kolab.org/www

Torsten Grote grote at kolabsys.com
Thu Jan 23 15:21:45 CET 2014


 kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_devel/admin_devel.info                                   |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu-rtl.css                                             |   48 
 kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.admin.js                                            |   14 
 kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.api.php                                             |  104 
 kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.css                                                 |   65 
 kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.drush.inc                                           |   14 
 kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.inc                                                 |  154 
 kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.info                                                |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.install                                             |    5 
 kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.js                                                  |  145 
 kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.module                                              |  139 
 kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.css                      |   11 
 kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.info                     |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.module                   |   34 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.admin.inc                                                 |   47 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.inc                                                       |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.info                                                      |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.install                                                   |   58 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.module                                                    |  193 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.test                                                      |   28 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha-rtl.css                               |   14 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.admin.inc                             |   21 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.info                                  |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.module                                |    8 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.user.inc                              |   18 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/da.po                                                |  875 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/de.po                                                |  633 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/es.po                                                |  717 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/fi.po                                                |  747 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/fr.po                                                |  712 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/he.po                                                |  611 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/hu.po                                                |  635 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/id.po                                                |  698 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/it.po                                                |  502 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/lt.po                                                |  651 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/nl.po                                                |  658 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/pl.po                                                |  510 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/uk-ua.po                                             |  428 
 kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/uk.po                                                |  428 
 kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/README.txt                                                   |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.admin.inc                                       |   56 
 kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.api.php                                         |   13 
 kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.css                                             |   14 
 kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.info                                            |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.install                                         |   17 
 kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.js                                              |   51 
 kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.module                                          |  219 
 kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.pages.inc                                       |   93 
 kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi_example/checklistapi_example.info               |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/lib/Drupal/checklistapi/ChecklistapiChecklist.php            |   67 
 kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/templates/checklistapi-progress-bar.tpl.php                  |   22 
 kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/tests/checklistapi.test                                      |   11 
 kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/tests/modules/checklistapi_test/checklistapi_test.info       |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/CHANGELOG.txt                                                    |   20 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.api.php                                                 |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.config.js                                               |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.info                                                    |    8 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.install                                                 |    5 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.module                                                  |   47 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.styles.js                                               |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.admin.inc                                      |   19 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.admin.js                                       |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.drush.inc                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.features.inc                                   |    4 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.lib.inc                                        |   23 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.page.inc                                       |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.user.inc                                       |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.utils.js                                       |   21 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/filemanager.config.php                                  |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/jqueryUI/sort.js                                        |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/dialogs/uicolor.js                              |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/bg.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/cs.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/cy.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/da.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/de.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/el.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/en.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/eo.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/et.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/fa.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/fi.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/fr.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/he.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/hr.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/it.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/mk.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/nb.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/nl.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/no.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/pl.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/tr.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/ug.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/uk.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/vi.js                                      |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/zh-cn.js                                   |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/plugin.js                                       |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/drupalbreaks/plugin.js                                   |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/imce/plugin.js                                           |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/media/plugin.js                                          |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/mediaembed/dialogs/mediaembed.js                         |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/mediaembed/plugin.js                                     |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/date/CHANGELOG.txt                                                        |   64 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date.api.php                                                         |    3 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date.diff.inc                                                        |   79 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date.field.inc                                                       |    8 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date.info                                                            |    8 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date.migrate.inc                                                     |  200 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date.module                                                          |   19 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date.theme                                                           |   66 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_admin.inc                                                       |    9 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_all_day/date_all_day.info                                       |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api.info                                               |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api.module                                             |   73 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api_elements.inc                                       |   23 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api_sql.inc                                            |   32 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_context/date_context.info                                       |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_context/plugins/date_context_date_condition.inc                 |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_elements.inc                                                    |   13 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date.migrate.inc                                        |  175 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate.info                                       |   14 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate.module                                     |   12 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate.test                                       |   70 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate_example/date_migrate_example.info          |    7 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate_example/date_migrate_example.migrate.inc   |   59 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate_example/date_migrate_example.module        |    3 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_popup/README.txt                                                |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_popup/date_popup.info                                           |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_popup/date_popup.module                                         |    8 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat/date_repeat.info                                         |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat/date_repeat_form.inc                                     |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat_field/date_repeat_field.info                             |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat_field/date_repeat_field.module                           |   25 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_tools/date_tools.info                                           |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/date_views.info                                           |    7 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/includes/date_views_argument_handler_simple.inc           |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/includes/date_views_filter_handler.inc                    |    4 
 kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/includes/date_views_filter_handler_simple.inc             |   48 
 kolab.org/www/drupal-7.18/sites/all/modules/date/tests/date_migrate.test                                              |   80 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n.info                                                            |    8 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n.test                                                            |   26 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_block/i18n_block.info                                           |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_contact/i18n_contact.info                                       |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_field/i18n_field.api.php                                        |   53 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_field/i18n_field.info                                           |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_field/i18n_field.module                                         |  132 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_forum/i18n_forum.info                                           |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_menu/i18n_menu.inc                                              |    1 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_menu/i18n_menu.info                                             |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_menu/i18n_menu.module                                           |   39 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_node/i18n_node.info                                             |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_node/i18n_node.pages.inc                                        |    4 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_path/i18n_path.info                                             |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_redirect/i18n_redirect.info                                     |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_select/i18n_select.info                                         |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_string/i18n_string.inc                                          |    4 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_string/i18n_string.info                                         |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_string/i18n_string.pages.inc                                    |   17 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_sync/i18n_sync.info                                             |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_sync/i18n_sync.node.inc                                         |   11 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_taxonomy/i18n_taxonomy.info                                     |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_taxonomy/i18n_taxonomy.module                                   |   26 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_translation/i18n_translation.info                               |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_user/i18n_user.info                                             |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_variable/i18n_variable.info                                     |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/i18n/tests/i18n_test.info                                                 |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/imce/imce.info                                                            |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/imce/imce.install                                                         |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/imce/imce.module                                                          |   90 
 kolab.org/www/drupal-7.18/sites/all/modules/imce/inc/imce.admin.inc                                                   |    9 
 kolab.org/www/drupal-7.18/sites/all/modules/imce/inc/imce.page.inc                                                    |   32 
 kolab.org/www/drupal-7.18/sites/all/modules/imce/js/imce.js                                                           |   13 
 kolab.org/www/drupal-7.18/sites/all/modules/imce/js/imce_extras.js                                                    |   19 
 kolab.org/www/drupal-7.18/sites/all/modules/imce/tpl/imce-page.tpl.php                                                |    1 
 kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/CHANGELOG.txt                                               |    7 
 kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/LICENSE.txt                                                 |  601 
 kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/jquery_update.info                                          |   10 
 kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/jquery_update.install                                       |    7 
 kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/jquery_update.module                                        |  173 
 kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.5/jquery.js                                | 8316 ++++++++
 kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.5/jquery.min.js                            |   16 
 kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.7/jquery.js                                | 9266 +++++++++
 kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.7/jquery.min.js                            |    4 
 kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.8/jquery.js                                | 9440 ++++++++++
 kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.8/jquery.min.js                            |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/jquery.js                                    | 8374 --------
 kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/jquery.min.js                                |   16 
 kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/misc/1.7/states.js                                  |  423 
 kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/misc/jquery.form.js                                 |  810 
 kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/misc/jquery.form.min.js                             |   11 
 kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/CHANGELOG.txt                                                 |   47 
 kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/README.txt                                                    |   12 
 kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.admin.inc                                         |   91 
 kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.batch.inc                                         |  114 
 kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.drush.inc                                         |   26 
 kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.info                                              |    8 
 kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.install                                           |  109 
 kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.module                                            | 1309 +
 kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.pages.inc                                         |   83 
 kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.redirect.inc                                      |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.test                                              |  282 
 kolab.org/www/drupal-7.18/sites/all/modules/permission_select/LICENSE.txt                                             |  601 
 kolab.org/www/drupal-7.18/sites/all/modules/permission_select/checkbox-checked.png                                    |binary
 kolab.org/www/drupal-7.18/sites/all/modules/permission_select/checkbox-unchecked.png                                  |binary
 kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.css                                   |   36 
 kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.info                                  |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.js                                    |   50 
 kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.module                                |  102 
 kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.admin.inc                                                     |   35 
 kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.info                                                          |    9 
 kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.install                                                       |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.module                                                        |   53 
 kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.test                                                          |  119 
 kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.variable.inc                                                  |   48 
 kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist.info                                          |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist.install                                       |  156 
 kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist.module                                        |  316 
 kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist_intro_tab.tpl.php                             |   20 
 kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/volacci-logo.png                                            |binary
 kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/.gitignore                                             |    1 
 kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/css/overlay_fix.css                                    |    8 
 kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/css/reset.css                                          |   36 
 kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/socialshareprivacy.admin.inc                           |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/socialshareprivacy.info                                |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/socialshareprivacy.module                              |   48 
 kolab.org/www/drupal-7.18/sites/all/modules/views/css/views-admin.ctools.css                                          |    5 
 kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_area_text.inc                                |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_field.inc                                    |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_field_boolean.inc                            |   34 
 kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_filter_combine.inc                           |   51 
 kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_filter_numeric.inc                           |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/views/includes/admin.inc                                                  |   18 
 kolab.org/www/drupal-7.18/sites/all/modules/views/includes/base.inc                                                   |    4 
 kolab.org/www/drupal-7.18/sites/all/modules/views/includes/cache.inc                                                  |   98 
 kolab.org/www/drupal-7.18/sites/all/modules/views/includes/handlers.inc                                               |    9 
 kolab.org/www/drupal-7.18/sites/all/modules/views/includes/view.inc                                                   |   12 
 kolab.org/www/drupal-7.18/sites/all/modules/views/js/ajax_view.js                                                     |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/views/js/views-admin.js                                                   |    7 
 kolab.org/www/drupal-7.18/sites/all/modules/views/modules/aggregator/views_handler_argument_aggregator_iid.inc        |    4 
 kolab.org/www/drupal-7.18/sites/all/modules/views/modules/field.views.inc                                             |   78 
 kolab.org/www/drupal-7.18/sites/all/modules/views/modules/node.views.inc                                              |   45 
 kolab.org/www/drupal-7.18/sites/all/modules/views/modules/node/views_handler_field_node_revision.inc                  |    5 
 kolab.org/www/drupal-7.18/sites/all/modules/views/modules/node/views_handler_filter_node_access.inc                   |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/views/modules/search/views_handler_filter_search.inc                      |   30 
 kolab.org/www/drupal-7.18/sites/all/modules/views/modules/taxonomy/views_handler_field_term_link_edit.inc             |   23 
 kolab.org/www/drupal-7.18/sites/all/modules/views/modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc   |   13 
 kolab.org/www/drupal-7.18/sites/all/modules/views/modules/tracker.views.inc                                           |  183 
 kolab.org/www/drupal-7.18/sites/all/modules/views/modules/tracker/views_handler_argument_tracker_comment_user_uid.inc |   26 
 kolab.org/www/drupal-7.18/sites/all/modules/views/modules/tracker/views_handler_filter_tracker_boolean_operator.inc   |   31 
 kolab.org/www/drupal-7.18/sites/all/modules/views/modules/tracker/views_handler_filter_tracker_comment_user_uid.inc   |   23 
 kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/export_ui/views_ui.class.php                                |    5 
 kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_display.inc                                    |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_display_feed.inc                               |    1 
 kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_display_page.inc                               |   24 
 kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_exposed_form.inc                               |   25 
 kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_pager_mini.inc                                 |   48 
 kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_query_default.inc                              |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_grid.inc                                 |   10 
 kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_jump_menu.inc                            |   17 
 kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_mapping.inc                              |  125 
 kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_summary_jump_menu.inc                    |   17 
 kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_table.inc                                |   11 
 kolab.org/www/drupal-7.18/sites/all/modules/views/tests/field/views_fieldapi.test                                     |   12 
 kolab.org/www/drupal-7.18/sites/all/modules/views/tests/handlers/views_handler_field_boolean.test                     |   34 
 kolab.org/www/drupal-7.18/sites/all/modules/views/tests/node/views_node_revision_relations.test                       |  177 
 kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style.test                                |   16 
 kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_base.test                           |   33 
 kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_jump_menu.test                      |    8 
 kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_mapping.test                        |  144 
 kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_unformatted.test                    |   22 
 kolab.org/www/drupal-7.18/sites/all/modules/views/tests/test_plugins/views_test_plugin_style_test_mapping.inc         |   52 
 kolab.org/www/drupal-7.18/sites/all/modules/views/tests/views_test.info                                               |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/views/tests/views_test.module                                             |   56 
 kolab.org/www/drupal-7.18/sites/all/modules/views/tests/views_translatable.test                                       |   23 
 kolab.org/www/drupal-7.18/sites/all/modules/views/theme/theme.inc                                                     |   29 
 kolab.org/www/drupal-7.18/sites/all/modules/views/theme/views-view-grid.tpl.php                                       |    4 
 kolab.org/www/drupal-7.18/sites/all/modules/views/theme/views-view-table.tpl.php                                      |    5 
 kolab.org/www/drupal-7.18/sites/all/modules/views/theme/views-view-unformatted.tpl.php                                |    2 
 kolab.org/www/drupal-7.18/sites/all/modules/views/views.api.php                                                       |   14 
 kolab.org/www/drupal-7.18/sites/all/modules/views/views.info                                                          |   14 
 kolab.org/www/drupal-7.18/sites/all/modules/views/views.module                                                        |   10 
 kolab.org/www/drupal-7.18/sites/all/modules/views/views_ui.info                                                       |    6 
 kolab.org/www/drupal-7.18/sites/all/modules/views/views_ui.module                                                     |    3 
 283 files changed, 35166 insertions(+), 20260 deletions(-)

New commits:
commit 9ec77367e92d9c9dd55f6b4f3d88b09f18e56b49
Author: Torsten Grote <grote at kolabsys.com>
Date:   Thu Jan 23 15:16:54 2014 +0100

    bring most modules up to date

diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_devel/admin_devel.info b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_devel/admin_devel.info
index df04a54..6408a1b 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_devel/admin_devel.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_devel/admin_devel.info
@@ -4,9 +4,9 @@ package = Administration
 core = 7.x
 scripts[] = admin_devel.js
 
-; Information added by drupal.org packaging script on 2012-05-17
-version = "7.x-3.0-rc3"
+; Information added by drupal.org packaging script on 2013-01-31
+version = "7.x-3.0-rc4"
 core = "7.x"
 project = "admin_menu"
-datestamp = "1337292349"
+datestamp = "1359651687"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu-rtl.css b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu-rtl.css
index 6004de5..9414dcf 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu-rtl.css
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu-rtl.css
@@ -1,50 +1,64 @@
 
 #admin-menu {
-  direction: rtl;
   text-align: right;
 }
-#admin-menu li.admin-menu-action {
+#admin-menu .dropdown .admin-menu-users a {
+  background-position: 10% center;
+  padding-left: 22px;
+  padding-right: 0;
+}
+#admin-menu .dropdown .admin-menu-action,
+#admin-menu .dropdown .admin-menu-search {
   float: left;
 }
-#admin-menu li.admin-menu-action a {
+#admin-menu .dropdown .admin-menu-action a {
   border-left: none;
   border-right: 1px solid #323232;
 }
 
 /* All lists */
-#admin-menu ul a {
+#admin-menu a {
+  text-align: right;
+}
+#admin-menu .dropdown a {
   border-left: 1px solid #323232;
   border-right: 0;
-  padding: 4px 8px;
-  text-align: right;
+}
+#admin-menu .dropdown .admin-menu-tab a {
+  border-left: 1px solid #52565E;
+  border-right: 0;
+}
+#admin-menu .dropdown li li a {
+  border-left: 0;
 }
 
 /* All list items */
-#admin-menu li {
+#admin-menu .dropdown li {
   float: right;
-  position: relative;
 }
-#admin-menu li li {
-  position: static;
+#admin-menu .dropdown li li {
 }
 
 /* Second-level lists */
-#admin-menu li ul {
-  right: 0;
+#admin-menu .dropdown li ul {
+  left: auto;
+  right: -999em;
 }
 
 /* Third-and-above-level lists */
-#admin-menu li li.expandable ul {
-  margin: -20px 160px 0 0;
+#admin-menu .dropdown li li.expandable ul {
+  margin-left: 0;
+  margin-right: 160px;
 }
 
 /* Lists nested under hovered list items */
-#admin-menu li.admin-menu-action:hover ul {
+#admin-menu .dropdown li.admin-menu-action:hover ul {
   left: 0 !important;
   right: auto;
 }
 
 /* Second-and-more-level hovering */
-#admin-menu li li.expandable {
-  background: #45454A url(images/arrow-rtl.png) no-repeat 5px 7px;
+#admin-menu .dropdown li li.expandable {
+  background-image: url(images/arrow-rtl.png);
+  background-position: 5px 6px;
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.admin.js b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.admin.js
index 6adf3a8..9ee9f36 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.admin.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.admin.js
@@ -1,6 +1,20 @@
 (function($) {
 
 /**
+ * Live preview of Administration menu components.
+ */
+Drupal.behaviors.adminMenuLivePreview = {
+  attach: function (context, settings) {
+    $('input[name^="admin_menu_components"]', context).once('admin-menu-live-preview')
+      .change(function () {
+        var target = $(this).attr('rel');
+        $(target).toggle(this.checked);
+      })
+      .trigger('change');
+  }
+};
+
+/**
  * Automatically enables required permissions on demand.
  *
  * Many users do not understand that two permissions are required for the
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.api.php b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.api.php
index 46646ae..2d212fb 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.api.php
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.api.php
@@ -41,11 +41,21 @@ function hook_admin_menu_map() {
 /**
  * Add to the administration menu content before it is rendered.
  *
+ * Only use this hook to add new data to the menu structure. Use
+ * hook_admin_menu_output_alter() to *alter* existing data.
+ *
  * @param array $content
- *   A structured array suitable for drupal_render(), containing:
+ *   A structured array suitable for drupal_render(), potentially containing:
  *   - menu: The administrative menu of links below the path 'admin/*'.
  *   - icon: The icon menu.
- *   - user: The user items and links.
+ *   - account: The user account name and log out link.
+ *   - users: The user counter.
+ *   Additionally, these special properties:
+ *   - #components: The actual components contained in $content are configurable
+ *     and depend on the 'admin_menu_components' configuration value. #components
+ *     holds a copy of that for convenience.
+ *   - #complete: A Boolean indicating whether the complete menu should be built,
+ *     ignoring the current configuration in #components.
  *   Passed by reference.
  *
  * @see hook_admin_menu_output_alter()
@@ -55,45 +65,77 @@ function hook_admin_menu_map() {
  * @see theme_admin_menu_links()
  */
 function hook_admin_menu_output_build(&$content) {
+  // In case your implementation provides a configurable component, check
+  // whether the component should be displayed:
+  if (empty($content['#components']['shortcut.links']) && !$content['#complete']) {
+    return;
+  }
+
+  // Add new top-level item to the menu.
+  if (isset($content['menu'])) {
+    $content['menu']['myitem'] = array(
+      '#title' => t('My item'),
+      // #attributes are used for list items (LI).
+      '#attributes' => array('class' => array('mymodule-myitem')),
+      '#href' => 'mymodule/path',
+      // #options are passed to l().
+      '#options' => array(
+        'query' => drupal_get_destination(),
+        // Apply a class on the link (anchor).
+        'attributes' => array('class' => array('myitem-link-anchor')),
+      ),
+      // #weight controls the order of links in the resulting item list.
+      '#weight' => 50,
+    );
+  }
+  // Add link to the icon menu to manually run cron.
+  if (isset($content['icon'])) {
+    $content['icon']['myitem']['cron'] = array(
+      '#title' => t('Run cron'),
+      '#access' => user_access('administer site configuration'),
+      '#href' => 'admin/reports/status/run-cron',
+    );
+  }
 }
 
 /**
  * Change the administration menu content before it is rendered.
  *
+ * Only use this hook to alter existing data in the menu structure. Use
+ * hook_admin_menu_output_build() to *add* new data.
+ *
  * @param array $content
- *   A structured array suitable for drupal_render(), containing:
- *   - menu: The administrative menu of links below the path 'admin/*'.
- *   - icon: The icon menu.
- *   - user: The user items and links.
- *   Passed by reference.
+ *   A structured array suitable for drupal_render(). Passed by reference.
  *
  * @see hook_admin_menu_output_build()
- * @see admin_menu_links_menu()
- * @see admin_menu_links_icon()
- * @see admin_menu_links_user()
- * @see theme_admin_menu_links()
  */
 function hook_admin_menu_output_alter(&$content) {
-  // Add new top-level item.
-  $content['menu']['myitem'] = array(
-    '#title' => t('My item'),
-    // #attributes are used for list items (LI).
-    '#attributes' => array('class' => array('mymodule-myitem')),
-    '#href' => 'mymodule/path',
-    // #options are passed to l(). Note that you can apply 'attributes' for
-    // links (A) here.
-    '#options' => array(
-      'query' => drupal_get_destination(),
-    ),
-    // #weight controls the order of links in the resulting item list.
-    '#weight' => 50,
-  );
-  // Add link to manually run cron.
-  $content['menu']['myitem']['cron'] = array(
-    '#title' => t('Run cron'),
-    '#access' => user_access('administer site configuration'),
-    '#href' => 'admin/reports/status/run-cron',
-  );
+}
+
+/**
+ * Return content to be replace via JS in the cached menu output.
+ *
+ * @param bool $complete
+ *   A Boolean indicating whether all available components of the menu will be
+ *   output and the cache will be skipped.
+ *
+ * @return array
+ *   An associative array whose keys are jQuery selectors and whose values are
+ *   strings containing the replacement content.
+ */
+function hook_admin_menu_replacements($complete) {
+  $items = array();
+  // If the complete menu is output, then it is uncached and will contain the
+  // current counts already.
+  if (!$complete) {
+    // Check whether the users count component is enabled.
+    $components = variable_get('admin_menu_components', array());
+    if (!empty($components['admin_menu.users']) && ($user_count = admin_menu_get_user_count())) {
+      // Replace the counters in the cached menu output with current counts.
+      $items['.admin-menu-users a'] = $user_count;
+    }
+  }
+  return $items;
 }
 
 /**
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.css b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.css
index 0ceec28..fd86dd7 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.css
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.css
@@ -34,7 +34,8 @@
   background: transparent url(images/icon_users.png) 90% center no-repeat;
   padding-right: 22px;
 }
-#admin-menu .dropdown .admin-menu-action {
+#admin-menu .dropdown .admin-menu-action,
+#admin-menu .dropdown .admin-menu-search {
   float: right;
 }
 #admin-menu .dropdown .admin-menu-action a {
@@ -57,31 +58,33 @@ body.admin-menu {
 #admin-menu .dropdown {
   position: static;
 }
-#admin-menu a {
+#admin-menu a,
+#admin-menu li > span {
   background: transparent none;
   border: none;
   color: #EEE;
   font-weight: normal;
-  text-align: left;
+  text-align: left; /* LTR */
   text-decoration: none;
 }
-#admin-menu .dropdown a {
-  border-right: 1px solid #323232;
+#admin-menu .dropdown a,
+#admin-menu .dropdown li > span {
+  border-right: 1px solid #323232; /* LTR */
   display: block;
   padding: 4px 8px;
 }
 #admin-menu .dropdown .admin-menu-tab a {
-  border-right: 1px solid #52565E;
+  border-right: 1px solid #52565E; /* LTR */
 }
 #admin-menu .dropdown li li a {
-  border-right: none;
+  border-right: none; /* LTR */
   border-top: 1px solid #323232;
 }
 
 /* All list items */
 #admin-menu .dropdown li {
   background-image: none;
-  float: left;
+  float: left; /* LTR */
   height: 100%;
   list-style-image: none;
   list-style-type: none;
@@ -108,7 +111,7 @@ body.admin-menu {
 #admin-menu .dropdown li ul {
   background: none;
   display: none;
-  left: -999em;
+  left: -999em; /* LTR */
   line-height: 1.2em;
   margin: 0;
   position: absolute;
@@ -117,7 +120,7 @@ body.admin-menu {
 
 /* Third-and-above-level lists */
 #admin-menu .dropdown li li.expandable ul {
-  margin: -20px 0 0 160px;
+  margin: -20px 0 0 160px; /* LTR */
 }
 
 #admin-menu .dropdown li:hover ul ul,
@@ -129,7 +132,7 @@ body.admin-menu {
 #admin-menu .dropdown li.iehover ul ul ul ul,
 #admin-menu .dropdown li.iehover ul ul ul ul ul {
   display: none;
-  left: -999em;
+  left: -999em; /* LTR */
 }
 
 /* Lists nested under hovered list items */
@@ -144,10 +147,10 @@ body.admin-menu {
 #admin-menu .dropdown li li li li.iehover ul,
 #admin-menu .dropdown li li li li li.iehover ul {
   display: block;
-  left: auto;
+  left: auto; /* LTR */
 }
 #admin-menu .dropdown li.admin-menu-action:hover ul {
-  right: 0;
+  right: 0; /* LTR */
 }
 
 /* Second-and-more-level hovering */
@@ -184,6 +187,42 @@ body.admin-menu {
   width: 90%; /* IE */
 }
 
+/* Search form */
+#admin-menu .admin-menu-search .form-item {
+  margin: 0;
+  padding: 0;
+}
+#admin-menu .admin-menu-search input {
+  background: #fff none center right no-repeat;
+  border: none;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+  font-size: 10px;
+  margin: 1px 0;
+  outline: none;
+  padding: 2px 22px 2px 4px;
+  width: 158px;
+}
+
+#admin-menu .dropdown .admin-menu-search-results {
+  display: block !important;
+  left: auto !important;
+  top: 100%;
+}
+#admin-menu .admin-menu-search-results,
+#admin-menu .admin-menu-search-results li {
+  width: 186px;
+}
+
+#admin-menu li.highlight {
+  background-color: #eee !important;
+}
+#admin-menu li.highlight > a {
+  border-color: #ccc !important;
+  color: #111 !important;
+}
+
 /* #210615: Mozilla on Mac fix */
 html.js fieldset.collapsible div.fieldset-wrapper {
   overflow: visible;
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.drush.inc b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.drush.inc
deleted file mode 100644
index a8469a9..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.drush.inc
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-/**
- * Implments hook_drush_exit()
- *
- * This is necessary because drush skips the normal hook_exit() where
- * we build the links.
- */
-function admin_menu_drush_exit() {
-  if (function_exists('admin_menu_exit')) {
-    admin_menu_exit();
-  }
-}
-
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.inc b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.inc
index 31efaea..e212970 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.inc
@@ -425,6 +425,7 @@ function admin_menu_links_icon() {
 
   $links = array(
     '#theme' => 'admin_menu_links',
+    '#wrapper_attributes' => array('id' => 'admin-menu-icon'),
     '#weight' => -100,
   );
   $links['icon'] = array(
@@ -495,52 +496,47 @@ function admin_menu_links_icon() {
       ),
     );
   }
+
   // Add link to toggle developer modules (performance).
   $saved_state = variable_get('admin_menu_devel_modules_enabled', NULL);
   $links['icon']['toggle-modules'] = array(
     '#title' => isset($saved_state) ? t('Enable developer modules') : t('Disable developer modules'),
     '#weight' => 88,
-    '#access' => user_access('administer site configuration'),
+    '#access' => user_access('administer modules'),
     '#href' => 'admin_menu/toggle-modules',
     '#options' => array(
       'query' => $destination + array('token' => drupal_get_token('admin_menu/toggle-modules')),
     ),
   );
 
-  // Add Devel module links.
+  // Add Devel module menu links.
   if (module_exists('devel')) {
-    // Add variable editor.
-    $links['icon']['devel-variables'] = array(
-      '#title' => t('Variable editor'),
-      '#weight' => 20,
-      '#access' => user_access('access devel information'),
-      '#href' => 'devel/variable',
-    );
+    $devel_tree = menu_build_tree('devel');
+    $devel_links = admin_menu_links_menu($devel_tree);
+    if (element_get_visible_children($devel_links)) {
+      $links['icon']['devel'] = array(
+        '#title' => t('Development'),
+        '#weight' => 30,
+      ) + $devel_links;
+    }
   }
 
   return $links;
 }
 
 /**
- * Build user/action links; mostly account information and links.
+ * Builds the account links.
  *
  * @see theme_admin_menu_links()
  */
-function admin_menu_links_user() {
+function admin_menu_links_account() {
   $links = array(
     '#theme' => 'admin_menu_links',
+    '#wrapper_attributes' => array('id' => 'admin-menu-account'),
     '#weight' => 100,
   );
-  // Add link to show current authenticated/anonymous users.
-  $links['user-counter'] = array(
-    '#title' => admin_menu_get_user_count(),
-    '#description' => t('Current anonymous / authenticated users'),
-    '#weight' => -90,
-    '#attributes' => array('class' => array('admin-menu-action', 'admin-menu-users')),
-    '#href' => (user_access('administer users') ? 'admin/people/people' : 'user'),
-  );
   $links['account'] = array(
-    '#title' => $GLOBALS['user']->name,
+    '#title' => format_username($GLOBALS['user']),
     '#weight' => -99,
     '#attributes' => array('class' => array('admin-menu-action', 'admin-menu-account')),
     '#href' => 'user/' . $GLOBALS['user']->uid,
@@ -551,7 +547,6 @@ function admin_menu_links_user() {
     '#attributes' => array('class' => array('admin-menu-action')),
     '#href' => 'user/logout',
   );
-
   // Add Devel module switch user links.
   $switch_links = module_invoke('devel', 'switch_user_list');
   if (!empty($switch_links) && count($switch_links) > 1) {
@@ -567,7 +562,51 @@ function admin_menu_links_user() {
       );
     }
   }
+  return $links;
+}
 
+/**
+ * Builds user counter.
+ *
+ * @see theme_admin_menu_links()
+ */
+function admin_menu_links_users() {
+  $links = array(
+    '#theme' => 'admin_menu_links',
+    '#wrapper_attributes' => array('id' => 'admin-menu-users'),
+    '#weight' => 150,
+  );
+  // Add link to show current authenticated/anonymous users.
+  $links['user-counter'] = array(
+    '#title' => admin_menu_get_user_count(),
+    '#description' => t('Current anonymous / authenticated users'),
+    '#weight' => -90,
+    '#attributes' => array('class' => array('admin-menu-action', 'admin-menu-users')),
+    '#href' => (user_access('administer users') ? 'admin/people/people' : 'user'),
+  );
+  return $links;
+}
+
+/**
+ * Build search widget.
+ *
+ * @see theme_admin_menu_links()
+ */
+function admin_menu_links_search() {
+  $links = array(
+    '#theme' => 'admin_menu_links',
+    '#wrapper_attributes' => array('id' => 'admin-menu-search'),
+    '#weight' => 180,
+  );
+  $links['search'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Search'),
+    '#title_display' => 'attribute',
+    '#attributes' => array(
+      'placeholder' => t('Search'),
+      'class' => array('admin-menu-search'),
+    ),
+  );
   return $links;
 }
 
@@ -584,20 +623,43 @@ function admin_menu_theme_settings() {
   $form['admin_menu_position_fixed'] = array(
     '#type' => 'checkbox',
     '#title' => t('Keep menu at top of page'),
-    '#default_value' => variable_get('admin_menu_position_fixed', 0),
+    '#default_value' => variable_get('admin_menu_position_fixed', 1),
     '#description' => t('Displays the administration menu always at the top of the browser viewport (even when scrolling the page).'),
   );
   // @todo Re-confirm this with latest browser versions.
   $form['admin_menu_position_fixed']['#description'] .= '<br /><strong>' . t('In some browsers, this setting may result in a malformed page, an invisible cursor, non-selectable elements in forms, or other issues.') . '</strong>';
-  $form['admin_menu_cache_client'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Cache menu in client-side browser'),
-    '#default_value' => variable_get('admin_menu_cache_client', 1),
+
+  $form['advanced'] = array(
+    '#type' => 'vertical_tabs',
+    '#title' => t('Advanced settings'),
   );
 
+  $form['plugins'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Plugins'),
+    '#group' => 'advanced',
+  );
+  $form['plugins']['admin_menu_components'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Enabled components'),
+    '#options' => array(
+      'admin_menu.icon' => t('Icon menu'),
+      'admin_menu.menu' => t('Administration menu'),
+      'admin_menu.search' => t('Search bar'),
+      'admin_menu.users' => t('User counts'),
+      'admin_menu.account' => t('Account links'),
+    ),
+  );
+  $form['plugins']['admin_menu_components']['#default_value'] = array_keys(array_filter(variable_get('admin_menu_components', $form['plugins']['admin_menu_components']['#options'])));
+
+  $process = element_info_property('checkboxes', '#process', array());
+  $form['plugins']['admin_menu_components']['#process'] = array_merge(array('admin_menu_settings_process_components'), $process);
+  $form['#attached']['js'][] = drupal_get_path('module', 'admin_menu') . '/admin_menu.admin.js';
+
   $form['tweaks'] = array(
     '#type' => 'fieldset',
-    '#title' => t('Advanced settings'),
+    '#title' => t('System tweaks'),
+    '#group' => 'advanced',
   );
   $form['tweaks']['admin_menu_tweak_modules'] = array(
     '#type' => 'checkbox',
@@ -625,6 +687,16 @@ function admin_menu_theme_settings() {
     '#description' => t('Moves the tabs on all pages into the administration menu. Only possible for themes using the CSS classes <code>tabs primary</code> and <code>tabs secondary</code>.'),
   );
 
+  $form['performance'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Performance'),
+    '#group' => 'advanced',
+  );
+  $form['performance']['admin_menu_cache_client'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Cache menu in client-side browser'),
+    '#default_value' => variable_get('admin_menu_cache_client', 1),
+  );
   // Fetch all available modules manually, since module_list() only returns
   // currently enabled modules, which makes this setting pointless if developer
   // modules are currently disabled.
@@ -638,7 +710,7 @@ function admin_menu_theme_settings() {
   }
   $devel_modules = variable_get('admin_menu_devel_modules', _admin_menu_developer_modules());
   $devel_modules = array_intersect_key($all_modules, array_flip($devel_modules));
-  $form['tweaks']['admin_menu_devel_modules_skip'] = array(
+  $form['performance']['admin_menu_devel_modules_skip'] = array(
     '#type' => 'checkboxes',
     '#title' => t('Developer modules to keep enabled'),
     '#default_value' => variable_get('admin_menu_devel_modules_skip', array()),
@@ -653,6 +725,32 @@ function admin_menu_theme_settings() {
 }
 
 /**
+ * #process callback for component plugin form element in admin_menu_theme_settings().
+ */
+function admin_menu_settings_process_components($element) {
+  // Assign 'rel' attributes to all options to achieve a live preview.
+  // Unfortunately, #states relies on wrapping .form-wrapper classes, so it
+  // cannot be used here.
+  foreach ($element['#options'] as $key => $label) {
+    if (!isset($element[$key]['#attributes']['rel'])) {
+      $id = preg_replace('/[^a-z]/', '-', $key);
+      $element[$key]['#attributes']['rel'] = '#' . $id;
+    }
+  }
+  return $element;
+}
+
+/**
+ * Form validation handler for admin_menu_theme_settings().
+ */
+function admin_menu_theme_settings_validate(&$form, &$form_state) {
+  // Change the configured components to Boolean values.
+  foreach ($form_state['values']['admin_menu_components'] as $component => &$enabled) {
+    $enabled = (bool) $enabled;
+  }
+}
+
+/**
  * Implementation of hook_form_FORM_ID_alter().
  *
  * Extends Devel module with Administration menu developer settings.
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.info b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.info
index bac8b2e..ee58c66 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.info
@@ -8,9 +8,9 @@ configure = admin/config/administration/admin_menu
 dependencies[] = system (>7.10)
 files[] = tests/admin_menu.test
 
-; Information added by drupal.org packaging script on 2012-05-17
-version = "7.x-3.0-rc3"
+; Information added by drupal.org packaging script on 2013-01-31
+version = "7.x-3.0-rc4"
 core = "7.x"
 project = "admin_menu"
-datestamp = "1337292349"
+datestamp = "1359651687"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.install b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.install
index acbd06b..70e31c6 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.install
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.install
@@ -32,6 +32,7 @@ function admin_menu_install() {
  */
 function admin_menu_uninstall() {
   // Delete variables.
+  variable_del('admin_menu_components');
   variable_del('admin_menu_devel_modules');
   variable_del('admin_menu_devel_modules_enabled');
   variable_del('admin_menu_devel_modules_skip');
@@ -102,7 +103,9 @@ function admin_menu_update_7303() {
  */
 function admin_menu_update_7304() {
   // Remove the custom menu used by 6.x-1.x.
-  db_delete('menu_custom')->condition('menu_name', 'admin_menu')->execute();
+  if (db_table_exists('menu_custom')) {
+    db_delete('menu_custom')->condition('menu_name', 'admin_menu')->execute();
+  }
 
   // 6.x-1.x cloned the entire link structure below the path 'admin' into a
   // separate 'menu_name' "admin_menu" with 'module' "admin_menu". 6.x-3.x and
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.js b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.js
index 169eba8..de0bb90 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.js
@@ -85,10 +85,11 @@ Drupal.behaviors.adminMenuCollapsePermissions = {
           });
         });
       });
-      // Get fragment from current URL.
-      var fragment = window.location.hash || '#';
       // Collapse all but the targeted permission rows set.
-      $modules.not(':has(' + fragment + ')').trigger('click.admin-menu');
+      if (window.location.hash.length) {
+        $modules = $modules.not(':has(' + window.location.hash + ')');
+      }
+      $modules.trigger('click.admin-menu');
     }
   }
 };
@@ -252,6 +253,144 @@ Drupal.admin.behaviors.hover = function (context, settings, $adminMenu) {
 };
 
 /**
+ * Apply the search bar functionality.
+ */
+Drupal.admin.behaviors.search = function (context, settings, $adminMenu) {
+  // @todo Add a HTML ID.
+  var $input = $('input.admin-menu-search', $adminMenu);
+  // Initialize the current search needle.
+  var needle = $input.val();
+  // Cache of all links that can be matched in the menu.
+  var links;
+  // Minimum search needle length.
+  var needleMinLength = 2;
+  // Append the results container.
+  var $results = $('<div />').insertAfter($input);
+
+  /**
+   * Executes the search upon user input.
+   */
+  function keyupHandler() {
+    var matches, $html, value = $(this).val();
+    // Only proceed if the search needle has changed.
+    if (value !== needle) {
+      needle = value;
+      // Initialize the cache of menu links upon first search.
+      if (!links && needle.length >= needleMinLength) {
+        // @todo Limit to links in dropdown menus; i.e., skip menu additions.
+        links = buildSearchIndex($adminMenu.find('li:not(.admin-menu-action, .admin-menu-action li) > a'));
+      }
+      // Empty results container when deleting search text.
+      if (needle.length < needleMinLength) {
+        $results.empty();
+      }
+      // Only search if the needle is long enough.
+      if (needle.length >= needleMinLength && links) {
+        matches = findMatches(needle, links);
+        // Build the list in a detached DOM node.
+        $html = buildResultsList(matches);
+        // Display results.
+        $results.empty().append($html);
+      }
+    }
+  }
+
+  /**
+   * Builds the search index.
+   */
+  function buildSearchIndex($links) {
+    return $links
+      .map(function () {
+        var text = (this.textContent || this.innerText);
+        // Skip menu entries that do not contain any text (e.g., the icon).
+        if (typeof text === 'undefined') {
+          return;
+        }
+        return {
+          text: text,
+          textMatch: text.toLowerCase(),
+          element: this
+        };
+      });
+  }
+
+  /**
+   * Searches the index for a given needle and returns matching entries.
+   */
+  function findMatches(needle, links) {
+    var needleMatch = needle.toLowerCase();
+    // Select matching links from the cache.
+    return $.grep(links, function (link) {
+      return link.textMatch.indexOf(needleMatch) !== -1;
+    });
+  }
+
+  /**
+   * Builds the search result list in a detached DOM node.
+   */
+  function buildResultsList(matches) {
+    var $html = $('<ul class="dropdown admin-menu-search-results" />');
+    $.each(matches, function () {
+      var result = this.text;
+      var $element = $(this.element);
+
+      // Check whether there is a top-level category that can be prepended.
+      var $category = $element.closest('#admin-menu-wrapper > ul > li');
+      var categoryText = $category.find('> a').text()
+      if ($category.length && categoryText) {
+        result = categoryText + ': ' + result;
+      }
+
+      var $result = $('<li><a href="' + $element.attr('href') + '">' + result + '</a></li>');
+      $result.data('original-link', $(this.element).parent());
+      $html.append($result);
+    });
+    return $html;
+  }
+
+  /**
+   * Highlights selected result.
+   */
+  function resultsHandler(e) {
+    var $this = $(this);
+    var show = e.type === 'mouseenter' || e.type === 'focusin';
+    $this.trigger(show ? 'showPath' : 'hidePath', [this]);
+  }
+
+  /**
+   * Closes the search results and clears the search input.
+   */
+  function resultsClickHandler(e, link) {
+    var $original = $(this).data('original-link');
+    $original.trigger('mouseleave');
+    $input.val('').trigger('keyup');
+  }
+
+  /**
+   * Shows the link in the menu that corresponds to a search result.
+   */
+  function highlightPathHandler(e, link) {
+    if (link) {
+      var $original = $(link).data('original-link');
+      var show = e.type === 'showPath';
+      // Toggle an additional CSS class to visually highlight the matching link.
+      // @todo Consider using same visual appearance as regular hover.
+      $original.toggleClass('highlight', show);
+      $original.trigger(show ? 'mouseenter' : 'mouseleave');
+    }
+  }
+
+  // Attach showPath/hidePath handler to search result entries.
+  $results.delegate('li', 'mouseenter mouseleave focus blur', resultsHandler);
+  // Hide the result list after a link has been clicked, useful for overlay.
+  $results.delegate('li', 'click', resultsClickHandler);
+  // Attach hover/active highlight behavior to search result entries.
+  $adminMenu.delegate('.admin-menu-search-results li', 'showPath hidePath', highlightPathHandler);
+  // Attach the search input event handler.
+  $input.bind('keyup search', keyupHandler);
+};
+
+/**
  * @} End of "defgroup admin_behaviors".
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.module b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.module
index 4f4f056..8a8dee1 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu.module
@@ -89,7 +89,7 @@ function admin_menu_menu() {
   // Menu link callbacks.
   $items['admin_menu/toggle-modules'] = array(
     'page callback' => 'admin_menu_toggle_modules',
-    'access arguments' => array('administer site configuration'),
+    'access arguments' => array('administer modules'),
     'type' => MENU_CALLBACK,
     'file' => 'admin_menu.inc',
   );
@@ -182,10 +182,16 @@ function admin_menu_page_build(&$page) {
   // Destination query strings are applied via JS.
   $settings['destination'] = drupal_http_build_query(drupal_get_destination());
 
+  // Determine whether we need to show all components and disable all caches.
+  $complete = FALSE;
+  if (current_path() == 'admin/config/administration/admin_menu' && $_SERVER['REQUEST_METHOD'] == 'GET') {
+    $complete = TRUE;
+  }
+
   // If the client supports JavaScript and we have a cached menu for the current
   // user, only output the hash for the client-side HTTP cache callback URL.
   $cid = 'admin_menu:' . $user->uid . ':' . session_id() . ':' . $language->language;
-  if (!empty($_COOKIE['has_js']) && ($hash = admin_menu_cache_get($cid))) {
+  if (!$complete && !empty($_COOKIE['has_js']) && ($hash = admin_menu_cache_get($cid))) {
     $settings['hash'] = $hash;
     // The base path to use for cache requests depends on whether clean URLs
     // are enabled, whether Drupal runs in a sub-directory, and on the language
@@ -198,10 +204,10 @@ function admin_menu_page_build(&$page) {
   }
   // Otherwise, add the full menu to the page.
   else {
-    $page['page_bottom']['admin_menu']['#markup'] = admin_menu_output();
+    $page['page_bottom']['admin_menu']['#markup'] = admin_menu_output($complete);
   }
 
-  $replacements = module_invoke_all('admin_menu_replacements');
+  $replacements = module_invoke_all('admin_menu_replacements', $complete);
   if (!empty($replacements)) {
     $settings['replacements'] = $replacements;
   }
@@ -213,7 +219,7 @@ function admin_menu_page_build(&$page) {
     // @see http://drupal.org/node/1473548, http://drupal.org/node/1194528
     //$page['#attributes']['class'][] = 'admin-menu';
   }
-  if ($setting = variable_get('admin_menu_position_fixed', 0)) {
+  if ($setting = variable_get('admin_menu_position_fixed', 1)) {
     $settings['position_fixed'] = $setting;
 
     // In fixed positioning, supply a callback function for tableheader.js to
@@ -326,6 +332,9 @@ function admin_menu_cache_set($cid, $data) {
 function admin_menu_js_cache() {
   global $conf;
 
+  // Suppress Devel module.
+  $GLOBALS['devel_shutdown'] = FALSE;
+
   // Enforce page caching.
   $conf['cache'] = 1;
   drupal_page_is_cacheable(TRUE);
@@ -384,10 +393,17 @@ function admin_menu_deliver($page_callback_result) {
 /**
  * Implements hook_admin_menu_replacements().
  */
-function admin_menu_admin_menu_replacements() {
+function admin_menu_admin_menu_replacements($complete) {
   $items = array();
-  if ($user_count = admin_menu_get_user_count()) {
-    $items['.admin-menu-users a'] = $user_count;
+  // If the complete menu is output, then it is uncached and will contain the
+  // current counts already.
+  if (!$complete) {
+    // Check whether the users count component is enabled.
+    $components = variable_get('admin_menu_components', array());
+    if (!empty($components['admin_menu.users']) && ($user_count = admin_menu_get_user_count())) {
+      // Replace the counters in the cached menu output with current counts.
+      $items['.admin-menu-users a'] = $user_count;
+    }
   }
   return $items;
 }
@@ -434,11 +450,16 @@ function admin_menu_session_count($timestamp = 0, $anonymous = TRUE) {
 
 /**
  * Build the administration menu output.
+ *
+ * @param bool $complete
+ *   (optional) Whether to build to the complete menu including all components
+ *   and ignore the cache. Defaults to FALSE. Internally used for the settings
+ *   page.
  */
-function admin_menu_output() {
+function admin_menu_output($complete = FALSE) {
   global $user, $language;
 
-  $cache_server_enabled = variable_get('admin_menu_cache_server', TRUE);
+  $cache_server_enabled = !$complete && variable_get('admin_menu_cache_server', TRUE);
   $cid = 'admin_menu:' . $user->uid . ':' . session_id() . ':' . $language->language;
 
   // Try to load and output administration menu from server-side cache.
@@ -458,6 +479,16 @@ function admin_menu_output() {
 
   // Rebuild the output.
   if (!isset($content)) {
+    // Retrieve enabled components to display and make them available for others.
+    $components = variable_get('admin_menu_components', array());
+    $components += array(
+      'admin_menu.menu' => TRUE,
+      'admin_menu.icon' => TRUE,
+      'admin_menu.account' => TRUE,
+    );
+    $content['#components'] = $components;
+    $content['#complete'] = $complete;
+
     // Add site name as CSS class for development/staging theming purposes. We
     // leverage the cookie domain instead of HTTP_HOST to account for many (but
     // not all) multi-domain setups (e.g. language-based sub-domains).
@@ -475,15 +506,31 @@ function admin_menu_output() {
     // Load menu builder functions.
     module_load_include('inc', 'admin_menu');
 
+    // @todo Move the below callbacks into hook_admin_menu_build()
+    //   implementations (and $module.admin_menu.inc).
+
     // Add administration menu.
-    $content['menu'] = admin_menu_links_menu(admin_menu_tree('management'));
-    $content['menu']['#theme'] = 'admin_menu_links';
-    // Ensure the menu tree is rendered between the icon and user links.
-    $content['menu']['#weight'] = 0;
+    if (!empty($components['admin_menu.menu']) || $complete) {
+      $content['menu'] = admin_menu_links_menu(admin_menu_tree('management'));
+      $content['menu']['#theme'] = 'admin_menu_links';
+      $content['menu']['#wrapper_attributes']['id'] = 'admin-menu-menu';
+      // Ensure the menu tree is rendered between the icon and user links.
+      $content['menu']['#weight'] = 0;
+    }
 
     // Add menu additions.
-    $content['icon'] = admin_menu_links_icon();
-    $content['user'] = admin_menu_links_user();
+    if (!empty($components['admin_menu.icon']) || $complete) {
+      $content['icon'] = admin_menu_links_icon();
+    }
+    if (!empty($components['admin_menu.account']) || $complete) {
+      $content['account'] = admin_menu_links_account();
+    }
+    if (!empty($components['admin_menu.users']) || $complete) {
+      $content['users'] = admin_menu_links_users();
+    }
+    if (!empty($components['admin_menu.search']) || $complete) {
+      $content['search'] = admin_menu_links_search();
+    }
 
     // Allow modules to enhance the menu.
     // Uses '_output' suffix for consistency with the alter hook (see below).
@@ -506,7 +553,7 @@ function admin_menu_output() {
   }
 
   // Store the new hash for this user.
-  if (!empty($_COOKIE['has_js'])) {
+  if (!empty($_COOKIE['has_js']) && !$complete) {
     admin_menu_cache_set($cid, md5($content));
   }
 
@@ -517,6 +564,10 @@ function admin_menu_output() {
  * Implements hook_admin_menu_output_build().
  */
 function admin_menu_admin_menu_output_build(&$content) {
+  if (!isset($content['menu'])) {
+    return;
+  }
+
   // Unassign weights for categories below Configuration.
   // An alphabetical order is more natural for a dropdown menu.
   if (isset($content['menu']['admin/config'])) {
@@ -623,6 +674,7 @@ function theme_admin_menu_links($variables) {
     }
 
     $link = '';
+    // Handle menu links.
     if (isset($elements[$path]['#href'])) {
       // Strip destination query string from href attribute and apply a CSS class
       // for our JavaScript behavior instead.
@@ -631,21 +683,21 @@ function theme_admin_menu_links($variables) {
         $elements[$path]['#options']['attributes']['class'][] = 'admin-menu-destination';
       }
 
-      $link .= l($elements[$path]['#title'], $elements[$path]['#href'], $elements[$path]['#options']);
+      $link = l($elements[$path]['#title'], $elements[$path]['#href'], $elements[$path]['#options']);
     }
-    elseif (isset($elements[$path]['#title'])) {
+    // Handle plain text items, but do not interfere with menu additions.
+    elseif (!isset($elements[$path]['#type']) && isset($elements[$path]['#title'])) {
       if (!empty($elements[$path]['#options']['html'])) {
         $title = $elements[$path]['#title'];
       }
       else {
         $title = check_plain($elements[$path]['#title']);
       }
-      if (!empty($elements[$path]['#options']['attributes'])) {
-        $link .= '<span' . drupal_attributes($elements[$path]['#options']['attributes']) . '>' . $title . '</span>';
-      }
-      else {
-        $link .= $title;
+      $attributes = '';
+      if (isset($elements[$path]['#options']['attributes'])) {
+        $attributes = drupal_attributes($elements[$path]['#options']['attributes']);
       }
+      $link = '<span' . $attributes . '>' . $title . '</span>';
     }
 
     $output .= '<li' . drupal_attributes($elements[$path]['#attributes']) . '>';
@@ -655,7 +707,9 @@ function theme_admin_menu_links($variables) {
   // @todo #attributes probably required for UL, but already used for LI.
   // @todo Use $element['#children'] here instead.
   if ($output) {
-    $output = "\n" . '<ul class="dropdown">' . $output . '</ul>';
+    $elements['#wrapper_attributes']['class'][] = 'dropdown';
+    $attributes = drupal_attributes($elements['#wrapper_attributes']);
+    $output = "\n" . '<ul' . $attributes . '>' . $output . '</ul>';
   }
   return $output;
 }
@@ -665,12 +719,12 @@ function theme_admin_menu_links($variables) {
  */
 function admin_menu_element_sort($a, $b) {
   // @see element_sort()
-  $a_weight = (is_array($a) && isset($a['#weight'])) ? $a['#weight'] : 0;
-  $b_weight = (is_array($b) && isset($b['#weight'])) ? $b['#weight'] : 0;
+  $a_weight = isset($a['#weight']) ? $a['#weight'] : 0;
+  $b_weight = isset($b['#weight']) ? $b['#weight'] : 0;
   if ($a_weight == $b_weight) {
     // @see element_sort_by_title()
-    $a_title = (is_array($a) && isset($a['#title'])) ? $a['#title'] : '';
-    $b_title = (is_array($b) && isset($b['#title'])) ? $b['#title'] : '';
+    $a_title = isset($a['#title']) ? $a['#title'] : '';
+    $b_title = isset($b['#title']) ? $b['#title'] : '';
     return strnatcasecmp($a_title, $b_title);
   }
   return ($a_weight < $b_weight) ? -1 : 1;
@@ -723,6 +777,22 @@ function admin_menu_translated_menu_link_alter(&$item, $map) {
  *   (optional) A user ID to limit the cache flush to.
  */
 function admin_menu_flush_caches($uid = NULL) {
+  // A call to menu_rebuild() will trigger potentially thousands of calls into
+  // menu_link_save(), for which admin_menu has to implement the corresponding
+  // CRUD hooks, in order to take up any menu link changes, since any menu link
+  // change could affect the admin menu (which essentially is an aggregate) and
+  // since there is no other way to get notified about stale caches. The cache
+  // only needs to be flushed once though, so we prevent a ton of needless
+  // subsequent calls with this static.
+  // @see http://drupal.org/node/918538
+  $was_flushed = &drupal_static(__FUNCTION__, array());
+  // $uid can be NULL. PHP automatically converts that into '' (empty string),
+  // which is different to uid 0 (zero).
+  if (isset($was_flushed[$uid])) {
+    return;
+  }
+  $was_flushed[$uid] = TRUE;
+
   $cid = 'admin_menu:';
   if (isset($uid)) {
     $cid .= $uid . ':';
@@ -742,6 +812,7 @@ function admin_menu_flush_caches($uid = NULL) {
  */
 function admin_menu_form_alter(&$form, &$form_state, $form_id) {
   $global_flush_ids = array(
+    'admin_menu_theme_settings' => 1,
     // Update links for clean/non-clean URLs.
     'system_clean_url_settings' => 1,
     // Incorporate changed user permissions.
@@ -753,12 +824,12 @@ function admin_menu_form_alter(&$form, &$form_state, $form_id) {
   );
   if (isset($global_flush_ids[$form_id])) {
     $form['#submit'][] = 'admin_menu_form_alter_flush_cache_submit';
-  }
 
-  // Optionally limit the cache flush to a certain user ID.
-  $form_state['admin_menu_uid'] = NULL;
-  if ($form_id == 'user_profile_form') {
-    $form_state['admin_menu_uid'] = $form_state['user']->uid;
+    // Optionally limit the cache flush to a certain user ID.
+    $form_state['admin_menu_uid'] = NULL;
+    if ($form_id == 'user_profile_form') {
+      $form_state['admin_menu_uid'] = $form_state['user']->uid;
+    }
   }
 
   // UX: Add a confirmation to the permissions form to ask the user whether to
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.css b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.css
index 56e448a..a3e9f3e 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.css
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.css
@@ -16,7 +16,8 @@ html body.admin-menu {
 html body.admin-menu-with-shortcuts {
   margin-top: 65px !important;
 }
-body div#toolbar {
+/* Displace the core Toolbar, if concurrently output. */
+body div#toolbar.toolbar {
   top: 30px;
 }
 
@@ -28,11 +29,9 @@ body div#toolbar {
  */
 #admin-menu {
   font: normal small "Lucida Grande", Verdana, sans-serif;
-  margin: 0 -20px;
-  padding: 0 20px;
-  -moz-box-shadow: 0 3px 20px #000;
-  -webkit-box-shadow: 0 3px 20px #000;
-  box-shadow: 0 3px 20px #000;
+  -moz-box-shadow: 0 -10px 20px 13px #000;
+  -webkit-box-shadow: 0 -10px 20px 13px #000;
+  box-shadow: 0 -10px 20px 13px #000;
   right: 0;
   width: auto;
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.info b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.info
index a63b6ce..2514776 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.info
@@ -4,9 +4,9 @@ package = Administration
 core = 7.x
 dependencies[] = admin_menu
 
-; Information added by drupal.org packaging script on 2012-05-17
-version = "7.x-3.0-rc3"
+; Information added by drupal.org packaging script on 2013-01-31
+version = "7.x-3.0-rc4"
 core = "7.x"
 project = "admin_menu"
-datestamp = "1337292349"
+datestamp = "1359651687"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.module b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.module
index 1885fce..74a9ee1 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.module
@@ -8,6 +8,17 @@
  */
 
 /**
+ * Implements hook_form_FORMID_alter().
+ */
+function admin_menu_toolbar_form_admin_menu_theme_settings_alter(&$form) {
+  // Add the shortcut links as component on behalf of Shortcut module.
+  $form['plugins']['admin_menu_components']['#options']['shortcut.links'] = t('Shortcuts');
+  // The shortcut bar consists of two elements, so we target their class names
+  // instead of cluttering the markup with additional IDs.
+  $form['plugins']['admin_menu_components']['shortcut.links']['#attributes']['rel'] = '.shortcut-toggle, .shortcut-toolbar';
+}
+
+/**
  * Implementation of hook_page_build().
  */
 function admin_menu_toolbar_page_build(&$page) {
@@ -48,6 +59,9 @@ function admin_menu_toolbar_page_build(&$page) {
  * Implements hook_admin_menu_output_build().
  */
 function admin_menu_toolbar_admin_menu_output_build(&$content) {
+  if (empty($content['#components']['shortcut.links']) && !$content['#complete']) {
+    return;
+  }
   // Add shortcuts toggle.
   $content['shortcut-toggle'] = array(
     '#access' => module_exists('shortcut'),
@@ -82,17 +96,23 @@ function admin_menu_toolbar_admin_menu_output_build(&$content) {
  */
 function admin_menu_toolbar_admin_menu_output_alter(&$content) {
   // Add a class to top-level items for styling.
-  foreach (element_children($content['menu']) as $link) {
-    $content['menu'][$link]['#attributes']['class'][] = 'admin-menu-toolbar-category';
+  if (isset($content['menu'])) {
+    foreach (element_children($content['menu']) as $link) {
+      $content['menu'][$link]['#attributes']['class'][] = 'admin-menu-toolbar-category';
+    }
   }
 
   // Alter icon.
-  unset($content['icon']['icon']['#theme']);
-  $content['icon']['icon']['#title'] = '<span>' . t('Home') . '</span>';
-  $content['icon']['icon']['#attributes']['class'][] = 'admin-menu-toolbar-category';
+  if (isset($content['icon'])) {
+    unset($content['icon']['icon']['#theme']);
+    $content['icon']['icon']['#title'] = '<span>' . t('Home') . '</span>';
+    $content['icon']['icon']['#attributes']['class'][] = 'admin-menu-toolbar-category';
+  }
 
   // Alter user account link.
-  $content['user']['account']['#title'] = t('Hello <strong>@username</strong>', array('@username' => $content['user']['account']['#title']));
-  $content['user']['account']['#options']['html'] = TRUE;
+  if (isset($content['account'])) {
+    $content['account']['account']['#title'] = t('Hello <strong>@username</strong>', array('@username' => $content['account']['account']['#title']));
+    $content['account']['account']['#options']['html'] = TRUE;
+  }
 }
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.admin.inc b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.admin.inc
index 013855a..0d095ae 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.admin.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.admin.inc
@@ -18,8 +18,8 @@
 function _captcha_available_challenge_types($add_special_options=TRUE) {
   $captcha_types = array();
   if ($add_special_options) {
-    $captcha_types['none'] = '[' . t('none') . ']';
-    $captcha_types['default'] = '[' . t('default challenge type') . ']';
+    $captcha_types['none'] = t('- No challenge -');
+    $captcha_types['default'] = t('Default challenge type');
   }
   // We do our own version of Drupal's module_invoke_all() here because
   // we want to build an array with custom keys and values.
@@ -47,9 +47,7 @@ function captcha_admin_settings() {
   $form['captcha_form_protection'] = array(
     '#type' => 'fieldset',
     '#title' => t('Form protection'),
-    '#description' => t('Select the challenge type you want for each of the listed forms (identified by their so called <em>form_id</em>\'s). You can easily add arbitrary forms with textfield at the bottom of the table or with the help of the \'%CAPTCHA_admin_links\' option below.',
-      array('%CAPTCHA_admin_links' => t('Add CAPTCHA administration links to forms'))
-      ),
+    '#description' => t("Select the challenge type you want for each of the listed forms (identified by their so called <em>form_id</em>'s). You can easily add arbitrary forms with the textfield at the bottom of the table or with the help of the option <em>Add CAPTCHA administration links to forms</em> below."),
   );
   $form['captcha_form_protection']['captcha_default_challenge'] = array(
     '#type' => 'select',
@@ -75,7 +73,7 @@ function captcha_admin_settings() {
     if (isset($captcha_point->module) && $captcha_point->module) {
       $captcha_type = $captcha_point->module . '/' . $captcha_point->captcha_type;
     }
-    elseif ($captcha_point->captcha_type == 'default') {
+    elseif (isset($captcha_point->captcha_type) && ($captcha_point->captcha_type == 'default')) {
       $captcha_type = 'default';
     }
     else {
@@ -113,27 +111,27 @@ function captcha_admin_settings() {
     '#type' => 'checkbox',
     '#title' => t('Add CAPTCHA administration links to forms'),
     '#default_value' => variable_get('captcha_administration_mode', FALSE),
-    '#description' => t('This option makes it easy to manage CAPTCHA settings on forms. When enabled, users with the "%admincaptcha" permission will see a fieldset with CAPTCHA administration links on all forms, except on administrative pages.', array('%admincaptcha' => t('administer CAPTCHA settings'))),
+    '#description' => t('This option makes it easy to manage CAPTCHA settings on forms. When enabled, users with the <em>administer CAPTCHA settings</em> permission will see a fieldset with CAPTCHA administration links on all forms, except on administrative pages.'),
   );
   // Field for the CAPTCHAs on admin pages.
   $form['captcha_form_protection']['captcha_allow_on_admin_pages'] = array(
     '#type' => 'checkbox',
     '#title' => t('Allow CAPTCHAs and CAPTCHA administration links on administrative pages'),
     '#default_value' => variable_get('captcha_allow_on_admin_pages', FALSE),
-    '#description' => t('This option makes it possible to add CAPTCHAs to forms on administrative pages. CAPTCHAs are disabled by default on administrative pages (which shouldn\'t be accessible to untrusted users normally) to avoid the related overhead. In some situations, e.g. in the case of demo sites, it can be usefull to allow CAPTCHAs on administrative pages.'),
+    '#description' => t("This option makes it possible to add CAPTCHAs to forms on administrative pages. CAPTCHAs are disabled by default on administrative pages (which shouldn't be accessible to untrusted users normally) to avoid the related overhead. In some situations, e.g. in the case of demo sites, it can be usefull to allow CAPTCHAs on administrative pages."),
   );
 
-  // Button for flushing the CAPTCHA placement cache.
+  // Button for clearing the CAPTCHA placement cache.
   // Based on Drupal core's "Clear all caches" (performance settings page).
   $form['captcha_form_protection']['captcha_placement_caching'] = array(
     '#type' => 'item',
     '#title' => t('CAPTCHA placement caching'),
-    '#description' => t('For efficiency, the positions of the CAPTCHA elements in each of the configured forms are cached. Most of the time, the structure of a form does not change and it would be a waste to recalculate the positions every time. Occasionally however, the form structure can change (e.g. during site building) and flushing the CAPTCHA placement cache can be required to fix the CAPTCHA placement.'),
+    '#description' => t('For efficiency, the positions of the CAPTCHA elements in each of the configured forms are cached. Most of the time, the structure of a form does not change and it would be a waste to recalculate the positions every time. Occasionally however, the form structure can change (e.g. during site building) and clearing the CAPTCHA placement cache can be required to fix the CAPTCHA placement.'),
   );
-  $form['captcha_form_protection']['captcha_placement_caching']['captcha_placement_cache_flush'] = array(
+  $form['captcha_form_protection']['captcha_placement_caching']['captcha_placement_cache_clear'] = array(
     '#type' => 'submit',
-    '#value' => t('Flush the CAPTCHA placement cache'),
-    '#submit' => array('captcha_flush_captcha_placement_cache_submit'),
+    '#value' => t('Clear the CAPTCHA placement cache'),
+    '#submit' => array('captcha_clear_captcha_placement_cache_submit'),
   );
 
   // Configuration option for adding a CAPTCHA description.
@@ -149,7 +147,7 @@ function captcha_admin_settings() {
     $form['captcha_descriptions'] = array(
       '#type' => 'fieldset',
       '#title' => t('CAPTCHA description'),
-      '#description' => t('Configurable description of the CAPTCHA. An empty entry will reset the description.'),
+      '#description' => t('Configurable description of the CAPTCHA. An empty entry will reset the description to default.'),
       '#attributes' => array('id' => 'edit-captcha-description-wrapper'),
     );
     foreach ($langs as $lang_code => $lang_name) {
@@ -165,7 +163,7 @@ function captcha_admin_settings() {
     $form['captcha_description'] = array(
       '#type' => 'textfield',
       '#title' => t('Challenge description'),
-      '#description' => t('Configurable description of the CAPTCHA. An empty entry will reset the description.'),
+      '#description' => t('Configurable description of the CAPTCHA. An empty entry will reset the description to default.'),
       '#default_value' => _captcha_get_description(),
       '#maxlength' => 256,
       '#attributes' => array('id' => 'edit-captcha-description-wrapper'),
@@ -203,6 +201,14 @@ function captcha_admin_settings() {
     '#description' => t('Define if challenges should be omitted during the rest of a session once the user successfully responds to a challenge.'),
   );
 
+  // Enable wrong response counter.
+  $form['captcha_enable_stats'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable statistics'),
+    '#description' => t('Keep CAPTCHA related counters in the <a href="!statusreport">status report</a>. Note that this comes with a performance penalty as updating the counters results in clearing the variable cache.', array('!statusreport' => url('admin/reports/status'))),
+    '#default_value' => variable_get('captcha_enable_stats', FALSE),
+  );
+
   // Option for logging wrong responses.
   $form['captcha_log_wrong_responses'] = array(
     '#type' => 'checkbox',
@@ -311,9 +317,10 @@ function captcha_admin_settings_submit($form, &$form_state) {
 
   variable_set('captcha_default_validation', $form_state['values']['captcha_default_validation']);
   variable_set('captcha_persistence', $form_state['values']['captcha_persistence']);
+  variable_set('captcha_enable_stats', $form_state['values']['captcha_enable_stats']);
   variable_set('captcha_log_wrong_responses', $form_state['values']['captcha_log_wrong_responses']);
 
-  drupal_set_message(t('The CAPTCHA settings were saved.'), 'status');
+  drupal_set_message(t('The CAPTCHA settings have been saved.'), 'status');
 }
 
 
@@ -322,9 +329,9 @@ function captcha_admin_settings_submit($form, &$form_state) {
 /**
  * Submit callback; clear CAPTCHA placement cache.
  */
-function captcha_flush_captcha_placement_cache_submit($form, &$form_state) {
+function captcha_clear_captcha_placement_cache_submit($form, &$form_state) {
   variable_del('captcha_placement_map_cache');
-  drupal_set_message(t('Flushed the CAPTCHA placement cache.'));
+  drupal_set_message(t('Cleared the CAPTCHA placement cache.'));
 }
 
 
@@ -378,7 +385,7 @@ function captcha_point_admin_form($form, $form_state, $captcha_point_form_id=NUL
   $form['captcha_type'] = array(
     '#type' => 'select',
     '#title' => t('Challenge type'),
-    '#description' => t('The CAPTCHA type to use for this form'),
+    '#description' => t('The CAPTCHA type to use for this form.'),
     '#default_value' => $default_captcha_type,
     '#options' => _captcha_available_challenge_types(),
   );
@@ -495,7 +502,7 @@ function captcha_examples($form, $form_state, $module, $challenge) {
         foreach ($challenges as $ckey => $challenge) {
           $form["captcha_{$mkey}_{$ckey}"] = array(
             '#type' => 'fieldset',
-            '#title' => t('Challenge "%challenge" by module "%module"', array('%challenge' => $challenge, '%module' => $module)),
+            '#title' => t('Challenge %challenge by module %module', array('%challenge' => $challenge, '%module' => $module)),
             'challenge' => _captcha_generate_example_challenge($module, $challenge),
             'more_examples' => array(
               '#markup' => l(t('10 more examples of this challenge.'), "admin/config/people/captcha/captcha/examples/$module/$challenge"),
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.inc b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.inc
index e8212b1..6af73a6 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.inc
@@ -194,7 +194,7 @@ function _captcha_get_description($lang_code=NULL) {
   global $language;
   $lang_code = isset($lang_code) ? $lang_code : $language->language;
   // The hardcoded but localizable default.
-  $default = t('This question is for testing whether you are a human visitor and to prevent automated spam submissions.', array(), array('langcode' => $lang_code));
+  $default = t('This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.', array(), array('langcode' => $lang_code));
   // Look up the configured CAPTCHA description or fall back on the (localized) default.
   if (module_exists('locale')) {
     $description = variable_get("captcha_description_$lang_code", $default);
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.info b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.info
index 15c72ac..32c91fc 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.info
@@ -10,9 +10,9 @@ files[] = captcha.admin.inc
 files[] = captcha.install
 files[] = captcha.test
 
-; Information added by drupal.org packaging script on 2012-01-02
-version = "7.x-1.0-beta2"
+; Information added by drupal.org packaging script on 2013-06-25
+version = "7.x-1.0"
 core = "7.x"
 project = "captcha"
-datestamp = "1325504137"
+datestamp = "1372203950"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.install b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.install
index e7aecbe..f53f600 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.install
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.install
@@ -114,7 +114,7 @@ function captcha_schema() {
 function captcha_requirements($phase) {
   $requirements = array();
   $t = get_t();
-  if ($phase == 'runtime') {
+  if ($phase == 'runtime' && variable_get('captcha_enable_stats', FALSE)) {
     // Show the wrong response counter in the status report.
     $requirements['captcha_wrong_response_counter'] = array(
       'title' => $t('CAPTCHA'),
@@ -178,62 +178,6 @@ function captcha_uninstall() {
 /**
  * Implementation of hook_update_N()
  */
-function captcha_update_1() {
-  $items = array();
-  switch ($GLOBALS['db_type']) {
-    case 'mysql':
-    case 'mysqli':
-      $items[] = update_sql("CREATE TABLE {captcha_points} (
-        form_id varchar(128) NOT NULL,
-        module varchar(64) default NULL,
-        type varchar(64) default NULL,
-        PRIMARY KEY (form_id)
-        ) /*!40100 DEFAULT CHARACTER SET utf8 */;"
-      );
-      $succes = TRUE;
-      break;
-    case 'pgsql':
-      $items[] = update_sql("CREATE TABLE {captcha_points} (
-        form_id varchar(128) NOT NULL,
-        module varchar(64) default NULL,
-        type varchar(64) default NULL,
-        PRIMARY KEY (form_id)
-        );"
-      );
-      $succes = TRUE;
-      break;
-    default:
-      drupal_set_message(t('Unsupported database.'), 'error');
-      $succes = FALSE;
-      break;
-  }
-  if ($succes) {
-    // insert some defaults
-    $form_ids = array('comment_form', 'contact_mail_user', 'contact_mail_page',
-      'user_register', 'user_pass');
-    foreach ($form_ids as $form_id) {
-      $items[] = update_sql("INSERT INTO {captcha_points} (form_id, module, type) VALUES ('$form_id', NULL, NULL)");
-    }
-  }
-  return $items;
-}
-
-/**
- * Implementation of hook_update_N()
- */
-function captcha_update_2() {
-  $items = array();
-  // insert some defaults
-  $form_ids = array('user_login', 'user_login_block');
-  foreach ($form_ids as $form_id) {
-    $items[] = update_sql("INSERT INTO {captcha_points} (form_id, module, type) VALUES ('$form_id', NULL, NULL)");
-  }
-  return $items;
-}
-
-/**
- * Implementation of hook_update_N()
- */
 function captcha_update_6200() {
   $items = array();
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.module b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.module
index 87124d0..b2772b6 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.module
@@ -39,12 +39,10 @@ function captcha_help($path, $arg) {
   switch ($path) {
     case 'admin/help#captcha':
       $output = '<p>' . t('"CAPTCHA" is an acronym for "Completely Automated Public Turing test to tell Computers and Humans Apart". It is typically a challenge-response test to determine whether the user is human. The CAPTCHA module is a tool to fight automated submission by malicious users (spamming) of for example comments forms, user registration forms, guestbook forms, etc. You can extend the desired forms with an additional challenge, which should be easy for a human to solve correctly, but hard enough to keep automated scripts and spam bots out.') . '</p>';
-      $output .= '<p>' . t('Note that the CAPTCHA module interacts with page caching (see <a href="!performancesettings">performance settings</a>). Because the challenge should be unique for each generated form, the caching of the page it appears on is prevented. Make sure that these forms do not appear on too many pages or you will lose much caching efficiency. For example, if you put a CAPTCHA on the user login block, which typically appears on each page for anonymous visitors, caching will practically be disabled. The comment submission forms are another example. In this case you should set the "%commentlocation" to "%separatepage" in the comment settings of the relevant <a href="!contenttypes">content types</a> for better caching efficiency.' ,
+      $output .= '<p>' . t('Note that the CAPTCHA module interacts with page caching (see <a href="!performancesettings">performance settings</a>). Because the challenge should be unique for each generated form, the caching of the page it appears on is prevented. Make sure that these forms do not appear on too many pages or you will lose much caching efficiency. For example, if you put a CAPTCHA on the user login block, which typically appears on each page for anonymous visitors, caching will practically be disabled. The comment submission forms are another example. In this case you should set the <em>Location of comment submission form</em> to <em>Display on separate page</em> in the comment settings of the relevant <a href="!contenttypes">content types</a> for better caching efficiency.',
         array(
-          '!performancesettings' => url('admin/settings/performance'),
-          '%commentlocation' => t('Location of comment submission form'),
-          '%separatepage' => t('Display on separate page'),
-          '!contenttypes' => url('admin/content/types'),
+          '!performancesettings' => url('admin/config/development/performance'),
+          '!contenttypes' => url('admin/structure/types'),
         )
       ) . '</p>';
       $output .= '<p>' . t('CAPTCHA is a trademark of Carnegie Mellon University.') . '</p>';
@@ -52,10 +50,8 @@ function captcha_help($path, $arg) {
     case 'admin/config/people/captcha':
     case 'admin/config/people/captcha/captcha':
     case 'admin/config/people/captcha/captcha/settings':
-      $output = '<p>' . t('A CAPTCHA can be added to virtually each Drupal form. Some default forms are already provided in the form list, but arbitrary forms can be easily added and managed when the option "%adminlinks" is enabled.',
-        array('%adminlinks' => t('Add CAPTCHA administration links to forms'))) . '</p>';
-      $output .= '<p>' . t('Users with the "%skipcaptcha" <a href="@perm">permission</a> won\'t be offered a challenge. Be sure to grant this permission to the trusted users (e.g. site administrators). If you want to test a protected form, be sure to do it as a user without the "%skipcaptcha" permission (e.g. as anonymous user).',
-        array('%skipcaptcha' => t('skip CAPTCHA'), '@perm' => url('admin/user/permissions'))) . '</p>';
+      $output = '<p>' . t('A CAPTCHA can be added to virtually each Drupal form. Some default forms are already provided in the form list, but arbitrary forms can be easily added and managed when the option <em>Add CAPTCHA administration links to forms</em> is enabled.') . '</p>';
+      $output .= '<p>' . t('Users with the <em>Skip CAPTCHA</em> <a href="@perm">permission</a> won\'t be offered a challenge. Be sure to grant this permission to the trusted users (e.g. site administrators). If you want to test a protected form, be sure to do it as a user without the <em>Skip CAPTCHA</em> permission (e.g. as anonymous user).', array('@perm' => url('admin/people/permissions'))) . '</p>';
       return $output;
   }
 }
@@ -281,7 +277,10 @@ function captcha_element_process($element, &$form_state, $complete_form) {
     $element['#theme'] = 'captcha';
 
     // Add pre_render callback for additional CAPTCHA processing.
-    $element['#pre_render'] = array('captcha_pre_render_process');
+    if (!isset($element['#pre_render'])) {
+      $element['#pre_render'] = array();
+    }
+    $element['#pre_render'][] = 'captcha_pre_render_process';
 
     // Store the solution in the #captcha_info array.
     $element['#captcha_info']['solution'] = $captcha['solution'];
@@ -327,91 +326,93 @@ function theme_captcha($variables) {
  */
 function captcha_form_alter(&$form, &$form_state, $form_id) {
 
-  if (arg(0) != 'admin' || variable_get('captcha_allow_on_admin_pages', FALSE)) {
-
+  if (!user_access('skip CAPTCHA')) {
+    // Visitor does not have permission to skip CAPTCHAs.
     module_load_include('inc', 'captcha');
 
-    if (!user_access('skip CAPTCHA')) {
-      // Visitor does not have permission to skip the CAPTCHA
-
-      // Get CAPTCHA type and module for given form_id.
-      $captcha_point = captcha_get_form_id_setting($form_id);
-      if ($captcha_point && $captcha_point->captcha_type) {
-        module_load_include('inc', 'captcha');
-        // Build CAPTCHA form element.
-        $captcha_element = array(
-          '#type' => 'captcha',
-          '#captcha_type' => $captcha_point->module . '/' . $captcha_point->captcha_type,
-        );
-        // Add a CAPTCHA description if required.
-        if (variable_get('captcha_add_captcha_description', TRUE)) {
-          $captcha_element['#description'] = _captcha_get_description();
-        }
-
-        // Get placement in form and insert in form.
-        $captcha_placement = _captcha_get_captcha_placement($form_id, $form);
-        _captcha_insert_captcha_element($form, $captcha_placement, $captcha_element);
-
-      }
-    }
-    elseif (user_access('administer CAPTCHA settings') && variable_get('captcha_administration_mode', FALSE)) {
-      $captcha_point = captcha_get_form_id_setting($form_id);
-      // For administrators: show CAPTCHA info and offer link to configure it
+    // Get CAPTCHA type and module for given form_id.
+    $captcha_point = captcha_get_form_id_setting($form_id);
+    if ($captcha_point && $captcha_point->captcha_type) {
+      module_load_include('inc', 'captcha');
+      // Build CAPTCHA form element.
       $captcha_element = array(
-        '#type' => 'fieldset',
-        '#title' => t('CAPTCHA'),
-        '#collapsible' => TRUE,
-        '#collapsed' => TRUE,
-        '#attributes' => array('class' => array('captcha-admin-links')),
+        '#type' => 'captcha',
+        '#captcha_type' => $captcha_point->module . '/' . $captcha_point->captcha_type,
       );
-      if ($captcha_point !== NULL && $captcha_point->captcha_type) {
-        $captcha_element['#title'] = t('CAPTCHA: challenge "@type" enabled', array('@type' => $captcha_point->captcha_type));
-        $captcha_element['#description'] = t('Untrusted users will see a CAPTCHA here (!settings).',
-          array('!settings' => l(t('general CAPTCHA settings'), 'admin/config/people/captcha'))
-        );
-        $captcha_element['challenge'] = array(
-          '#type' => 'item',
-          '#title' => t('Enabled challenge'),
-          '#markup' => t('"@type" by module "@module" (!change, !disable)', array(
-            '@type' => $captcha_point->captcha_type,
-            '@module' => $captcha_point->module,
-            '!change' => l(t('change'), "admin/config/people/captcha/captcha/captcha_point/$form_id", array('query' => drupal_get_destination())),
-            '!disable' => l(t('disable'), "admin/config/people/captcha/captcha/captcha_point/$form_id/disable", array('query' => drupal_get_destination())),
-          )),
-        );
-        // Add an example challenge with solution.
-        // This does not work with the reCAPTCHA and Egglue challenges as
-        // discussed in http://drupal.org/node/487032 and
-        // http://drupal.org/node/525586. As a temporary workaround, we
-        // blacklist the reCAPTCHA and Egglue challenges and do not show
-        // an example challenge.
-        // TODO: Once the issues mentioned above are fixed, this workaround
-        // should be removed.
-        if ($captcha_point->module != 'recaptcha' && $captcha_point->module != 'egglue_captcha') {
-          $captcha_element['example'] = array(
-            '#type' => 'fieldset',
-            '#title' => t('Example'),
-            '#description' => t('This is a pre-solved, non-blocking example of this challenge.'),
-          );
-          $captcha_element['example']['example_captcha'] = array(
-            '#type' => 'captcha',
-            '#captcha_type' => $captcha_point->module . '/' . $captcha_point->captcha_type,
-            '#captcha_admin_mode' => TRUE,
-          );
-        }
+      // Add a CAPTCHA description if required.
+      if (variable_get('captcha_add_captcha_description', TRUE)) {
+        $captcha_element['#description'] = _captcha_get_description();
       }
-      else {
-        $captcha_element['#title'] = t('CAPTCHA: no challenge enabled');
-        $captcha_element['add_captcha'] = array(
-          '#markup' => l(t('Place a CAPTCHA here for untrusted users.'), "admin/config/people/captcha/captcha/captcha_point/$form_id", array('query' => drupal_get_destination()))
-        );
 
-      }
       // Get placement in form and insert in form.
       $captcha_placement = _captcha_get_captcha_placement($form_id, $form);
       _captcha_insert_captcha_element($form, $captcha_placement, $captcha_element);
+    }
+  }
+  else if (
+  variable_get('captcha_administration_mode', FALSE)
+  && user_access('administer CAPTCHA settings')
+  && (arg(0) != 'admin' || variable_get('captcha_allow_on_admin_pages', FALSE))
+  ) {
+    // Add CAPTCHA administration tools.
+    module_load_include('inc', 'captcha');
+
+    $captcha_point = captcha_get_form_id_setting($form_id);
+    // For administrators: show CAPTCHA info and offer link to configure it
+    $captcha_element = array(
+      '#type' => 'fieldset',
+      '#title' => t('CAPTCHA'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+      '#attributes' => array('class' => array('captcha-admin-links')),
+    );
+    if ($captcha_point !== NULL && $captcha_point->captcha_type) {
+      $captcha_element['#title'] = t('CAPTCHA: challenge "@type" enabled', array('@type' => $captcha_point->captcha_type));
+      $captcha_element['#description'] = t('Untrusted users will see a CAPTCHA here (<a href="@settings">general CAPTCHA settings</a>).',
+        array('@settings' => url('admin/config/people/captcha'))
+      );
+      $captcha_element['challenge'] = array(
+        '#type' => 'item',
+        '#title' => t('Enabled challenge'),
+        '#markup' => t('%type by module %module (<a href="@change">change</a>, <a href="@disable">disable</a>)', array(
+          '%type' => $captcha_point->captcha_type,
+          '%module' => $captcha_point->module,
+          '@change' => url("admin/config/people/captcha/captcha/captcha_point/$form_id", array('query' => drupal_get_destination())),
+          '@disable' => url("admin/config/people/captcha/captcha/captcha_point/$form_id/disable", array('query' => drupal_get_destination())),
+        )),
+      );
+      // Add an example challenge with solution.
+      // This does not work with the reCAPTCHA and Egglue challenges as
+      // discussed in http://drupal.org/node/487032 and
+      // http://drupal.org/node/525586. As a temporary workaround, we
+      // blacklist the reCAPTCHA and Egglue challenges and do not show
+      // an example challenge.
+      // TODO: Once the issues mentioned above are fixed, this workaround
+      // should be removed.
+      if ($captcha_point->module != 'recaptcha' && $captcha_point->module != 'egglue_captcha') {
+        $captcha_element['example'] = array(
+          '#type' => 'fieldset',
+          '#title' => t('Example'),
+          '#description' => t('This is a pre-solved, non-blocking example of this challenge.'),
+        );
+        $captcha_element['example']['example_captcha'] = array(
+          '#type' => 'captcha',
+          '#captcha_type' => $captcha_point->module . '/' . $captcha_point->captcha_type,
+          '#captcha_admin_mode' => TRUE,
+        );
+      }
+    }
+    else {
+      $captcha_element['#title'] = t('CAPTCHA: no challenge enabled');
+      $captcha_element['add_captcha'] = array(
+        '#markup' => l(t('Place a CAPTCHA here for untrusted users.'), "admin/config/people/captcha/captcha/captcha_point/$form_id", array('query' => drupal_get_destination()))
+      );
 
     }
+    // Get placement in form and insert in form.
+    $captcha_placement = _captcha_get_captcha_placement($form_id, $form);
+    _captcha_insert_captcha_element($form, $captcha_placement, $captcha_element);
+
   }
 
   // Add a warning about caching on the Perfomance settings page.
@@ -446,7 +447,7 @@ function captcha_validate_strict_equality($solution, $response) {
  * @return TRUE when case insensitive equal, FALSE otherwise.
  */
 function captcha_validate_case_insensitive_equality($solution, $response) {
-  return strtolower($solution) === strtolower($response);
+  return drupal_strtolower($solution) === drupal_strtolower($response);
 }
 
 /**
@@ -456,7 +457,7 @@ function captcha_validate_case_insensitive_equality($solution, $response) {
  * @return TRUE when equal (ignoring spaces), FALSE otherwise.
  */
 function captcha_validate_ignore_spaces($solution, $response) {
-  return preg_replace('/\s/', '', $solution) == preg_replace('/\s/', '', $response);
+  return preg_replace('/\s/', '', $solution) === preg_replace('/\s/', '', $response);
 }
 
 /**
@@ -466,7 +467,7 @@ function captcha_validate_ignore_spaces($solution, $response) {
  * @return TRUE when equal (ignoring spaces), FALSE otherwise.
  */
 function captcha_validate_case_insensitive_ignore_spaces($solution, $response) {
-  return preg_replace('/\s/', '', strtolower($solution)) == preg_replace('/\s/', '', strtolower($response));
+  return preg_replace('/\s/', '', drupal_strtolower($solution)) === preg_replace('/\s/', '', drupal_strtolower($response));
 }
 
 /**
@@ -598,7 +599,13 @@ function captcha_validate($element, &$form_state) {
     // we also provide the CAPTCHA $element and $form_state arrays for more advanced use cases.
     if ($captcha_validate($solution, $captcha_response, $element, $form_state)) {
       // Correct answer.
-      $_SESSION['captcha_success_form_ids'][$form_id] = $form_id;
+
+      // Store form_id in session (but only if it is useful to do so, avoid setting stuff in session unnecessarily).
+      $captcha_persistence = variable_get('captcha_persistence', CAPTCHA_PERSISTENCE_SKIP_ONCE_SUCCESSFUL_PER_FORM_INSTANCE);
+      if ($captcha_persistence == CAPTCHA_PERSISTENCE_SKIP_ONCE_SUCCESSFUL || $captcha_persistence == CAPTCHA_PERSISTENCE_SKIP_ONCE_SUCCESSFUL_PER_FORM_TYPE) {
+        $_SESSION['captcha_success_form_ids'][$form_id] = $form_id;
+      }
+
       // Record success.
       db_update('captcha_sessions')
         ->condition('csid', $csid)
@@ -615,13 +622,15 @@ function captcha_validate($element, &$form_state) {
       // set form error
       form_set_error('captcha_response', t('The answer you entered for the CAPTCHA was not correct.'));
       // update wrong response counter
-      variable_set('captcha_wrong_response_counter', variable_get('captcha_wrong_response_counter', 0) + 1);
+      if (variable_get('captcha_enable_stats', FALSE)) {
+        variable_set('captcha_wrong_response_counter', variable_get('captcha_wrong_response_counter', 0) + 1);
+      }
       // log to watchdog if needed
       if (variable_get('captcha_log_wrong_responses', FALSE)) {
         watchdog('CAPTCHA',
-          '%form_id post blocked by CAPTCHA module: challenge "%challenge" (by module "%module"), user answered "%response", but the solution was "%solution".',
+          '%form_id post blocked by CAPTCHA module: challenge %challenge (by module %module), user answered "@response", but the solution was "@solution".',
           array('%form_id' => $form_id,
-            '%response' => $captcha_response, '%solution' => $solution,
+            '@response' => $captcha_response, '@solution' => $solution,
             '%challenge' => $captcha_info['captcha_type'], '%module' => $captcha_info['module'],
           ),
           WATCHDOG_NOTICE);
@@ -640,6 +649,8 @@ function captcha_validate($element, &$form_state) {
  * @return the manipulated element
  */
 function captcha_pre_render_process($element) {
+  module_load_include('inc', 'captcha');
+
   // Get form and CAPTCHA information.
   $captcha_info = $element['#captcha_info'];
   $form_id = $captcha_info['form_id'];
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.test b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.test
index 1647df2..bccefe3 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.test
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/captcha.test
@@ -376,6 +376,24 @@ class CaptchaTestCase extends CaptchaBaseWebTestCase {
     $this->assertCaptchaPresence(FALSE);
   }
 
+
+  /**
+   * CAPTCHA should also be put on admin pages even if visitor
+   * has no access
+   */
+  function testCaptchaOnLoginBlockOnAdminPagesIssue893810() {
+    // Set a CAPTCHA on login block form
+    captcha_set_form_id_setting('user_login_block', 'captcha/Math');
+
+    // Check if there is a CAPTCHA on home page.
+    $this->drupalGet('node');
+    $this->assertCaptchaPresence(TRUE);
+
+    // Check there is a CAPTCHA on "forbidden" admin pages
+    $this->drupalGet('admin');
+    $this->assertCaptchaPresence(TRUE);
+  }
+
 }
 
 
@@ -598,9 +616,9 @@ class CaptchaAdminTestCase extends CaptchaBaseWebTestCase {
   }
 
   /**
-   * Test the CAPTCHA placement flushing.
+   * Test the CAPTCHA placement clearing.
    */
-  function testCaptchaPlacementCacheFlushing() {
+  function testCaptchaPlacementCacheClearing() {
     // Set CAPTCHA on user register form.
     captcha_set_form_id_setting('user_register_form', 'captcha/Math');
     // Visit user register form to fill the CAPTCHA placement cache.
@@ -608,12 +626,12 @@ class CaptchaAdminTestCase extends CaptchaBaseWebTestCase {
     // Check if there is CAPTCHA placement cache.
     $placement_map = variable_get('captcha_placement_map_cache', NULL);
     $this->assertNotNull($placement_map, 'CAPTCHA placement cache should be set.');
-    // Flush the cache
+    // Clear the cache
     $this->drupalLogin($this->admin_user);
-    $this->drupalPost(self::CAPTCHA_ADMIN_PATH, array(), t('Flush the CAPTCHA placement cache'));
+    $this->drupalPost(self::CAPTCHA_ADMIN_PATH, array(), t('Clear the CAPTCHA placement cache'));
     // Check that the placement cache is unset
     $placement_map = variable_get('captcha_placement_map_cache', NULL);
-    $this->assertNull($placement_map, 'CAPTCHA placement cache should be unset after flush.');
+    $this->assertNull($placement_map, 'CAPTCHA placement cache should be unset after cache clear.');
   }
 
   /**
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha-rtl.css b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha-rtl.css
deleted file mode 100644
index 8785e86..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha-rtl.css
+++ /dev/null
@@ -1,14 +0,0 @@
-/* $Id: image_captcha-rtl.css,v 1.1.2.1 2010/11/29 23:33:37 soxofaan Exp $ */
-
-/**
- * Styling of the font selection list (with previews)
- * on the Image CAPTCHA settings page.
- */
-
-/**
- * Float the fonts with preview (with a fixed width)
- * to create a multi-column layout.
- */
-.image_captcha_admin_font_preview {
-  float: right;
-}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.admin.inc b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.admin.inc
index b3c9f02..5bf39fc 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.admin.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.admin.inc
@@ -59,6 +59,17 @@ function image_captcha_settings_form() {
     '#default_value' => (int) variable_get('image_captcha_code_length', 5),
     '#description' => t('The code length influences the size of the image. Note that larger values make the image generation more CPU intensive.'),
   );
+  // RTL support option (only show this option when there are RTL languages).
+  $languages = language_list('direction');
+  if (isset($languages[LANGUAGE_RTL])) {
+    $form['image_captcha_code_settings']['image_captcha_rtl_support'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('RTL support'),
+      '#default_value' => variable_get('image_captcha_rtl_support', 0),
+      '#description' => t('Enable this option to render the code from right to left for right to left languages.'),
+    );
+  }
+
 
   // Font related stuff.
   $form['image_captcha_font_settings'] = _image_captcha_settings_form_font_section();
@@ -89,11 +100,11 @@ function image_captcha_settings_form() {
     '#type' => 'select',
     '#title' => t('Additional variation of text color'),
     '#options' => array(
-      0 => t('none'),
-      50 => t('small'),
-      100 => t('moderate'),
-      150 => t('high'),
-      200 => t('very high'),
+      0 => t('No variation'),
+      50 => t('Little variation'),
+      100 => t('Medium variation'),
+      150 => t('High variation'),
+      200 => t('Very high variation'),
     ),
     '#default_value' => (int) variable_get('image_captcha_foreground_color_randomness', 100),
     '#description' => t('The different characters will have randomized colors in the specified range around the text color.'),
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.info b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.info
index d09b65c..1c0e9b1 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.info
@@ -10,9 +10,9 @@ files[] = image_captcha.module
 files[] = image_captcha.admin.inc
 files[] = image_captcha.user.inc
 
-; Information added by drupal.org packaging script on 2012-01-02
-version = "7.x-1.0-beta2"
+; Information added by drupal.org packaging script on 2013-06-25
+version = "7.x-1.0"
 core = "7.x"
 project = "captcha"
-datestamp = "1325504137"
+datestamp = "1372203950"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.module b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.module
index 485510c..fc1e850 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.module
@@ -229,7 +229,13 @@ function image_captcha_captcha($op, $captcha_type='', $captcha_sid=NULL) {
         // Generate image source URL (add timestamp to avoid problems with
         // client side caching: subsequent images of the same CAPTCHA session
         // have the same URL, but should display a different code).
-        $img_src = check_url(url("image_captcha/$captcha_sid/" . REQUEST_TIME));
+        $options = array(
+          'query' => array(
+            'sid' => $captcha_sid,
+            'ts' => REQUEST_TIME,
+          ),
+        );
+        $img_src = check_url(url("image_captcha", $options));
         list($width, $height) = _image_captcha_image_size($code);
         // TODO: start using a theming funtion for generating the image markup?
         $result['form']['captcha_image'] = array(
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.user.inc b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.user.inc
index 38434f4..07aeb84 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.user.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/image_captcha/image_captcha.user.inc
@@ -11,15 +11,16 @@
 /**
  * Menu callback function that generates the CAPTCHA image.
  */
-function image_captcha_image($captcha_sid=NULL) {
+function image_captcha_image() {
   // If output buffering is on: discard current content and disable further buffering
   if (ob_get_level()) {
     ob_end_clean();
   }
-  
-  if (!$captcha_sid) {
+
+  if (!isset($_GET['sid'])) {
     exit();
   }
+  $captcha_sid = $_GET['sid'];
 
   // Get solution (the code to show).
   $code = db_query("SELECT solution FROM {captcha_sessions} WHERE csid = :csid",
@@ -96,8 +97,12 @@ function _image_captcha_generate_image($code) {
   }
   imagefilledrectangle($image, 0, 0, $width, $height, $background_color);
 
+  // Do we need to draw in RTL mode?
+  global $language;
+  $rtl = $language->direction && ((bool) variable_get('image_captcha_rtl_support', 0));
+
   // draw text
-  $result = _image_captcha_image_generator_print_string($image, $width, $height, $fonts, $font_size, $code);
+  $result = _image_captcha_image_generator_print_string($image, $width, $height, $fonts, $font_size, $code, $rtl);
   if (!$result) {
     return FALSE;
   }
@@ -230,7 +235,7 @@ function _image_captcha_image_generator_add_dots(&$image, $width, $height, $colo
 /**
  * Helper function for drawing text on the image.
  */
-function _image_captcha_image_generator_print_string(&$image, $width, $height, $fonts, $font_size, $text) {
+function _image_captcha_image_generator_print_string(&$image, $width, $height, $fonts, $font_size, $text, $rtl=FALSE) {
   // get characters
   $characters = _image_captcha_utf8_split($text);
   $character_quantity = count($characters);
@@ -260,6 +265,9 @@ function _image_captcha_image_generator_print_string(&$image, $width, $height, $
   foreach ($characters as $c => $character) {
     // initial position of character: in the center of its cage
     $center_x = ($c + 0.5) * $ccage_width;
+    if ($rtl) {
+      $center_x = $width - $center_x;
+    }
     $center_y = 0.5 * $height;
 
     // Pick a random font from the list.
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/da.po b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/da.po
deleted file mode 100644
index dc76738..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/da.po
+++ /dev/null
@@ -1,875 +0,0 @@
-# Dansk translation of captcha (6.x-2.0-beta5)
-# Copyright (c) 2009 by the Dansk translation team
-# Generated from files:
-# captcha.admin.inc,v 1.24 2009/05/14 22:47:37 soxofaan
-# image_captcha.admin.inc,v 1.19 2009/05/14 22:47:38 soxofaan
-# captcha.module,v 1.89 2009/05/17 17:02:20 soxofaan
-# captcha.info,v 1.7 2008/02/17 12:49:24 soxofaan
-# image_captcha.user.inc,v 1.19 2009/04/24 22:16:48 soxofaan
-# image_captcha.module,v 1.25 2009/05/14 22:47:38 soxofaan
-# captcha.inc,v 1.4 2009/05/03 21:20:46 soxofaan
-# captcha.install,v 1.9 2009/03/22 20:06:39 soxofaan
-# image_captcha.info,v 1.5 2008/02/17 12:49:24 soxofaan
-# 
-# 
-msgid ""
-msgstr ""
-"Project-Id-Version: captcha (6.x-2.0-beta5)\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-05-29 02:46-0700\n"
-"PO-Revision-Date: 2009-05-29 11:47+0200\n"
-"Last-Translator: Morten Wulff <wulff at ratatosk.net>\n"
-"Language-Team: Dansk <dansk at klid.dk>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n!=1);"
-
-#: captcha.admin.inc:176
-msgid "Save configuration"
-msgstr "Gem indstillinger"
-
-#: captcha.admin.inc:83
-msgid "delete"
-msgstr "slet"
-
-#: captcha.admin.inc:186
-msgid "Operations"
-msgstr "Handlinger"
-
-#: captcha.admin.inc:359
-msgid "Delete"
-msgstr "Slet"
-
-#: captcha.admin.inc:318
-msgid "Save"
-msgstr "Gem"
-
-#: captcha.admin.inc:16; image_captcha/image_captcha.admin.inc:148,170
-msgid "none"
-msgstr "ingen"
-
-#: image_captcha/image_captcha.admin.inc:138
-msgid "Text color"
-msgstr "Tekstfarve"
-
-#: captcha.module:34
-msgid "Location of comment submission form"
-msgstr "Placering af formular"
-
-#: captcha.module:35
-msgid "Display on separate page"
-msgstr "Vis på separat side"
-
-#: captcha.module:76
-msgid "General settings"
-msgstr "Generelle indstillinger"
-
-#: captcha.admin.inc:363
-msgid "Disable"
-msgstr "Deaktivér"
-
-#: captcha.module:327
-msgid "disable"
-msgstr "deaktivér"
-
-#: captcha.module:263,311,118,211,413,59,70; captcha.info:0; image_captcha/image_captcha.user.inc:29,72; image_captcha/image_captcha.module:94
-msgid "CAPTCHA"
-msgstr "CAPTCHA"
-
-#: image_captcha/image_captcha.admin.inc:130
-msgid "Background color"
-msgstr "Baggrundsfarve"
-
-#: image_captcha/image_captcha.admin.inc:151,174
-msgid "high"
-msgstr "høj"
-
-#: image_captcha/image_captcha.admin.inc:96,117,173
-msgid "normal"
-msgstr "normal"
-
-#: image_captcha/image_captcha.admin.inc:171
-msgid "low"
-msgstr "lav"
-
-#: captcha.module:30
-msgid ""
-"\"CAPTCHA\" is an acronym for \"Completely Automated Public Turing "
-"test to tell Computers and Humans Apart\". It is typically a "
-"challenge-response test to determine whether the user is human. The "
-"CAPTCHA module is a tool to fight automated submission by malicious "
-"users (spamming) of for example comments forms, user registration "
-"forms, guestbook forms, etc. You can extend the desired forms with an "
-"additional challenge, which should be easy for a human to solve "
-"correctly, but hard enough to keep automated scripts and spam bots "
-"out."
-msgstr ""
-"CAPTCHA er et akronym for \"Completely Automated Public Turing test to "
-"tell Computers and Humans Apart\" (fulstændig automatisk offentlig "
-"Turing-test til at skille computere fra mennesker). Det er typisk en "
-"udfordring-svar test som bestemmer hvorvidt brugeren er et menneske. "
-"CAPTCHA-modulet er et værktøj til bekæmpelse af ondsindede brugeres "
-"automatiske indsendelse (spamming) af kommentarformularer, "
-"brugeroprettelser, gæstebogsindlæg osv. Du kan udvide de ønskede "
-"formularer med en yderligere udfordring, som vil være let at løse "
-"for mennesker men svær nok til at holde automatiske scripts og "
-"spam-robotter ude."
-
-#: captcha.module:39
-msgid "CAPTCHA is a trademark of Carnegie Mellon University."
-msgstr "CAPTCHA er et varemærke tilhørende Carnegie Mellon University."
-
-#: captcha.module:60
-msgid "Administer how and where CAPTCHAs are used."
-msgstr "Administrer hvor og hvordan CAPTCHAs bruges."
-
-#: captcha.module:82
-msgid "Examples"
-msgstr "Eksempler"
-
-#: captcha.module:83
-msgid "An overview of the available challenge types with examples."
-msgstr "En oversigt over de forskellige udfordringstyper med eksempler."
-
-#: captcha.inc:131
-msgid ""
-"This question is for testing whether you are a human visitor and to "
-"prevent automated spam submissions."
-msgstr ""
-"Dette spørgsmål tester hvorvidt du er et menneske og forhindrer "
-"automatisk indsendelse af spam."
-
-#: captcha.admin.inc:380
-msgid "Disabled CAPTCHA for form %form_id."
-msgstr "CAPTCHA for formular %form_id deaktiveret."
-
-#: captcha.admin.inc:376
-msgid "Deleted CAPTCHA for form %form_id."
-msgstr "CAPTCHA for formular %form_id slettet."
-
-#: captcha.admin.inc:122,137
-msgid "Challenge description"
-msgstr "Beskrivelse af udfordring"
-
-#: captcha.admin.inc:123,138
-msgid ""
-"With this description you can explain the purpose of the challenge to "
-"the user."
-msgstr ""
-"Med denne beskrivelse kan du forklarer formålet med udfordringen til "
-"brugeren."
-
-#: captcha.admin.inc:128
-msgid "For language %lang_name (code %lang_code)"
-msgstr "For sproget %lang_name (kode %lang_code)"
-
-#: captcha.admin.inc:155
-msgid "Persistence"
-msgstr "Vedholdenhed"
-
-#: captcha.admin.inc:158
-msgid "Always add a challenge."
-msgstr "Tilføj altid en udfordring."
-
-#: captcha.admin.inc:159
-msgid ""
-"Omit challenges for a form once the user has successfully responded to "
-"a challenge for that form."
-msgstr ""
-"Udelad udfordringer fra en formular når brugeren har klaret "
-"udfordringen for den pågældende formular."
-
-#: captcha.admin.inc:160
-msgid ""
-"Omit challenges for all forms once the user has successfully responded "
-"to a challenge."
-msgstr ""
-"Udelad udfordringer fra alle formularer når brugeren har klaret "
-"udfordringen for en formular."
-
-#: captcha.admin.inc:162
-msgid ""
-"Define if challenges should be omitted during the rest of a session "
-"once the user successfully responses to a challenge."
-msgstr ""
-"Angiv om udfordringerne skal udelades under resten af en session når "
-"brugeren har givet et korrekt svar på en udfordring."
-
-#: captcha.admin.inc:168
-msgid "Log wrong responses"
-msgstr "Log forkerte svar"
-
-#: captcha.admin.inc:255
-msgid "The CAPTCHA settings were saved."
-msgstr "Indstillinger for CAPTCHA gemt."
-
-#: captcha.module:211
-msgid ""
-"CAPTCHA problem: hook_captcha() of module %module returned nothing "
-"when trying to retrieve challenge type %type for form %form_id."
-msgstr ""
-"CAPTCHA-problem: hook_captcha() fra modulet %module returnerede intet "
-"under forsøget på at hente udfordringstypen %type for formularen "
-"%form_id."
-
-#: captcha.module:408
-msgid "The answer you entered for the CAPTCHA was not correct."
-msgstr "Svaret, som du indtastede på CAPTCHAen, er ikke korrekt."
-
-#: captcha.module:413
-msgid ""
-"%form_id post blocked by CAPTCHA module: challenge \"%challenge\" (by "
-"module \"%module\"), user answered \"%response\", but the solution was "
-"\"%solution\"."
-msgstr ""
-"%form_id-indsendelse blokeret af CAPTCHA-modulet: udfordring "
-"\"%challenge\" (fra modulet \"%module\"), brugeren svarede "
-"\"%response\", men løsningen var \"%solution\"."
-
-#: captcha.admin.inc:417
-msgid ""
-"This page gives an overview of all available challenge types, "
-"generated with their current settings."
-msgstr ""
-"Denne side giver et overblik over alle tilgængelige udfordringstyper "
-"genereret med deres aktuelle indstillinger."
-
-#: captcha.admin.inc:425
-msgid "Challenge \"%challenge\" by module \"%module\""
-msgstr "Udfordring \"%challenge\" fra modulet \"%module\""
-
-#: captcha.admin.inc:428
-msgid "10 more examples of this challenge."
-msgstr "10 eksempler til på denne udfordring."
-
-#: captcha.module:497
-msgid ""
-"Solve this simple math problem and enter the result. E.g. for 1+3, "
-"enter 4."
-msgstr ""
-"Løs denne simple matematikopgave og indtast resultatet. Indtast "
-"f.eks. 4 hvis opgaven er 1+3."
-
-#: captcha.module:498
-msgid "@x + @y = "
-msgstr "@x + @y = "
-
-#: captcha.admin.inc:107; captcha.module:106
-msgid "administer CAPTCHA settings"
-msgstr "administrer CAPTCHA-indstillinger"
-
-#: captcha.module:47,106
-msgid "skip CAPTCHA"
-msgstr "spring over CAPTCHA"
-
-#: captcha.module:0
-msgid "captcha"
-msgstr "captcha"
-
-#: captcha.install:156
-msgid "Unsupported database."
-msgstr "Database ikke understøttet."
-
-#: captcha.info:0
-msgid "Base CAPTCHA module for adding challenges to arbitrary forms."
-msgstr ""
-"Basalt CAPTCHA-modul som tilføjer udfordringer til vilkårlige "
-"formularer."
-
-#: captcha.info:0; image_captcha/image_captcha.info:0
-msgid "Spam control"
-msgstr "Spam-kontrol"
-
-#: image_captcha/image_captcha.module:179,40; image_captcha/image_captcha.info:0
-msgid "Image CAPTCHA"
-msgstr "Billed-CAPTCHA"
-
-#: image_captcha/image_captcha.admin.inc:13
-msgid "Built-in font"
-msgstr "Indbygget skrifttype"
-
-#: image_captcha/image_captcha.admin.inc:57
-msgid "Code settings"
-msgstr "Kodeindstillinger"
-
-#: image_captcha/image_captcha.admin.inc:61
-msgid "Characters to use in the code"
-msgstr "Tegn som bruges i koden"
-
-#: image_captcha/image_captcha.admin.inc:66
-msgid "Code length"
-msgstr "Kodelængde"
-
-#: image_captcha/image_captcha.admin.inc:69
-msgid ""
-"The code length influences the size of the image. Note that larger "
-"values make the image generation more CPU intensive."
-msgstr ""
-"Kodelængden har betydning for billedets størrelse. Bemærk at "
-"større værdier gør genereringen af billedet mere CPU-tung."
-
-#: image_captcha/image_captcha.admin.inc:75
-msgid "Font settings"
-msgstr "Skrifttypeindstillinger"
-
-#: image_captcha/image_captcha.admin.inc:81
-msgid "Font"
-msgstr "Skrift"
-
-#: image_captcha/image_captcha.admin.inc:83
-msgid "The TrueType font (.ttf) to use for the text in the image CAPTCHA."
-msgstr ""
-"TrueType skrifttypen (.ttf) som skal bruges til teksten i "
-"billed-CAPTCHAen."
-
-#: image_captcha/image_captcha.admin.inc:92
-msgid "Font size"
-msgstr "Skriftstørrelse"
-
-#: image_captcha/image_captcha.admin.inc:94
-msgid "tiny"
-msgstr "lillebitte"
-
-#: image_captcha/image_captcha.admin.inc:95,116,149
-msgid "small"
-msgstr "lille"
-
-#: image_captcha/image_captcha.admin.inc:97,118
-msgid "large"
-msgstr "stor"
-
-#: image_captcha/image_captcha.admin.inc:100
-msgid ""
-"The font size influences the size of the image. Note that larger "
-"values make the image generation more CPU intensive."
-msgstr ""
-"Skriftstørrelsen har betydning for billedets størrelse. Bemærk at "
-"større værdier gør genereringen af billedet mere CPU-tung."
-
-#: image_captcha/image_captcha.admin.inc:112
-msgid "Character spacing"
-msgstr "Spatiering"
-
-#: image_captcha/image_captcha.admin.inc:113
-msgid ""
-"Define the average spacing between characters. Note that larger values "
-"make the image generation more CPU intensive."
-msgstr ""
-"Angiv den gennemsnitlige afstand mellem tegnene. Bemærk at større "
-"værdier gør genereringen af billedet mere CPU-tung."
-
-#: image_captcha/image_captcha.admin.inc:162
-msgid "Distortion and noise"
-msgstr "Forvrængning og støj"
-
-#: image_captcha/image_captcha.admin.inc:163
-msgid ""
-"With these settings you can control the degree of obfuscation by "
-"distortion and added noise. Do not exaggerate the obfuscation and "
-"assure that the code in the image is reasonably readable. For example, "
-"do not combine high levels of distortion and noise."
-msgstr ""
-"Med disse indstillinger kan du kontrollér hvor godt tekststrengen "
-"skal skjules med forvrængning og støj. Du bør ikke overdrive "
-"forvrængningen og du skal sikre dig at koden i billede er nogenlunde "
-"læselig. Du bør f.eks. ikke kombinere store mængder af "
-"forvrængning og støj."
-
-#: image_captcha/image_captcha.admin.inc:168
-msgid "Distortion level"
-msgstr "Forvrængningsniveau"
-
-#: image_captcha/image_captcha.admin.inc:150,172
-msgid "moderate"
-msgstr "moderat"
-
-#: image_captcha/image_captcha.admin.inc:175
-msgid "severe"
-msgstr "kraftig"
-
-#: image_captcha/image_captcha.admin.inc:178
-msgid "Set the degree of wave distortion in the image."
-msgstr "Angiv mængden af bølge-forvrænging i billedet."
-
-#: image_captcha/image_captcha.admin.inc:182
-msgid "Smooth distortion"
-msgstr "Jævn forvrængning"
-
-#: image_captcha/image_captcha.admin.inc:191
-msgid "This option adds randomly colored point noise."
-msgstr "Tilføjer tilfældig  farvet punktstøj."
-
-#: image_captcha/image_captcha.admin.inc:195
-msgid "Add line noise"
-msgstr "Tilføj linjestøj"
-
-#: image_captcha/image_captcha.admin.inc:197
-msgid "This option enables lines randomly drawn on top of the text code."
-msgstr "Tegner tilfældige linjer ovenpå teksten."
-
-#: image_captcha/image_captcha.admin.inc:201
-msgid "Noise level"
-msgstr "Støjniveau"
-
-#: image_captcha/image_captcha.admin.inc:234
-msgid ""
-"The usage of the built-in bitmap font it is not recommended because of "
-"its small size and missing UTF-8 support."
-msgstr ""
-"Brugen af den indbyggede bitmap-skrifttype er ikke anbefalet på grund "
-"af dens lille størrelse og manglende UTF8-understøttelse."
-
-#: image_captcha/image_captcha.admin.inc:245
-msgid "The list of characters to use should not contain spaces."
-msgstr "Listen af anvendte tegn skal ikke indeholde mellemrum."
-
-#: image_captcha/image_captcha.admin.inc:250
-msgid "You need to select a font"
-msgstr "Du skal vælge en skrifttype"
-
-#: image_captcha/image_captcha.admin.inc:253
-msgid "Font does not exist or is not readable."
-msgstr "Skrifttypen eksisterer ikke eller er ikke læsbar."
-
-#: image_captcha/image_captcha.module:94
-msgid ""
-"Encountered an illegal byte while splitting an utf8 string in "
-"characters."
-msgstr ""
-"Stødte på en ugyldig byte ved opsplitning af en UTF8-tekststreng i "
-"tegn."
-
-#: image_captcha/image_captcha.module:184
-msgid "What code is in the image?"
-msgstr "Hvilken kode vises i billedet?"
-
-#: image_captcha/image_captcha.user.inc:29
-msgid ""
-"Generation of image CAPTCHA failed. Check your image CAPTCHA "
-"configuration and especially the used font."
-msgstr ""
-"Generereing af billed-CAPTCHA mislykkedes. Undersøg dine Image "
-"CAPTCHA indstillinger og især den anvendte skrifttype."
-
-#: image_captcha/image_captcha.module:0
-msgid "image_captcha"
-msgstr "image_captcha"
-
-#: image_captcha/image_captcha.info:0
-msgid "Provides an image based CAPTCHA."
-msgstr "Tilbyder en billedbaseret CAPTCHA."
-
-#: captcha.admin.inc:41,105; captcha.module:45
-msgid "Add CAPTCHA administration links to forms"
-msgstr "Tilføj CAPTCHA-administrationslinks til formularer"
-
-#: captcha.admin.inc:169
-msgid "Report information about wrong responses to the !log."
-msgstr "Gem information om forkerte besvarelser i !log."
-
-#: captcha.admin.inc:169
-msgid "log"
-msgstr "log"
-
-#: captcha.admin.inc:287,301
-msgid "Form ID"
-msgstr "Formular ID"
-
-#: captcha.admin.inc:288,302
-msgid "The Drupal form_id of the form to add the CAPTCHA to."
-msgstr "Drupal form_id for formularen som CAPTCHA skal tilføjees til."
-
-#: captcha.admin.inc:186,308
-msgid "Challenge type"
-msgstr "Udfordringstype"
-
-#: captcha.admin.inc:309
-msgid "The CAPTCHA type to use for this form"
-msgstr "CAPTCHA-typen som skal bruges til denne formular"
-
-#: captcha.admin.inc:213,329
-msgid "Illegal form_id"
-msgstr "Ugyldig form_id"
-
-#: captcha.admin.inc:341
-msgid "Saved CAPTCHA point settings."
-msgstr "CAPTCHA-indstillinger gemt."
-
-#: captcha.admin.inc:358
-msgid "Are you sure you want to delete the CAPTCHA for form_id %form_id?"
-msgstr "Ønsker du at slette CAPTCHA for form_id %form_id?"
-
-#: captcha.admin.inc:362
-msgid "Are you sure you want to disable the CAPTCHA for form_id %form_id?"
-msgstr "Ønsker du at deaktivere CAPTCHA for form_id %form_id?"
-
-#: captcha.module:31
-msgid ""
-"Note that the CAPTCHA module interacts with page caching (see <a "
-"href=\"!performancesettings\">performance settings</a>). Because the "
-"challenge should be unique for each generated form, the caching of the "
-"page it appears on is prevented. Make sure that these forms do not "
-"appear on too many pages or you will lose much caching efficiency. For "
-"example, if you put a CAPTCHA on the user login block, which typically "
-"appears on each page for anonymous visitors, caching will practically "
-"be disabled. The comment submission forms are another example. In this "
-"case you should set the \"%commentlocation\" to \"%separatepage\" in "
-"the comment settings of the relevant <a href=\"!contenttypes\">content "
-"types</a> for better caching efficiency."
-msgstr ""
-"Bemærk at CAPTCHA-modulet interagerer med sidecaching (ee <a "
-"href=\"!performancesettings\">indstillinger for ydelse</a>). Fordi "
-"udfordringen skal være unik for hver genereret formular forhindres "
-"caching af siden hvor formularen optræder. Forvis dig om at disse "
-"formularer ikke optræder på for mange sider eller du vil miste en "
-"del cacheffektivitet. Hvis du f.eks. tilføjer CAPTCHA til "
-"login-blokken, som typisk optræder på alle sider for anonyme "
-"brugere, vil caching i praksis være deaktiveret. "
-"Kommentarformularerne er et andet eksempel. I dette tilfælde skal du "
-"sætte \"%commentlocation\" til \"%separatepage\" under <a "
-"href=\"!commentsettings\">kommentarindstillingerne</a> for bedre "
-"cache-effektivitet."
-
-#: captcha.module:44
-msgid ""
-"A CAPTCHA can be added to virtually each Drupal form. Some default "
-"forms are already provided in the form list, but arbitrary forms can "
-"be easily added and managed when the option \"%adminlinks\" is "
-"enabled."
-msgstr ""
-"En CAPTCHA kan tilføjes til praktisk talt enhver Drupal-formular. "
-"Enkelte standardformularer er til rådighed i formularlisten, men "
-"vilkårlige formularer kan let tilføjes og håndteres når "
-"\"%adminlinks\" er aktiveret."
-
-#: captcha.module:46
-msgid ""
-"Users with the \"%skipcaptcha\" <a href=\"@perm\">permission</a> won't "
-"be offered a challenge. Be sure to grant this permission to the "
-"trusted users (e.g. site administrators). If you want to test a "
-"protected form, be sure to do it as a user without the "
-"\"%skipcaptcha\" permission (e.g. as anonymous user)."
-msgstr ""
-"Brugere med <a href=\"@perm\">tilladelsen</a> \"%skipcaptcha\" bliver "
-"ikke tilbudt en udfordring. Giv kun denne tilladelse til betroede "
-"brugere (f.eks. administratorer). Hvis du ønsker at teste en "
-"beskyttet formular skal du gøre det som en bruger uden tilladelsen "
-"\"%skipcaptcha\" (f.eks. som anonym bruger)."
-
-#: captcha.module:317
-msgid "Untrusted users will see a CAPTCHA here (!settings)."
-msgstr "Utroværdige brugere vil se en CAPTCHA her (!settings)."
-
-#: captcha.module:318
-msgid "general CAPTCHA settings"
-msgstr "generelle CAPTCHA-indstillinger"
-
-#: captcha.module:322
-msgid "Enabled challenge"
-msgstr "Udfordring aktiveret"
-
-#: captcha.module:323
-msgid "\"@type\" by module \"@module\" (!change, !disable)"
-msgstr "\"@type\" af modul \"@module\" (!change, !disable)"
-
-#: captcha.module:326
-msgid "change"
-msgstr "skift"
-
-#: captcha.module:344
-msgid "Place a CAPTCHA here for untrusted users."
-msgstr "Placér en CAPTCHA her for utroværdige brugere."
-
-#: captcha.install:115
-msgid ""
-"You can now <a href=\"!captcha_admin\">configure the CAPTCHA "
-"module</a> for your site."
-msgstr ""
-"Du kan nu <a href=\"!captcha_admin\">indstille CAPTCHA-modulet</a> på "
-"dit site."
-
-#: image_captcha/image_captcha.admin.inc:125
-msgid "Color settings"
-msgstr "Farveindstillinger"
-
-#: image_captcha/image_captcha.admin.inc:126
-msgid "Configuration of the background and text colors in the image CAPTCHA."
-msgstr "Indstilling af baggrunds- og tekstfarver i billed-CAPTCHA."
-
-#: image_captcha/image_captcha.admin.inc:131
-msgid ""
-"Enter the hexadecimal code for the background color (e.g. #FFF or "
-"#FFCE90)."
-msgstr ""
-"Indtast den hexadecimale kode for baggrundsfarven (f.eks. #FFF eller "
-"#FFCE90)."
-
-#: image_captcha/image_captcha.admin.inc:139
-msgid "Enter the hexadecimal code for the text color (e.g. #000 or #004283)."
-msgstr ""
-"Indtast den hexadecimale kode for tekstfarven (f.eks. #000 eller "
-"#004283)."
-
-#: image_captcha/image_captcha.admin.inc:146
-msgid "Additional variation of text color"
-msgstr "Variation i tekstfarve"
-
-#: image_captcha/image_captcha.admin.inc:152
-msgid "very high"
-msgstr "meget høj"
-
-#: image_captcha/image_captcha.admin.inc:155
-msgid ""
-"The different characters will have randomized colors in the specified "
-"range around the text color."
-msgstr ""
-"De forskellige tegn får tilfældige farver i det angivne interval "
-"omkring tekstfarven."
-
-#: image_captcha/image_captcha.admin.inc:258
-msgid "Background color is not a valid hexadecimal color value."
-msgstr "Baggrundsfarven er ikke en gyldig hexadecimal farveværdi."
-
-#: image_captcha/image_captcha.admin.inc:261
-msgid "Text color is not a valid hexadecimal color value."
-msgstr "Tekstfarven er ikke en gyldig hexadecimal farveværdi."
-
-#: captcha.module:517
-msgid "Test"
-msgstr "Test"
-
-#: captcha.admin.inc:39
-msgid "Form protection"
-msgstr "Formularbeskyttelse"
-
-#: captcha.admin.inc:40
-msgid ""
-"Select the challenge type you want for each of the listed forms "
-"(identified by their so called <em>form_id</em>'s). You can easily add "
-"arbitrary forms with textfield at the bottom of the table or with the "
-"help of the '%CAPTCHA_admin_links' option below."
-msgstr ""
-"Vælg typen af udfordring du ønsker for hver af de viste formularer "
-"(identificeret ved deres såkaldte <em>form_id</em>). Du kan let "
-"tilføje vilkårlige formularer med tekstfeltet i bunden af tabellen "
-"eller ved hjælp af '%CAPTCHA_admin_links' herunder."
-
-#: captcha.admin.inc:237
-msgid "Added CAPTCHA point."
-msgstr "CAPTCHA-punkt tilføjet."
-
-#: captcha.module:389
-msgid "CAPTCHA test failed (unknown csid)."
-msgstr "CAPTCHA-test mislykkedes (ukendt csid)."
-
-#: captcha.module:342
-msgid "CAPTCHA: no challenge enabled"
-msgstr "CAPTCHA: ingen udfordring aktiveret"
-
-#: captcha.module:92
-msgid "CAPTCHA point administration"
-msgstr "CAPTCHA pointadministration"
-
-#: image_captcha/image_captcha.admin.inc:184
-msgid ""
-"This option enables bilinear interpolation of the distortion which "
-"makes the image look smoother, but it is more CPU intensive."
-msgstr ""
-"Dette valg aktiverer biliniær interpolation af forvrængningen, som "
-"får billedet til at se mere jævnt ud, men er mere CPU-tungt."
-
-#: image_captcha/image_captcha.admin.inc:189
-msgid "Add salt and pepper noise"
-msgstr "Tilføj \"salt og peber\" støj"
-
-#: image_captcha/image_captcha.admin.inc:231
-msgid ""
-"The image CAPTCHA module works best with a TrueType font file (TTF) "
-"for generating the images, but because of licencing issues it is not "
-"allowed to package fonts with the module. A simple built-in bitmap "
-"font is provided as default instead. You can install TrueType fonts "
-"yourself by putting them in the fonts directory of the image CAPTCHA "
-"module (directory \"%fontsdir\") or by uploading them to your Drupal "
-"file system (directory \"%filesdir\") with for example the upload "
-"module."
-msgstr ""
-"Image CAPTCHA-modulet virker bedst med en TrueType skrifttypefil "
-"(.ttf) til generering af billederne, men på grund af licensproblemer "
-"er det ikke muligt at inkludere skrifttyper med modulet. Der bruges en "
-"simpel indbygget bitmap-skrifttype som standard i stedet. Du kan selv "
-"installere TrueType skrifttyper ved at placere dem i mappen fonts i "
-"Image CAPTCHA-modulets mappe (\"%fontsdir\") eller ved at uploade dem "
-"til dit Drupal filsystem (\"%filesdir\") med Upload-modulet."
-
-#: image_captcha/image_captcha.module:28
-msgid ""
-"The image CAPTCHA is a popular challenge where a random textual code "
-"is obfuscated in an image. The image is generated on the fly for each "
-"request, which is rather CPU intensive for the server. Be careful with "
-"the size and computation related settings."
-msgstr ""
-"Billed-CAPTCHAen er en populær udfordring hvor en tilfældig "
-"tekstkode skjules i et billede. Billedet genereres i farten for hver "
-"anmodning, hvilket er ganske CPU-intensivt for serveren. Vær varsom "
-"med størrelsen og de beregningsrelaterede indstillinger."
-
-#: image_captcha/image_captcha.module:169
-msgid "Enter the characters (without spaces) shown in the image."
-msgstr "Indtast tegnene som er vist på billeder (uden mellemrum)"
-
-#: image_captcha/image_captcha.module:166
-msgid ""
-"Enter the characters shown in the image. Ignore spaces and be careful "
-"about upper and lower case."
-msgstr ""
-"Indtast tegnene som vises på billeder. Ignorér mellemrum og vær "
-"omhyggelig med store og små bogstaver."
-
-#: captcha.module:316
-msgid "CAPTCHA: challenge \"@type\" enabled"
-msgstr "CAPTCHA: udfordring \"@type\" aktiveret"
-
-#: captcha.module:332; image_captcha/image_captcha.admin.inc:45
-msgid "Example"
-msgstr "Eksempel"
-
-#: captcha.module:333
-msgid "This is a pre-solved, non-blocking example of this challenge."
-msgstr ""
-"Dette er et ikke-blokerende og allerede løst eksempel på denne "
-"udfordring."
-
-#: captcha.module:119
-msgid "Already 1 blocked form submission"
-msgid_plural "Already @count blocked form submissions"
-msgstr[0] "Har allerede blokeret 1 formularindsendelse"
-msgstr[1] "Har allerede blokeret @count formularindsendelser"
-
-#: image_captcha/image_captcha.admin.inc:35
-msgid ""
-"The Image CAPTCHA module can not generate images because your PHP "
-"setup does not support it (no <a href=\"!gdlib\">GD library</a>)."
-msgstr ""
-"Image CAPTCHA-modulet kan ikke generere billeder fordi din "
-"PHP-opsætning ikke understøtter det (intet <a "
-"href=\"!gdlib\">GD-bibliotek</a>)."
-
-#: image_captcha/image_captcha.admin.inc:203
-msgid "1 - low"
-msgstr "1 - lav"
-
-#: image_captcha/image_captcha.admin.inc:205
-msgid "3 - medium"
-msgstr "3 - middel"
-
-#: image_captcha/image_captcha.admin.inc:207
-msgid "5 - high"
-msgstr "5 - høj"
-
-#: image_captcha/image_captcha.admin.inc:209
-msgid "10 - severe"
-msgstr "10 - alvorlig"
-
-#: image_captcha/image_captcha.admin.inc:226
-msgid ""
-"The Image CAPTCHA module can not use True Type fonts because your PHP "
-"setup does not support it. There is only a built-in bitmap font "
-"available."
-msgstr ""
-"Image CAPTCHA-modulet kan ikke bruge True Type skrifttyper fordi din "
-"PHP-opsætning ikke understøtter dem. Kun den indbyggede "
-"bitmap-skrifttype er tilgængelig."
-
-#: image_captcha/image_captcha.user.inc:72
-msgid ""
-"Could not find or read the configured font (\"%font\") for the image "
-"CAPTCHA."
-msgstr ""
-"Kan ikke finde eller læse den valgte skrifttype (\"%font\") for Image "
-"CAPTCHA."
-
-#: captcha.admin.inc:17
-msgid "default challenge type"
-msgstr "standard udfordringstype"
-
-#: captcha.admin.inc:23
-msgid "@type (from module @module)"
-msgstr "@type (fra modulet @module)"
-
-#: captcha.admin.inc:46
-msgid "Default challenge type"
-msgstr "Standard udfordringstype"
-
-#: captcha.admin.inc:47
-msgid ""
-"Select the default challenge type for CAPTCHAs. This can be overriden "
-"for each form if desired."
-msgstr ""
-"Vælg standardudfordringstypen for CAPTCHAer. Den kan tilsidesættes "
-"på hver formular hvis det ønskes."
-
-#: captcha.admin.inc:107
-msgid ""
-"This option makes it easy to manage CAPTCHA settings on forms. When "
-"enabled, users with the \"%admincaptcha\" permission will see a "
-"fieldset with CAPTCHA administration links on all forms, except on "
-"administrative pages."
-msgstr ""
-"Gør det nemt at administrere CAPTCHA-indstillinger på formularer. "
-"Brugere med tilladelsen \"%admincaptcha\" vil se en feltgruppe med "
-"CAPTCHA administrationslinks på alle formularer, undtagen på "
-"administrationssider."
-
-#: captcha.admin.inc:112
-msgid ""
-"Allow CAPTCHAs and CAPTCHA administration links on administrative "
-"pages"
-msgstr ""
-"Tillad CAPTCHAer og CAPTCHA administrationslinks på administrative "
-"sider."
-
-#: captcha.admin.inc:114
-msgid ""
-"This option makes it possible to add CAPTCHAs to forms on "
-"administrative pages. CAPTCHAs are disabled by default on "
-"administrative pages (which shouldn't be accessible to untrusted users "
-"normally) to avoid the related overhead. In some situations, e.g. in "
-"the case of demo sites, it can be usefull to allow CAPTCHAs on "
-"administrative pages."
-msgstr ""
-"Gør det muligt at tilføje CAPTCHAs til formularer på administrative "
-"sider. CAPTCHAs er som standard deaktiveret på administrative sider "
-"(som normalt ikke er tilgængelige for almindelige brugere) for at "
-"undgå de relaterede omkostninger. I visse situationer, f.eks. på "
-"demosites, kan det være nyttigt at tillade CAPTCHAs på "
-"administrative sider."
-
-#: captcha.admin.inc:147
-msgid "Case sensitive validation"
-msgstr "Versalfølsom validering"
-
-#: captcha.admin.inc:148
-msgid ""
-"Disable this option to ignore uppercase/lowercase errors in the "
-"response."
-msgstr "Deaktivér for at ignorere fejl i store/små bogstaver i svaret."
-
-#: captcha.inc:35
-msgid ""
-"Failed to set a CAPTCHA type for form %form_id: could not interpret "
-"value \"@captcha_type\""
-msgstr ""
-"Kunne ikke sætte en CAPTCHA-type på formularen %form_id: kunne ikke "
-"fortolke værdien \"@captcha_type\""
-
-#: captcha.module:496
-msgid "Math question"
-msgstr "Matematikspørgsmål"
-
-#: image_captcha/image_captcha.admin.inc:46
-msgid "Presolved image CAPTCHA example, generated with the current settings."
-msgstr ""
-"Forudfyldt billed-CAPTCHA eksempel, genereret med de aktuelle "
-"indstillinger."
-
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/de.po b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/de.po
deleted file mode 100644
index cf7f01f..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/de.po
+++ /dev/null
@@ -1,633 +0,0 @@
-# $Id: de.po,v 1.6.2.1 2010/08/17 12:12:59 soxofaan Exp $
-#
-# LANGUAGE translation of Drupal (general)
-# Copyright YEAR NAME <EMAIL at ADDRESS>
-# Generated from files:
-#  captcha.admin.inc,v 1.15 2009/02/02 19:44:08 soxofaan
-#  image_captcha.admin.inc,v 1.13 2009/02/06 18:02:29 soxofaan
-#  captcha.module,v 1.76 2009/02/06 17:45:20 soxofaan
-#  captcha.pages.inc,v 1.10 2009/02/06 17:45:20 soxofaan
-#  captcha.info,v 1.7 2008/02/17 12:49:24 soxofaan
-#  image_captcha.user.inc,v 1.15 2009/02/06 18:02:29 soxofaan
-#  image_captcha.module,v 1.18 2009/02/06 18:02:29 soxofaan
-#  captcha.install,v 1.8 2009/01/03 18:04:55 soxofaan
-#  image_captcha.info,v 1.5 2008/02/17 12:49:24 soxofaan
-#
-msgid ""
-msgstr "Project-Id-Version: PROJECT VERSION\n"
-"POT-Creation-Date: 2009-02-24 10:13+0100\n"
-"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n"
-"Last-Translator: drupalcenter.de - Drupal Voice Channel\n"
-"Language-Team: drupalcenter.de - Drupal Voice Channel\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n!=1);\n"
-
-#: captcha.admin.inc:13 image_captcha/image_captcha.admin.inc:128;150
-msgid "none"
-msgstr "keine"
-
-#: captcha.admin.inc:32
-msgid "Form protection"
-msgstr "Formularschutz"
-
-#: captcha.admin.inc:33
-msgid "Select the challenge type you want for each of the listed forms (identified by their so called <em>form_id</em>'s). You can easily add arbitrary forms with textfield at the bottom of the table or with the help of the '%CAPTCHA_admin_links' option below."
-msgstr "Wählen Sie einen Test, den Sie für jeden der aufgeführten Formularen (anhand der form_id). Über das Textfeld am Ende der Tabelle können beliebige Formulare unter Zuhilfenahme der Option '%CAPTCHA_admin_links' hinzugefügt werden."
-
-#: captcha.admin.inc:34;81 captcha.module:43
-msgid "Add CAPTCHA administration links to forms"
-msgstr "Füge CAPTCHA Verwaltungslinks zu Formularen hinzu"
-
-#: captcha.admin.inc:59
-msgid "delete"
-msgstr "löschen"
-
-#: captcha.admin.inc:83
-msgid "This option is very helpful to enable/disable challenges on forms. When enabled, users with the \"%admincaptcha\" permission will see CAPTCHA administration links on all forms (except on administrative pages, which shouldn't be accessible to untrusted users in the first place). These links make it possible to enable a challenge of the desired type or disable it."
-msgstr "Diese Option ist sehr hilfreich, zum Aktivieren bzw. Deaktivieren von Tests auf Formularen. Benutzer mit dem Recht \"%admincaptcha\" erhalten Links zur Verwaltung von CAPTCHA - Tests auf alle Formularen (ausgenommen Verwaltungs-Seiten). Einen Test des gewünschten Typs aktivieren oder deaktivieren."
-
-#: captcha.admin.inc:83 captcha.module:104
-msgid "administer CAPTCHA settings"
-msgstr "Einstellungen von CAPTCHA verwalten"
-
-#: captcha.admin.inc:91;106
-msgid "Challenge description"
-msgstr "Beschreibung des Test"
-
-#: captcha.admin.inc:92;107
-msgid "With this description you can explain the purpose of the challenge to the user."
-msgstr "Mit dieser Beschreibung wird dem Benutzer erklärt, warum diesr Test notwendig ist."
-
-#: captcha.admin.inc:97
-msgid "For language %lang_name (code %lang_code)"
-msgstr "Für die Sprache %lang_name (%lang_code)"
-
-#: captcha.admin.inc:116
-msgid "Persistence"
-msgstr "Gültigkeitsdauer"
-
-#: captcha.admin.inc:119
-msgid "Always add a challenge."
-msgstr "Füge immer einen Test hinzu."
-
-#: captcha.admin.inc:120
-msgid "Omit challenges for a form once the user has successfully responded to a challenge for that form."
-msgstr "Sobald der Benutzer einen Test für dieses Formular gelöst hat, werden Tests für das Formular übersprungen."
-
-#: captcha.admin.inc:121
-msgid "Omit challenges for all forms once the user has successfully responded to a challenge."
-msgstr "Sobald der Benutzer einen Test gelöst hat, werden Tests für alle Formulare übersprungen."
-
-#: captcha.admin.inc:123
-msgid "Define if challenges should be omitted during the rest of a session once the user successfully responses to a challenge."
-msgstr "Sobald der Benutzer einen Test gelöst hat, werden Tests für den Rest der Sitzung übersprungen."
-
-#: captcha.admin.inc:129
-msgid "Log wrong responses"
-msgstr "Falsche Antworten protokollieren"
-
-#: captcha.admin.inc:130
-msgid "Report information about wrong responses to the !log."
-msgstr "Informationen über falsche Antworten im !log festhalten."
-
-#: captcha.admin.inc:130
-msgid "log"
-msgstr "Protokoll"
-
-#: captcha.admin.inc:137
-msgid "Save configuration"
-msgstr "Konfiguration speichern"
-
-#: captcha.admin.inc:147
-msgid "Challenge type (module)"
-msgstr "Testtyp (Modul)"
-
-#: captcha.admin.inc:147
-msgid "Operations"
-msgstr "Operationen"
-
-#: captcha.admin.inc:188;300
-msgid "Illegal form_id"
-msgstr "Ungültige form_id"
-
-#: captcha.admin.inc:209
-msgid "Added CAPTCHA point."
-msgstr "CAPTCHA für Formular hinzugefügt."
-
-#: captcha.admin.inc:227
-msgid "The CAPTCHA settings were saved."
-msgstr "Die CAPTCHA Einstellungen wurden gespeichert."
-
-#: captcha.admin.inc:257;272
-msgid "Form ID"
-msgstr "Formular ID"
-
-#: captcha.admin.inc:258;273
-msgid "The Drupal form_id of the form to add the CAPTCHA to."
-msgstr "Die Drupal form_id des Formulars zu dem das CAPTCHA hinzugefügt werden soll."
-
-#: captcha.admin.inc:279
-msgid "Challenge type"
-msgstr "Testtyp"
-
-#: captcha.admin.inc:280
-msgid "The CAPTCHA type to use for this form"
-msgstr "Der CAPTCHA-Typ für dieses Formular."
-
-#: captcha.admin.inc:289
-msgid "Save"
-msgstr "Speichern"
-
-#: captcha.admin.inc:312
-msgid "Saved CAPTCHA point settings."
-msgstr "Einstellungen für CAPTCHA Zuordnung gespeichert."
-
-#: captcha.admin.inc:329
-msgid "Are you sure you want to delete the CAPTCHA for form_id %form_id?"
-msgstr "CAPTCHA für die form_id %form_id wirklich löschen?"
-
-#: captcha.admin.inc:330
-msgid "Delete"
-msgstr "Löschen"
-
-#: captcha.admin.inc:333
-msgid "Are you sure you want to disable the CAPTCHA for form_id %form_id?"
-msgstr "CAPTCHA für die form_id %form_id wirklich deaktivieren?"
-
-#: captcha.admin.inc:334
-msgid "Disable"
-msgstr "Deaktivieren"
-
-#: captcha.admin.inc:347
-msgid "Deleted CAPTCHA for form %form_id."
-msgstr "CAPTCHA für Formular %form_id gelöscht."
-
-#: captcha.admin.inc:351
-msgid "Disabled CAPTCHA for form %form_id."
-msgstr "CAPTCHA für Formular %form_id deaktiviert."
-
-#: captcha.admin.inc:386
-msgid "This page gives an overview of all available challenge types, generated with their current settings."
-msgstr "Diese Seite gibt einen Überblick aller verfügbaren Testtypen unter Verwendung ihrer aktuellen Einstellungen."
-
-#: captcha.admin.inc:394
-msgid "Challenge \"%challenge\" by module \"%module\""
-msgstr "Test \"%challenge\" pro Modul \"%module\""
-
-#: captcha.admin.inc:397
-msgid "10 more examples of this challenge."
-msgstr "10 weitere Beispiele dieses Test."
-
-#: (duplicate) captcha.pages.inc:52;39 captcha.module:186;116 ;263;57;68 captcha.info:0 image_captcha/image_captcha.user.inc:29 image_captcha/image_captcha.module:94
-msgid "CAPTCHA"
-msgstr "CAPTCHA"
-
-#: captcha.pages.inc:39
-msgid "CAPTCHA problem: hook_captcha() of module %module returned nothing when trying to retrieve challenge type %type for form %form_id."
-msgstr "CAPTCHA Problem: Die Rückgabe von hook_captcha() des Moduls %module ist fehlgeschlagen, als versucht wurde für das Formular %form_id den Testtyp %type zu erstellen."
-
-#: captcha.module:28
-msgid "\"CAPTCHA\" is an acronym for \"Completely Automated Public Turing test to tell Computers and Humans Apart\". It is typically a challenge-response test to determine whether the user is human. The CAPTCHA module is a tool to fight automated submission by malicious users (spamming) of for example comments forms, user registration forms, guestbook forms, etc. You can extend the desired forms with an additional challenge, which should be easy for a human to solve correctly, but hard enough to keep automated scripts and spam bots out."
-msgstr "CAPTCHA ist ein Akronym für Completely Automated Public Turing test to tell Computers and Humans Apart. Wörtlich übersetzt bedeutet das \"Vollautomatischer öffentlicher Turing-Test, um Computer und Menschen zu unterscheiden\". Es ist in der Regel ein Challenge-Response-Test, um festzustellen, ob der Benutzer menschlich ist. Das CAPTCHA-Modul ist ein Werkzeug zur automatisierten Überprüfung von Benutzern, um Spamming zu vermeiden, zB in Kommentaren,  bei der Benutzer-Registrierung, im Gästebuch Formulare, etc. Einzelne Formulare können mit einem zusätzlichen Test versehen werden, der einfach für eine Menschen zu lösen ist, aber schwer für automatisierte Skripte und Spam-Bots."
-
-#: captcha.module:29
-msgid "Note that the CAPTCHA module interacts with page caching (see <a href=\"!performancesettings\">performance settings</a>). Because the challenge should be unique for each generated form, the caching of the page it appears on is prevented. Make sure that these forms do not appear on too many pages or you will lose much caching efficiency. For example, if you put a CAPTCHA on the user login block, which typically appears on each page for anonymous visitors, caching will practically be disabled. The comment submission forms are another example. In this case you should set the \"%commentlocation\" to \"%separatepage\" in the comment settings of the relevant <a href=\"!contenttypes\">content types</a> for better caching efficiency."
-msgstr "Das CAPTCHA-Modul interagiert mit dem Seiten-Caching, siehe <a href=\"!performancesettings\">Performance-Einstellungen</a>. Da für jeden einzelnen Abruf des Formulars ein neuer Test erzeugt wird, werden die Formularseiten nicht in den Cache aufgenommen. Stellen Sie sicher, dass die Tests nicht auf zu viele Seiten erscheinen , sonst wird viel Effizienz verloren (Caching  deaktiviert für diese Seiten). Zum Beispiel, wenn Sie ein CAPTCHA auf dem User-Login-Block aktivieren, der in der Regel auf jeder Seite für anonyme Besucher erscheint, ist  das Caching damit praktisch ausgeschaltet. Der Kommentar Formulare sind ein weiteres Beispiel. In diesem Fall sollten Sie den \"%commentlocation\" auf \"%separatepage\" in den Kommentar-Einstellungen des jeweiligen <a href=\"!contenttypes\">Inhaltstpyen</a> für eine bessere Caching-Effizienz."
-
-#: captcha.module:32
-msgid "Location of comment submission form"
-msgstr "Position des Formulars zum Eingeben von Kommentaren"
-
-#: captcha.module:33
-msgid "Display on separate page"
-msgstr "Auf einer separaten Seite anzeigen."
-
-#: captcha.module:37
-msgid "CAPTCHA is a trademark of Carnegie Mellon University."
-msgstr "CAPTCHA ist ein Warenzeichen der Carnegie Mellon Universität."
-
-#: captcha.module:42
-msgid "A CAPTCHA can be added to virtually each Drupal form. Some default forms are already provided in the form list, but arbitrary forms can be easily added and managed when the option \"%adminlinks\" is enabled."
-msgstr "Ein CAPTCHA kann zu praktisch jedem Drupal-Formular hinzugefügt werden. Manche Standardformulare sind bereits in der Liste, zusätzliche Formulare können hinzugefügt und verwaltet werden, wenn die Option \"%adminlinks\" aktiviert ist."
-
-#: captcha.module:44
-msgid "Users with the \"%skipcaptcha\" <a href=\"@perm\">permission</a> won't be offered a challenge. Be sure to grant this permission to the trusted users (e.g. site administrators). If you want to test a protected form, be sure to do it as a user without the \"%skipcaptcha\" permission (e.g. as anonymous user)."
-msgstr "Benutzer mit der  \"%skipcaptcha\" <a href=\"@perm\">Berechtigung</a> werden vom Test ausgenommen. Achten Sie darauf, dieses Recht nur vertrauenswürdigen Benutzern zu gewähren (z. B. Website-Administratoren). Wenn Sie zu ein geschütztes Formular testen wollen, so sollten Sie es als Benutzer tun, ohne die \"%skipcaptcha\" Berechtigung (zB als anonymer Benutzer)."
-
-#: captcha.module:45;104
-msgid "skip CAPTCHA"
-msgstr "CAPTCHA überspringen"
-
-#: captcha.module:150
-msgid "This question is for testing whether you are a human visitor and to prevent automated spam submissions."
-msgstr "Diese Frage hat den Zweck zu testen, ob Sie ein menschlicher Benutzer sind und um automatisiertem Spam vorzubeugen."
-
-#: captcha.module:191
-msgid "CAPTCHA: \"@type\" enabled"
-msgstr "CAPTCHA: \"@type\" aktiviert"
-
-#: captcha.module:192
-msgid "Untrusted users will see a CAPTCHA here (!settings)."
-msgstr "Nicht vertauenswürdige Benutzer werden hier ein CAPTCHA sehen (!settings)."
-
-#: captcha.module:193
-msgid "general CAPTCHA settings"
-msgstr "Allgemeine CAPTCHA-Einstellungen"
-
-#: captcha.module:197
-msgid "Enabled challenge"
-msgstr "Test aktiviert"
-
-#: captcha.module:198
-msgid "\"@type\" by module \"@module\" (!change, !disable)"
-msgstr "\"@type\" pro Modul \"@module\" (!change, !disable)"
-
-#: captcha.module:201
-msgid "change"
-msgstr "Ändern"
-
-#: captcha.module:202
-msgid "disable"
-msgstr "Deaktivieren"
-
-#: captcha.module:207
-msgid "CAPTCHA: no challenge enabled"
-msgstr "CAPTCHA: keine Test aktiviert"
-
-#: captcha.module:209
-msgid "Place a CAPTCHA here for untrusted users."
-msgstr "Hier einen CAPTCHA für nicht vertrauenswürdige Benutzer platzieren."
-
-#: captcha.module:244
-msgid "CAPTCHA test failed (unknown csid)."
-msgstr "CAPTCHA fehlgeschlagen."
-
-#: captcha.module:258
-msgid "The answer you entered for the CAPTCHA was not correct."
-msgstr "Die von Ihnen eingegebene Antwort war nicht korrekt."
-
-#: captcha.module:398
-msgid "Math Question"
-msgstr "Mathematischer Test"
-
-#: captcha.module:399
-msgid "Solve this simple math problem and enter the result. E.g. for 1+3, enter 4."
-msgstr "Das einfache mathematische Problem ist zu lösen und das Ergebnis einzugeben.  Z.B. muss für 1+3 der Wert 4 eingegebene werden."
-
-#: captcha.module:400
-msgid "@x + @y = "
-msgstr "@x + @y =  "
-
-#: (duplicate) captcha.module:117 
-msgid "Already @counter blocked form submissions"
-msgstr "Es wurden bisher @counter Formulareingaben abgeblockt"
-
-#: captcha.module:263
-msgid "%form_id post blocked by CAPTCHA module: challenge \"%challenge\" (by module \"%module\"), user answered \"%response\", but the solution was \"%solution\"."
-msgstr "Der Beitrag von %form_id  wurde vom CAPTCHA Modul geblockt: Test \"%challenge\" (vom Modul \"%module\"), der Benutzer antwortete \"%response\", aber die Lösung war \"%solution\"."
-
-#: captcha.module:58
-msgid "Administer how and where CAPTCHAs are used."
-msgstr "Verwalten, wo und wie CAPTCHAs verwendet werden."
-
-#: captcha.module:74
-msgid "General settings"
-msgstr "Allgemeine Einstellungen"
-
-#: captcha.module:80
-msgid "Examples"
-msgstr "Beispiele"
-
-#: captcha.module:81
-msgid "An overview of the available challenge types with examples."
-msgstr "Überblick verfügbarer Testtypen mit Beispielen."
-
-#: captcha.module:90
-msgid "CAPTCHA point administration"
-msgstr "Verwaltung der CAPTCHA Zuordnungen"
-
-#: captcha.module:0
-msgid "captcha"
-msgstr "captcha"
-
-#: captcha.install:10
-msgid "This table describes which challenges should be added to which forms."
-msgstr "Diese Tabelle beschreibt, welche Test zu welchem Formular hinzugefügt wird."
-
-#: captcha.install:13
-msgid "The form_id of the form to add a CAPTCHA to."
-msgstr "Die form_id des Formulars, zu dem ein CAPTCHA hinzugefügt wird."
-
-#: captcha.install:19
-msgid "The module that provides the challenge."
-msgstr "Das Modul, das die Test bereitstellt."
-
-#: captcha.install:24
-msgid "The challenge type to use."
-msgstr "Der zu verwendende Testtyp."
-
-#: captcha.install:33;191
-msgid "Stores the data about CAPTCHA sessions (solution, IP address, timestamp, ...)."
-msgstr "Speichert die Daten der CAPTCHA Sessions (Lösung, IP Adresse, Zeit, ...)."
-
-#: captcha.install:36;194
-msgid "CAPTCHA session ID."
-msgstr "CAPTCHA Session-ID."
-
-#: captcha.install:41;199
-msgid "User's {users}.uid."
-msgstr "{users}.uid des Benutzers."
-
-#: captcha.install:47;205
-msgid "Session ID of the user."
-msgstr "Session-ID des Benutzers."
-
-#: captcha.install:54;212
-msgid "IP addres of visitor."
-msgstr "IP Adresse des Besuchers."
-
-#: captcha.install:60;218
-msgid "A Unix timestamp indicating when the challenge was generated."
-msgstr "Ein UNIX Zeitstempel, der den Generierungszeitpunkt der Frage markiert."
-
-#: captcha.install:66;224
-msgid "The form_id of the form where the CAPTCHA is added to."
-msgstr "Die form_id des Formulars, zu dem ein CAPTCHA hinzugefügt wird."
-
-#: captcha.install:72;230
-msgid "Solution of the challenge."
-msgstr "Lösung des Test."
-
-#: captcha.install:79;237
-msgid "Status of the CAPTCHA session (unsolved, solved, ...)"
-msgstr "Status der CAPTCHA Session (ungelöst, gelöst, ...)"
-
-#: captcha.install:85;243
-msgid "The number of attempts."
-msgstr "Anzahl der Versuche."
-
-#: captcha.install:114
-msgid "You can now <a href=\"!captcha_admin\">configure the CAPTCHA module</a> for your site."
-msgstr "Das CAPTCHA Modul kann jetzt auf der Seite <a href=\"!captcha_admin\">konfiguriert</a> werden."
-
-#: captcha.install:155
-msgid "Unsupported database."
-msgstr "Nicht unterstützte Datenbank."
-
-#: captcha.info:0
-msgid "Base CAPTCHA module for adding challenges to arbitrary forms."
-msgstr "Basis CAPTCHA Modul zur Erweiterung beliebiger Formulare mir einem CAPTCHA (Test)."
-
-#: captcha.info:0 image_captcha/image_captcha.info:0
-msgid "Spam control"
-msgstr "Spam Kontrolle"
-
-#: image_captcha/image_captcha.admin.inc:13
-msgid "Built-in font"
-msgstr "Eingebaute Schriftart"
-
-#: image_captcha/image_captcha.admin.inc:31
-msgid "Images cannot be generated, because your PHP installation's GD library has no JPEG support."
-msgstr "Bilder können nicht erzeugt werden, weil zum Erstellen des Bildes die GD-Bibliothek mit JPEG-Unterstützung erforderlich ist."
-
-#: image_captcha/image_captcha.admin.inc:36
-msgid "Code settings"
-msgstr "Texteigenschaften"
-
-#: image_captcha/image_captcha.admin.inc:40
-msgid "Characters to use in the code"
-msgstr "Zeichen, die im Text benutzt werden"
-
-#: image_captcha/image_captcha.admin.inc:45
-msgid "Code length"
-msgstr "Textlänge"
-
-#: image_captcha/image_captcha.admin.inc:48
-msgid "The code length influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr "Die Codelänge beeinflusst die Größe des Bildes. Je größer der Wert ist, desto mehr Rechenzeit wird aufgewandt, um das Bild zu erstellen."
-
-#: image_captcha/image_captcha.admin.inc:53
-msgid "Case insensitive validation"
-msgstr "Groß- und Kleinschreibung wird nicht unterschieden"
-
-#: image_captcha/image_captcha.admin.inc:54
-msgid "Enable this option to ignore uppercase/lowercase errors in the response. This can be usefull for certain target audiences or fonts."
-msgstr "Aktivieren Sie diese Option, um Groß-/ Kleinschreibung in der Antwort zu ignorieren. Dies kann für bestimmte Zielgruppen oder Schriftarten nützlich."
-
-#: image_captcha/image_captcha.admin.inc:61
-msgid "Font settings"
-msgstr "Schrifteinstellungen"
-
-#: image_captcha/image_captcha.admin.inc:67
-msgid "Font"
-msgstr "Schrift"
-
-#: image_captcha/image_captcha.admin.inc:69
-msgid "The TrueType font (.ttf) to use for the text in the image CAPTCHA."
-msgstr "TrueType-Schrift (.ttf) zur Erzeugung des Textes in einem Bild-CAPTCHA."
-
-#: image_captcha/image_captcha.admin.inc:78
-msgid "Font size"
-msgstr "Schriftgröße"
-
-#: image_captcha/image_captcha.admin.inc:80
-msgid "tiny"
-msgstr "winzig"
-
-#: image_captcha/image_captcha.admin.inc:81;96;129
-msgid "small"
-msgstr "klein"
-
-#: image_captcha/image_captcha.admin.inc:82;97;153;191
-msgid "normal"
-msgstr "normal"
-
-#: image_captcha/image_captcha.admin.inc:83;98
-msgid "large"
-msgstr "groß"
-
-#: image_captcha/image_captcha.admin.inc:86
-msgid "The font size influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr "Schriftgröße beeinflusst die Größe des Bildes. Je größer der Wert ist, desto mehr Rechenzeit wird aufgewandt, um das Bild zu erstellen."
-
-#: image_captcha/image_captcha.admin.inc:92
-msgid "Character spacing"
-msgstr "Zeichenabstand"
-
-#: image_captcha/image_captcha.admin.inc:93
-msgid "Define the average spacing between characters. Note that larger values make the image generation more CPU intensive."
-msgstr "Definieren Sie die durchschnittliche Abstand zwischen den Zeichen. Je größer der Wert ist, desto mehr Rechenzeit wird aufgewandt, um das Bild zu erstellen."
-
-#: image_captcha/image_captcha.admin.inc:105
-msgid "Color settings"
-msgstr "Farbeinstellungen"
-
-#: image_captcha/image_captcha.admin.inc:106
-msgid "Configuration of the background and text colors in the image CAPTCHA."
-msgstr "Einstellungen der Hintergrund- und Textfarbe für das Bild-CAPTCHA."
-
-#: image_captcha/image_captcha.admin.inc:110
-msgid "Background color"
-msgstr "Hintergrundfarbe"
-
-#: image_captcha/image_captcha.admin.inc:111
-msgid "Enter the hexadecimal code for the background color (e.g. #FFF or #FFCE90)."
-msgstr "Eingabe der Hintergrundfarbe in hexadezimaler Form (z.B. #FFF oder #FFCE90)."
-
-#: image_captcha/image_captcha.admin.inc:118
-msgid "Text color"
-msgstr "Schriftfarbe"
-
-#: image_captcha/image_captcha.admin.inc:119
-msgid "Enter the hexadecimal code for the text color (e.g. #000 or #004283)."
-msgstr "Eingabe der Textfarbe in hexadezimaler Form (z.B. #000 oder #004283)."
-
-#: image_captcha/image_captcha.admin.inc:126
-msgid "Additional variation of text color"
-msgstr "Zusätzliche Variation der Textfarbe"
-
-#: image_captcha/image_captcha.admin.inc:130;152
-msgid "moderate"
-msgstr "mittel"
-
-#: image_captcha/image_captcha.admin.inc:131;154;192
-msgid "high"
-msgstr "hoch"
-
-#: image_captcha/image_captcha.admin.inc:132
-msgid "very high"
-msgstr "sehr hoch"
-
-#: image_captcha/image_captcha.admin.inc:135
-msgid "The different characters will have randomized colors in the specified range around the text color."
-msgstr "Die verschiedenen Buchstaben werden verschiedene zufällige Schriftfarben im angegebenen Bereich haben."
-
-#: image_captcha/image_captcha.admin.inc:142
-msgid "Distortion and noise"
-msgstr "Verzerrung und Rauschen"
-
-#: image_captcha/image_captcha.admin.inc:143
-msgid "With these settings you can control the degree of obfuscation by distortion and added noise. Do not exaggerate the obfuscation and assure that the code in the image is reasonably readable. For example, do not combine high levels of distortion and noise."
-msgstr "Mit diesen Einstellungen können Sie den Grad Verschleierung und das Ausmaß des Rauschens steuern. Übertreiben Sie nicht die Verschleierung und prüfen Sie, dass der Code in den Bildern einigermaßen lesbar ist. Kombinieren Sie zum Beispiel nicht starke Verzerrungen und starkes Rauschen."
-
-#: image_captcha/image_captcha.admin.inc:148
-msgid "Distortion level"
-msgstr "Grad der Verzerrung"
-
-#: image_captcha/image_captcha.admin.inc:151;190
-msgid "low"
-msgstr "niedrig"
-
-#: image_captcha/image_captcha.admin.inc:155;193
-msgid "severe"
-msgstr "schwer"
-
-#: image_captcha/image_captcha.admin.inc:158
-msgid "Set the degree of wave distortion in the image."
-msgstr "Setzt den Grad der Wellenverzerrung im Bild."
-
-#: image_captcha/image_captcha.admin.inc:162
-msgid "Smooth distortion"
-msgstr "Sanfte Verzerrung"
-
-#: image_captcha/image_captcha.admin.inc:164
-msgid "This option enables bilinear interpolation of the distortion which makes the image look smoother, but it is more CPU intensive."
-msgstr "Diese Option aktiviert bilineare Interpolation der Verzerrung, so dass das Bild weicher aussieht. Dies ist jedoch sehr CPU intensiv."
-
-#: image_captcha/image_captcha.admin.inc:169
-msgid "Double vision"
-msgstr "Doppelte Darstellung"
-
-#: image_captcha/image_captcha.admin.inc:171
-msgid "When enabled, characters appear twice in the image, overlaid onto each other."
-msgstr "Wenn dies aktiviert ist, erscheinen Zeichen im Bild doppelt. Sie erscheinen dann übereinandergelegt."
-
-#: image_captcha/image_captcha.admin.inc:176
-msgid "Add salt and pepper noise"
-msgstr "Bildrauschen hinzufügen"
-
-#: image_captcha/image_captcha.admin.inc:178
-msgid "This option adds randomly colored point noise."
-msgstr "Diese Option fügt ein Rauschen mit zufälligen farbigen Punkten hinzu."
-
-#: image_captcha/image_captcha.admin.inc:182
-msgid "Add line noise"
-msgstr "Linienrauschen hinzufügen"
-
-#: image_captcha/image_captcha.admin.inc:184
-msgid "This option enables lines randomly drawn on top of the text code."
-msgstr "Diese Option aktiviert zufällig über den Text gelegte Linien."
-
-#: image_captcha/image_captcha.admin.inc:188
-msgid "Noise level"
-msgstr "Grad des Rauschens"
-
-#: image_captcha/image_captcha.admin.inc:206
-msgid "The image CAPTCHA module works best with a TrueType font file (TTF) for generating the images, but because of licencing issues it is not allowed to package fonts with the module. A simple built-in bitmap font is provided as default instead. You can install TrueType fonts yourself by putting them in the fonts directory of the image CAPTCHA module (directory \"%fontsdir\") or by uploading them to your Drupal file system (directory \"%filesdir\") with for example the upload module."
-msgstr "Das Bild CAPTCHA-Modul funktioniert am besten mit einer TrueType-Schriftart-Datei (TTF) für die Generierung der Bilder, aber wegen der Lizenzbedingungen ist es nicht gestattet, diese Schriftdateien mitzuliefern. Eine einfache Bitmap-Schrift ist stattdessen mitgeliefert. Sie können TrueType-Schriftarten installieren: laden Sie diese in das Schriftarten-Verzeichnis des CAPTCHA-Modul (Verzeichnis \"%fontsdir\") oder in Ihrer Drupal-Dateisystem (Verzeichnis \"%filesdir\") mit dem Upload-Modul."
-
-#: image_captcha/image_captcha.admin.inc:209
-msgid "The usage of the built-in bitmap font it is not recommended because of its small size and missing UTF-8 support."
-msgstr "Die Benutzung der eingebauten Bitmap Schriften wird aufgrund ihrer geringen Größe und der fehlenden UTF-8 Unterstützung nicht empfohlen."
-
-#: image_captcha/image_captcha.admin.inc:220
-msgid "The list of characters to use should not contain spaces."
-msgstr "Die Liste der Zeichen darf keine Leerzeichen enthalten."
-
-#: image_captcha/image_captcha.admin.inc:225
-msgid "You need to select a font"
-msgstr "Es muss eine Schriftart ausgewählt werden"
-
-#: image_captcha/image_captcha.admin.inc:228
-msgid "Font does not exist or is not readable."
-msgstr "Die Schriftart existiert nicht oder ist nicht lesbar."
-
-#: image_captcha/image_captcha.admin.inc:233
-msgid "Background color is not a valid hexadecimal color value."
-msgstr "Die Hintergrundfarbe wurde nicht als hexadezimaler Farbwert angegeben."
-
-#: image_captcha/image_captcha.admin.inc:236
-msgid "Text color is not a valid hexadecimal color value."
-msgstr "Die Textfarbe wurde nicht als hexadezimaler Farbwert angegeben."
-
-#: image_captcha/image_captcha.user.inc:29
-msgid "Generation of image CAPTCHA failed. Check your image CAPTCHA configuration and especially the used font."
-msgstr "Das CAPTCHA-Bild konnte nicht erzeugt werden.  Bitte die Einstellungen für Bild-CAPTCHA und insbesondere die benutzte Schriftart überprüfen."
-
-#: image_captcha/image_captcha.module:17
-msgid "The image CAPTCHA is a popular challenge where a random textual code is obfuscated in an image. The image is generated on the fly for each request, which is rather CPU intensive for the server. Be careful with the size and computation related settings."
-msgstr "Das Bild CAPTCHA ist ein beliebter Test, bei dem ein zufälliger Text in ein Bild verwoben wird. Das Bild wird neu für jede einzelne Abfrage erzeugt, was entsprechend CPU-Zeit auf dem Server verbraucht. Wählen Sie die Größe und andere Einstellungen mit Bedacht."
-
-#: image_captcha/image_captcha.module:22
-msgid "<p>Example image, generated with the current settings:</p>!img"
-msgstr "<p>Beispielbild, mit den aktuellen Einstellungen:</p>!img"
-
-#: image_captcha/image_captcha.module:146
-msgid "Enter the characters (without spaces) shown in the image."
-msgstr "Bitte die im Bild dargestellten Buchstaben (ohne Leerzeichen) eingeben."
-
-#: image_captcha/image_captcha.module:149
-msgid "Enter the characters shown in the image. Ignore spaces and be careful about upper and lower case."
-msgstr "Bitte die im Bild dargestellten Buchstaben (ohne Leerzeichen) eingeben. Bitte die im Bild dargestellten Buchstaben (ohne Leerzeichen) eingeben und dabei Groß- und Kleinschreibung beachten."
-
-#: image_captcha/image_captcha.module:159;159;35 image_captcha/image_captcha.info:0
-msgid "Image CAPTCHA"
-msgstr "Bild-CAPTCHA"
-
-#: image_captcha/image_captcha.module:164
-msgid "What code is in the image?"
-msgstr "Welche Zeichen sind in dem Bild zu sehen?"
-
-#: image_captcha/image_captcha.module:94
-msgid "Encountered an illegal byte while splitting an utf8 string in characters."
-msgstr "Innerhalb eines UTF-8 kodierten Textes wurde ein unzulässiges Zeichen entdeckt."
-
-#: image_captcha/image_captcha.module:0
-msgid "image_captcha"
-msgstr "image_captcha"
-
-#: image_captcha/image_captcha.info:0
-msgid "Provides an image based CAPTCHA."
-msgstr "Stellt einen Bild basierten CAPTCHA bereit."
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/es.po b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/es.po
deleted file mode 100644
index 07cec97..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/es.po
+++ /dev/null
@@ -1,717 +0,0 @@
-# $Id: es.po,v 1.2 2009/10/04 22:24:55 soxofaan Exp $
-#
-# Spanish translation of Drupal (general)
-# Copyright YEAR NAME <EMAIL at ADDRESS>
-# Generated from files:
-#  captcha.admin.inc,v 1.30 2009/08/10 22:33:34 soxofaan
-#  image_captcha.admin.inc,v 1.28 2009/09/23 21:23:00 soxofaan
-#  captcha.module,v 1.100 2009/09/20 10:57:07 soxofaan
-#  captcha.inc,v 1.11 2009/08/27 22:21:56 soxofaan
-#  captcha.info,v 1.7 2008/02/17 12:49:24 soxofaan
-#  image_captcha.user.inc,v 1.21 2009/09/22 22:51:00 soxofaan
-#  image_captcha.module,v 1.31 2009/09/22 22:51:00 soxofaan
-#  captcha.install,v 1.10 2009/05/26 20:17:40 soxofaan
-#  image_captcha.info,v 1.5 2008/02/17 12:49:24 soxofaan
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Drupal 6.x\n"
-"POT-Creation-Date: 2009-09-28 04:38-0400\n"
-"PO-Revision-Date: 2009-10-03 15:57+0100\n"
-"Last-Translator: Gusgsm <gusgsm at gmail.com>\n"
-"Language-Team: Gusgsm <gusgsm at gmail.com>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n!=1);\n"
-"X-Poedit-Language: Spanish\n"
-"X-Poedit-Country: SPAIN\n"
-"X-Poedit-SourceCharset: utf-8\n"
-
-#: captcha.admin.inc:16
-#: image_captcha/image_captcha.admin.inc:171
-msgid "none"
-msgstr "ninguno"
-
-#: captcha.admin.inc:17
-msgid "default challenge type"
-msgstr "Tipo de "
-
-#: captcha.admin.inc:23
-msgid "@type (from module @module)"
-msgstr "@type (del módulo @module)"
-
-#: captcha.admin.inc:42
-msgid "Form protection"
-msgstr "Protección de formulario"
-
-#: captcha.admin.inc:43
-msgid "Select the challenge type you want for each of the listed forms (identified by their so called <em>form_id</em>'s). You can easily add arbitrary forms with textfield at the bottom of the table or with the help of the '%CAPTCHA_admin_links' option below."
-msgstr "Seleccione el tipo de pregunta que desee para cada uno de los formularios listados (identificados por lo que se llama su <em>form_id</em>). Puede añadir fácilmente formularios con campos de texto de forma arbitraria al final de la tabla con la ayuda de la opción CAPTCHA_admin_links, más abajo. "
-
-#: captcha.admin.inc:44;108
-#: captcha.module:46
-msgid "Add CAPTCHA administration links to forms"
-msgstr "Añadir enlaces de administración de CAPTCHA a los formularios"
-
-#: captcha.admin.inc:49
-msgid "Default challenge type"
-msgstr "Tipo de pregunta predefinida"
-
-#: captcha.admin.inc:50
-msgid "Select the default challenge type for CAPTCHAs. This can be overriden for each form if desired."
-msgstr "Seleccione el tipo de pregunta CAPTCHA predeterminada. Puede cambiarlo en cada formulario especificando otro, si lo desea."
-
-#: captcha.admin.inc:86
-msgid "delete"
-msgstr "borrar"
-
-#: captcha.admin.inc:110
-msgid "This option makes it easy to manage CAPTCHA settings on forms. When enabled, users with the \"%admincaptcha\" permission will see a fieldset with CAPTCHA administration links on all forms, except on administrative pages."
-msgstr "Esta opción facilita la gestión de las opciones de preguntas CAPTCHA en los formularios. Si se activa los usuarios con los permisos \"%admincaptcha\" verán un campo de texto con los enlaces de administración de CAPTCHAs en todos los formularios excepto en los de las páginas administrativas."
-
-#: captcha.admin.inc:110
-#: captcha.module:107
-msgid "administer CAPTCHA settings"
-msgstr "Administrar las opciones de CAPTCHA"
-
-#: captcha.admin.inc:115
-msgid "Allow CAPTCHAs and CAPTCHA administration links on administrative pages"
-msgstr "Permitir el planteamiento de preguntas CAPTCHA y los enlaces para su gestión en las páginas administrativas."
-
-#: captcha.admin.inc:117
-msgid "This option makes it possible to add CAPTCHAs to forms on administrative pages. CAPTCHAs are disabled by default on administrative pages (which shouldn't be accessible to untrusted users normally) to avoid the related overhead. In some situations, e.g. in the case of demo sites, it can be usefull to allow CAPTCHAs on administrative pages."
-msgstr "Esta opción permite añadir preguntas CAPTCHA a los formularios en las páginas administrativas. En principio, los CAPTCHA están desactivados en las páginas administrativas (ya que lo usual es que no sean accesibles a usuarios que no sean de confianza) para evitar la sobrecarga y retraso consiguiente. Sin embargo, en algunas situaciones (como sitios de demostración o prueba) podría ser útil añadir CAPTCHAs en las páginas administrativas,"
-
-#: captcha.admin.inc:123
-msgid "Add a description to the CAPTCHA"
-msgstr "Añadir una descripción a la pregunta CAPTCHA"
-
-#: captcha.admin.inc:124
-msgid "Add a configurable description to explain the purpose of the CAPTCHA to the visitor."
-msgstr "Añadir una descripción configurable para explicar la finalidad de la pregunta CAPTCHA al visitante."
-
-#: captcha.admin.inc:132
-msgid "CAPTCHA description"
-msgstr "Descripción de CAPTCHA"
-
-#: captcha.admin.inc:133;149
-msgid "Configurable description of the CAPTCHA. An empty entry will reset the description."
-msgstr "Descripción configurable de la pregunta CAPTCHA. Si se deja el campo vacío, la descripción se reconfigurará."
-
-#: captcha.admin.inc:139
-msgid "For language %lang_name (code %lang_code)"
-msgstr "Para idioma %lang_name (código %lang_code)"
-
-#: captcha.admin.inc:148
-msgid "Challenge description"
-msgstr "Descripción de la pregunta"
-
-#: captcha.admin.inc:159
-msgid "Default CAPTCHA validation"
-msgstr "Validación predefinida de CAPTCHA"
-
-#: captcha.admin.inc:160
-msgid "Define how the response should be processed by default. Note that the modules that provide the actual challenges can override or ignore this."
-msgstr "Define cómo se deben procesar las respuestas de forma predefinida. Tenga en cuenta que los módulos que proporcionan las preguntas pueden alterar o ignorar esto."
-
-#: captcha.admin.inc:162
-msgid "Case sensitive validation: the response has to exactly match the solution."
-msgstr "Validación que diferencia mayúsculas de mínúsculas: La respuesta tiene que coincidir exactamente con la solución."
-
-#: captcha.admin.inc:163
-msgid "Case insensitive validation: lowercase/uppercase errors are ignored."
-msgstr "Validación que no diferencia mayúsculas de mínúsculas: Las diferencias en esos casos no se tienen en cuenta."
-
-#: captcha.admin.inc:171
-msgid "Persistence"
-msgstr "Persistencia"
-
-#: captcha.admin.inc:174
-msgid "Always add a challenge."
-msgstr "Añadir siempre una pregunta"
-
-#: captcha.admin.inc:175
-msgid "Omit challenges for a form once the user has successfully responded to a challenge for that form."
-msgstr "Omitir preguntas de un formulario siempre que el usuario haya sabido responder bien a una en ese formulario."
-
-#: captcha.admin.inc:176
-msgid "Omit challenges for all forms once the user has successfully responded to a challenge."
-msgstr "Omitir preguntas de todos los formularios cuando el usuario haya sabido responder bien a una."
-
-#: captcha.admin.inc:178
-msgid "Define if challenges should be omitted during the rest of a session once the user successfully responses to a challenge."
-msgstr "Definir si las preguntas deben desactivarse para el resto de la sesión una vez que un usuario haya respondido con éxito a una de ellas."
-
-#: captcha.admin.inc:184
-msgid "Log wrong responses"
-msgstr "Registrar respuestas erróneas"
-
-#: captcha.admin.inc:185
-msgid "Report information about wrong responses to the !log."
-msgstr "Registrar la información de las respuestas erróneas en el !log."
-
-#: captcha.admin.inc:185
-msgid "log"
-msgstr "registro"
-
-#: captcha.admin.inc:192
-msgid "Save configuration"
-msgstr "Guardar configuración"
-
-#: captcha.admin.inc:202;342
-msgid "Challenge type"
-msgstr "Tipo de pregunta"
-
-#: captcha.admin.inc:202
-msgid "Operations"
-msgstr "Operaciones"
-
-#: captcha.admin.inc:229;363
-msgid "Illegal form_id"
-msgstr "form_id ilegal"
-
-#: captcha.admin.inc:255
-msgid "Added CAPTCHA point."
-msgstr "Añadido punto CAPTCHA."
-
-#: captcha.admin.inc:270
-msgid "Reset of CAPTCHA description for language %language."
-msgstr "Se ha restablecido la descripción de la pregunta CAPTCHA para el idioma %language."
-
-#: captcha.admin.inc:281
-msgid "Reset of CAPTCHA description."
-msgstr "Restablecer la descripción de CAPTCHA."
-
-#: captcha.admin.inc:289
-msgid "The CAPTCHA settings were saved."
-msgstr "Las opciones de CAPTCHA se han guardado."
-
-#: captcha.admin.inc:321;335
-msgid "Form ID"
-msgstr "ID del formulario"
-
-#: captcha.admin.inc:322;336
-msgid "The Drupal form_id of the form to add the CAPTCHA to."
-msgstr "La form_id de Drupal del formulario al que se quiere añadir la pregunta CAPTCHA."
-
-#: captcha.admin.inc:343
-msgid "The CAPTCHA type to use for this form"
-msgstr "El tipo de CAPTCHA que se usará para este formulario"
-
-#: captcha.admin.inc:352
-msgid "Save"
-msgstr "Guardar"
-
-#: captcha.admin.inc:375
-msgid "Saved CAPTCHA point settings."
-msgstr "Opciones de puntos CAPTCHA guardadas."
-
-#: captcha.admin.inc:392
-msgid "Are you sure you want to delete the CAPTCHA for form_id %form_id?"
-msgstr "¿Está seguro de querer borrar la pregungta CAPTCHA para form_id %form_id?"
-
-#: captcha.admin.inc:393
-msgid "Delete"
-msgstr "Borrar"
-
-#: captcha.admin.inc:396
-msgid "Are you sure you want to disable the CAPTCHA for form_id %form_id?"
-msgstr "¿Está seguro de querer desactivar CAPCHA para form_id %form_id?"
-
-#: captcha.admin.inc:397
-msgid "Disable"
-msgstr "Desactivar"
-
-#: captcha.admin.inc:410
-msgid "Deleted CAPTCHA for form %form_id."
-msgstr "Se ha borrado la pregunta CAPTCHA para el formulario %form_id."
-
-#: captcha.admin.inc:414
-msgid "Disabled CAPTCHA for form %form_id."
-msgstr "Se ha desactivado  la pregunta CAPTCHA para el formulario %form_id."
-
-#: captcha.admin.inc:451
-msgid "This page gives an overview of all available challenge types, generated with their current settings."
-msgstr "Esta página proporciona un resumen de los tipos de preguntas disponibles, generadas con sus configuraciones actuales."
-
-#: captcha.admin.inc:459
-msgid "Challenge \"%challenge\" by module \"%module\""
-msgstr "Pregunta \"%challenge\" por módulo \"%module\""
-
-#: captcha.admin.inc:462
-msgid "10 more examples of this challenge."
-msgstr "Diez ejemplos más de esta pregunta."
-
-#: captcha.inc:38
-msgid "Failed to set a CAPTCHA type for form %form_id: could not interpret value \"@captcha_type\""
-msgstr "No se pudo establecer un tipo de pregunta CAPTCHA para el formulario %form_id: No se logró interpretar el valor \"@captcha_type\""
-
-#: captcha.inc:146
-msgid "This question is for testing whether you are a human visitor and to prevent automated spam submissions."
-msgstr "Esta pregunta se hace para comprobar que es usted una persona real e impedir el envío automatizado de mensajes basura."
-
-#: captcha.module:31
-msgid "\"CAPTCHA\" is an acronym for \"Completely Automated Public Turing test to tell Computers and Humans Apart\". It is typically a challenge-response test to determine whether the user is human. The CAPTCHA module is a tool to fight automated submission by malicious users (spamming) of for example comments forms, user registration forms, guestbook forms, etc. You can extend the desired forms with an additional challenge, which should be easy for a human to solve correctly, but hard enough to keep automated scripts and spam bots out."
-msgstr "\"CAPTCHA\" es un acrónimo de \"Completely Automated Public Turing test to tell Computers and Humans Apart\" <em>(test de Turing completamente automatizado para distinguir humanos de ordenadores)</em>. Es la típica pregunta cuya respuesta permite determinar si el usuario es o no humano. El módulo CAPTCHA es una herramienta para combatir contra los envíos automatizados por parte de usuarios mal intencionados (spam) en formularios de comentarios, de registro como nuevos usuarios, libros de visitas, etc... Pueden añadirse nuevos formularios con nuevas preguntas que un humano debería poder contestar pero que deberían ser lo bastante difíciles para rechazar  códigos y programas automáticos."
-
-#: captcha.module:32
-msgid "Note that the CAPTCHA module interacts with page caching (see <a href=\"!performancesettings\">performance settings</a>). Because the challenge should be unique for each generated form, the caching of the page it appears on is prevented. Make sure that these forms do not appear on too many pages or you will lose much caching efficiency. For example, if you put a CAPTCHA on the user login block, which typically appears on each page for anonymous visitors, caching will practically be disabled. The comment submission forms are another example. In this case you should set the \"%commentlocation\" to \"%separatepage\" in the comment settings of the relevant <a href=\"!contenttypes\">content types</a> for better caching efficiency."
-msgstr "Tenga en cuenta que el módulo CAPTCHA interactua con la caché de páginas (consulte <a href=\"!performancesettings\">opciones de rendimiento</a>). Como la pregunta debe ser distinta para cada formulario generado, la caché de la página en la que aparece queda inutilizada. Asegúrese de que estos formularios no aparezcan en demasiadas páginas o la caché perderá mucha eficiencia. Por ejemplo, si pone una pregunta CAPTCHA en el bloque de comienzo de sesión como usuario, que suele aparecer en cada página que ve un usuario anónimo, la caché quedará virtualmente desactivada. En ese caso, debería disponer el %commentlocation\" en\"%separatepage\" en las opciones de comentarios de los <a href=\"!contenttypes\">tipos de contenido</a> relevantes para ajustar la eficiencia de la caché."
-
-#: captcha.module:35
-msgid "Location of comment submission form"
-msgstr "Ubicación del formulario de envío de comentarios"
-
-#: captcha.module:36
-msgid "Display on separate page"
-msgstr "Mostrar en una página aparte"
-
-#: captcha.module:40
-msgid "CAPTCHA is a trademark of Carnegie Mellon University."
-msgstr "CAPTCHA es una marca registrada de la Universidad Carnegie Mellon."
-
-#: captcha.module:45
-msgid "A CAPTCHA can be added to virtually each Drupal form. Some default forms are already provided in the form list, but arbitrary forms can be easily added and managed when the option \"%adminlinks\" is enabled."
-msgstr "Se puede añadir una pregunta CAPTCHA casi a cualquier formulario en Drupal. Algunos formularios ya vienen en la lista de formularios predeterminada, pero se pueden añadir y gestionar otros formularios si se activa la opción \"%adminlinks\"."
-
-#: captcha.module:47
-msgid "Users with the \"%skipcaptcha\" <a href=\"@perm\">permission</a> won't be offered a challenge. Be sure to grant this permission to the trusted users (e.g. site administrators). If you want to test a protected form, be sure to do it as a user without the \"%skipcaptcha\" permission (e.g. as anonymous user)."
-msgstr "A los usuarios con <a href=\"@perm\">permisos</a> \"%skipcaptcha\"  no se les planteará una pregunta. Asegúrese de conceder este permiso a usuarios de confianza (como los administradores del sitio web). Si quiere probar un formualrio protegido, compruebe que lo hace como usario sin el permiso \"%skipcaptcha\"; por ejemplo: Como usuario anónimo no registrado."
-
-#: captcha.module:48;107
-msgid "skip CAPTCHA"
-msgstr "Evitar CAPTCHA"
-
-#: (duplicate) captcha.module:269;322;119
-#: ;222;427;456;60;71 captcha.info:0
-#: image_captcha/image_captcha.user.inc:29;73
-#: image_captcha/image_captcha.module:95
-msgid "CAPTCHA"
-msgstr "CAPTCHA"
-
-#: captcha.module:327
-msgid "CAPTCHA: challenge \"@type\" enabled"
-msgstr "CAPTCHA: Activada la pregunta \"@type\""
-
-#: captcha.module:328
-msgid "Untrusted users will see a CAPTCHA here (!settings)."
-msgstr "Los usuarios que no son de confianza verán un CAPTCHA aquí (!settings)."
-
-#: captcha.module:329
-msgid "general CAPTCHA settings"
-msgstr "opciones generales de CAPTCHA"
-
-#: captcha.module:333
-msgid "Enabled challenge"
-msgstr "Pregunta activada"
-
-#: captcha.module:334
-msgid "\"@type\" by module \"@module\" (!change, !disable)"
-msgstr "\"@type\" por el módulo \"@module\" (!change, !disable)"
-
-#: captcha.module:337
-msgid "change"
-msgstr "cambiar"
-
-#: captcha.module:338
-msgid "disable"
-msgstr "desactivar"
-
-#: captcha.module:352
-#: image_captcha/image_captcha.admin.inc:57
-msgid "Example"
-msgstr "Ejemplo"
-
-#: captcha.module:353
-msgid "This is a pre-solved, non-blocking example of this challenge."
-msgstr "Este es un ejemplo ya resuelto de la pregunta y no impide nada."
-
-#: captcha.module:362
-msgid "CAPTCHA: no challenge enabled"
-msgstr "CAPTCHA: No se ha establecido ninguna pregunta"
-
-#: captcha.module:364
-msgid "Place a CAPTCHA here for untrusted users."
-msgstr "Ponga un CAPTCHA a aquellos usuarios que no son de confianza."
-
-#: captcha.module:426
-msgid "CAPTCHA validation error: unknown CAPTCHA session ID. Contact the site administrator if this problem persists."
-msgstr "Error de validación CAPTCHA: ID de sesión CAPCHA no identificada. Contacte con los administradores de este sitio si el problema persiste."
-
-#: captcha.module:451
-msgid "The answer you entered for the CAPTCHA was not correct."
-msgstr "La respuesta a la pregunta no es correcta."
-
-#: captcha.module:538
-msgid "Math question"
-msgstr "Pregunta matemática"
-
-#: captcha.module:539
-msgid "Solve this simple math problem and enter the result. E.g. for 1+3, enter 4."
-msgstr "Resuelva este simple problema matemático y escriba la solución; por ejemplo: Para 1+3, escriba 4."
-
-#: captcha.module:540
-msgid "@x + @y = "
-msgstr "@x + @y = "
-
-#: captcha.module:559
-msgid "Test one two three"
-msgstr "Prueba uno dos tres"
-
-#: captcha.module:222
-msgid "CAPTCHA problem: hook_captcha() of module %module returned nothing when trying to retrieve challenge type %type for form %form_id."
-msgstr "Problema de CAPTCHA: hook_captcha() del módulo %module no devolvió nada al intentar extraer la pregunta del tipo %type para el formulario %form_id."
-
-#: captcha.module:427
-msgid "CAPTCHA validation error: unknown CAPTCHA session ID (%csid)."
-msgstr "Error de validación de CAPTCHA: ID de sesión de CAPTCHA desconocido (%csid)."
-
-#: captcha.module:456
-msgid "%form_id post blocked by CAPTCHA module: challenge \"%challenge\" (by module \"%module\"), user answered \"%response\", but the solution was \"%solution\"."
-msgstr "mensaje de %form_id bloqueado por el módulo CAPTCHA: Pregunta \"%challenge\" (del módulo \"%module\"), el usuario respondió \"%response\", pero la solución era \"%solution\"."
-
-#: captcha.module:120
-msgid "Already 1 blocked form submission"
-msgid_plural "Already @count blocked form submissions"
-msgstr[0] "Ya se ha bloqueado 1 envío a formulario"
-msgstr[1] "Ya se han bloqueado @count envíos a formularios"
-
-#: captcha.module:61
-msgid "Administer how and where CAPTCHAs are used."
-msgstr "Administra cómo y cuándo se usa CAPTCHA."
-
-#: captcha.module:77
-msgid "General settings"
-msgstr "Opciones generales"
-
-#: captcha.module:83
-msgid "Examples"
-msgstr "Ejemplos"
-
-#: captcha.module:84
-msgid "An overview of the available challenge types with examples."
-msgstr "Un resumen de los tipos de preguntas disponibles con ejemplos."
-
-#: captcha.module:93
-msgid "CAPTCHA point administration"
-msgstr "Administración de puntos CAPTCHA"
-
-#: captcha.module:0
-msgid "captcha"
-msgstr "captcha"
-
-#: captcha.install:156
-msgid "Unsupported database."
-msgstr "Base de datos no admitida."
-
-#: (duplicate) captcha.install:115
-msgid "You can now <a href=\"!captcha_admin\">configure the CAPTCHA module</a> for your site."
-msgstr "Ahora puede <a href=\"!captcha_admin\">configurar el módulo CAPTCHYA </a> en el sitio web."
-
-#: captcha.info:0
-msgid "Base CAPTCHA module for adding challenges to arbitrary forms."
-msgstr "El módulo CAPTCHA base para añadir preguntas a los formularios de manera arbitraria."
-
-#: captcha.info:0
-#: image_captcha/image_captcha.info:0
-msgid "Spam control"
-msgstr "Control de correo basura"
-
-#: image_captcha/image_captcha.admin.inc:29
-msgid "Built-in font"
-msgstr "Fuente predefinida"
-
-#: image_captcha/image_captcha.admin.inc:47
-msgid "The Image CAPTCHA module can not generate images because your PHP setup does not support it (no <a href=\"!gdlib\">GD library</a> with JPEG support)."
-msgstr "El módulo de preguntas CAPTCHA de imágenes no puede generar las imágenes por que su configuración de PHP no lo admite  (no hay una <a href=\"!gdlib\">GD library</a> que admita formato JPEG)."
-
-#: image_captcha/image_captcha.admin.inc:58
-msgid "Presolved image CAPTCHA example, generated with the current settings."
-msgstr "Ejemplo de un CAPTCHA de imagen ya solucionado, creado con las opciones actuales."
-
-#: image_captcha/image_captcha.admin.inc:69
-msgid "Code settings"
-msgstr "Opciones de código"
-
-#: image_captcha/image_captcha.admin.inc:73
-msgid "Characters to use in the code"
-msgstr "Caracteres que se usarán en el código"
-
-#: image_captcha/image_captcha.admin.inc:78
-msgid "Code length"
-msgstr "Longitud del código"
-
-#: image_captcha/image_captcha.admin.inc:81
-msgid "The code length influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr "La longitud del código influye en el tamaño de la imagen. Tenga en cuenta que cuanto mayor sea la longitud, más tendrá que esforzarse la CPU para crear la imagen."
-
-#: image_captcha/image_captcha.admin.inc:87
-msgid "Font settings"
-msgstr "Opciones de fuente"
-
-#: image_captcha/image_captcha.admin.inc:93
-msgid "Font"
-msgstr "Fuente"
-
-#: image_captcha/image_captcha.admin.inc:95
-msgid "Select the font to use for the text in the image CAPTCHA. Apart from the provided defaults, you can also use your own TrueType fonts (filename extension .ttf) by putting them in the Drupal \"files\" directory (directory %filesdir), %fonts_library_general or %fonts_library_specific."
-msgstr "Seleccione que tipo de letra desea usar en el texto del CAPTCHA de imagen. Además de las predefinidas, puede añadir sus propias fuentes TrueType (con la extensión de documento .ttf) colocándolas en el directorio \"files\" de su instalación Drupal (directory %filesdir), %fonts_library_general o %fonts_library_specific."
-
-#: image_captcha/image_captcha.admin.inc:110
-msgid "Font size"
-msgstr "Tamaño de letras"
-
-#: image_captcha/image_captcha.admin.inc:112
-msgid "tiny"
-msgstr "Diminuto"
-
-#: image_captcha/image_captcha.admin.inc:113;172
-msgid "small"
-msgstr "pequeño"
-
-#: image_captcha/image_captcha.admin.inc:115;139
-msgid "normal"
-msgstr "normal"
-
-#: image_captcha/image_captcha.admin.inc:117
-msgid "large"
-msgstr "grande"
-
-#: image_captcha/image_captcha.admin.inc:119
-msgid "extra large"
-msgstr "extra grande"
-
-#: image_captcha/image_captcha.admin.inc:122
-msgid "The font size influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr "El tamaño de la fuente influye en el tamaño de la imagen. Tenga en cuenta que un valor mayor hará que la creación de la imagen será más trabajosa para la CPU."
-
-#: image_captcha/image_captcha.admin.inc:134
-msgid "Character spacing"
-msgstr "Espacio entre caracteres"
-
-#: image_captcha/image_captcha.admin.inc:135
-msgid "Define the average spacing between characters. Note that larger values make the image generation more CPU intensive."
-msgstr "Define el espacio promedio entre caracteres. Tenga en cuenta que a mayores tamaños, la imagen resultante será mayor y también lo será el esfuerzo que tenga que hacer la CPU."
-
-#: image_captcha/image_captcha.admin.inc:138
-msgid "tight"
-msgstr "apretado"
-
-#: image_captcha/image_captcha.admin.inc:140
-msgid "wide"
-msgstr "amplio"
-
-#: image_captcha/image_captcha.admin.inc:141
-msgid "extra wide"
-msgstr "extra amplio"
-
-#: image_captcha/image_captcha.admin.inc:148
-msgid "Color and image settings"
-msgstr "Opciones de color e imagen"
-
-#: image_captcha/image_captcha.admin.inc:149
-msgid "Configuration of the background, text colors and file format of the image CAPTCHA."
-msgstr "Configuración de los colores de fondo y textos, y del formato del documento con la imagen CAPTCHA."
-
-#: image_captcha/image_captcha.admin.inc:153
-msgid "Background color"
-msgstr "Color de fondo"
-
-#: image_captcha/image_captcha.admin.inc:154
-msgid "Enter the hexadecimal code for the background color (e.g. #FFF or #FFCE90). When using the PNG file format with transparent background, it is recommended to set this close to the underlying background color."
-msgstr "Indique el valor hexadecimal del color de fondo; por ejemplo: #fff o #ffce90. En el caso de usar el formato PNG con fondo transparente, se recomienda indicar un color similar al color que tenga el fondo."
-
-#: image_captcha/image_captcha.admin.inc:161
-msgid "Text color"
-msgstr "Color del texto"
-
-#: image_captcha/image_captcha.admin.inc:162
-msgid "Enter the hexadecimal code for the text color (e.g. #000 or #004283)."
-msgstr "Indique un valor decimal para el color del texto; por ejemplo: #000 o #004283."
-
-#: image_captcha/image_captcha.admin.inc:169
-msgid "Additional variation of text color"
-msgstr "Variación adicional del color del texto"
-
-#: image_captcha/image_captcha.admin.inc:173
-msgid "moderate"
-msgstr "moderada"
-
-#: image_captcha/image_captcha.admin.inc:174;245
-msgid "high"
-msgstr "alta"
-
-#: image_captcha/image_captcha.admin.inc:175
-msgid "very high"
-msgstr "extrema"
-
-#: image_captcha/image_captcha.admin.inc:178
-msgid "The different characters will have randomized colors in the specified range around the text color."
-msgstr "Las distintas letras tendrán colores al azar en el rango determinado en torno al color del texto."
-
-#: image_captcha/image_captcha.admin.inc:182
-msgid "File format"
-msgstr "Formato de documento"
-
-#: image_captcha/image_captcha.admin.inc:183
-msgid "Select the file format for the image. JPEG usually results in smaller files, PNG allows tranparency."
-msgstr "Seleccione el formato de documento para la imagen. JPEG suele proporcionar documentos más reducidos, mientras que PNG permite transparencia."
-
-#: image_captcha/image_captcha.admin.inc:186
-msgid "JPEG"
-msgstr "JPEG"
-
-#: image_captcha/image_captcha.admin.inc:187
-msgid "PNG"
-msgstr "PNG"
-
-#: image_captcha/image_captcha.admin.inc:188
-msgid "PNG with transparent background"
-msgstr "PNG con fondo transparente"
-
-#: image_captcha/image_captcha.admin.inc:195
-msgid "Distortion and noise"
-msgstr "Distorsión y ruido"
-
-#: image_captcha/image_captcha.admin.inc:196
-msgid "With these settings you can control the degree of obfuscation by distortion and added noise. Do not exaggerate the obfuscation and assure that the code in the image is reasonably readable. For example, do not combine high levels of distortion and noise."
-msgstr "Con estas opciones se controla el grado de legibilidad añadiendo dirtorsiones y ruido. No exagere la pérdida de legibilidad y asegúrese de que el código de la imagen será razonablemente comprensible; por ejemplo: No combine altos niveles de distorsión y ruido."
-
-#: image_captcha/image_captcha.admin.inc:201
-msgid "Distortion level"
-msgstr "Nivel de distorsión"
-
-#: image_captcha/image_captcha.admin.inc:203
-msgid "@level - no distortion"
-msgstr "@level - Sin distorsión"
-
-#: image_captcha/image_captcha.admin.inc:204
-msgid "@level - low"
-msgstr "@level - Poca"
-
-#: image_captcha/image_captcha.admin.inc:208
-msgid "@level - medium"
-msgstr "@level - Media"
-
-#: image_captcha/image_captcha.admin.inc:213
-msgid "@level - high"
-msgstr "@level - Alta"
-
-#: image_captcha/image_captcha.admin.inc:216
-msgid "Set the degree of wave distortion in the image."
-msgstr "Establecer el nivel de la onda de distorsión en la imagen."
-
-#: image_captcha/image_captcha.admin.inc:220
-msgid "Smooth distortion"
-msgstr "Distorsión suave"
-
-#: image_captcha/image_captcha.admin.inc:222
-msgid "This option enables bilinear interpolation of the distortion which makes the image look smoother, but it is more CPU intensive."
-msgstr "Esta opción permite la interpolación bilineal de la distorsión, lo que hace que la imagen se vea más suavizada, pero añade más carga a la CPU."
-
-#: image_captcha/image_captcha.admin.inc:227
-msgid "Add salt and pepper noise"
-msgstr "Añadir ruido granular"
-
-#: image_captcha/image_captcha.admin.inc:229
-msgid "This option adds randomly colored point noise."
-msgstr "Esta opción añade ruido de puntos de colores al azar."
-
-#: image_captcha/image_captcha.admin.inc:233
-msgid "Add line noise"
-msgstr "Añadir línea de ruido"
-
-#: image_captcha/image_captcha.admin.inc:235
-msgid "This option enables lines randomly drawn on top of the text code."
-msgstr "Esta opción coloca trazos al azar encima del texto del código."
-
-#: image_captcha/image_captcha.admin.inc:239
-msgid "Noise level"
-msgstr "Nivel de ruido"
-
-#: image_captcha/image_captcha.admin.inc:241
-msgid "low"
-msgstr "bajo"
-
-#: image_captcha/image_captcha.admin.inc:243
-msgid "medium"
-msgstr "medio"
-
-#: image_captcha/image_captcha.admin.inc:247
-msgid "severe"
-msgstr "intenso"
-
-#: image_captcha/image_captcha.admin.inc:264
-msgid "The Image CAPTCHA module can not use TrueType fonts because your PHP setup does not support it. You can only use a low quality built-in bitmap font."
-msgstr "El módulo de preguntas CAPTCHAs de imagen no puede usar fuentes TrueType porque su configuración de PHP no lo admite. Sólo puede usar una fuente de sistema de mapa de bits de baja calidad."
-
-#: image_captcha/image_captcha.admin.inc:269
-msgid "The usage of the built-in bitmap font it is not recommended because of its small size and missing UTF-8 support."
-msgstr "El uso de una fuente de mapa de bits del sistema no se recomienda debido a su reducido tamaño y a que no funcionan con UTF-8."
-
-#: image_captcha/image_captcha.admin.inc:280
-msgid "The list of characters to use should not contain spaces."
-msgstr "La lista de caracteres no deben incluir espacios"
-
-#: image_captcha/image_captcha.admin.inc:285
-msgid "You need to select a font"
-msgstr "Tiene que seleccionar una fuente"
-
-#: image_captcha/image_captcha.admin.inc:290
-msgid "The built-in font only supports Latin2 characters. Only use \"a\" to \"z\" and numbers."
-msgstr "La fuente del sistema sólo admite caracteres Latin2. Utilice sólo letras de la \"a\" a la \"z\" y números."
-
-#: image_captcha/image_captcha.admin.inc:294
-msgid "Font does not exist or is not readable."
-msgstr "La fuente no existe o no es legible."
-
-#: image_captcha/image_captcha.admin.inc:299
-msgid "Background color is not a valid hexadecimal color value."
-msgstr "El color de fondo no es un valor de color hexadecimal válido."
-
-#: image_captcha/image_captcha.admin.inc:302
-msgid "Text color is not a valid hexadecimal color value."
-msgstr "El color del texto no es un valor hexadecimal válido."
-
-#: image_captcha/image_captcha.user.inc:29
-msgid "Generation of image CAPTCHA failed. Check your image CAPTCHA configuration and especially the used font."
-msgstr "No se pudo crear la imagen CAPTCHA. Compruebe la configuración de su CAPTCHA de imagen y, sobre todo, qué tipo de letra se ha usado."
-
-#: image_captcha/image_captcha.user.inc:73
-msgid "Could not find or read the configured font (\"%font\") for the image CAPTCHA."
-msgstr "No se pudo leer la fuente  (\"%font\") especificada para la pregunta CAPTCHA de imagen."
-
-#: image_captcha/image_captcha.module:29
-msgid "The image CAPTCHA is a popular challenge where a random textual code is obfuscated in an image. The image is generated on the fly for each request, which is rather CPU intensive for the server. Be careful with the size and computation related settings."
-msgstr "El CAPTCHA de imagen es un tipo popular de pregunta en la que un texto aleatorio se distorsiona y oculta como una imagen. Ésta imagen se genera sobre la marcha con cada petición, por lo que se incrementa el esfuerzo de la CPU del servidor. Tenga cuidado con las opciones relacionadas con su tamaño y cualquier esfuerzo del procesador."
-
-#: image_captcha/image_captcha.module:165
-msgid "Enter the characters shown in the image. Ignore spaces and be careful about upper and lower case."
-msgstr "Escriba los caracteres que se deben mosytrar en la imagen. Los espacios no se tendrán en cuenta. Tenga cuidado con las mayúsculas y minúsculas."
-
-#: image_captcha/image_captcha.module:168
-msgid "Enter the characters (without spaces) shown in the image."
-msgstr "Escriba los caracteres (sin espacios) que se deben mostrar en la imagen."
-
-#: image_captcha/image_captcha.module:178;178;41
-#: image_captcha/image_captcha.info:0
-msgid "Image CAPTCHA"
-msgstr "CAPTCHA de imagen"
-
-#: image_captcha/image_captcha.module:183
-msgid "What code is in the image?"
-msgstr "¿Cuál es el código de la imagen?"
-
-#: image_captcha/image_captcha.module:95
-msgid "Encountered an illegal byte while splitting an utf8 string in characters."
-msgstr "Se ha encontrado un byte ilegal al distribuir en caracteres una cadena utf8."
-
-#: image_captcha/image_captcha.module:0
-msgid "image_captcha"
-msgstr "image_captcha"
-
-#: image_captcha/image_captcha.info:0
-msgid "Provides an image based CAPTCHA."
-msgstr "Proporcionar una pregunta CAPTCHA basada en una imagen."
-
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/fi.po b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/fi.po
deleted file mode 100644
index 2c98f4c..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/fi.po
+++ /dev/null
@@ -1,747 +0,0 @@
-#
-# LANGUAGE translation of Drupal (general)
-# Copyright YEAR NAME <EMAIL at ADDRESS>
-# Generated from files:
-#  captcha.admin.inc,v 1.5.2.5 2008/03/09 02:16:57 soxofaan
-#  image_captcha.admin.inc,v 1.3 2008/01/07 13:34:53 soxofaan
-#  captcha.module,v 1.58.2.5 2008/03/09 02:16:57 soxofaan
-#  captcha.info,v 1.5 2007/10/27 18:24:50 robloach
-#  image_captcha.user.inc,v 1.3 2008/01/07 13:34:53 soxofaan
-#  image_captcha.module,v 1.8.2.1 2008/03/09 01:42:07 soxofaan
-#  captcha.install,v 1.3.2.2 2008/03/20 10:27:53 soxofaan
-#  image_captcha.info,v 1.3 2007/12/11 12:05:32 soxofaan
-#  text_captcha.info,v 1.3 2008/01/04 14:29:58 soxofaan
-#  text_captcha.admin.inc,v 1.1 2008/01/04 14:29:58 soxofaan
-#  text_captcha.user.inc,v 1.1 2008/01/04 14:29:58 soxofaan
-#  text_captcha.module,v 1.3.2.1 2008/02/27 15:20:51 soxofaan
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: captcha-6.x-2.0\n"
-"POT-Creation-Date: 2009-08-22 09:54+0300\n"
-"PO-Revision-Date: 2009-08-22 16:15+0200\n"
-"Last-Translator: Juhani Pirinen <juhani.pirinen at ontieto.com>\n"
-"Language-Team: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Poedit-Language: Finnish\n"
-"X-Poedit-Country: FINLAND\n"
-"X-Poedit-SourceCharset: utf-8\n"
-
-#: captcha.admin.inc:16
-#: image_captcha/image_captcha.admin.inc:157;179
-msgid "none"
-msgstr "ei mitään"
-
-#: captcha.admin.inc:17
-msgid "default challenge type"
-msgstr "oletus tarkistustyyppi"
-
-#: captcha.admin.inc:23
-msgid "@type (from module @module)"
-msgstr "@type (moduuli @module)"
-
-#: captcha.admin.inc:42
-msgid "Form protection"
-msgstr "Lomakkeen suojaus"
-
-#: captcha.admin.inc:43
-msgid "Select the challenge type you want for each of the listed forms (identified by their so called <em>form_id</em>'s). You can easily add arbitrary forms with textfield at the bottom of the table or with the help of the '%CAPTCHA_admin_links' option below."
-msgstr "Valitse tarkistuksen tyyppi jokaiselle listan lomakkeelle (yksilöintiin käytetään <em>form_id</em>:tä). Voit helposti lisätä tarkituksen muillekin lomakkeille taulukon alla tai käyttämällä alla valintaa '%CAPTCHA_admin_links'."
-
-#: captcha.admin.inc:44;108
-#: captcha.module:46
-msgid "Add CAPTCHA administration links to forms"
-msgstr "Lisää CAPTCHA ylläpitolinkit lomakkeille"
-
-#: captcha.admin.inc:49
-msgid "Default challenge type"
-msgstr "Oletus tarkistustyyppi"
-
-#: captcha.admin.inc:50
-msgid "Select the default challenge type for CAPTCHAs. This can be overriden for each form if desired."
-msgstr "Valitse oletus tarkistustyyppi CAPTCHAlle.  Tämä voidaan tarvittaessa ohittaa kunkin lomakkeen asetuksissa."
-
-#: captcha.admin.inc:86
-msgid "delete"
-msgstr "poista"
-
-#: captcha.admin.inc:110
-msgid "This option makes it easy to manage CAPTCHA settings on forms. When enabled, users with the \"%admincaptcha\" permission will see a fieldsset with CAPTCHA administration links on all forms, except on administrative pages."
-msgstr "Tämä valinta helpottaa CAPTCHAn asetusten ylläpitoa lomakkeissa. Kun tämä on käytössä, ne käyttäjät joilla on \"%admincaptcha\" oikeus näkevät CAPTCHA ylläpitolinkin kaikilla lomakkeilla, paitsi ylläpitosivuilla."
-
-#: captcha.admin.inc:110
-#: captcha.module:107
-msgid "administer CAPTCHA settings"
-msgstr "CAPTCHAn asetusten määrittely"
-
-#: captcha.admin.inc:115
-msgid "Allow CAPTCHAs and CAPTCHA administration links on administrative pages"
-msgstr "Ota käyttöön CAPTCHAt ja CAPTCHAn ylläpitolinkit ylläpitosivuilla"
-
-#: captcha.admin.inc:117
-msgid "This option makes it possible to add CAPTCHAs to forms on administrative pages. CAPTCHAs are disabled by default on administrative pages (which shouldn't be accessible to untrusted users normally) to avoid the related overhead. In some situations, e.g. in the case of demo sites, it can be usefull to allow CAPTCHAs on administrative pages."
-msgstr "Tämä valinta mahdollistaa CAPTCHAn lisäämisen lomakkeisiin ylläpitosivuilla.  Oletusarvoisesti CAPTCHAt eivät ole käytössä ylläpitosivuilla (joille epäluotetuilla käyttäjillä ei normaalisti pitäisi olla pääsyä) turhan kuormituksen välttämiseksi.  Joissain tapauksissa, esim. demosivuilla, voi olla käytännöllistä käyttää CAPTCHAa ylläpitosivuilla."
-
-#: captcha.admin.inc:123
-msgid "Add a description to the CAPTCHA"
-msgstr "Lisää CAPTCHAlle kuvaus"
-
-#: captcha.admin.inc:124
-msgid "Add a configurable description to explain the purpose of the CAPTCHA to the visitor."
-msgstr "Lisää muokattava kuvaus selittämään CAPTCHAn tarkoitusta käyttäjälle."
-
-#: captcha.admin.inc:132
-msgid "CAPTCHA description"
-msgstr "CAPTCHAn kuvaus"
-
-#: captcha.admin.inc:133;149
-msgid "Configurable description of the CAPTCHA. An empty entry will reset the description."
-msgstr "CAPTCHAn muokattava kuvaus.  Tyhjä arvo tyhjentää kuvauksen."
-
-#: captcha.admin.inc:139
-msgid "For language %lang_name (code %lang_code)"
-msgstr "Kielelle %lang_name (koodi %lang_code)"
-
-#: captcha.admin.inc:148
-msgid "Challenge description"
-msgstr "Tarkistuksen kuvaus"
-
-#: captcha.admin.inc:159
-msgid "Default CAPTCHA validation"
-msgstr "CAPTCHAn oletushyväksyntä"
-
-#: captcha.admin.inc:160
-msgid "Define how the response should be processed by default. Note that the modules that provide the actual challenges can override or ignore this."
-msgstr "Määrittele miten vastauksia prosessoidaan oletusarvoisesti.  Huomaa, että moduulit jotka varsinaisesti tuottavat tarkistukset, voivat ohittaa tämän tai olla välittämättä tästä."
-
-#: captcha.admin.inc:162
-msgid "Case sensitive validation: the response has to exactly match the solution."
-msgstr "Merkkikokoriippuvainen hyväksyntä: vastauksen täytyy vastata ratkaisua tarkasti."
-
-#: captcha.admin.inc:163
-msgid "Case insensitive validation: lowercase/uppercase errors are ignored."
-msgstr "Merkkikokoriippumaton hyväksyntä: pieni/iso eroavuudesta syntyvät virheet jätetään huomiotta."
-
-#: captcha.admin.inc:171
-msgid "Persistence"
-msgstr "Pysyvyys"
-
-#: captcha.admin.inc:174
-msgid "Always add a challenge."
-msgstr "Lisää tarkistus aina."
-
-#: captcha.admin.inc:175
-msgid "Omit challenges for a form once the user has successfully responded to a challenge for that form."
-msgstr "Ohita tarkistukset samalla lomakkeella, jolla käyttäjä on vastannut tarkistuskyselyyn oikein."
-
-#: captcha.admin.inc:176
-msgid "Omit challenges for all forms once the user has successfully responded to a challenge."
-msgstr "Ohita tarkistukset kaikissa lomakkeissa, kun käyttäjä on vastannut tarkistuskyselyyn oikein."
-
-#: captcha.admin.inc:178
-msgid "Define if challenges should be omitted during the rest of a session once the user successfully responses to a challenge."
-msgstr "Määrittele ohitetaanko tarkistukset loppuistunnon ajaksi, kun käyttäjä on vastannut tarkistuskyselyyn oikein."
-
-#: captcha.admin.inc:184
-msgid "Log wrong responses"
-msgstr "Kirjaa väärät vastaukset lokiin"
-
-#: captcha.admin.inc:185
-msgid "Report information about wrong responses to the !log."
-msgstr "Raportoi vääristä vastauksista !log."
-
-#: captcha.admin.inc:185
-msgid "log"
-msgstr "lokiin"
-
-#: captcha.admin.inc:192
-msgid "Save configuration"
-msgstr "Tallenna asetukset"
-
-#: captcha.admin.inc:202;342
-msgid "Challenge type"
-msgstr "Tarkistustyyppi"
-
-#: captcha.admin.inc:202
-msgid "Operations"
-msgstr "Toiminnot"
-
-#: captcha.admin.inc:229;363
-msgid "Illegal form_id"
-msgstr "Kielletty form_id"
-
-#: captcha.admin.inc:255
-msgid "Added CAPTCHA point."
-msgstr "CAPTCHA kohde lisätty."
-
-#: captcha.admin.inc:270
-msgid "Reset of CAPTCHA description for language %language."
-msgstr "Tyhjennä CAPTCHAn kuvaus kielelle %language."
-
-#: captcha.admin.inc:281
-msgid "Reset of CAPTCHA description."
-msgstr "CAPTCHA kuvauksen tyhjennys."
-
-#: captcha.admin.inc:289
-msgid "The CAPTCHA settings were saved."
-msgstr "CAPTCHAn asetukset tallennettu."
-
-#: captcha.admin.inc:321;335
-msgid "Form ID"
-msgstr "Form ID"
-
-#: captcha.admin.inc:322;336
-msgid "The Drupal form_id of the form to add the CAPTCHA to."
-msgstr "Drupalin form_id lomakkeelle johon CAPTCHA lisätään."
-
-#: captcha.admin.inc:343
-msgid "The CAPTCHA type to use for this form"
-msgstr "CAPTCHA tyyppi tälle lomakkeelle"
-
-#: captcha.admin.inc:352
-msgid "Save"
-msgstr "Tallenna"
-
-#: captcha.admin.inc:375
-msgid "Saved CAPTCHA point settings."
-msgstr "CAPTCHA kohdeasetukset tallennettu."
-
-#: captcha.admin.inc:392
-msgid "Are you sure you want to delete the CAPTCHA for form_id %form_id?"
-msgstr "Haluatko varmasti poistaa CAPTCHAn lomakkeelta %form_id?"
-
-#: captcha.admin.inc:393
-msgid "Delete"
-msgstr "Poista"
-
-#: captcha.admin.inc:396
-msgid "Are you sure you want to disable the CAPTCHA for form_id %form_id?"
-msgstr "Haluatko varmasti poistaa CAPTCHAn käytöstä lomakkeelta %form_id?"
-
-#: captcha.admin.inc:397
-msgid "Disable"
-msgstr "Poista käytöstä"
-
-#: captcha.admin.inc:410
-msgid "Deleted CAPTCHA for form %form_id."
-msgstr "CAPTCHA poistettu lomakkeelta %form_id."
-
-#: captcha.admin.inc:414
-msgid "Disabled CAPTCHA for form %form_id."
-msgstr "CAPTCHA poistettu käytöstä lomakkeelta %form_id."
-
-#: captcha.admin.inc:451
-msgid "This page gives an overview of all available challenge types, generated with their current settings."
-msgstr "Tämä sivu antaa yleiskatsauksen saatavilla olevista tarkistustyyppeistä, jotka on muodostettu nykyisillä asetuksilla."
-
-#: captcha.admin.inc:459
-msgid "Challenge \"%challenge\" by module \"%module\""
-msgstr "Moduulin \"%module\" tarkistus \"%challenge\""
-
-#: captcha.admin.inc:462
-msgid "10 more examples of this challenge."
-msgstr "10 lisäesimerkkiä tarkistuksesta."
-
-#: captcha.inc:38
-msgid "Failed to set a CAPTCHA type for form %form_id: could not interpret value \"@captcha_type\""
-msgstr "CAPTCHA-tyypin asetus lomakkeelle %form_id epäonnistui: ei voitu tulkita arvoa \"@captcha_type\""
-
-#: captcha.inc:145
-msgid "This question is for testing whether you are a human visitor and to prevent automated spam submissions."
-msgstr "Tämä kysymys esitetään, jotta lomakkeen automatisoitu käyttö voitaisiin estää."
-
-#: captcha.module:31
-msgid "\"CAPTCHA\" is an acronym for \"Completely Automated Public Turing test to tell Computers and Humans Apart\". It is typically a challenge-response test to determine whether the user is human. The CAPTCHA module is a tool to fight automated submission by malicious users (spamming) of for example comments forms, user registration forms, guestbook forms, etc. You can extend the desired forms with an additional challenge, which should be easy for a human to solve correctly, but hard enough to keep automated scripts and spam bots out."
-msgstr "\"CAPTCHA\" on lyhenne sanoista \"Completely Automated Public Turing test to tell Computers and Humans Apart\".  Yleensä se on kysymys-vastaus testi, jolla määritetään, onko käyttäjä ihminen. CAPTCHA moduuli on työkalu taistelussa pahantahtoisten käyttäjien automatisoituja lähetyksiä (spamia) vastaan, esimerkiksi rekisteröitymislomakkeissa, vieraskirjalomakkeissa, jne.  Haluttuja lomakkeita voi laajentaa lisätarkistuksella, jonka ihmisten pitäisi olla helppo ratkaista oikein, mutta joka on riittävän vaikea pitämään automaattiset skriptit ja spam botit poissa."
-
-#: captcha.module:32
-msgid "Note that the CAPTCHA module interacts with page caching (see <a href=\"!performancesettings\">performance settings</a>). Because the challenge should be unique for each generated form, the caching of the page it appears on is prevented. Make sure that these forms do not appear on too many pages or you will lose much caching efficiency. For example, if you put a CAPTCHA on the user login block, which typically appears on each page for anonymous visitors, caching will practically be disabled. The comment submission forms are another example. In this case you should set the \"%commentlocation\" to \"%separatepage\" in the comment settings of the relevant <a href=\"!contenttypes\">content types</a> for better caching efficiency."
-msgstr "Huomaa, että CAPTCHA moduuli vaikuttaa sivuvälimuistin käyttöön (katso <a href=\"!performancesettings\">suorituskykyasetukset</a>). Koska tarkistus on ainutkertainen joka lomakkeelle, estetään kohdelomakkeen tallennus sivuvälimuistiin.  Varmista, että näitä lomakkeita ei ole sivustolla liian monta, muuten sivuvälimuistin käytön hyötysuhteesta menetetään paljon.  Esimerkiksi, jos laitat CAPTCHAn sisäänkirjautumislohkoon, mikä tavallisesti on joka sivulla anonyymeille vierailijoille, sivuvälimuistin käyttö käytännössä estyy.  Kommenttien lähetyslomakkeet ovat toinen esimerkki.  Tässä tapauksessa \"%commentlocation\" pitäisi asettaa kohteeseen \"%separatepage\" kommenttien asetuksissa <a href=\"!contenttypes\">sisällön tyypeissä</a>, jotta välimuistin käytön hyötysuhde olisi parempi."
-
-#: captcha.module:35
-msgid "Location of comment submission form"
-msgstr "Kommenttien lähetyslomakkeen sijainti"
-
-#: captcha.module:36
-msgid "Display on separate page"
-msgstr "Näytä erillisellä sivulla"
-
-#: captcha.module:40
-msgid "CAPTCHA is a trademark of Carnegie Mellon University."
-msgstr "CAPTCHA on Carnegie Mellon Yliopiston tavaramerkki."
-
-#: captcha.module:45
-msgid "A CAPTCHA can be added to virtually each Drupal form. Some default forms are already provided in the form list, but arbitrary forms can be easily added and managed when the option \"%adminlinks\" is enabled."
-msgstr "CAPTCHA voidaan lisätä käytännöllisesti katsoen kaikkiin Drupalin lomakkeisiin. Joitakin oletuslomakkeita on jo listalla, mutta yleensä kaikkiin lomakkeisiin voidaan lisätä tarkistus kun valinta \"%adminlinks\" on käytössä."
-
-#: captcha.module:47
-msgid "Users with the \"%skipcaptcha\" <a href=\"@perm\">permission</a> won't be offered a challenge. Be sure to grant this permission to the trusted users (e.g. site administrators). If you want to test a protected form, be sure to do it as a user without the \"%skipcaptcha\" permission (e.g. as anonymous user)."
-msgstr "Käyttäjille, joilla on \"%skipcaptcha\" <a href=\"@perm\">oikeus</a> ei näytetä tarkistusta. Varmista, että tämä annetaan vain luotetuille käyttäjille (esim. ylläpitäjille). Jos tahdot testata suojattua lomaketta, varmista että teet sen käyttäjänä ilman \"%skipcaptcha\" oikeutta (esim. anonyyminä käyttäjänä)."
-
-#: captcha.module:48;107
-msgid "skip CAPTCHA"
-msgstr "CAPTCHAn ohittaminen"
-
-#: (duplicate) captcha.module:269;322;119
-#: ;222;442;60;71 captcha.info:0
-#: image_captcha/image_captcha.user.inc:29;72
-#: image_captcha/image_captcha.module:94
-msgid "CAPTCHA"
-msgstr "CAPTCHA"
-
-#: captcha.module:327
-msgid "CAPTCHA: challenge \"@type\" enabled"
-msgstr "CAPTCHA: tarkistus \"@type\" käytössä"
-
-#: captcha.module:328
-msgid "Untrusted users will see a CAPTCHA here (!settings)."
-msgstr "Epäluotetut käyttäjät näkevät CAPTCHAn tässä (!settings)."
-
-#: captcha.module:329
-msgid "general CAPTCHA settings"
-msgstr "Yleiset CAPTCHA asetukset"
-
-#: captcha.module:333
-msgid "Enabled challenge"
-msgstr "Käyttöönotettu tarkistus"
-
-#: captcha.module:334
-msgid "\"@type\" by module \"@module\" (!change, !disable)"
-msgstr "Moduulin \"@module\" \"@type\" (!change, !disable)"
-
-#: captcha.module:337
-msgid "change"
-msgstr "muuta"
-
-#: captcha.module:338
-msgid "disable"
-msgstr "pois käytöstä"
-
-#: captcha.module:343
-#: image_captcha/image_captcha.admin.inc:49
-msgid "Example"
-msgstr "Esimerkki"
-
-#: captcha.module:344
-msgid "This is a pre-solved, non-blocking example of this challenge."
-msgstr "Tämä on esiratkaistu, ei-estävä esimerkki tästä tarkistuksesta."
-
-#: captcha.module:353
-msgid "CAPTCHA: no challenge enabled"
-msgstr "CAPTCHA: tarkistusta ei käytössä"
-
-#: captcha.module:355
-msgid "Place a CAPTCHA here for untrusted users."
-msgstr "Aseta tähän CAPTCHA epäluotetuille käyttäjille."
-
-#: captcha.module:417
-msgid "CAPTCHA test failed (unknown csid)."
-msgstr "CAPTCHA testi epäonnistui (tuntematon csid)."
-
-#: captcha.module:437
-msgid "The answer you entered for the CAPTCHA was not correct."
-msgstr "CAPTCHAan annettu vastaus ei ollut oikein."
-
-#: captcha.module:524
-msgid "Math question"
-msgstr "Laskutehtävä"
-
-#: captcha.module:525
-msgid "Solve this simple math problem and enter the result. E.g. for 1+3, enter 4."
-msgstr "Ratkaise tämä pieni laskutehtävä ja anna vastaus. Esim. 1+3, anna 4."
-
-#: captcha.module:526
-msgid "@x + @y = "
-msgstr "@x + @y = "
-
-#: captcha.module:545
-msgid "Test one two three"
-msgstr "Testi yksi kaksi kolme"
-
-#: captcha.module:222
-msgid "CAPTCHA problem: hook_captcha() of module %module returned nothing when trying to retrieve challenge type %type for form %form_id."
-msgstr "CAPTCHA ongelma: moduulin %module hook_captcha() ei palauttanut mitään kun yritettiin hakea tarkistustyyppiä %type lomakkeelle %form_id."
-
-#: captcha.module:442
-msgid "%form_id post blocked by CAPTCHA module: challenge \"%challenge\" (by module \"%module\"), user answered \"%response\", but the solution was \"%solution\"."
-msgstr "CAPTCHA moduuli on estänyt %form_id:n lähetyksen. Tarkistus \"%challenge\" (moduulilta \"%module\"), käyttäjä vastasi \"%response\", kun oikea vastaus oli \"%solution\"."
-
-#: captcha.module:120
-msgid "Already 1 blocked form submission"
-msgid_plural "Already @count blocked form submissions"
-msgstr[0] "Jo 1 estetty lomakkeen lähetys"
-msgstr[1] "Jo @count estettyä lomakkeen lähetystä"
-
-#: captcha.module:61
-msgid "Administer how and where CAPTCHAs are used."
-msgstr "Aseta miten ja missä CAPTCHAa käytetään."
-
-#: captcha.module:77
-msgid "General settings"
-msgstr "Yleiset asetukset"
-
-#: captcha.module:83
-msgid "Examples"
-msgstr "Esimerkit"
-
-#: captcha.module:84
-msgid "An overview of the available challenge types with examples."
-msgstr "Yleiskatsaus saatavilla oleviin tarkistustyyppeihin esimerkkien kanssa."
-
-#: captcha.module:93
-msgid "CAPTCHA point administration"
-msgstr "CAPTCHA kohteiden ylläpito"
-
-#: captcha.install:156
-msgid "Unsupported database."
-msgstr "Ei tukea tälle tietokannalle."
-
-#: (duplicate) captcha.install:115
-msgid "You can now <a href=\"!captcha_admin\">configure the CAPTCHA module</a> for your site."
-msgstr "Nyt voit muokata <a href=\"!captcha_admin\">CAPTCHA moduulin asetuksia</a> sivustollasi."
-
-#: captcha.info:0
-msgid "Base CAPTCHA module for adding challenges to arbitrary forms."
-msgstr "Perus CAPTCHA moduuli tarkistusten lisäämiseksi kaikkiin lomakkeisiin."
-
-#: captcha.info:0
-#: image_captcha/image_captcha.info:0
-msgid "Spam control"
-msgstr "Roskapostin hallinta"
-
-#: image_captcha/image_captcha.admin.inc:13
-msgid "Built-in font"
-msgstr "Sisäänrakennettu fontti"
-
-#: image_captcha/image_captcha.admin.inc:39
-msgid "The Image CAPTCHA module can not generate images because your PHP setup does not support it (no <a href=\"!gdlib\">GD library</a>)."
-msgstr "Kuva CAPTCHA moduuli ei voi muodostaa kuvia, koska PHP asennus ei tue sitä (ei <a href=\"!gdlib\">GD kirjastoa</a>)."
-
-#: image_captcha/image_captcha.admin.inc:50
-msgid "Presolved image CAPTCHA example, generated with the current settings."
-msgstr "Esiratkaistu Kuva CAPTCHA esimerkki, muodostettu nykyisillä asetuksilla."
-
-#: image_captcha/image_captcha.admin.inc:61
-msgid "Code settings"
-msgstr "Koodiasetukset"
-
-#: image_captcha/image_captcha.admin.inc:65
-msgid "Characters to use in the code"
-msgstr "Koodissa käytettävät merkit"
-
-#: image_captcha/image_captcha.admin.inc:70
-msgid "Code length"
-msgstr "Koodin pituus"
-
-#: image_captcha/image_captcha.admin.inc:73
-msgid "The code length influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr "Koodin pituus vaikuttaa kuvan kokoon. Huomaa, että suuremmat arvot tekevät kuvien muodostamisesta palvelinta kuormittavampaa."
-
-#: image_captcha/image_captcha.admin.inc:79
-msgid "Font settings"
-msgstr "Fonttiasetukset"
-
-#: image_captcha/image_captcha.admin.inc:85
-msgid "Font"
-msgstr "Fontti"
-
-#: image_captcha/image_captcha.admin.inc:87
-msgid "The TrueType font (.ttf) to use for the text in the image CAPTCHA."
-msgstr "TrueType fontti (.ttf) tekstin käyttöön Kuva CAPTCHAssa."
-
-#: image_captcha/image_captcha.admin.inc:96
-msgid "Font size"
-msgstr "Fontin koko"
-
-#: image_captcha/image_captcha.admin.inc:98
-msgid "tiny"
-msgstr "hyvin pieni"
-
-#: image_captcha/image_captcha.admin.inc:99;158
-msgid "small"
-msgstr "pieni"
-
-#: image_captcha/image_captcha.admin.inc:101;125;185
-msgid "normal"
-msgstr "normaali"
-
-#: image_captcha/image_captcha.admin.inc:103
-msgid "large"
-msgstr "suuri"
-
-#: image_captcha/image_captcha.admin.inc:105
-msgid "extra large"
-msgstr "hyvin suuri"
-
-#: image_captcha/image_captcha.admin.inc:108
-msgid "The font size influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr "Fontin koko vaikuttaa kuvan kokoon. Huomaa, että suuremmat arvot tekevät kuvien muodostamisesta palvelinta kuormittavampaa."
-
-#: image_captcha/image_captcha.admin.inc:120
-msgid "Character spacing"
-msgstr "Merkkien väli"
-
-#: image_captcha/image_captcha.admin.inc:121
-msgid "Define the average spacing between characters. Note that larger values make the image generation more CPU intensive."
-msgstr "Määrittele keskimääräinen merkkien väli. Huomaa, että suuremmat arvot tekevät kuvien muodostamisesta palvelinta kuormittavampaa."
-
-#: image_captcha/image_captcha.admin.inc:124
-msgid "tight"
-msgstr "kapea"
-
-#: image_captcha/image_captcha.admin.inc:126
-msgid "wide"
-msgstr "laaja"
-
-#: image_captcha/image_captcha.admin.inc:127
-msgid "extra wide"
-msgstr "hyvin laaja"
-
-#: image_captcha/image_captcha.admin.inc:134
-msgid "Color settings"
-msgstr "Väriasetukset"
-
-#: image_captcha/image_captcha.admin.inc:135
-msgid "Configuration of the background and text colors in the image CAPTCHA."
-msgstr "Kuva CAPTCHAN taustan ja tekstin värien asetukset."
-
-#: image_captcha/image_captcha.admin.inc:139
-msgid "Background color"
-msgstr "Taustaväri"
-
-#: image_captcha/image_captcha.admin.inc:140
-msgid "Enter the hexadecimal code for the background color (e.g. #FFF or #FFCE90)."
-msgstr "Kirjoita taustavärin heksadesimaalikoodi (esim. #FFF tai #FFCE90)."
-
-#: image_captcha/image_captcha.admin.inc:147
-msgid "Text color"
-msgstr "Tekstin väri"
-
-#: image_captcha/image_captcha.admin.inc:148
-msgid "Enter the hexadecimal code for the text color (e.g. #000 or #004283)."
-msgstr "Kirjoita tekstin värin heksadesimaalikoodi (e.g. #000 or #004283)."
-
-#: image_captcha/image_captcha.admin.inc:155
-msgid "Additional variation of text color"
-msgstr "Ylimääräinen tekstin värin muuntelu"
-
-#: image_captcha/image_captcha.admin.inc:159;183
-msgid "moderate"
-msgstr "keskinkertainen"
-
-#: image_captcha/image_captcha.admin.inc:160;187;221
-msgid "high"
-msgstr "korkea"
-
-#: image_captcha/image_captcha.admin.inc:161
-msgid "very high"
-msgstr "hyvin korkea"
-
-#: image_captcha/image_captcha.admin.inc:164
-msgid "The different characters will have randomized colors in the specified range around the text color."
-msgstr "Eri merkeille tulevat satunnaiset värit tietyllä vaihteluvälillä tekstin väristä."
-
-#: image_captcha/image_captcha.admin.inc:171
-msgid "Distortion and noise"
-msgstr "Väännös ja kohina"
-
-#: image_captcha/image_captcha.admin.inc:172
-msgid "With these settings you can control the degree of obfuscation by distortion and added noise. Do not exaggerate the obfuscation and assure that the code in the image is reasonably readable. For example, do not combine high levels of distortion and noise."
-msgstr "Näillä asetuksilla voit hallita sekoituksen määrää väännöksissä ja kohinassa. Älä lisää sekoitusta liikaa ja varmista, että kuva pysyy ymmärrettävästi luettavana.  Esimerkiksi, älä yhdistä korkeita väännöstasoja ja kohinaa."
-
-#: image_captcha/image_captcha.admin.inc:177
-msgid "Distortion level"
-msgstr "Väännöstaso"
-
-#: image_captcha/image_captcha.admin.inc:181;217
-msgid "low"
-msgstr "alhainen"
-
-#: image_captcha/image_captcha.admin.inc:189;223
-msgid "severe"
-msgstr "rankka"
-
-#: image_captcha/image_captcha.admin.inc:192
-msgid "Set the degree of wave distortion in the image."
-msgstr "Aseta asteluku kuvan aaltoväännölle."
-
-#: image_captcha/image_captcha.admin.inc:196
-msgid "Smooth distortion"
-msgstr "Pehmeä väännös"
-
-#: image_captcha/image_captcha.admin.inc:198
-msgid "This option enables bilinear interpolation of the distortion which makes the image look smoother, but it is more CPU intensive."
-msgstr "Tämä valinta ottaa käyttöön bilineaarisen interpoloinnin väännöksiin, joka tekee kuvasta pehmeämmän, mutta rasittaa palvelinta enemmän."
-
-#: image_captcha/image_captcha.admin.inc:203
-msgid "Add salt and pepper noise"
-msgstr "Lisää suola & pippuri -kohinaa"
-
-#: image_captcha/image_captcha.admin.inc:205
-msgid "This option adds randomly colored point noise."
-msgstr "Tämä valinta lisää satunnaisesti väritettyä pistekohinaa."
-
-#: image_captcha/image_captcha.admin.inc:209
-msgid "Add line noise"
-msgstr "Lisää linjakohinaa"
-
-#: image_captcha/image_captcha.admin.inc:211
-msgid "This option enables lines randomly drawn on top of the text code."
-msgstr "Tämä valinta piirtää satunnaislinjoja tekstin päälle."
-
-#: image_captcha/image_captcha.admin.inc:215
-msgid "Noise level"
-msgstr "Kohinataso"
-
-#: image_captcha/image_captcha.admin.inc:219
-msgid "medium"
-msgstr "keskikokoinen"
-
-#: image_captcha/image_captcha.admin.inc:240
-msgid "The Image CAPTCHA module can not use True Type fonts because your PHP setup does not support it. There is only a built-in bitmap font available."
-msgstr "Kuva CAPTCHA moduuli ei voi käyttää True Type fontteja, koska PHP asennus ei tue sitä.  Vain sisäänrakennettu bittikarttafontti on saatavana."
-
-#: image_captcha/image_captcha.admin.inc:245
-msgid "The image CAPTCHA module works best with a TrueType font file (TTF) for generating the images, but because of licencing issues it is not allowed to package fonts with the module. A simple built-in bitmap font is provided as default instead. You can install TrueType fonts yourself by putting them in the fonts directory of the image CAPTCHA module (directory \"%fontsdir\") or by uploading them to your Drupal file system (directory \"%filesdir\") with for example the upload module."
-msgstr "Kuva CAPTCHA toimii parhaiten TrueType fonteilla kuvien muodostamisessa, mutta lisenssiongelmien vuoksi fontteja ei ole sallittua toimittaa yhdessä moduulin kanssa.  Sen sijaan oletuksena tarjotaan yksinkertainen bittikarttafontti.  TrueType fontteja voi asentaa itse laittamalla ne kuva CAPTCHA moduulin fonttihakemistoon (directory \"%fontsdir\") tai lataamalla ne Drupalin tiedostojärjestelmään (hakupolku \"%filesdir\") esimerkiksi latausmoduulilla."
-
-#: image_captcha/image_captcha.admin.inc:248
-msgid "The usage of the built-in bitmap font it is not recommended because of its small size and missing UTF-8 support."
-msgstr "Sisäänrakennetun bittikarttafontin käyttöä ei suositella, koska koko on pieni eikä siinä ole UTF-8 tukea."
-
-#: image_captcha/image_captcha.admin.inc:259
-msgid "The list of characters to use should not contain spaces."
-msgstr "Käytettävän merkkilistan ei pitäisi sisältää välilyöntejä."
-
-#: image_captcha/image_captcha.admin.inc:264
-msgid "You need to select a font"
-msgstr "Valitse fontti"
-
-#: image_captcha/image_captcha.admin.inc:267
-msgid "Font does not exist or is not readable."
-msgstr "Fonttia ei ole tai se ei ole luettavissa."
-
-#: image_captcha/image_captcha.admin.inc:272
-msgid "Background color is not a valid hexadecimal color value."
-msgstr "Taustaväri ei ole kelvollinen heksadesimaali väriarvo."
-
-#: image_captcha/image_captcha.admin.inc:275
-msgid "Text color is not a valid hexadecimal color value."
-msgstr "Tekstin väri ei ole kelvollinen heksadesimaali väriarvo."
-
-#: image_captcha/image_captcha.user.inc:29
-msgid "Generation of image CAPTCHA failed. Check your image CAPTCHA configuration and especially the used font."
-msgstr "CAPTCHAn kuvan luonti epäonnistui. Tarkista Kuva CAPTCHAn asetukset ja erityisesti käytetty fontti."
-
-#: image_captcha/image_captcha.user.inc:72
-msgid "Could not find or read the configured font (\"%font\") for the image CAPTCHA."
-msgstr "Ei voitu löytää tai lukea Kuva CAPTCHAlle asetettua fonttia (\"%font\")."
-
-#: image_captcha/image_captcha.module:28
-msgid "The image CAPTCHA is a popular challenge where a random textual code is obfuscated in an image. The image is generated on the fly for each request, which is rather CPU intensive for the server. Be careful with the size and computation related settings."
-msgstr "Kuva CAPTCHA on suosittu tarkistuskysely, missä satunnainen koodi on muutettu epäselvennetyksi kuvaksi. Kuva muodostetaan lennossa erikseen joka sivulatauksella, mikä on melko palvelinta rasittavaa. Ole tarkkana koon ja muiden laskentaa vaativien asetusten suhteen."
-
-#: image_captcha/image_captcha.module:166
-msgid "Enter the characters shown in the image. Ignore spaces and be careful about upper and lower case."
-msgstr "Kirjoita kuvassa näkyvät merkit (ilman välilyöntejä).  Huomioi isot ja pienet kirjaimet."
-
-#: image_captcha/image_captcha.module:169
-msgid "Enter the characters (without spaces) shown in the image."
-msgstr "Kirjoita kuvassa näkyvät merkit (ilman välilyöntejä)."
-
-#: image_captcha/image_captcha.module:179;179;40
-#: image_captcha/image_captcha.info:0
-msgid "Image CAPTCHA"
-msgstr "Kuva CAPTCHA"
-
-#: image_captcha/image_captcha.module:184
-msgid "What code is in the image?"
-msgstr "Mikä koodi on kuvassa?"
-
-#: image_captcha/image_captcha.module:94
-msgid "Encountered an illegal byte while splitting an utf8 string in characters."
-msgstr "Havaittiin kielletty bitti kun jaettiin utf8 merkkijonoa merkkeihin."
-
-#: image_captcha/image_captcha.info:0
-msgid "Provides an image based CAPTCHA."
-msgstr "Tarjoaa kuvapohjaisen CAPTCHAn."
-
-#~ msgid "Challenge type per form"
-#~ msgstr "Tarkistustyyppi per lomake"
-#~ msgid "Challenge type (module)"
-#~ msgstr "Tarkistustyyppi (moduuli)"
-#~ msgid "Invalid CAPTCHA token."
-#~ msgstr "Väärä CAPTCHA merkki."
-#~ msgid "captcha"
-#~ msgstr "captcha"
-#~ msgid ""
-#~ "Images cannot be generated, because your PHP installation's GD library "
-#~ "has no JPEG support."
-#~ msgstr ""
-#~ "Kuvaa ei voi luoda, koska palvelimen PHP asetuksista puuttuu jpeg tuki."
-#~ msgid "Double vision"
-#~ msgstr "Kaksoiskuva"
-#~ msgid ""
-#~ "When enabled, characters appear twice in the image, overlayed onto each "
-#~ "other."
-#~ msgstr "Kun on käytössä, kirjaimet ilmestyvät kahdesti toistensa päälle."
-#~ msgid "Copy the characters (respecting upper/lower case) from the image."
-#~ msgstr "Kopio kirjaimet kuvasta (Huomio isot ja pienet kirjaimet)."
-#~ msgid "image_captcha"
-#~ msgstr "kuva_captcha"
-#~ msgid "Kind of words to use in the phrase"
-#~ msgstr "Lauseessa käytettäviä sanoja"
-#~ msgid "Generate nonsense random words."
-#~ msgstr "Muodosta merkityksettömiä satunnaissanoja."
-#~ msgid "Use user defined words."
-#~ msgstr "Käytä käyttäjän antamia sanoja."
-#~ msgid "User defined words"
-#~ msgstr "Käyttäjän antamat sanat"
-#~ msgid "Enter a bunch of space separated words (at least @min)."
-#~ msgstr "Anna ryhmä sanavälillä eroteltuja sanoja (vähintään @min)."
-#~ msgid "Number of words in the phrase"
-#~ msgstr "Sanojen määrä lauseessa"
-#~ msgid ""
-#~ "You need to enter at least @min words if you want to use user defined "
-#~ "words."
-#~ msgstr ""
-#~ "Sinun on annettava vähintään @min sanaa jos haluat käyttää itse "
-#~ "määriteltyjä sanoja."
-#~ msgid "Number of words in the phrase should be between 4 and 10."
-#~ msgstr "Sanojen määrä lauseessa tulee olla 4 ja 10 välillä."
-#~ msgid "first"
-#~ msgstr "ensimmäinen"
-#~ msgid "second"
-#~ msgstr "toinen"
-#~ msgid "third"
-#~ msgstr "kolmas"
-#~ msgid "fourth"
-#~ msgstr "neljäs"
-#~ msgid "fifth"
-#~ msgstr "viides"
-#~ msgid "sixth"
-#~ msgstr "kuudes"
-#~ msgid "seventh"
-#~ msgstr "seitsemäs"
-#~ msgid "ninth"
-#~ msgstr "yhdeksäs"
-#~ msgid "tenth"
-#~ msgstr "kymmenes"
-#~ msgid ""
-#~ "In this challenge the visitor is asked for the n<sup>th</sup> word of a "
-#~ "given phrase."
-#~ msgstr ""
-#~ "Tässä tarkistuksessa vierailijalta kysytään määrättyä sanaa annetusta "
-#~ "lauseesta."
-#~ msgid "What is the @nth word in the phrase \"@words\"?"
-#~ msgstr "Mikä on @nth sana lauseessa \"@words\"?"
-#~ msgid "Text CAPTCHA"
-#~ msgstr "Teksti CAPTCHA"
-#~ msgid "text_captcha"
-#~ msgstr "teksti_captcha"
-#~ msgid "Provides a simple text based CAPTCHA."
-#~ msgstr "Tarjoaa yksinkertaisen tekstipohjaisen CAPTCHA tunnistuksen."
-
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/fr.po b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/fr.po
deleted file mode 100644
index e7a9580..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/fr.po
+++ /dev/null
@@ -1,712 +0,0 @@
-# $Id: fr.po,v 1.1.4.3 2010/03/16 20:24:50 soxofaan Exp $
-#
-# FRENCH translation of Drupal (general)
-# Copyright 2010 NAME <EMAIL at ADDRESS>
-# Generated from files:
-#  captcha.admin.inc,v 1.32 2009/10/27 16:11:17 soxofaan
-#  image_captcha.admin.inc,v 1.30 2009/12/15 23:53:37 soxofaan
-#  captcha.module,v 1.102 2009/12/08 22:25:19 soxofaan
-#  captcha.inc,v 1.11 2009/08/27 22:21:56 soxofaan
-#  captcha.info,v 1.7 2008/02/17 12:49:24 soxofaan
-#  image_captcha.user.inc,v 1.23 2009/12/15 23:53:37 soxofaan
-#  image_captcha.module,v 1.33 2009/12/15 23:53:37 soxofaan
-#  captcha.install,v 1.11 2009/12/19 00:24:36 soxofaan
-#  image_captcha.info,v 1.5 2008/02/17 12:49:24 soxofaan
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: captcha 6.x-2.x\n"
-"POT-Creation-Date: 2010-01-03 15:35+0100\n"
-"PO-Revision-Date: 2010-03-08 15:17+0100\n"
-"Last-Translator: LD <lucie.dengreville at uhb.fr>\n"
-"Language-Team: French <EMAIL at ADDRESS>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n!=1);\n"
-
-
-
-#: captcha.admin.inc:16
-#: image_captcha/image_captcha.admin.inc:92
-msgid "none"
-msgstr "aucun"
-
-#: captcha.admin.inc:17
-msgid "default challenge type"
-msgstr "Type de défi par défaut"
-
-#: captcha.admin.inc:25
-msgid "@type (from module @module)"
-msgstr "@type (du module @module)"
-
-#: captcha.admin.inc:44
-msgid "Form protection"
-msgstr "Protection de formulaire"
-
-#: captcha.admin.inc:45
-msgid "Select the challenge type you want for each of the listed forms (identified by their so called <em>form_id</em>'s). You can easily add arbitrary forms with textfield at the bottom of the table or with the help of the '%CAPTCHA_admin_links' option below."
-msgstr "Choisir le type de défi désiré pour chacun des formulaires mentionnés (identifiés par leur <em>form_id</em>). Il est facile d'ajouter un formulaire arbitraire à l'aide de l'option '%CAPTCHA_admin_links'."
-
-#: captcha.admin.inc:46;110
-#: captcha.module:46
-msgid "Add CAPTCHA administration links to forms"
-msgstr "Ajouter des liens d'administration CAPTCHA aux formulaires"
-
-#: captcha.admin.inc:51
-msgid "Default challenge type"
-msgstr "Type de défi par défaut"
-
-#: captcha.admin.inc:52
-msgid "Select the default challenge type for CAPTCHAs. This can be overriden for each form if desired."
-msgstr "Choisissez le type de défi par défaut. Cela peut ensuite être modifié pour chaque formulaire si vous le souhaitez."
-
-#: captcha.admin.inc:88
-msgid "delete"
-msgstr "supprimer"
-
-#: captcha.admin.inc:112
-msgid "This option makes it easy to manage CAPTCHA settings on forms. When enabled, users with the \"%admincaptcha\" permission will see a fieldset with CAPTCHA administration links on all forms, except on administrative pages."
-msgstr "Cette option permet de configurer les paramètres CAPTCHA sur les formulaires. Si activée, les utilisateurs possédant la permission \"%admincaptcha\" verront les liens d'administration CAPTCHA sur l'ensemble des formulaires (à l'exception des pages d'administrations, qui ne devraient pas être accessibles aux utilisateurs non dignes de confiance). Ces liens rendent possible l'activation ou la désactivation d'un certain type de défi."
-
-#: captcha.admin.inc:112
-#: captcha.module:107
-msgid "administer CAPTCHA settings"
-msgstr "Administrer les paramètres CAPTCHA"
-
-#: captcha.admin.inc:117
-msgid "Allow CAPTCHAs and CAPTCHA administration links on administrative pages"
-msgstr "Ajouter des CAPTCHAs et des liens d'administration CAPTCHA sur les pages d'administration."
-
-#: captcha.admin.inc:119
-msgid "This option makes it possible to add CAPTCHAs to forms on administrative pages. CAPTCHAs are disabled by default on administrative pages (which shouldn't be accessible to untrusted users normally) to avoid the related overhead. In some situations, e.g. in the case of demo sites, it can be usefull to allow CAPTCHAs on administrative pages."
-msgstr "Cette option est très utile pour ajouter des CAPTCHAs sur les formulaires des pages d'administration. CAPTCHA est désactivé par défaut sur les pages d'administration (qui ne devraient pas être accessibles aux utilisateurs non dignes de confiance). Dans certaines situations, par exemple dans le cas des sites de démonstration, il peut être utile de permettre CAPTCHAs sur les pages d'administration."
-
-#: captcha.admin.inc:125
-msgid "Add a description to the CAPTCHA"
-msgstr "Ajouter une description pour le CAPTCHA"
-
-#: captcha.admin.inc:126
-msgid "Add a configurable description to explain the purpose of the CAPTCHA to the visitor."
-msgstr "La description du défi sert à expliquer l'utilité de ce dernier à l'utilisateur."
-
-#: captcha.admin.inc:134
-msgid "CAPTCHA description"
-msgstr "Description du défi"
-
-#: captcha.admin.inc:135;151
-msgid "Configurable description of the CAPTCHA. An empty entry will reset the description."
-msgstr "Description configurable du CAPTCHA. Une entrée vide permet de réinitialiser la description."
-
-#: captcha.admin.inc:141
-msgid "For language %lang_name (code %lang_code)"
-msgstr "Pour la langue %lang_name (code %lang_code)"
-
-#: captcha.admin.inc:150
-msgid "Challenge description"
-msgstr "Description du défi"
-
-#: captcha.admin.inc:161
-msgid "Default CAPTCHA validation"
-msgstr "Validation du CAPTCHA par défaut"
-
-#: captcha.admin.inc:162
-msgid "Define how the response should be processed by default. Note that the modules that provide the actual challenges can override or ignore this."
-msgstr "Définit la manière dont la réponse devrait être générée par défaut. Notez que les modules actuellement paramétrés peuvent outrepasser ou ignorer cela."
-
-#: captcha.admin.inc:164
-msgid "Case sensitive validation: the response has to exactly match the solution."
-msgstr "Validation sensible à la casse : la réponse doit exactement correspondre à la solution."
-
-#: captcha.admin.inc:165
-msgid "Case insensitive validation: lowercase/uppercase errors are ignored."
-msgstr "Validation insensible à la casse : les erreurs de type majuscule/minuscule sont ignorées."
-
-#: captcha.admin.inc:173
-msgid "Persistence"
-msgstr "Persistance"
-
-#: captcha.admin.inc:176
-msgid "Always add a challenge."
-msgstr "Toujours ajouter un défi."
-
-#: captcha.admin.inc:177
-msgid "Omit challenges for a form once the user has successfully responded to a challenge for that form."
-msgstr "Omettre les défis d'un formulaire lorsqu'un utilisateur a répondu correctement à un défi précédent pour ce même formulaire."
-
-#: captcha.admin.inc:178
-msgid "Omit challenges for all forms once the user has successfully responded to a challenge."
-msgstr "Omettre les défis de tous les formulaires lorsqu'un utilisateur a répondu correctement à un défi."
-
-#: captcha.admin.inc:180
-msgid "Define if challenges should be omitted during the rest of a session once the user successfully responses to a challenge."
-msgstr "Définir si les défis devraient être omis pour toute la durée de la session lorsqu'un utilisateur a répondu correctement à un défi."
-
-#: captcha.admin.inc:186
-msgid "Log wrong responses"
-msgstr "Consigner les mauvaises réponses"
-
-#: captcha.admin.inc:187
-msgid "Report information about wrong responses to the !log."
-msgstr "Afficher les informations concernant les mauvaises réponses dans le !log."
-
-#: captcha.admin.inc:187
-msgid "log"
-msgstr "log"
-
-#: captcha.admin.inc:194
-msgid "Save configuration"
-msgstr "Enregistrer la configuration"
-
-#: captcha.admin.inc:204;344
-msgid "Challenge type"
-msgstr "Type de défi"
-
-#: captcha.admin.inc:204
-msgid "Operations"
-msgstr "Opérations"
-
-#: captcha.admin.inc:231;365
-msgid "Illegal form_id"
-msgstr "Form_id non admis"
-
-#: captcha.admin.inc:257
-msgid "Added CAPTCHA point."
-msgstr "Pointage CAPTCHA ajouté."
-
-#: captcha.admin.inc:272
-msgid "Reset of CAPTCHA description for language %language."
-msgstr "Réinitialisation de la description du CAPTCHA pour la langue %language."
-
-#: captcha.admin.inc:283
-msgid "Reset of CAPTCHA description."
-msgstr "Réinitialisation de la description du CAPTCHA."
-
-#: captcha.admin.inc:291
-msgid "The CAPTCHA settings were saved."
-msgstr "Les paramètres CAPTCHA ont été enregistrés."
-
-#: captcha.admin.inc:323;337
-msgid "Form ID"
-msgstr "Identifiant du formulaire"
-
-#: captcha.admin.inc:324;338
-msgid "The Drupal form_id of the form to add the CAPTCHA to."
-msgstr "Le form_id Drupal du formulaire auquel ajouter le CAPTCHA."
-
-#: captcha.admin.inc:345
-msgid "The CAPTCHA type to use for this form"
-msgstr "Le type de CAPTCHA à utiliser pour ce formulaire"
-
-#: captcha.admin.inc:354
-msgid "Save"
-msgstr "Sauvegarder"
-
-#: captcha.admin.inc:377
-msgid "Saved CAPTCHA point settings."
-msgstr "Paramètres de pointage CAPTCHA enregistrés."
-
-#: captcha.admin.inc:394
-msgid "Are you sure you want to delete the CAPTCHA for form_id %form_id?"
-msgstr "Êtes-vous sûr de vouloir supprimer le CAPTCHA pour le form_id %form_id ?"
-
-#: captcha.admin.inc:395
-msgid "Delete"
-msgstr "Supprimer"
-
-#: captcha.admin.inc:398
-msgid "Are you sure you want to disable the CAPTCHA for form_id %form_id?"
-msgstr "Êtes-vous sûr de vouloir désactiver le CAPTCHA pour le form_id %form_id ?"
-
-#: captcha.admin.inc:399
-msgid "Disable"
-msgstr "Désactiver"
-
-#: captcha.admin.inc:412
-msgid "Deleted CAPTCHA for form %form_id."
-msgstr "Le CAPTCHA du formulaire %form_id a été supprimé."
-
-#: captcha.admin.inc:416
-msgid "Disabled CAPTCHA for form %form_id."
-msgstr "Le CAPTCHA du formulaire %form_id a été désactivé."
-
-#: captcha.admin.inc:453
-msgid "This page gives an overview of all available challenge types, generated with their current settings."
-msgstr "Cette page donne un aperçu de tous les types de défis disponibles, générés avec leurs paramètres courants."
-
-#: captcha.admin.inc:461
-msgid "Challenge \"%challenge\" by module \"%module\""
-msgstr "Défi \"%challenge\" par le module \"%module\""
-
-#: captcha.admin.inc:464
-msgid "10 more examples of this challenge."
-msgstr "10 autres exemples de ce défi."
-
-#: captcha.inc:38
-msgid "Failed to set a CAPTCHA type for form %form_id: could not interpret value \"@captcha_type\""
-msgstr "Impossible de définir un type de CAPTCHA pour le formulaire  %form_id : ne peut pas interpréter la valeur \"@captcha_type\""
-
-#: captcha.inc:146
-msgid "This question is for testing whether you are a human visitor and to prevent automated spam submissions."
-msgstr "Cette question permet de s'assurer que vous êtes un utilisateur humain et non un logiciel automatisé de pollupostage."
-
-#: captcha.module:31
-msgid "\"CAPTCHA\" is an acronym for \"Completely Automated Public Turing test to tell Computers and Humans Apart\". It is typically a challenge-response test to determine whether the user is human. The CAPTCHA module is a tool to fight automated submission by malicious users (spamming) of for example comments forms, user registration forms, guestbook forms, etc. You can extend the desired forms with an additional challenge, which should be easy for a human to solve correctly, but hard enough to keep automated scripts and spam bots out."
-msgstr "\"CAPTCHA\" est un acronyme pour \"Completely Automated Public Turing test to tell Computers and Humans Apart\" (ou \"test de Turing permettant de différencier de manière automatisée un utilisateur humain d'un ordinateur\"). Il s'agit typiquement d'un test de type question/réponse qui permet de s'assurer que l'utilisateur est bel et bien un être humain. Le module CAPTCHA est un outil visant à contrer la soumission automatique de données par des utilisateurs malicieux (pollupostage) à travers des formulaires de commentaires, d'enregistrement, de livres d'or, etc. Il est donc possible d'ajouter à un formulaire un défi additionnel, qui devra idéalement être assez facile pour qu'un être humain puisse le résoudre, mais assez difficile pour ne pas laisser passer les scripts automatisés et autres robots de pollupostage."
-
-#: captcha.module:32
-msgid "Note that the CAPTCHA module interacts with page caching (see <a href=\"!performancesettings\">performance settings</a>). Because the challenge should be unique for each generated form, the caching of the page it appears on is prevented. Make sure that these forms do not appear on too many pages or you will lose much caching efficiency. For example, if you put a CAPTCHA on the user login block, which typically appears on each page for anonymous visitors, caching will practically be disabled. The comment submission forms are another example. In this case you should set the \"%commentlocation\" to \"%separatepage\" in the comment settings of the relevant <a href=\"!contenttypes\">content types</a> for better caching efficiency."
-msgstr "Il est à noter que le module CAPTCHA intéragit avec la mise en cache des pages (voir les <a href=\"!performancesettings\">paramètres de performance</a>). Étant donné que le défi doit être unique pour chaque formulaire généré, la mise en cache des pages sur lesquelles celui-ci apparaît n'est pas effectuée. Assurez-vous que ces formulaires n'apparaissent pas sur une quantité trop grande de pages, sinon vous perdrez beaucoup d'efficacité au niveau de la mise en cache. Par exemple, si vous placez un CAPTCHA dans le bloc d'authentification des utilisateurs qui est généralement généré sur chaque page pour un utilisateur anonyme, la mise en cache sera pratiquement désactivée. Le formulaire de soumission de commentaire est un autre exemple. Dans ce cas, vous devriez définir \"%commentlocation\" à \"%separatepage\" dans les paramètres de commentaires des <a href=\"!contenttypes\">types de contenu</a> appropriés pour une meilleure efficacité de la mis
 e en cache."
-
-#: captcha.module:35
-msgid "Location of comment submission form"
-msgstr "Emplacement du formulaire de soumission de commentaire"
-
-#: captcha.module:36
-msgid "Display on separate page"
-msgstr "Afficher sur une page séparée"
-
-#: captcha.module:40
-msgid "CAPTCHA is a trademark of Carnegie Mellon University."
-msgstr "CAPTCHA est une marque déposée de l'Université Carnegie Mellon."
-
-#: captcha.module:45
-msgid "A CAPTCHA can be added to virtually each Drupal form. Some default forms are already provided in the form list, but arbitrary forms can be easily added and managed when the option \"%adminlinks\" is enabled."
-msgstr "Un CAPTCHA peut être ajouté à pratiquement n'importe quel formulaire Drupal. La liste des formulaires par défaut ci-dessous vous en fournit quelques-uns, mais des formulaires arbitraires peuvent être ajoutés et gérés aisément lorsque l'option \"%adminlinks\" est activée."
-
-#: captcha.module:47
-msgid "Users with the \"%skipcaptcha\" <a href=\"@perm\">permission</a> won't be offered a challenge. Be sure to grant this permission to the trusted users (e.g. site administrators). If you want to test a protected form, be sure to do it as a user without the \"%skipcaptcha\" permission (e.g. as anonymous user)."
-msgstr "Les utilisateurs possédant la <a href=\"@perm\">permission</a> \"%skipcaptcha\" ne se verront pas offrir de défi. N'accordez cette permission qu'aux utilisateurs dignes de confiance (ex.: les administrateurs du site). Si vous désirez tester un formulaire protégé par un défi, assurez-vous de le faire à l'aide d'un utilisateur ne possédant pas la permission \"%skipcaptcha\" (ex.: l'utilisateur anonyme)."
-
-#: captcha.module:48;107
-msgid "skip CAPTCHA"
-msgstr "Ignorer le CAPTCHA"
-
-#: (duplicate) captcha.module:269;322;119
-#: ;222;446;475;60;71 captcha.info:0
-#: image_captcha/image_captcha.user.inc:29
-#: image_captcha/image_captcha.module:129
-msgid "CAPTCHA"
-msgstr "CAPTCHA"
-
-#: captcha.module:327
-msgid "CAPTCHA: challenge \"@type\" enabled"
-msgstr "CAPTCHA:  défi \"@type\" activé"
-
-#: captcha.module:328
-msgid "Untrusted users will see a CAPTCHA here (!settings)."
-msgstr "Les utilisateurs non dignes de confiance verront un CAPTCHA ici (!settings)."
-
-#: captcha.module:329
-msgid "general CAPTCHA settings"
-msgstr "paramètres CAPTCHA généraux"
-
-#: captcha.module:333
-msgid "Enabled challenge"
-msgstr "Défi activé"
-
-#: captcha.module:334
-msgid "\"@type\" by module \"@module\" (!change, !disable)"
-msgstr "\"@type\" par le module \"@module\" (!change, !disable)"
-
-#: captcha.module:337
-msgid "change"
-msgstr "modifier"
-
-#: captcha.module:338
-msgid "disable"
-msgstr "désactiver"
-
-#: captcha.module:352
-#: image_captcha/image_captcha.admin.inc:36
-msgid "Example"
-msgstr "Exemple"
-
-#: captcha.module:353
-msgid "This is a pre-solved, non-blocking example of this challenge."
-msgstr "Ceci est un exemple résolu et non bloquant de ce défi."
-
-#: captcha.module:362
-msgid "CAPTCHA: no challenge enabled"
-msgstr "CAPTCHA: pas de défi disponible"
-
-#: captcha.module:364
-msgid "Place a CAPTCHA here for untrusted users."
-msgstr "Ajouter ici un CAPTCHA pour les utilisateurs non dignes de confiance."
-
-#: captcha.module:445
-msgid "CAPTCHA validation error: unknown CAPTCHA session ID. Contact the site administrator if this problem persists."
-msgstr "Erreur de validation CAPTCHA : ID de session CAPTCHA inconnu. Contactez l'administrateur du site si le problème persiste."
-
-#: captcha.module:470
-msgid "The answer you entered for the CAPTCHA was not correct."
-msgstr "La réponse saisie pour le CAPTCHA est incorrecte."
-
-#: captcha.module:557
-msgid "Math question"
-msgstr "Question mathématique"
-
-#: captcha.module:558
-msgid "Solve this simple math problem and enter the result. E.g. for 1+3, enter 4."
-msgstr "Résolvez cette équation mathématique simple et entrez le résultat. Ex.: pour 1+3, entrez 4."
-
-#: captcha.module:559
-msgid "@x + @y = "
-msgstr "@x + @y = "
-
-#: captcha.module:578
-msgid "Test one two three"
-msgstr "Test un deux trois"
-
-#: captcha.module:222
-msgid "CAPTCHA problem: hook_captcha() of module %module returned nothing when trying to retrieve challenge type %type for form %form_id."
-msgstr "Problème CAPTCHA : hook_captcha() du module %module n'a rien retourné lors de la récupération du type de défi %type pour le formulaire %form_id."
-
-#: captcha.module:446
-msgid "CAPTCHA validation error: unknown CAPTCHA session ID (%csid)."
-msgstr "Erreur de la validation CAPTCHA : ID (%csid) de session CAPTCHA inconnu."
-
-#: captcha.module:475
-msgid "%form_id post blocked by CAPTCHA module: challenge \"%challenge\" (by module \"%module\"), user answered \"%response\", but the solution was \"%solution\"."
-msgstr "Génération du formulaire %form_id bloquée par le module CAPTCHA:  défi \"%challenge\" (par le module \"%module\"), l'utilisateur a répondu \"%response\", mais la solution était \"%solution\"."
-
-#: captcha.module:120
-msgid "Already 1 blocked form submission"
-msgid_plural "Already @count blocked form submissions"
-msgstr[0] "1 tentative de soumission de formulaire déjà bloquée"
-msgstr[1] "@counter tentatives de soumission de formulaire déjà bloquées"
-
-#: captcha.module:61
-msgid "Administer how and where CAPTCHAs are used."
-msgstr "Administrer où et comment les CAPTCHAs sont utilisés."
-
-#: captcha.module:77
-msgid "General settings"
-msgstr "Configuration générale"
-
-#: captcha.module:83
-msgid "Examples"
-msgstr "Exemples"
-
-#: captcha.module:84
-msgid "An overview of the available challenge types with examples."
-msgstr "Un aperçu des types de défis disponibles, suivis d'exemples."
-
-#: captcha.module:93
-msgid "CAPTCHA point administration"
-msgstr "Administration du pointage CAPTCHA"
-
-#: captcha.install:156
-msgid "Unsupported database."
-msgstr "Base de données non supportée."
-
-#: (duplicate) captcha.install:115
-msgid "You can now <a href=\"!captcha_admin\">configure the CAPTCHA module</a> for your site."
-msgstr "Vous pouvez maintenant <a href=\"!captcha_admin\">configurer le module CAPTCHA</a> pour votre site."
-
-#: captcha.info:0
-msgid "Base CAPTCHA module for adding challenges to arbitrary forms."
-msgstr "Module CAPTCHA de base pour ajouter des défis à des formulaires arbitraires."
-
-#: captcha.info:0
-#: image_captcha/image_captcha.info:0
-msgid "Spam control"
-msgstr "Contrôle du pollupostage"
-
-#: image_captcha/image_captcha.admin.inc:26
-msgid "The Image CAPTCHA module can not generate images because your PHP setup does not support it (no <a href=\"!gdlib\">GD library</a> with JPEG support)."
-msgstr "Les images ne peuvent être générées par le module CAPTCHA visuel, car votre installation PHP ne le supporte pas (pas de <a href=\"!gdlib\">librairie GD</a> avec support JPEG."
-
-#: image_captcha/image_captcha.admin.inc:37
-msgid "Presolved image CAPTCHA example, generated with the current settings."
-msgstr "Exemple de visuel CAPTCHA pré-résolu, généré avec les paramètres actuels."
-
-#: image_captcha/image_captcha.admin.inc:48
-msgid "Code settings"
-msgstr "Paramètres de code"
-
-#: image_captcha/image_captcha.admin.inc:52
-msgid "Characters to use in the code"
-msgstr "Caractères à utiliser dans ce code"
-
-#: image_captcha/image_captcha.admin.inc:57
-msgid "Code length"
-msgstr "Longueur du code"
-
-#: image_captcha/image_captcha.admin.inc:60
-msgid "The code length influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr "La longueur du code influence la taille de l'image. Il est à noter que des valeurs élevées peuvent rendre la génération de l'image plus lourde en terme de puissance de calcul."
-
-#: image_captcha/image_captcha.admin.inc:69
-msgid "Color and image settings"
-msgstr "Paramètres de couleur et d'image"
-
-#: image_captcha/image_captcha.admin.inc:70
-msgid "Configuration of the background, text colors and file format of the image CAPTCHA."
-msgstr "Configuration du format de fichier, des couleurs de l'arrière-plan et du texte dans le CAPTCHA visuel."
-
-#: image_captcha/image_captcha.admin.inc:74
-msgid "Background color"
-msgstr "Couleur de fond"
-
-#: image_captcha/image_captcha.admin.inc:75
-msgid "Enter the hexadecimal code for the background color (e.g. #FFF or #FFCE90). When using the PNG file format with transparent background, it is recommended to set this close to the underlying background color."
-msgstr "Entrez un code hexadécimal pour la couleur de fond (ex. #FFF ou #FFCE90). Si vous utilisez le format de fichier PNG avec un fond transparent, il est recommandé de fixer cette couleur à une valeur proche de la couleur de fond sous-jacente. "
-
-#: image_captcha/image_captcha.admin.inc:82
-msgid "Text color"
-msgstr "Couleur du texte"
-
-#: image_captcha/image_captcha.admin.inc:83
-msgid "Enter the hexadecimal code for the text color (e.g. #000 or #004283)."
-msgstr "Entrer le code hexadécimal pour la couleur du texte (ex.: #000 ou #004283)."
-
-#: image_captcha/image_captcha.admin.inc:90
-msgid "Additional variation of text color"
-msgstr "Variation additionnelle de la couleur du texte"
-
-#: image_captcha/image_captcha.admin.inc:93;270
-msgid "small"
-msgstr "petite"
-
-#: image_captcha/image_captcha.admin.inc:94
-msgid "moderate"
-msgstr "modéré"
-
-#: image_captcha/image_captcha.admin.inc:95;166
-msgid "high"
-msgstr "élevé"
-
-#: image_captcha/image_captcha.admin.inc:96
-msgid "very high"
-msgstr "très élevé"
-
-#: image_captcha/image_captcha.admin.inc:99
-msgid "The different characters will have randomized colors in the specified range around the text color."
-msgstr "Les différents caractères prendront des couleurs aléatoires autour de la couleur de texte, en fonction de la gamme de variation spécifiée. "
-
-#: image_captcha/image_captcha.admin.inc:103
-msgid "File format"
-msgstr "Format de fichier"
-
-#: image_captcha/image_captcha.admin.inc:104
-msgid "Select the file format for the image. JPEG usually results in smaller files, PNG allows tranparency."
-msgstr "Sélectionnez le format de fichier pour l'image. JPEG produit en général des fichiers plus petits, PNG permet la transparence."
-
-#: image_captcha/image_captcha.admin.inc:107
-msgid "JPEG"
-msgstr "JPEG"
-
-#: image_captcha/image_captcha.admin.inc:108
-msgid "PNG"
-msgstr "PNG"
-
-#: image_captcha/image_captcha.admin.inc:109
-msgid "PNG with transparent background"
-msgstr "PNG avec fond transparent"
-
-#: image_captcha/image_captcha.admin.inc:116
-msgid "Distortion and noise"
-msgstr "Distorsion et interférence"
-
-#: image_captcha/image_captcha.admin.inc:117
-msgid "With these settings you can control the degree of obfuscation by distortion and added noise. Do not exaggerate the obfuscation and assure that the code in the image is reasonably readable. For example, do not combine high levels of distortion and noise."
-msgstr "À l'aide de ces paramètres, il est possible de contrôler le degré de masquage par la distorsion et l'interférence. Ne pas exagérer la masquage et s'assurer que le code de l'image demeure raisonnablement lisible. Par exemple, ne pas combiner un degré élevé de distorsion et d'interférences."
-
-#: image_captcha/image_captcha.admin.inc:122
-msgid "Distortion level"
-msgstr "Degré de distorsion"
-
-#: image_captcha/image_captcha.admin.inc:124
-msgid "@level - no distortion"
-msgstr "@level - sans distorsion"
-
-#: image_captcha/image_captcha.admin.inc:125
-msgid "@level - low"
-msgstr "@level - bas"
-
-#: image_captcha/image_captcha.admin.inc:129
-msgid "@level - medium"
-msgstr "@level - modéré"
-
-#: image_captcha/image_captcha.admin.inc:134
-msgid "@level - high"
-msgstr "@level - élévé"
-
-#: image_captcha/image_captcha.admin.inc:137
-msgid "Set the degree of wave distortion in the image."
-msgstr "Définir le degré de distorsion ondulatoire de l'image."
-
-#: image_captcha/image_captcha.admin.inc:141
-msgid "Smooth distortion"
-msgstr "Distorsion lisse"
-
-#: image_captcha/image_captcha.admin.inc:143
-msgid "This option enables bilinear interpolation of the distortion which makes the image look smoother, but it is more CPU intensive."
-msgstr "Cette option active l'interpolation bilinéaire de la distorsion. Cela rend l'image plus lisse, mais est plus lourd en terme de puissance de calcul."
-
-#: image_captcha/image_captcha.admin.inc:148
-msgid "Add salt and pepper noise"
-msgstr "Ajouter de l'interférence sel et poivre"
-
-#: image_captcha/image_captcha.admin.inc:150
-msgid "This option adds randomly colored point noise."
-msgstr "Cette option ajoute de l'interférence sous forme de points colorés aléatoirement."
-
-#: image_captcha/image_captcha.admin.inc:154
-msgid "Add line noise"
-msgstr "Ajouter de l'interférence linéaire"
-
-#: image_captcha/image_captcha.admin.inc:156
-msgid "This option enables lines randomly drawn on top of the text code."
-msgstr "Cette option ajoute des lignes dessinées aléatoirement sur le texte du code."
-
-#: image_captcha/image_captcha.admin.inc:160
-msgid "Noise level"
-msgstr "Degré d'interférence"
-
-#: image_captcha/image_captcha.admin.inc:162
-msgid "low"
-msgstr "bas"
-
-#: image_captcha/image_captcha.admin.inc:164
-msgid "medium"
-msgstr "modéré"
-
-#: image_captcha/image_captcha.admin.inc:168
-msgid "severe"
-msgstr "sévère"
-
-#: image_captcha/image_captcha.admin.inc:198
-msgid "Font settings"
-msgstr "Paramètres de police"
-
-#: image_captcha/image_captcha.admin.inc:207
-msgid "No TrueType support"
-msgstr "Pas de support pour la police TrueType"
-
-#: image_captcha/image_captcha.admin.inc:208
-msgid "The Image CAPTCHA module can not use TrueType fonts because your PHP setup does not support it. You can only use a PHP built-in bitmap font of fixed size."
-msgstr "Le module CAPTCHA visuel ne peut utiliser les polices de caractères TrueType parce que votre configuration PHP ne le supporte pas. Vous pouvez seulement utiliser la police bitmap incorporée, de taille fixée."
-
-#: image_captcha/image_captcha.admin.inc:226
-msgid "Font preview of @font (@file)"
-msgstr "Prévisualisation pour le police @font (@file)."
-
-#: image_captcha/image_captcha.admin.inc:241
-msgid "Preview of built-in font"
-msgstr "Prévisualisation de la police incorporée"
-
-#: image_captcha/image_captcha.admin.inc:242
-msgid "PHP built-in font: !font_preview"
-msgstr "Police intégrée à PHP : !font_preview"
-
-#: image_captcha/image_captcha.admin.inc:249
-msgid "Fonts"
-msgstr "Polices"
-
-#: image_captcha/image_captcha.admin.inc:251
-msgid "Select the fonts to use for the text in the image CAPTCHA. Apart from the provided defaults, you can also use your own TrueType fonts (filename extension .ttf) by putting them in %fonts_library_general or %fonts_library_specific. You can also upload them to the \"files\" directory of your site (%filesdir), e.g. with the \"Upload\" module, but those fonts will not get a preview for security reasons."
-msgstr "Sélectionnez les polices à utiliser pour le texte dans le visuel CAPTCHA. Outre les paramètres fournis par défaut, vous pouvez aussi utiliser vos propres polices TrueType (extension. ttf) en les mettant dans %fonts_library_general ou %fonts_library_specific. Vous pouvez également les télécharger vers le répertoire \"files\" de votre site (%filesdir), par exemple avec le module \"Upload \" , mais ces polices ne permettront pas d'obtenir une prévisualisation, pour des raisons de sécurité."
-
-#: image_captcha/image_captcha.admin.inc:267
-msgid "Font size"
-msgstr "Taille de la police"
-
-#: image_captcha/image_captcha.admin.inc:269
-msgid "tiny"
-msgstr "minuscule"
-
-#: image_captcha/image_captcha.admin.inc:272;292
-msgid "normal"
-msgstr "normal"
-
-#: image_captcha/image_captcha.admin.inc:274
-msgid "large"
-msgstr "grande"
-
-#: image_captcha/image_captcha.admin.inc:276
-msgid "extra large"
-msgstr "très grande"
-
-#: image_captcha/image_captcha.admin.inc:279
-msgid "The font size influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr "La taille de la police influence la taille de l'image. Il est à noter que des valeurs élevées peuvent rendre la génération de l'image plus lourde en terme de puissance de calcul."
-
-#: image_captcha/image_captcha.admin.inc:287
-msgid "Character spacing"
-msgstr "Espacement des caractères"
-
-#: image_captcha/image_captcha.admin.inc:288
-msgid "Define the average spacing between characters. Note that larger values make the image generation more CPU intensive."
-msgstr "définir l'espacement moyen entre les caractères. Il est à noter que des valeurs élevées peuvent rendre la génération de l'image plus lourde en terme de puissance de calcul."
-
-#: image_captcha/image_captcha.admin.inc:291
-msgid "tight"
-msgstr "condensé"
-
-#: image_captcha/image_captcha.admin.inc:293
-msgid "wide"
-msgstr "étendu"
-
-#: image_captcha/image_captcha.admin.inc:294
-msgid "extra wide"
-msgstr "très étendu"
-
-#: image_captcha/image_captcha.admin.inc:356
-msgid "The list of characters to use should not contain spaces."
-msgstr "La liste des caractères à utiliser ne doit pas contenir d'espaces."
-
-#: image_captcha/image_captcha.admin.inc:364
-msgid "You need to select at least one font."
-msgstr "Vous devez spécifier au moins une police."
-
-#: image_captcha/image_captcha.admin.inc:369
-msgid "The built-in font only supports Latin2 characters. Only use \"a\" to \"z\" and numbers."
-msgstr "La police incorporée supporte uniquement les caractères Latin2. Utilisez seulement les caractères de \"a\" à  \"z\"  et les nombres."
-
-#: image_captcha/image_captcha.admin.inc:374
-msgid "The following fonts are not readable: %fonts."
-msgstr "Les polices suivantes ne sont pas lisibles :  %fonts."
-
-#: image_captcha/image_captcha.admin.inc:380
-msgid "Background color is not a valid hexadecimal color value."
-msgstr "La couleur d'arrière-plan n'est pas une valeur hexadécimale valide."
-
-#: image_captcha/image_captcha.admin.inc:383
-msgid "Text color is not a valid hexadecimal color value."
-msgstr "La couleur du texte n'est pas une valeur hexadécimale valide."
-
-#: image_captcha/image_captcha.user.inc:29
-msgid "Generation of image CAPTCHA failed. Check your image CAPTCHA configuration and especially the used font."
-msgstr "La génération du CAPTCHA visuel a échoué. Vérifiez les paramètres du CAPTCHA visuel et plus particulièrement la police utilisée."
-
-#: image_captcha/image_captcha.module:30
-msgid "The image CAPTCHA is a popular challenge where a random textual code is obfuscated in an image. The image is generated on the fly for each request, which is rather CPU intensive for the server. Be careful with the size and computation related settings."
-msgstr "Le CAPTCHA visuel est un défi populaire où un code textuel aléatoire est masqué dans une image. L'image en question est générée à la volée à chaque requête, ce qui rend le processus assez lourd en terme de puissance de calcul. Soyez prudent lors de la configuration des paramètres liés à la taille et au rendu de l'image."
-
-#: image_captcha/image_captcha.module:212;212;42
-#: image_captcha/image_captcha.info:0
-msgid "Image CAPTCHA"
-msgstr "CAPTCHA visuel"
-
-#: image_captcha/image_captcha.module:217
-msgid "What code is in the image?"
-msgstr "Quel est le code dans l'image?"
-
-#: image_captcha/image_captcha.module:218
-msgid "Enter the characters shown in the image."
-msgstr "Entrez les caractères (sans espace) affichés dans l'image."
-
-#: image_captcha/image_captcha.module:129
-msgid "Encountered an illegal byte while splitting an utf8 string in characters."
-msgstr "Rencontre d'un octet non admis lors du découpage d'une chaîne utf8 en caractères."
-
-#: image_captcha/image_captcha.module:51
-msgid "Font example"
-msgstr "Exemple de police"
-
-#: image_captcha/image_captcha.info:0
-msgid "Provides an image based CAPTCHA."
-msgstr "Fournit un CAPTCHA visuel."
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/he.po b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/he.po
deleted file mode 100644
index 439f690..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/he.po
+++ /dev/null
@@ -1,611 +0,0 @@
-# $Id: he.po,v 1.3 2009/07/11 17:30:38 soxofaan Exp $
-#
-# Hebrew translation of Drupal (general)
-# Copyright YEAR NAME <EMAIL at ADDRESS>
-# Generated from files:
-#  captcha.admin.inc,v 1.5.2.6 2008/03/29 17:20:25 soxofaan
-#  image_captcha.admin.inc,v 1.3.2.1 2008/04/06 15:27:27 soxofaan
-#  captcha.module,v 1.58.2.6 2008/04/07 22:25:45 soxofaan
-#  captcha.info,v 1.5 2007/10/27 18:24:50 robloach
-#  image_captcha.user.inc,v 1.3.2.1 2008/04/06 15:27:27 soxofaan
-#  image_captcha.module,v 1.8.2.2 2008/04/07 22:25:45 soxofaan
-#  captcha.install,v 1.3.2.2 2008/03/20 10:27:53 soxofaan
-#  image_captcha.info,v 1.3 2007/12/11 12:05:32 soxofaan
-#  text_captcha.info,v 1.3 2008/01/04 14:29:58 soxofaan
-#  text_captcha.admin.inc,v 1.1 2008/01/04 14:29:58 soxofaan
-#  text_captcha.user.inc,v 1.1 2008/01/04 14:29:58 soxofaan
-#  text_captcha.module,v 1.3.2.2 2008/04/07 22:25:46 soxofaan
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PROJECT VERSION\n"
-"POT-Creation-Date: 2009-04-27 23:28+0200\n"
-"PO-Revision-Date: 2009-05-26 17:58+0200\n"
-"Last-Translator: Shahar Or <shahar at shahar-or.co.il>\n"
-"Language-Team: Hebrew <EMAIL at ADDRESS>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n!=1);\n"
-
-#: captcha.admin.inc:13 image_captcha/image_captcha.admin.inc:144;166
-msgid "none"
-msgstr "ללא"
-
-#: captcha.admin.inc:34
-msgid "Form protection"
-msgstr ""
-
-#: captcha.admin.inc:35
-msgid "Select the challenge type you want for each of the listed forms (identified by their so called <em>form_id</em>'s). You can easily add arbitrary forms with textfield at the bottom of the table or with the help of the '%CAPTCHA_admin_links' option below."
-msgstr ""
-
-#: captcha.admin.inc:36;83 captcha.module:45
-msgid "Add CAPTCHA administration links to forms"
-msgstr ""
-
-#: captcha.admin.inc:61
-msgid "delete"
-msgstr "מחק"
-
-#: captcha.admin.inc:85
-msgid "This option makes it easy to manage CAPTCHA settings on forms. When enabled, users with the \"%admincaptcha\" permission will see a fieldset with CAPTCHA administration links on all forms, except on administrative pages."
-msgstr ""
-
-#: captcha.admin.inc:85 captcha.module:106
-msgid "administer CAPTCHA settings"
-msgstr ""
-
-#: captcha.admin.inc:90
-msgid "Allow CAPTCHAs and CAPTCHA administration links on administrative pages"
-msgstr ""
-
-#: captcha.admin.inc:92
-msgid "This option makes it possible to add CAPTCHAs to forms on administrative pages. CAPTCHAs are disabled by default on administrative pages (which shouldn't be accessible to untrusted users normally) to avoid the related overhead. In some situations, e.g. in the case of demo sites, it can be usefull to allow CAPTCHAs on administrative pages."
-msgstr ""
-
-#: captcha.admin.inc:100;115
-msgid "Challenge description"
-msgstr ""
-
-#: captcha.admin.inc:101;116
-msgid "With this description you can explain the purpose of the challenge to the user."
-msgstr ""
-
-#: captcha.admin.inc:106
-msgid "For language %lang_name (code %lang_code)"
-msgstr ""
-
-#: captcha.admin.inc:125
-msgid "Persistence"
-msgstr ""
-
-#: captcha.admin.inc:128
-msgid "Always add a challenge."
-msgstr ""
-
-#: captcha.admin.inc:129
-msgid "Omit challenges for a form once the user has successfully responded to a challenge for that form."
-msgstr ""
-
-#: captcha.admin.inc:130
-msgid "Omit challenges for all forms once the user has successfully responded to a challenge."
-msgstr ""
-
-#: captcha.admin.inc:132
-msgid "Define if challenges should be omitted during the rest of a session once the user successfully responses to a challenge."
-msgstr ""
-
-#: captcha.admin.inc:138
-msgid "Log wrong responses"
-msgstr ""
-
-#: captcha.admin.inc:139
-msgid "Report information about wrong responses to the !log."
-msgstr ""
-
-#: captcha.admin.inc:139
-msgid "log"
-msgstr ""
-
-#: captcha.admin.inc:146
-msgid "Save configuration"
-msgstr ""
-
-#: captcha.admin.inc:156
-msgid "Challenge type (module)"
-msgstr ""
-
-#: captcha.admin.inc:156
-msgid "Operations"
-msgstr "פעולות אפשריות"
-
-#: captcha.admin.inc:183;295
-msgid "Illegal form_id"
-msgstr ""
-
-#: captcha.admin.inc:205
-msgid "Added CAPTCHA point."
-msgstr ""
-
-#: captcha.admin.inc:223
-msgid "The CAPTCHA settings were saved."
-msgstr ""
-
-#: captcha.admin.inc:253;267
-msgid "Form ID"
-msgstr ""
-
-#: captcha.admin.inc:254;268
-msgid "The Drupal form_id of the form to add the CAPTCHA to."
-msgstr ""
-
-#: captcha.admin.inc:274
-msgid "Challenge type"
-msgstr ""
-
-#: captcha.admin.inc:275
-msgid "The CAPTCHA type to use for this form"
-msgstr ""
-
-#: captcha.admin.inc:284
-msgid "Save"
-msgstr ""
-
-#: captcha.admin.inc:307
-msgid "Saved CAPTCHA point settings."
-msgstr ""
-
-#: captcha.admin.inc:324
-msgid "Are you sure you want to delete the CAPTCHA for form_id %form_id?"
-msgstr ""
-
-#: captcha.admin.inc:325
-msgid "Delete"
-msgstr "מחק"
-
-#: captcha.admin.inc:328
-msgid "Are you sure you want to disable the CAPTCHA for form_id %form_id?"
-msgstr ""
-
-#: captcha.admin.inc:329
-msgid "Disable"
-msgstr ""
-
-#: captcha.admin.inc:342
-msgid "Deleted CAPTCHA for form %form_id."
-msgstr ""
-
-#: captcha.admin.inc:346
-msgid "Disabled CAPTCHA for form %form_id."
-msgstr ""
-
-#: captcha.admin.inc:384
-msgid "This page gives an overview of all available challenge types, generated with their current settings."
-msgstr ""
-
-#: captcha.admin.inc:392
-msgid "Challenge \"%challenge\" by module \"%module\""
-msgstr ""
-
-#: captcha.admin.inc:395
-msgid "10 more examples of this challenge."
-msgstr ""
-
-#: captcha.inc:55
-msgid "This question is for testing whether you are a human visitor and to prevent automated spam submissions."
-msgstr "אתגר זה נועד לוודא שהינך אנושי כדי למנוע \"ספאם\"."
-
-#: captcha.module:30
-msgid "\"CAPTCHA\" is an acronym for \"Completely Automated Public Turing test to tell Computers and Humans Apart\". It is typically a challenge-response test to determine whether the user is human. The CAPTCHA module is a tool to fight automated submission by malicious users (spamming) of for example comments forms, user registration forms, guestbook forms, etc. You can extend the desired forms with an additional challenge, which should be easy for a human to solve correctly, but hard enough to keep automated scripts and spam bots out."
-msgstr ""
-
-#: captcha.module:31
-msgid "Note that the CAPTCHA module interacts with page caching (see <a href=\"!performancesettings\">performance settings</a>). Because the challenge should be unique for each generated form, the caching of the page it appears on is prevented. Make sure that these forms do not appear on too many pages or you will lose much caching efficiency. For example, if you put a CAPTCHA on the user login block, which typically appears on each page for anonymous visitors, caching will practically be disabled. The comment submission forms are another example. In this case you should set the \"%commentlocation\" to \"%separatepage\" in the comment settings of the relevant <a href=\"!contenttypes\">content types</a> for better caching efficiency."
-msgstr ""
-
-#: captcha.module:34
-msgid "Location of comment submission form"
-msgstr "מיקום טופס כתיבת התגובה"
-
-#: captcha.module:35
-msgid "Display on separate page"
-msgstr "הצג בעמוד נפרד"
-
-#: captcha.module:39
-msgid "CAPTCHA is a trademark of Carnegie Mellon University."
-msgstr ""
-
-#: captcha.module:44
-msgid "A CAPTCHA can be added to virtually each Drupal form. Some default forms are already provided in the form list, but arbitrary forms can be easily added and managed when the option \"%adminlinks\" is enabled."
-msgstr ""
-
-#: captcha.module:46
-msgid "Users with the \"%skipcaptcha\" <a href=\"@perm\">permission</a> won't be offered a challenge. Be sure to grant this permission to the trusted users (e.g. site administrators). If you want to test a protected form, be sure to do it as a user without the \"%skipcaptcha\" permission (e.g. as anonymous user)."
-msgstr ""
-
-#: captcha.module:47;106
-msgid "skip CAPTCHA"
-msgstr ""
-
-#: (duplicate) captcha.module:263;342;118 ;211;440;59;70 captcha.info:0
-#: image_captcha/image_captcha.user.inc:29;72
-#: image_captcha/image_captcha.module:97
-msgid "CAPTCHA"
-msgstr ""
-
-#: captcha.module:347
-msgid "CAPTCHA: challenge \"@type\" enabled"
-msgstr ""
-
-#: captcha.module:348
-msgid "Untrusted users will see a CAPTCHA here (!settings)."
-msgstr ""
-
-#: captcha.module:349
-msgid "general CAPTCHA settings"
-msgstr ""
-
-#: captcha.module:353
-msgid "Enabled challenge"
-msgstr ""
-
-#: captcha.module:354
-msgid "\"@type\" by module \"@module\" (!change, !disable)"
-msgstr ""
-
-#: captcha.module:357
-msgid "change"
-msgstr ""
-
-#: captcha.module:358
-msgid "disable"
-msgstr ""
-
-#: captcha.module:363
-msgid "Example"
-msgstr ""
-
-#: captcha.module:364
-msgid "This is a pre-solved, non-blocking example of this challenge."
-msgstr ""
-
-#: captcha.module:373
-msgid "CAPTCHA: no challenge enabled"
-msgstr ""
-
-#: captcha.module:375
-msgid "Place a CAPTCHA here for untrusted users."
-msgstr ""
-
-#: captcha.module:421
-msgid "CAPTCHA test failed (unknown csid)."
-msgstr ""
-
-#: captcha.module:435
-msgid "The answer you entered for the CAPTCHA was not correct."
-msgstr "התשובה שסיפקת לאתגר אינה נכונה."
-
-#: captcha.module:523
-#, fuzzy
-msgid "Math question"
-msgstr "שאלת מתמטיקה"
-
-#: captcha.module:524
-msgid "Solve this simple math problem and enter the result. E.g. for 1+3, enter 4."
-msgstr "פתור את הבעיה המתמטית הפשוטה הזו. לדוגמה, עבור 1+3, הקש 4."
-
-#: captcha.module:525
-msgid "@x + @y = "
-msgstr ""
-
-#: captcha.module:211
-msgid "CAPTCHA problem: hook_captcha() of module %module returned nothing when trying to retrieve challenge type %type for form %form_id."
-msgstr ""
-
-#: captcha.module:440
-msgid "%form_id post blocked by CAPTCHA module: challenge \"%challenge\" (by module \"%module\"), user answered \"%response\", but the solution was \"%solution\"."
-msgstr ""
-
-#: captcha.module:119
-msgid "Already 1 blocked form submission"
-msgid_plural "Already @count blocked form submissions"
-msgstr[0] ""
-msgstr[1] ""
-
-#: captcha.module:60
-msgid "Administer how and where CAPTCHAs are used."
-msgstr ""
-
-#: captcha.module:76
-msgid "General settings"
-msgstr ""
-
-#: captcha.module:82
-msgid "Examples"
-msgstr ""
-
-#: captcha.module:83
-msgid "An overview of the available challenge types with examples."
-msgstr ""
-
-#: captcha.module:92
-msgid "CAPTCHA point administration"
-msgstr ""
-
-#: captcha.install:156
-msgid "Unsupported database."
-msgstr ""
-
-#: (duplicate) captcha.install:115
-msgid "You can now <a href=\"!captcha_admin\">configure the CAPTCHA module</a> for your site."
-msgstr ""
-
-#: captcha.info:0
-msgid "Base CAPTCHA module for adding challenges to arbitrary forms."
-msgstr ""
-
-#: captcha.info:0 image_captcha/image_captcha.info:0
-msgid "Spam control"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:13
-msgid "Built-in font"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:35
-msgid "The Image CAPTCHA module can not generate images because your PHP setup does not support it (no <a href=\"!gdlib\">GD library</a>)."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:46
-msgid "Code settings"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:50
-msgid "Characters to use in the code"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:55
-msgid "Code length"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:58
-msgid "The code length influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:63
-msgid "Case insensitive validation"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:64
-msgid "Enable this option to ignore uppercase/lowercase errors in the response. This can be usefull for certain target audiences or fonts."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:71
-msgid "Font settings"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:77
-msgid "Font"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:79
-msgid "The TrueType font (.ttf) to use for the text in the image CAPTCHA."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:88
-msgid "Font size"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:90
-msgid "tiny"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:91;112;145
-msgid "small"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:92;113;169
-msgid "normal"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:93;114
-msgid "large"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:96
-msgid "The font size influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:108
-msgid "Character spacing"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:109
-msgid "Define the average spacing between characters. Note that larger values make the image generation more CPU intensive."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:121
-msgid "Color settings"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:122
-msgid "Configuration of the background and text colors in the image CAPTCHA."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:126
-msgid "Background color"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:127
-msgid "Enter the hexadecimal code for the background color (e.g. #FFF or #FFCE90)."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:134
-msgid "Text color"
-msgstr "צבע הטקסט"
-
-#: image_captcha/image_captcha.admin.inc:135
-msgid "Enter the hexadecimal code for the text color (e.g. #000 or #004283)."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:142
-msgid "Additional variation of text color"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:146;168
-msgid "moderate"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:147;170
-msgid "high"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:148
-msgid "very high"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:151
-msgid "The different characters will have randomized colors in the specified range around the text color."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:158
-msgid "Distortion and noise"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:159
-msgid "With these settings you can control the degree of obfuscation by distortion and added noise. Do not exaggerate the obfuscation and assure that the code in the image is reasonably readable. For example, do not combine high levels of distortion and noise."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:164
-msgid "Distortion level"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:167
-msgid "low"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:171
-msgid "severe"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:174
-msgid "Set the degree of wave distortion in the image."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:178
-msgid "Smooth distortion"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:180
-msgid "This option enables bilinear interpolation of the distortion which makes the image look smoother, but it is more CPU intensive."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:185
-msgid "Add salt and pepper noise"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:187
-msgid "This option adds randomly colored point noise."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:191
-msgid "Add line noise"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:193
-msgid "This option enables lines randomly drawn on top of the text code."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:197
-msgid "Noise level"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:199
-msgid "1 - low"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:201
-msgid "3 - medium"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:203
-msgid "5 - high"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:205
-msgid "10 - severe"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:222
-msgid "The Image CAPTCHA module can not use True Type fonts because your PHP setup does not support it. There is only a built-in bitmap font available."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:227
-msgid "The image CAPTCHA module works best with a TrueType font file (TTF) for generating the images, but because of licencing issues it is not allowed to package fonts with the module. A simple built-in bitmap font is provided as default instead. You can install TrueType fonts yourself by putting them in the fonts directory of the image CAPTCHA module (directory \"%fontsdir\") or by uploading them to your Drupal file system (directory \"%filesdir\") with for example the upload module."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:230
-msgid "The usage of the built-in bitmap font it is not recommended because of its small size and missing UTF-8 support."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:241
-msgid "The list of characters to use should not contain spaces."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:246
-msgid "You need to select a font"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:249
-msgid "Font does not exist or is not readable."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:254
-msgid "Background color is not a valid hexadecimal color value."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:257
-msgid "Text color is not a valid hexadecimal color value."
-msgstr ""
-
-#: image_captcha/image_captcha.user.inc:29
-msgid "Generation of image CAPTCHA failed. Check your image CAPTCHA configuration and especially the used font."
-msgstr ""
-
-#: image_captcha/image_captcha.user.inc:72
-msgid "Could not find or read the configured font (\"%font\") for the image CAPTCHA."
-msgstr ""
-
-#: image_captcha/image_captcha.module:24
-msgid "The image CAPTCHA is a popular challenge where a random textual code is obfuscated in an image. The image is generated on the fly for each request, which is rather CPU intensive for the server. Be careful with the size and computation related settings."
-msgstr ""
-
-#: image_captcha/image_captcha.module:30
-msgid "Example image, generated with the current settings:"
-msgstr ""
-
-#: image_captcha/image_captcha.module:170
-msgid "Enter the characters (without spaces) shown in the image."
-msgstr ""
-
-#: image_captcha/image_captcha.module:173
-msgid "Enter the characters shown in the image. Ignore spaces and be careful about upper and lower case."
-msgstr ""
-
-#: image_captcha/image_captcha.module:183;183;43
-#: image_captcha/image_captcha.info:0
-msgid "Image CAPTCHA"
-msgstr ""
-
-#: image_captcha/image_captcha.module:188
-msgid "What code is in the image?"
-msgstr "איזה קוד בתמונה?"
-
-#: image_captcha/image_captcha.module:97
-msgid "Encountered an illegal byte while splitting an utf8 string in characters."
-msgstr ""
-
-#: image_captcha/image_captcha.info:0
-msgid "Provides an image based CAPTCHA."
-msgstr ""
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/hu.po b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/hu.po
deleted file mode 100644
index d62900a..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/hu.po
+++ /dev/null
@@ -1,635 +0,0 @@
-# Hungarian translation of CAPTCHA (6.x-2.1)
-# Copyright (c) 2010 by the Hungarian translation team
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: CAPTCHA (6.x-2.1)\n"
-"POT-Creation-Date: 2010-01-08 20:46+0000\n"
-"PO-Revision-Date: 2010-01-08 20:45+0000\n"
-"Language-Team: Hungarian\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n!=1);\n"
-
-msgid "Save configuration"
-msgstr "Beállítások mentése"
-msgid "delete"
-msgstr "törlés"
-msgid "Delete"
-msgstr "Törlés"
-msgid "Operations"
-msgstr "Műveletek"
-msgid "Disable"
-msgstr "Letilt"
-msgid "none"
-msgstr "nincs"
-msgid "General settings"
-msgstr "Általános beállítások"
-msgid "Save"
-msgstr "Mentés"
-msgid "Form ID"
-msgstr "Űrlap azonosító"
-msgid "Example"
-msgstr "Példa"
-msgid "Background color"
-msgstr "Háttérszín"
-msgid "Text color"
-msgstr "Szövegszín"
-msgid "Unsupported database."
-msgstr "Nem támogatott adatbázis."
-msgid "normal"
-msgstr "normál"
-msgid "Code length"
-msgstr "Kód hossza"
-msgid "Font size"
-msgstr "Betűméret"
-msgid "Spam control"
-msgstr "Reklámszemét felügyelet"
-msgid "Characters to use in the code"
-msgstr "A kódban használt karakterek"
-msgid "The list of characters to use should not contain spaces."
-msgstr "A használt karakterek felsorolása nem tartalmazhat szóközt."
-msgid "Math question"
-msgstr "Matematikai kérdés"
-msgid ""
-"Encountered an illegal byte while splitting an utf8 string in "
-"characters."
-msgstr ""
-"Az UTF-8 karaktersorozat átalakítása közben egy érvénytelen "
-"bájt fordult elő."
-msgid "For language %lang_name (code %lang_code)"
-msgstr "%lang_name nyelven (kód %lang_code)"
-msgid "change"
-msgstr "változtat"
-msgid "disable"
-msgstr "letiltás"
-msgid "low"
-msgstr "alacsony"
-msgid "medium"
-msgstr "közepes"
-msgid "high"
-msgstr "magas"
-msgid "Display on separate page"
-msgstr "Megjelenítés külön oldalon"
-msgid "Add CAPTCHA administration links to forms"
-msgstr "CAPTCHA adminisztrációs hivatkozás hozzáadása az űrlapokhoz"
-msgid "administer CAPTCHA settings"
-msgstr "CAPTCHA beállítások adminisztrációja"
-msgid "Challenge description"
-msgstr "Feladat leírása"
-msgid "Persistence"
-msgstr "Szívósság"
-msgid "Always add a challenge."
-msgstr "Mindig adja hozzá a feladatot."
-msgid ""
-"Omit challenges for a form once the user has successfully responded to "
-"a challenge for that form."
-msgstr ""
-"Mellőzi a feladatot az adott űrlap mellől, ha a felhasználó "
-"egyszer már jól válaszolt."
-msgid ""
-"Omit challenges for all forms once the user has successfully responded "
-"to a challenge."
-msgstr ""
-"Mellőzi a feladatot minden űrlap mellől, ha a felhasználó egyszer "
-"már jól válaszolt."
-msgid ""
-"Define if challenges should be omitted during the rest of a session "
-"once the user successfully responses to a challenge."
-msgstr ""
-"Megadható, hogy amennyiben a felhasználó sikeresen megoldott egy "
-"feladatot, látogatásának további szakaszában már ne kapjon "
-"többet."
-msgid "Log wrong responses"
-msgstr "Hibás válaszok naplózása"
-msgid "Report information about wrong responses to the !log."
-msgstr ""
-"Kerüljön információ a rossz válaszokról a rendszernaplóba. "
-"(!log)"
-msgid "log"
-msgstr "napló"
-msgid "The CAPTCHA settings were saved."
-msgstr "A CAPTCHA beállítások elmentve."
-msgid "The Drupal form_id of the form to add the CAPTCHA to."
-msgstr ""
-"A Drupal űrlap azonosítója, amihez a CAPTCHA feladatot hozzá kell "
-"adni."
-msgid "Challenge type"
-msgstr "Feladat típusa"
-msgid "The CAPTCHA type to use for this form"
-msgstr "Az űrlaphoz használt CAPTCHA típusa"
-msgid "Illegal form_id"
-msgstr "Érvénytelen form_id"
-msgid "Saved CAPTCHA point settings."
-msgstr "Mentett CAPTCHA pont beállítások."
-msgid "Are you sure you want to delete the CAPTCHA for form_id %form_id?"
-msgstr "„%form_id” <em>CAPTCHA</em> védelme biztosan törölhető?"
-msgid "Are you sure you want to disable the CAPTCHA for form_id %form_id?"
-msgstr "„%form_id” <em>CAPTCHA</em> védelme biztosan letiltható?"
-msgid "Deleted CAPTCHA for form %form_id."
-msgstr "%form_id űrlapról a CAPTCHA eltávolítva."
-msgid "Disabled CAPTCHA for form %form_id."
-msgstr "%form_id űrlapról a CAPTCHA letiltva."
-msgid ""
-"This page gives an overview of all available challenge types, "
-"generated with their current settings."
-msgstr ""
-"Ez a lap egy átfogó képet ad a rendelkezésre álló feladat "
-"típusokról, azok aktuális beállításaival létrehozva."
-msgid "Challenge \"%challenge\" by module \"%module\""
-msgstr "„%module” számára „%challenge” feladat"
-msgid "10 more examples of this challenge."
-msgstr "10 további példa ebből a feladatból."
-msgid ""
-"\"CAPTCHA\" is an acronym for \"Completely Automated Public Turing "
-"test to tell Computers and Humans Apart\". It is typically a "
-"challenge-response test to determine whether the user is human. The "
-"CAPTCHA module is a tool to fight automated submission by malicious "
-"users (spamming) of for example comments forms, user registration "
-"forms, guestbook forms, etc. You can extend the desired forms with an "
-"additional challenge, which should be easy for a human to solve "
-"correctly, but hard enough to keep automated scripts and spam bots "
-"out."
-msgstr ""
-"A CAPTCHA a „Completely Automated Public Turing test to tell "
-"Computers and Humans Apart” rövídítése. Ez tipikusan egy "
-"feladat-válasz teszt, mely megállapítja, hogy felhasználó valós "
-"ember-e. A <em>CAPTCHA</em> modul egy eszköz a rosszindulatú "
-"felhasználók automatikus beküldései elleni harcban, a "
-"hozzászólás, a felhasználói regisztráció, vagy a vendégkönyv "
-"űrlapokon. A szükséges űrlapokat ki lehet egészíteni egy "
-"egyszerű feladattal, melyet az emberek könnyedén meg tudnak oldani, "
-"de elég nehéz feladat elé állítják az automatikus programokat "
-"és a szemétküldő robotokat."
-msgid ""
-"Note that the CAPTCHA module interacts with page caching (see <a "
-"href=\"!performancesettings\">performance settings</a>). Because the "
-"challenge should be unique for each generated form, the caching of the "
-"page it appears on is prevented. Make sure that these forms do not "
-"appear on too many pages or you will lose much caching efficiency. For "
-"example, if you put a CAPTCHA on the user login block, which typically "
-"appears on each page for anonymous visitors, caching will practically "
-"be disabled. The comment submission forms are another example. In this "
-"case you should set the \"%commentlocation\" to \"%separatepage\" in "
-"the comment settings of the relevant <a href=\"!contenttypes\">content "
-"types</a> for better caching efficiency."
-msgstr ""
-"Megjegyzés: A <em>CAPTCHA</em> modul együttműködik a lap "
-"gyorstárazással (lásd a <a "
-"href=\"!performancesettings\">teljesítmény beállításoknál</a>). "
-"Mivel a feladatnak egyedinek kell lennie minden űrlap esetén, ez a "
-"lap gyorstárazását meggátolja. Meg kell győződni arról, hogy "
-"ezek az űrlapok ne jelenjenek meg túl sok oldalon, mert az jelentős "
-"teljesítmény romláshoz vezet. Például, ha a felhasználói "
-"bejelentkezés blokkon - mely tipikusan minden oldalon megjelenik a "
-"vendég felhasználóknak - CAPTCHA védelem van, a lapok "
-"gyorstárazása átmenetileg le lesz tiltva. A hozzászólás "
-"beküldő űrlap a másik példa. Ebben az esetben célszerű a "
-"„%commentlocation” helyét „%separatepage” lehetőségre "
-"állítani a <a href=\"!contenttypes\">tartalomtípusok</a> oldalán a "
-"jobb gyorstárazás érdekében."
-msgid "Location of comment submission form"
-msgstr "Hozzászólás-beküldő űrlap helyzete"
-msgid "CAPTCHA is a trademark of Carnegie Mellon University."
-msgstr "A CAPTCHA a Carnegie Mellon University védjegye."
-msgid ""
-"A CAPTCHA can be added to virtually each Drupal form. Some default "
-"forms are already provided in the form list, but arbitrary forms can "
-"be easily added and managed when the option \"%adminlinks\" is "
-"enabled."
-msgstr ""
-"Minden Drupal űrlapohoz hozzá lehet adni a feladatokat. Néhány "
-"alapértelmezett űrlap már fel van kínálva az űrlaplistán, de "
-"bármelyik űrlapot könnyen hozzá lehet adni, ha „%adminlinks” "
-"engedélyezett."
-msgid ""
-"Users with the \"%skipcaptcha\" <a href=\"@perm\">permission</a> won't "
-"be offered a challenge. Be sure to grant this permission to the "
-"trusted users (e.g. site administrators). If you want to test a "
-"protected form, be sure to do it as a user without the "
-"\"%skipcaptcha\" permission (e.g. as anonymous user)."
-msgstr ""
-"„%skipcaptcha” <a href=\"@perm\">jogosultsággal</a> rendelkező "
-"felhasználók nem kapnak feladatokat. Ezt a jogosultságot minden "
-"megbízható felhasználóhoz hozzá kell rendelni (például az "
-"adminisztrátorok). Egy védett űrlap tesztelését olyan "
-"felhasználóval kell elvégezni, aki nem rendelkezik "
-"„%skipcaptcha” jogosultsággal (Például a vendégek)."
-msgid "skip CAPTCHA"
-msgstr "CAPTCHA mellőzése"
-msgid ""
-"This question is for testing whether you are a human visitor and to "
-"prevent automated spam submissions."
-msgstr ""
-"A kérdés azt vizsgálja, hogy valós látogató, vagy robot "
-"szeretné az űrlapot beküldeni."
-msgid "CAPTCHA"
-msgstr "CAPTCHA"
-msgid "Untrusted users will see a CAPTCHA here (!settings)."
-msgstr ""
-"Megbízhatatlan felhasználók fognak látni egy CAPTCHA védelmet itt "
-"(!settings)."
-msgid "general CAPTCHA settings"
-msgstr "általános CAPTCHA beállítások"
-msgid "Enabled challenge"
-msgstr "Engedélyezett feladat"
-msgid "\"@type\" by module \"@module\" (!change, !disable)"
-msgstr "„@type” modul „@module” (!change, !disable)"
-msgid "Place a CAPTCHA here for untrusted users."
-msgstr "CAPTCHA elhelyezése ide megbízhatatlan felhasználók ellen."
-msgid "The answer you entered for the CAPTCHA was not correct."
-msgstr "A CAPTCHA feladatra adott válasz helytelen volt."
-msgid ""
-"Solve this simple math problem and enter the result. E.g. for 1+3, "
-"enter 4."
-msgstr "A fenti művelet eredményét kell beírni. Pl.: 1+3 esetén 4-et."
-msgid "@x + @y = "
-msgstr "@x + @y = "
-msgid ""
-"CAPTCHA problem: hook_captcha() of module %module returned nothing "
-"when trying to retrieve challenge type %type for form %form_id."
-msgstr ""
-"CAPTCHA hiba: %modul modul hook_captcha() függvénye nem adott vissza "
-"semmit amikor próbálta kinyerni a %type feladat típusát a %form_id "
-"űrlapról."
-msgid ""
-"%form_id post blocked by CAPTCHA module: challenge \"%challenge\" (by "
-"module \"%module\"), user answered \"%response\", but the solution was "
-"\"%solution\"."
-msgstr ""
-"%form_id űrlap beküldését blokkolta a <em>CAPTCHA</em> modul. A "
-"feladat „%challenge” (modul „%module”), a felhasználó "
-"válasza „%response” volt, bár helyes a megoldás „%solution” "
-"lett volna."
-msgid "Administer how and where CAPTCHAs are used."
-msgstr "Adminisztráció, hogyan és hol használja a CAPTCHA-t."
-msgid "Examples"
-msgstr "Példák"
-msgid "An overview of the available challenge types with examples."
-msgstr "Egy áttekintés az elérhető feladat típusokról, példákkal."
-msgid ""
-"You can now <a href=\"!captcha_admin\">configure the CAPTCHA "
-"module</a> for your site."
-msgstr ""
-"Most <a href=\"!captcha_admin\">be lehet állítani a <em>CAPTCHA</em> "
-"modult</a> a webhelyen."
-msgid "Base CAPTCHA module for adding challenges to arbitrary forms."
-msgstr "Alap CAPTCHA modul, mely feladatokat ad tetszőleges űrlapokhoz."
-msgid "Code settings"
-msgstr "Kód beállítások"
-msgid ""
-"The code length influences the size of the image. Note that larger "
-"values make the image generation more CPU intensive."
-msgstr ""
-"A kód hossza befolyásolja a kép méretét. Nagyobb értékek "
-"esetén a kép előállítása intenzív processzor használatot "
-"eredményez."
-msgid "Font settings"
-msgstr "Betűkészlet beállítások"
-msgid "tiny"
-msgstr "apró"
-msgid "small"
-msgstr "kicsi"
-msgid "large"
-msgstr "nagy"
-msgid ""
-"The font size influences the size of the image. Note that larger "
-"values make the image generation more CPU intensive."
-msgstr ""
-"A betűméret befolyásolja a kép méretét. Nagyobb értékek "
-"esetén a kép előállítása intenzív processzor használatot "
-"eredményez."
-msgid "Character spacing"
-msgstr "Karakter ritkítás"
-msgid ""
-"Define the average spacing between characters. Note that larger values "
-"make the image generation more CPU intensive."
-msgstr ""
-"A karakterek közötti átlagos távolságot szabályozza. Nagyobb "
-"értékek esetén a kép előállítása intenzív processzor "
-"használatot eredményez."
-msgid "Enter the hexadecimal code for the text color (e.g. #000 or #004283)."
-msgstr "A szöveg színének hexadecimális kódja (Pl. #FFF vagy #FFCE90)."
-msgid "Additional variation of text color"
-msgstr "A szöveg színének változtatása"
-msgid "moderate"
-msgstr "mérsékelt"
-msgid "very high"
-msgstr "nagyon magas"
-msgid ""
-"The different characters will have randomized colors in the specified "
-"range around the text color."
-msgstr ""
-"A különböző karakterek véletlenszerű színt vesznek fel a "
-"megadott szövegszín tartomány környékéről."
-msgid "Distortion and noise"
-msgstr "Torzítás és zaj"
-msgid ""
-"With these settings you can control the degree of obfuscation by "
-"distortion and added noise. Do not exaggerate the obfuscation and "
-"assure that the code in the image is reasonably readable. For example, "
-"do not combine high levels of distortion and noise."
-msgstr ""
-"Ezekkel a beállításokkal lehet szabályozni a torzítás fokát, "
-"és a zaj hozzáadását. Nem szabad túlzásokba esni, és meg kell "
-"győződni arról, hogy a kód a képről egyértelműen leolvasható "
-"maradt. Például nem érdemes kombinálni a nagyszintű torzítást "
-"és a zajt."
-msgid "Distortion level"
-msgstr "Torzítási szint"
-msgid "severe"
-msgstr "szigorú"
-msgid "Set the degree of wave distortion in the image."
-msgstr "A hullámtorzítás szögének beállítása a képen."
-msgid "Smooth distortion"
-msgstr "Egyenletes torzítás"
-msgid "This option adds randomly colored point noise."
-msgstr "Ez a lehetőség véletlenszerű, színes pontokat ad."
-msgid "Add line noise"
-msgstr "Vonalzaj hozzáadása"
-msgid "This option enables lines randomly drawn on top of the text code."
-msgstr ""
-"Ez a lehetőség véletlenszerű vonalakat rajzol a szövegkód "
-"fölé."
-msgid "Noise level"
-msgstr "Zajszint"
-msgid "Background color is not a valid hexadecimal color value."
-msgstr "A háttérszín hexadecimális értéke érvénytelen."
-msgid "Text color is not a valid hexadecimal color value."
-msgstr "A szöveg színének hexadecimális értéke érvénytelen."
-msgid ""
-"Generation of image CAPTCHA failed. Check your image CAPTCHA "
-"configuration and especially the used font."
-msgstr ""
-"A kép CAPTCHA előállítása nem sikerült. Ellenőrizni kell a "
-"<em>kép CAPTCHA</em> beállítását, különös tekintettel a "
-"használt betűkészletre."
-msgid "Image CAPTCHA"
-msgstr "Kép CAPTCHA"
-msgid "What code is in the image?"
-msgstr "A képen látható kód"
-msgid "Provides an image based CAPTCHA."
-msgstr "Kép alapú CAPTCHA-t nyújt."
-msgid "File format"
-msgstr "Fájlformátum"
-msgid "Fonts"
-msgstr "Betűtípusok"
-msgid ""
-"This option enables bilinear interpolation of the distortion which "
-"makes the image look smoother, but it is more CPU intensive."
-msgstr ""
-"Ez a lehetőség engedélyezi a torzítás bilineráris "
-"interpolációját, mely a képet jobban láthatóvá teszi, de "
-"intenzív processzor használatot eredményez."
-msgid "Add salt and pepper noise"
-msgstr "Só-bors zaj hozzáadása"
-msgid ""
-"The image CAPTCHA is a popular challenge where a random textual code "
-"is obfuscated in an image. The image is generated on the fly for each "
-"request, which is rather CPU intensive for the server. Be careful with "
-"the size and computation related settings."
-msgstr ""
-"A <em>kép CAPTCHA</em> egy népszerű feladat, ahol véletlenszerű "
-"szöveges kódok vannak eltorzítva a képen. A kép előállítása "
-"ad-hoc történik minden egyes kérésnél, ez azonban intenzív "
-"processzor használatot jelent a kiszolgálónak. Óvatosan kell "
-"bánni a mérettel és a számítási igénnyel kapcsolatos "
-"beállításokkal."
-msgid "default challenge type"
-msgstr "alapértelmezés szerinti feladattípus"
-msgid "@type (from module @module)"
-msgstr "@type (@module modulból)"
-msgid "Form protection"
-msgstr "Űrlapvédelem"
-msgid ""
-"Select the challenge type you want for each of the listed forms "
-"(identified by their so called <em>form_id</em>'s). You can easily add "
-"arbitrary forms with textfield at the bottom of the table or with the "
-"help of the '%CAPTCHA_admin_links' option below."
-msgstr ""
-"A feladat típusának meghatározása a felsorolt űrlapokhoz (Az "
-"űrlap azonosítása a <em>form_id</em> segítségével történik). "
-"Tetszőleges űrlap könnyen hozzáadható a táblázat alján "
-"található szöveges mező, vagy a lenti „%CAPTCHA_admin_links” "
-"segítségével."
-msgid "Default challenge type"
-msgstr "Alapértelmezés szerinti feladattípus"
-msgid ""
-"Select the default challenge type for CAPTCHAs. This can be overriden "
-"for each form if desired."
-msgstr ""
-"Ki kell választani az alapértelmezett CAPTCHA feladattípust. Ez "
-"felülírható minden űrlapon, ha szükséges."
-msgid ""
-"Allow CAPTCHAs and CAPTCHA administration links on administrative "
-"pages"
-msgstr ""
-"Engedélyezi a CAPTCHA feladatokat és a CAPTCHA adminisztrációs "
-"hivatkozásokat az adminisztrációs oldalakon"
-msgid ""
-"This option makes it possible to add CAPTCHAs to forms on "
-"administrative pages. CAPTCHAs are disabled by default on "
-"administrative pages (which shouldn't be accessible to untrusted users "
-"normally) to avoid the related overhead. In some situations, e.g. in "
-"the case of demo sites, it can be usefull to allow CAPTCHAs on "
-"administrative pages."
-msgstr ""
-"Ez a kapcsoló lehetővé teszi CAPTCHA feladatok hozzárendelését "
-"az adminisztrációs oldalak űrlapjaihoz. Az adminisztrációs "
-"oldalakon a feladatok le vannak tiltva alapértelmezés szerint "
-"(melyek normál módon nem elérhetők a megbízhatatlan "
-"felhasználók számára) elkerülendő a kapcsolódó "
-"többletterhelést. Azonban néhány esetben (például bemutató "
-"oldalakon) hasznos lehet a CAPTCHA engedélyezése az "
-"adminisztrációs oldalakra is."
-msgid "Add a description to the CAPTCHA"
-msgstr "Leírás hozzáadása a CAPTCHA-hoz"
-msgid ""
-"Add a configurable description to explain the purpose of the CAPTCHA "
-"to the visitor."
-msgstr ""
-"Beállítható leírás hozzáadása, ami elmagyarázza a "
-"látogatóknak a CAPTCHA célját."
-msgid "CAPTCHA description"
-msgstr "CAPTCHA leírása"
-msgid ""
-"Configurable description of the CAPTCHA. An empty entry will reset the "
-"description."
-msgstr ""
-"A CAPTCHA beállítható leírása. Az üres bejegyzés elrejti a "
-"leírást."
-msgid "Default CAPTCHA validation"
-msgstr "Alapértelmezett CAPTCHA ellenőrzés"
-msgid ""
-"Define how the response should be processed by default. Note that the "
-"modules that provide the actual challenges can override or ignore "
-"this."
-msgstr ""
-"Meghatározza a válasz alapértelmezett feldolgozási módját. "
-"Fontos megjegyezni, hogy a jelenleg alkalmazott feladatot nyújtó "
-"modul ezt nem mindig veszi figyelembe."
-msgid ""
-"Case sensitive validation: the response has to exactly match the "
-"solution."
-msgstr ""
-"Kis- és nagybetűérzékeny ellenőrzés: a válasznak tökéletesen "
-"kell egyeznie a feladvánnyal."
-msgid "Case insensitive validation: lowercase/uppercase errors are ignored."
-msgstr ""
-"Kis-, illetve nagybetűérzéketlen ellenőrzés: a kisbetű és "
-"nagybetű hibák figyelmen kívül lesznek hagyva."
-msgid "Added CAPTCHA point."
-msgstr "CAPTCHA pont hozzáadva."
-msgid "Reset of CAPTCHA description for language %language."
-msgstr "CAPTCHA leírás elrejtése %language nyelv esetén."
-msgid "Reset of CAPTCHA description."
-msgstr "CAPTCHA leírás elrejtése."
-msgid ""
-"Failed to set a CAPTCHA type for form %form_id: could not interpret "
-"value \"@captcha_type\""
-msgstr ""
-"A CAPTCHA típus beállítása nem sikerült a következő űrlapon: "
-"%form_id. Nem értelmezhető érték: „@captcha_type”."
-msgid "CAPTCHA: challenge \"@type\" enabled"
-msgstr "CAPTCHA: feladat „@type” engedélyezve"
-msgid "This is a pre-solved, non-blocking example of this challenge."
-msgstr "Ez egy előre megoldott, nem blokkoló példája ennek a feladatnak."
-msgid "CAPTCHA: no challenge enabled"
-msgstr "CAPTCHA: nincs engedélyezett feladat"
-msgid "Test one two three"
-msgstr "Teszt egy, kettő, három"
-msgid "Already 1 blocked form submission"
-msgid_plural "Already @count blocked form submissions"
-msgstr[0] "Már 1 meggátolt űrlapbeküldés történt"
-msgstr[1] "Már @count meggátolt űrlapbeküldés történt"
-msgid "CAPTCHA point administration"
-msgstr "CAPTCHA pont adminisztrációja"
-msgid "Presolved image CAPTCHA example, generated with the current settings."
-msgstr ""
-"Előre megoldott <em>kép CAPTCHA</em> példa, az aktuális "
-"beállításokkal létrehozva."
-msgid "extra large"
-msgstr "nagyon nagy"
-msgid "tight"
-msgstr "szűk"
-msgid "wide"
-msgstr "széles"
-msgid "extra wide"
-msgstr "nagyon széles"
-msgid ""
-"This option makes it easy to manage CAPTCHA settings on forms. When "
-"enabled, users with the \"%admincaptcha\" permission will see a "
-"fieldset with CAPTCHA administration links on all forms, except on "
-"administrative pages."
-msgstr ""
-"Ezzel a lehetőséggel könnyebben szabályozható az űrlapokhoz "
-"rendelt CAPTCHA. Bekapcsolt állapotban a „%admincaptcha” "
-"jogosultsággal rendelkező felhasználók egy mezőcsoportot fognak "
-"látni az összes űrlap alatt, kivéve az adminisztratív oldalakon."
-msgid ""
-"The built-in font only supports Latin2 characters. Only use \"a\" to "
-"\"z\" and numbers."
-msgstr ""
-"A beépített betűtípus csak Latin2 karaktereket támogat. "
-"Kizárólag a betűk „a”-tól „z”-ig, valamint számok "
-"használhatók."
-msgid ""
-"CAPTCHA validation error: unknown CAPTCHA session ID. Contact the site "
-"administrator if this problem persists."
-msgstr ""
-"CAPTCHA ellenőrzési hiba: ismeretlen CAPTCHA "
-"munkafolyamat-azonosító. Ha állandósul a probléma, érdemes "
-"felvenni a kapcsolatot a webhely üzemeltetőjével."
-msgid "CAPTCHA validation error: unknown CAPTCHA session ID (%csid)."
-msgstr ""
-"CAPTCHA ellenőrzési hiba: ismeretlen CAPTCHA "
-"munkafolyamat-azonosító (%csid)."
-msgid ""
-"The Image CAPTCHA module can not generate images because your PHP "
-"setup does not support it (no <a href=\"!gdlib\">GD library</a> with "
-"JPEG support)."
-msgstr ""
-"Az Image CAPTCHA modul nem tud képeket létrehozni, mert a PHP "
-"beállításai nem támogatják azt (nincs JPEG támogatással "
-"rendelkező href=\"!gdlib\">GD könyvtár</a>)."
-msgid "Color and image settings"
-msgstr "Szín- és képbeállítások"
-msgid ""
-"Configuration of the background, text colors and file format of the "
-"image CAPTCHA."
-msgstr ""
-"A kép CAPTCHA hátterének, szövegszínének és fájlformátumának "
-"beállítása."
-msgid ""
-"Enter the hexadecimal code for the background color (e.g. #FFF or "
-"#FFCE90). When using the PNG file format with transparent background, "
-"it is recommended to set this close to the underlying background "
-"color."
-msgstr ""
-"A háttérszín tizenhatos számrendszerbeli kódja. (például #FFF "
-"vagy #FFCE90). Átlátszó PNG fájloknál ajánlott a kép alatt "
-"megjelenő háttér színéhez igazítani az átlátszóságot rosszul "
-"kezelő böngészők (például Internet Explorer 6) érdekében."
-msgid ""
-"Select the file format for the image. JPEG usually results in smaller "
-"files, PNG allows tranparency."
-msgstr ""
-"A kép fájlformátumának kiválasztása. A JPEG fájlok általában "
-"kisebbek, a PNG fájlok engedélyezik az átlátszóságot és kisebb "
-"a tömörítési algoritmusból fakadó zavar."
-msgid "JPEG"
-msgstr "JPEG"
-msgid "PNG"
-msgstr "PNG"
-msgid "PNG with transparent background"
-msgstr "PNG átlátszó háttérrel"
-msgid "@level - no distortion"
-msgstr "@level - nincs torzítás"
-msgid "@level - low"
-msgstr "@level - alacsony"
-msgid "@level - medium"
-msgstr "@level - közepes"
-msgid "@level - high"
-msgstr "@level - magas"
-msgid "No TrueType support"
-msgstr "Nincs <em>TrueType</em> támogatás"
-msgid ""
-"The Image CAPTCHA module can not use TrueType fonts because your PHP "
-"setup does not support it. You can only use a PHP built-in bitmap font "
-"of fixed size."
-msgstr ""
-"Az <em>Image Captcha</em> modul nem tud <em>TrueType</em> "
-"betűtípusokat használni, mert a PHP beállítása nem támogatja "
-"auz. Csak a PHP beépített, rögzített méretű betűtípusa "
-"használható."
-msgid "Font preview of @font (@file)"
-msgstr "@font (@file) betűtípus előnézete"
-msgid "Preview of built-in font"
-msgstr "Beépített betűtípus előnézete"
-msgid "PHP built-in font: !font_preview"
-msgstr "Beépített PHP betűtípus: !font_preview"
-msgid ""
-"Select the fonts to use for the text in the image CAPTCHA. Apart from "
-"the provided defaults, you can also use your own TrueType fonts "
-"(filename extension .ttf) by putting them in %fonts_library_general or "
-"%fonts_library_specific. You can also upload them to the \"files\" "
-"directory of your site (%filesdir), e.g. with the \"Upload\" module, "
-"but those fonts will not get a preview for security reasons."
-msgstr ""
-"Ki kell választani a kép CAPTCHA modulban a szövegekhez használt "
-"betűtípust. Az alapértelmezés szerint biztosítottak mellett a "
-"%fonts_library_general vagy a %fonts_library_specific könyvtárakban "
-"elhelyezett saját <em>TrueType</em> betűtípusok (.ttf filenév "
-"kiterjesztés) is használhatóak. A betűtípusokat a webhely "
-"„files” könyvtárba (%filesdir) is fel lehet tölteni pl. az "
-"<em>Upload</em> modul használatával, de ezekhez biztonsági okokból "
-"nem lesz előnézet létrehozva."
-msgid "You need to select at least one font."
-msgstr "Legalább egy betűtípust ki kell választani."
-msgid "The following fonts are not readable: %fonts."
-msgstr "A következő betűtípusok nem olvashatóak: %fonts."
-msgid "Enter the characters shown in the image."
-msgstr "Be kell írni a képen látható karaktereket."
-msgid "Font example"
-msgstr "Betűtípus példa"
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/id.po b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/id.po
deleted file mode 100644
index eda3229..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/id.po
+++ /dev/null
@@ -1,698 +0,0 @@
-# $Id: id.po,v 1.1.2.1 2010/06/03 22:56:21 soxofaan Exp $
-#
-# Indonesian translation of Drupal (general)
-# Copyright (c) 2010 by the Indonesian translation team <admin at drupal-id.org>
-# Generated from files:
-#  captcha.admin.inc,v 1.30 2009/08/10 22:33:34 soxofaan
-#  image_captcha.admin.inc,v 1.28 2009/09/23 21:23:00 soxofaan
-#  captcha.module,v 1.100 2009/09/20 10:57:07 soxofaan
-#  captcha.inc,v 1.11 2009/08/27 22:21:56 soxofaan
-#  captcha.info,v 1.7 2008/02/17 12:49:24 soxofaan
-#  image_captcha.user.inc,v 1.21 2009/09/22 22:51:00 soxofaan
-#  image_captcha.module,v 1.31 2009/09/22 22:51:00 soxofaan
-#  captcha.install,v 1.10 2009/05/26 20:17:40 soxofaan
-#  image_captcha.info,v 1.5 2008/02/17 12:49:24 soxofaan
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PROJECT VERSION\n"
-"POT-Creation-Date: 2009-09-23 23:34+0200\n"
-"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n"
-"Last-Translator: Ki-drupadi <kidrupadi at yahoo.com>\n"
-"Language-Team: drupal-id.org <admin at drupal-id.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-
-#: captcha.admin.inc:16 image_captcha/image_captcha.admin.inc:171
-msgid "none"
-msgstr "tidak ada"
-
-#: captcha.admin.inc:17
-msgid "default challenge type"
-msgstr "jenis tantangan baku"
-
-#: captcha.admin.inc:23
-msgid "@type (from module @module)"
-msgstr ""
-
-#: captcha.admin.inc:42
-msgid "Form protection"
-msgstr "Perlindungan Form"
-
-#: captcha.admin.inc:43
-msgid "Select the challenge type you want for each of the listed forms (identified by their so called <em>form_id</em>'s). You can easily add arbitrary forms with textfield at the bottom of the table or with the help of the '%CAPTCHA_admin_links' option below."
-msgstr ""
-
-#: captcha.admin.inc:44;108 captcha.module:46
-msgid "Add CAPTCHA administration links to forms"
-msgstr "Tambahkan link CAPTCHA admin ke form"
-
-#: captcha.admin.inc:49
-msgid "Default challenge type"
-msgstr "Jenis tantangan baku"
-
-#: captcha.admin.inc:50
-msgid "Select the default challenge type for CAPTCHAs. This can be overriden for each form if desired."
-msgstr ""
-
-#: captcha.admin.inc:86
-msgid "delete"
-msgstr "hapus"
-
-#: captcha.admin.inc:110
-msgid "This option makes it easy to manage CAPTCHA settings on forms. When enabled, users with the \"%admincaptcha\" permission will see a fieldset with CAPTCHA administration links on all forms, except on administrative pages."
-msgstr ""
-
-#: captcha.admin.inc:110 captcha.module:107
-msgid "administer CAPTCHA settings"
-msgstr "Kelola pengaturan CAPTCHA"
-
-#: captcha.admin.inc:115
-msgid "Allow CAPTCHAs and CAPTCHA administration links on administrative pages"
-msgstr "Ijinkan CAPTCHA dan tautan admin CAPTCHA pada halaman Administer"
-
-#: captcha.admin.inc:117
-msgid "This option makes it possible to add CAPTCHAs to forms on administrative pages. CAPTCHAs are disabled by default on administrative pages (which shouldn't be accessible to untrusted users normally) to avoid the related overhead. In some situations, e.g. in the case of demo sites, it can be usefull to allow CAPTCHAs on administrative pages."
-msgstr ""
-
-#: captcha.admin.inc:123
-msgid "Add a description to the CAPTCHA"
-msgstr "Tambahkan deskripsi ke CAPTCHA"
-
-#: captcha.admin.inc:124
-msgid "Add a configurable description to explain the purpose of the CAPTCHA to the visitor."
-msgstr ""
-
-#: captcha.admin.inc:132
-msgid "CAPTCHA description"
-msgstr "deskripsi CAPTCHA"
-
-#: captcha.admin.inc:133;149
-msgid "Configurable description of the CAPTCHA. An empty entry will reset the description."
-msgstr "Deskripsi CAPTCHA yang bisa diubah. Entri kosong akan menghilangkan deskripsi"
-
-#: captcha.admin.inc:139
-msgid "For language %lang_name (code %lang_code)"
-msgstr "Untuk bahasa %lang_name (code %lang_code)"
-
-#: captcha.admin.inc:148
-msgid "Challenge description"
-msgstr "deskripsi tantangan"
-
-#: captcha.admin.inc:159
-msgid "Default CAPTCHA validation"
-msgstr "Validasi CAPTCHA baku"
-
-#: captcha.admin.inc:160
-msgid "Define how the response should be processed by default. Note that the modules that provide the actual challenges can override or ignore this."
-msgstr ""
-
-#: captcha.admin.inc:162
-msgid "Case sensitive validation: the response has to exactly match the solution."
-msgstr ""
-
-#: captcha.admin.inc:163
-msgid "Case insensitive validation: lowercase/uppercase errors are ignored."
-msgstr ""
-
-#: captcha.admin.inc:171
-msgid "Persistence"
-msgstr "Menetap"
-
-#: captcha.admin.inc:174
-msgid "Always add a challenge."
-msgstr "Selalu tambahkan tantangan"
-
-#: captcha.admin.inc:175
-msgid "Omit challenges for a form once the user has successfully responded to a challenge for that form."
-msgstr "Hilangkan tantangan untuk form apabila pengguna berhasil merespon sekali saja pada form tersebut"
-
-#: captcha.admin.inc:176
-msgid "Omit challenges for all forms once the user has successfully responded to a challenge."
-msgstr "Hilangkan tantangan untuk semua form apabila pengguna berhasil merespon sekali"
-
-#: captcha.admin.inc:178
-msgid "Define if challenges should be omitted during the rest of a session once the user successfully responses to a challenge."
-msgstr ""
-
-#: captcha.admin.inc:184
-msgid "Log wrong responses"
-msgstr "Catat respon yang salah"
-
-#: captcha.admin.inc:185
-msgid "Report information about wrong responses to the !log."
-msgstr "Laporkan informasi tentang respon yang salah pada !log"
-
-#: captcha.admin.inc:185
-msgid "log"
-msgstr "Catat"
-
-#: captcha.admin.inc:192
-msgid "Save configuration"
-msgstr "Simpan pengaturan"
-
-#: captcha.admin.inc:202;342
-msgid "Challenge type"
-msgstr "Tipe tantangan"
-
-#: captcha.admin.inc:202
-msgid "Operations"
-msgstr "Tindakan"
-
-#: captcha.admin.inc:229;363
-msgid "Illegal form_id"
-msgstr "form_id tidak dikenal"
-
-#: captcha.admin.inc:255
-msgid "Added CAPTCHA point."
-msgstr "Tambahkan titik CAPTCHA"
-
-#: captcha.admin.inc:270
-msgid "Reset of CAPTCHA description for language %language."
-msgstr "Kembalikan nilai deskripsi CAPTCHA untuk bahasa %language."
-
-#: captcha.admin.inc:281
-msgid "Reset of CAPTCHA description."
-msgstr "Kembalikan nilai deskripsi CAPTCHA."
-
-#: captcha.admin.inc:289
-msgid "The CAPTCHA settings were saved."
-msgstr "Pengaturan CAPTCHA telah disimpan"
-
-#: captcha.admin.inc:321;335
-msgid "Form ID"
-msgstr ""
-
-#: captcha.admin.inc:322;336
-msgid "The Drupal form_id of the form to add the CAPTCHA to."
-msgstr ""
-
-#: captcha.admin.inc:343
-msgid "The CAPTCHA type to use for this form"
-msgstr ""
-
-#: captcha.admin.inc:352
-msgid "Save"
-msgstr ""
-
-#: captcha.admin.inc:375
-msgid "Saved CAPTCHA point settings."
-msgstr ""
-
-#: captcha.admin.inc:392
-msgid "Are you sure you want to delete the CAPTCHA for form_id %form_id?"
-msgstr ""
-
-#: captcha.admin.inc:393
-msgid "Delete"
-msgstr ""
-
-#: captcha.admin.inc:396
-msgid "Are you sure you want to disable the CAPTCHA for form_id %form_id?"
-msgstr ""
-
-#: captcha.admin.inc:397
-msgid "Disable"
-msgstr ""
-
-#: captcha.admin.inc:410
-msgid "Deleted CAPTCHA for form %form_id."
-msgstr ""
-
-#: captcha.admin.inc:414
-msgid "Disabled CAPTCHA for form %form_id."
-msgstr ""
-
-#: captcha.admin.inc:451
-msgid "This page gives an overview of all available challenge types, generated with their current settings."
-msgstr ""
-
-#: captcha.admin.inc:459
-msgid "Challenge \"%challenge\" by module \"%module\""
-msgstr ""
-
-#: captcha.admin.inc:462
-msgid "10 more examples of this challenge."
-msgstr ""
-
-#: captcha.inc:38
-msgid "Failed to set a CAPTCHA type for form %form_id: could not interpret value \"@captcha_type\""
-msgstr ""
-
-#: captcha.inc:146
-msgid "This question is for testing whether you are a human visitor and to prevent automated spam submissions."
-msgstr ""
-
-#: captcha.module:31
-msgid "\"CAPTCHA\" is an acronym for \"Completely Automated Public Turing test to tell Computers and Humans Apart\". It is typically a challenge-response test to determine whether the user is human. The CAPTCHA module is a tool to fight automated submission by malicious users (spamming) of for example comments forms, user registration forms, guestbook forms, etc. You can extend the desired forms with an additional challenge, which should be easy for a human to solve correctly, but hard enough to keep automated scripts and spam bots out."
-msgstr ""
-
-#: captcha.module:32
-msgid "Note that the CAPTCHA module interacts with page caching (see <a href=\"!performancesettings\">performance settings</a>). Because the challenge should be unique for each generated form, the caching of the page it appears on is prevented. Make sure that these forms do not appear on too many pages or you will lose much caching efficiency. For example, if you put a CAPTCHA on the user login block, which typically appears on each page for anonymous visitors, caching will practically be disabled. The comment submission forms are another example. In this case you should set the \"%commentlocation\" to \"%separatepage\" in the comment settings of the relevant <a href=\"!contenttypes\">content types</a> for better caching efficiency."
-msgstr ""
-
-#: captcha.module:35
-msgid "Location of comment submission form"
-msgstr ""
-
-#: captcha.module:36
-msgid "Display on separate page"
-msgstr ""
-
-#: captcha.module:40
-msgid "CAPTCHA is a trademark of Carnegie Mellon University."
-msgstr ""
-
-#: captcha.module:45
-msgid "A CAPTCHA can be added to virtually each Drupal form. Some default forms are already provided in the form list, but arbitrary forms can be easily added and managed when the option \"%adminlinks\" is enabled."
-msgstr ""
-
-#: captcha.module:47
-msgid "Users with the \"%skipcaptcha\" <a href=\"@perm\">permission</a> won't be offered a challenge. Be sure to grant this permission to the trusted users (e.g. site administrators). If you want to test a protected form, be sure to do it as a user without the \"%skipcaptcha\" permission (e.g. as anonymous user)."
-msgstr ""
-
-#: captcha.module:48;107
-msgid "skip CAPTCHA"
-msgstr ""
-
-#: (duplicate) captcha.module:269;322;119 ;222;427;456;60;71 captcha.info:0 image_captcha/image_captcha.user.inc:29;73 image_captcha/image_captcha.module:95
-msgid "CAPTCHA"
-msgstr ""
-
-#: captcha.module:327
-msgid "CAPTCHA: challenge \"@type\" enabled"
-msgstr ""
-
-#: captcha.module:328
-msgid "Untrusted users will see a CAPTCHA here (!settings)."
-msgstr ""
-
-#: captcha.module:329
-msgid "general CAPTCHA settings"
-msgstr ""
-
-#: captcha.module:333
-msgid "Enabled challenge"
-msgstr ""
-
-#: captcha.module:334
-msgid "\"@type\" by module \"@module\" (!change, !disable)"
-msgstr ""
-
-#: captcha.module:337
-msgid "change"
-msgstr ""
-
-#: captcha.module:338
-msgid "disable"
-msgstr ""
-
-#: captcha.module:352 image_captcha/image_captcha.admin.inc:57
-msgid "Example"
-msgstr ""
-
-#: captcha.module:353
-msgid "This is a pre-solved, non-blocking example of this challenge."
-msgstr ""
-
-#: captcha.module:362
-msgid "CAPTCHA: no challenge enabled"
-msgstr ""
-
-#: captcha.module:364
-msgid "Place a CAPTCHA here for untrusted users."
-msgstr ""
-
-#: captcha.module:426
-msgid "CAPTCHA validation error: unknown CAPTCHA session ID. Contact the site administrator if this problem persists."
-msgstr ""
-
-#: captcha.module:451
-msgid "The answer you entered for the CAPTCHA was not correct."
-msgstr ""
-
-#: captcha.module:538
-msgid "Math question"
-msgstr ""
-
-#: captcha.module:539
-msgid "Solve this simple math problem and enter the result. E.g. for 1+3, enter 4."
-msgstr ""
-
-#: captcha.module:540
-msgid "@x + @y = "
-msgstr ""
-
-#: captcha.module:559
-msgid "Test one two three"
-msgstr ""
-
-#: captcha.module:222
-msgid "CAPTCHA problem: hook_captcha() of module %module returned nothing when trying to retrieve challenge type %type for form %form_id."
-msgstr ""
-
-#: captcha.module:427
-msgid "CAPTCHA validation error: unknown CAPTCHA session ID (%csid)."
-msgstr ""
-
-#: captcha.module:456
-msgid "%form_id post blocked by CAPTCHA module: challenge \"%challenge\" (by module \"%module\"), user answered \"%response\", but the solution was \"%solution\"."
-msgstr ""
-
-#: captcha.module:120
-msgid "Already 1 blocked form submission"
-msgid_plural "Already @count blocked form submissions"
-msgstr[0] ""
-msgstr[1] ""
-
-#: captcha.module:61
-msgid "Administer how and where CAPTCHAs are used."
-msgstr ""
-
-#: captcha.module:77
-msgid "General settings"
-msgstr "Pengaturan umum"
-
-#: captcha.module:83
-msgid "Examples"
-msgstr "Contoh"
-
-#: captcha.module:84
-msgid "An overview of the available challenge types with examples."
-msgstr ""
-
-#: captcha.module:93
-msgid "CAPTCHA point administration"
-msgstr ""
-
-#: captcha.install:156
-msgid "Unsupported database."
-msgstr ""
-
-#: (duplicate) captcha.install:115 
-msgid "You can now <a href=\"!captcha_admin\">configure the CAPTCHA module</a> for your site."
-msgstr ""
-
-#: captcha.info:0
-msgid "Base CAPTCHA module for adding challenges to arbitrary forms."
-msgstr ""
-
-#: captcha.info:0 image_captcha/image_captcha.info:0
-msgid "Spam control"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:29
-msgid "Built-in font"
-msgstr "Font terpasang"
-
-#: image_captcha/image_captcha.admin.inc:47
-msgid "The Image CAPTCHA module can not generate images because your PHP setup does not support it (no <a href=\"!gdlib\">GD library</a> with JPEG support)."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:58
-msgid "Presolved image CAPTCHA example, generated with the current settings."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:69
-msgid "Code settings"
-msgstr "Pengaturan kode"
-
-#: image_captcha/image_captcha.admin.inc:73
-msgid "Characters to use in the code"
-msgstr "Karakter yang digunakan dalam kode"
-
-#: image_captcha/image_captcha.admin.inc:78
-msgid "Code length"
-msgstr "Panjang kode"
-
-#: image_captcha/image_captcha.admin.inc:81
-msgid "The code length influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:87
-msgid "Font settings"
-msgstr "Pengaturan Font"
-
-#: image_captcha/image_captcha.admin.inc:93
-msgid "Font"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:95
-msgid "Select the font to use for the text in the image CAPTCHA. Apart from the provided defaults, you can also use your own TrueType fonts (filename extension .ttf) by putting them in the Drupal \"files\" directory (directory %filesdir), %fonts_library_general or %fonts_library_specific."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:110
-msgid "Font size"
-msgstr "Ukuran Font"
-
-#: image_captcha/image_captcha.admin.inc:112
-msgid "tiny"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:113;172
-msgid "small"
-msgstr "kecil"
-
-#: image_captcha/image_captcha.admin.inc:115;139
-msgid "normal"
-msgstr "normal"
-
-#: image_captcha/image_captcha.admin.inc:117
-msgid "large"
-msgstr "besar"
-
-#: image_captcha/image_captcha.admin.inc:119
-msgid "extra large"
-msgstr "sangat besar"
-
-#: image_captcha/image_captcha.admin.inc:122
-msgid "The font size influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:134
-msgid "Character spacing"
-msgstr "spasi karakter"
-
-#: image_captcha/image_captcha.admin.inc:135
-msgid "Define the average spacing between characters. Note that larger values make the image generation more CPU intensive."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:138
-msgid "tight"
-msgstr "rapat"
-
-#: image_captcha/image_captcha.admin.inc:140
-msgid "wide"
-msgstr "lebar"
-
-#: image_captcha/image_captcha.admin.inc:141
-msgid "extra wide"
-msgstr "sangat lebar"
-
-#: image_captcha/image_captcha.admin.inc:148
-msgid "Color and image settings"
-msgstr "Pengaturan warna dan gambar"
-
-#: image_captcha/image_captcha.admin.inc:149
-msgid "Configuration of the background, text colors and file format of the image CAPTCHA."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:153
-msgid "Background color"
-msgstr "warna latar belakang"
-
-#: image_captcha/image_captcha.admin.inc:154
-msgid "Enter the hexadecimal code for the background color (e.g. #FFF or #FFCE90). When using the PNG file format with transparent background, it is recommended to set this close to the underlying background color."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:161
-msgid "Text color"
-msgstr "warna teks"
-
-#: image_captcha/image_captcha.admin.inc:162
-msgid "Enter the hexadecimal code for the text color (e.g. #000 or #004283)."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:169
-msgid "Additional variation of text color"
-msgstr "tambahan variasi warna pada teks"
-
-#: image_captcha/image_captcha.admin.inc:173
-msgid "moderate"
-msgstr "sederhana"
-
-#: image_captcha/image_captcha.admin.inc:174;245
-msgid "high"
-msgstr "terang"
-
-#: image_captcha/image_captcha.admin.inc:175
-msgid "very high"
-msgstr "sangat terang"
-
-#: image_captcha/image_captcha.admin.inc:178
-msgid "The different characters will have randomized colors in the specified range around the text color."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:182
-msgid "File format"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:183
-msgid "Select the file format for the image. JPEG usually results in smaller files, PNG allows tranparency."
-msgstr "Pilih Format file untuk gambar. JPEG menghasilkan file yang kecil, PNG bisa latar transparan"
-
-#: image_captcha/image_captcha.admin.inc:186
-msgid "JPEG"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:187
-msgid "PNG"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:188
-msgid "PNG with transparent background"
-msgstr "PNG dengan latar transparan"
-
-#: image_captcha/image_captcha.admin.inc:195
-msgid "Distortion and noise"
-msgstr "Distorsi dan noise"
-
-#: image_captcha/image_captcha.admin.inc:196
-msgid "With these settings you can control the degree of obfuscation by distortion and added noise. Do not exaggerate the obfuscation and assure that the code in the image is reasonably readable. For example, do not combine high levels of distortion and noise."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:201
-msgid "Distortion level"
-msgstr "Tingkat distorsi"
-
-#: image_captcha/image_captcha.admin.inc:203
-msgid "@level - no distortion"
-msgstr "@level - tanpa distorsi"
-
-#: image_captcha/image_captcha.admin.inc:204
-msgid "@level - low"
-msgstr "@level - rendah"
-
-#: image_captcha/image_captcha.admin.inc:208
-msgid "@level - medium"
-msgstr "@level - sedang"
-
-#: image_captcha/image_captcha.admin.inc:213
-msgid "@level - high"
-msgstr "@level - tinggi"
-
-#: image_captcha/image_captcha.admin.inc:216
-msgid "Set the degree of wave distortion in the image."
-msgstr "Atur derajat gelombang distorsi pada image"
-
-#: image_captcha/image_captcha.admin.inc:220
-msgid "Smooth distortion"
-msgstr "Distorsi halus"
-
-#: image_captcha/image_captcha.admin.inc:222
-msgid "This option enables bilinear interpolation of the distortion which makes the image look smoother, but it is more CPU intensive."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:227
-msgid "Add salt and pepper noise"
-msgstr "Tambahkan bintik garam dan lada"
-
-#: image_captcha/image_captcha.admin.inc:229
-msgid "This option adds randomly colored point noise."
-msgstr "Pilihan ini menambahkan noise titik berwarna"
-
-#: image_captcha/image_captcha.admin.inc:233
-msgid "Add line noise"
-msgstr "tambahkan noise bergaris"
-
-#: image_captcha/image_captcha.admin.inc:235
-msgid "This option enables lines randomly drawn on top of the text code."
-msgstr "Pilihan ini mengaktifkan gambar garis acak di atas kode teks"
-
-#: image_captcha/image_captcha.admin.inc:239
-msgid "Noise level"
-msgstr "Tingkatan Noise"
-
-#: image_captcha/image_captcha.admin.inc:241
-msgid "low"
-msgstr "rendah"
-
-#: image_captcha/image_captcha.admin.inc:243
-msgid "medium"
-msgstr "sedang"
-
-#: image_captcha/image_captcha.admin.inc:247
-msgid "severe"
-msgstr "susah"
-
-#: image_captcha/image_captcha.admin.inc:264
-msgid "The Image CAPTCHA module can not use TrueType fonts because your PHP setup does not support it. You can only use a low quality built-in bitmap font."
-msgstr "Image CAPTCHA tidak bisa menggunakan Truetype font karena PHP anda tidak mendunkung. Anda hanya bisa menggunkan bitmap font kualitas rendah"
-
-#: image_captcha/image_captcha.admin.inc:269
-msgid "The usage of the built-in bitmap font it is not recommended because of its small size and missing UTF-8 support."
-msgstr "Penggunaan bitmap font terpasang tidak dianjurkan karena ukurannya kecil dan tidak mendukung UTF-8"
-
-#: image_captcha/image_captcha.admin.inc:280
-msgid "The list of characters to use should not contain spaces."
-msgstr "Daftar karakter yang digunkan tidak boleh berisi spasi"
-
-#: image_captcha/image_captcha.admin.inc:285
-msgid "You need to select a font"
-msgstr "Anda harus memilih font"
-
-#: image_captcha/image_captcha.admin.inc:290
-msgid "The built-in font only supports Latin2 characters. Only use \"a\" to \"z\" and numbers."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:294
-msgid "Font does not exist or is not readable."
-msgstr "Font tidak tersedia atau tidak terbaca"
-
-#: image_captcha/image_captcha.admin.inc:299
-msgid "Background color is not a valid hexadecimal color value."
-msgstr "Warna latar tidak termasuk nilai heksadesimal untuk warna"
-
-#: image_captcha/image_captcha.admin.inc:302
-msgid "Text color is not a valid hexadecimal color value."
-msgstr "Warna teks tidak termasuk nilai heksadesimal untuk warna"
-
-#: image_captcha/image_captcha.user.inc:29
-msgid "Generation of image CAPTCHA failed. Check your image CAPTCHA configuration and especially the used font."
-msgstr ""
-
-#: image_captcha/image_captcha.user.inc:73
-msgid "Could not find or read the configured font (\"%font\") for the image CAPTCHA."
-msgstr "Tidak dapat menemukan atau membaca konfigurasi font (\"%font\") untuk image CAPTCHA"
-
-#: image_captcha/image_captcha.module:29
-msgid "The image CAPTCHA is a popular challenge where a random textual code is obfuscated in an image. The image is generated on the fly for each request, which is rather CPU intensive for the server. Be careful with the size and computation related settings."
-msgstr "CAPTCHA gambar adalah tantangan yang populer ketika kode teks acak tampak kabur dalam gambar..."
-
-#: image_captcha/image_captcha.module:165
-msgid "Enter the characters shown in the image. Ignore spaces and be careful about upper and lower case."
-msgstr "Masukan karakter yang nampak dalam gambar. Abaikan spasi dan hati-hati dengan huruf besar dan kecil"
-
-#: image_captcha/image_captcha.module:168
-msgid "Enter the characters (without spaces) shown in the image."
-msgstr "Masukan karakter pada gambar yang tampil (tanpa spasi)"
-
-#: image_captcha/image_captcha.module:178;178;41 image_captcha/image_captcha.info:0
-msgid "Image CAPTCHA"
-msgstr ""
-
-#: image_captcha/image_captcha.module:183
-msgid "What code is in the image?"
-msgstr "Apakah kode pada gambar?"
-
-#: image_captcha/image_captcha.module:95
-msgid "Encountered an illegal byte while splitting an utf8 string in characters."
-msgstr "hitungan byte ilegal ketika memisahkan utf8 string dalam karakter"
-
-#: image_captcha/image_captcha.info:0
-msgid "Provides an image based CAPTCHA."
-msgstr "CAPTCHA gambar yang tersedia"
-
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/it.po b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/it.po
deleted file mode 100644
index a031b62..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/it.po
+++ /dev/null
@@ -1,502 +0,0 @@
-# $Id: it.po,v 1.3 2009/07/17 17:54:50 soxofaan Exp $
-#
-# LANGUAGE translation of Drupal (general)
-# Copyright YEAR NAME <augusto at fagioli.biz>
-# Generated from files:
-#  captcha.module,v 1.42.2.24 2007/08/24 03:16:29 wundo
-#  captcha.info,v 1.3.2.2 2007/07/10 22:02:33 robloach
-#  captcha.install,v 1.1.4.4 2007/07/24 00:45:39 robloach
-#  image_captcha.info,v 1.1.4.2 2007/07/10 22:02:34 robloach
-#  text_captcha.info,v 1.1.4.2 2007/07/10 22:02:35 robloach
-#  image_captcha.module,v 1.1.4.14 2007/08/29 19:18:34 robloach
-#  text_captcha.module,v 1.1.4.8 2007/08/25 13:29:49 wundo
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: it\n"
-"POT-Creation-Date: 2007-09-04 21:17+0200\n"
-"PO-Revision-Date: 2008-09-10 14:21+0200\n"
-"Last-Translator: augusto\n"
-"Language-Team:  <en at li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n!=1);\n"
-"X-Poedit-Country: GERMANY\n"
-"X-Generator: KBabel 1.11.4\n"
-
-#: captcha.module:26
-msgid "A captcha is a tool to fight automated spam submission of forms (e.g. user registration forms, comment forms, guestbook forms, etc.) by malicious users. A captcha is an extra field (or several fields) on a form presented to the user. It represents a challenge, which should be easy for a normal human to solve (e.g. a simple math problem), but hard enough to keep automated scripts and spam bots out."
-msgstr ""
-
-#: captcha.module:30
-msgid "<p>A captcha can be added to virtually each drupal form (which is identified by a <em>form_id</em>). The captcha module comes with some default forms to add a captcha to, but arbitrary forms can be easily added and managed when the option \"%adminlinks\" is enabled.</p><p>Users with the \"%skipcaptcha\" <a href=\"@perm\">permission</a> won't be offered a captcha. Be sure to grant this permission to the trusted users (e.g. site administrators). If you want to test the captcha challenges, be sure to do it as a user without the \"%skipcaptcha\" permission (e.g. as unauthenticated user).</p>"
-msgstr ""
-
-#: captcha.module:33;174
-msgid "Add captcha adminstration links to forms"
-msgstr "Aggiungi Link di gestione Captcha ai forms"
-
-#: captcha.module:49;59;342
-#: captcha.info:0
-msgid "Captcha"
-msgstr "CAPTCHA"
-
-#: captcha.module:50
-msgid "Administer how and where Captchas are used."
-msgstr "Gestisci come e dove Captcha viene usato"
-
-#: captcha.module:65
-msgid "General settings"
-msgstr "Impostazioni generali"
-
-#: captcha.module:71
-msgid "Examples"
-msgstr "Esempi"
-
-#: captcha.module:72
-msgid "An overview of the available captcha types with examples."
-msgstr "Panoramica dei typi disponibili di Captcha con esempi"
-
-#: captcha.module:119;122
-msgid "This question is for testing whether you are a human visitor and to prevent automated spam submissions."
-msgstr "Questa domanda serve a verificare che il form non venga inviato da procedure automatizzate"
-
-#: captcha.module:142
-msgid "Disabled captcha for form %form_id."
-msgstr "Disabilita CAPTCHA per il form %form_id "
-
-#: captcha.module:148
-msgid "Deleted captcha for form %form_id."
-msgstr "CAPTCHA eliminati per il form %form_id"
-
-#: captcha.module:176
-msgid "This option is very helpful to enable/disable captchas on forms. When enabled, users with the \"%admincaptcha\" permission will see captcha administration links on all forms (except on administrative pages, which shouldn't be accessible to untrusted users in the first place)."
-msgstr "Opzione utile per abilitare/disabilitare CAPTCHA nei form. Quando abilitata, gli utenti con il permesso  \"%admincaptcha\"- disporra' dei link di gestione  CAPTCHA-su tutti i form. (tranne che per le pagine di amministrazione, che di norma sono disponibili agli utenti amministratori)."
-
-#: captcha.module:181
-msgid "Select captcha types"
-msgstr "Seleziona il tipo di Captcha"
-
-#: captcha.module:182
-msgid "Select what kind of captcha challenge you want for each form."
-msgstr "Assegna d ogni form un tipo di CAPTCHA"
-
-#: captcha.module:208
-msgid "delete"
-msgstr "elimina"
-
-#: captcha.module:218;232
-msgid "Captcha description"
-msgstr "Descrizione del CAPTCHA"
-
-#: captcha.module:219;233
-msgid "With this description you can explain the purpose of the captcha challenge to the user."
-msgstr "Con questa testo puoi  descrivere il Captcha agli utenti del sito"
-
-#: captcha.module:224
-msgid "Captcha description for %lang_name (locale %lang_code)"
-msgstr "Descrizione CAPTCHA per la lingua  %lang_name (Locale %lang_code)"
-
-#: captcha.module:240
-msgid "Persistent captchas"
-msgstr "CAPTCHAs Persistenti"
-
-#: captcha.module:241
-msgid "If checked, the user will always have to solve a captcha. If not checked, the captcha check for a form will be omitted during the rest of the session once the user has successfully solved a captcha for that form."
-msgstr ""
-
-#: captcha.module:247
-msgid "Submit"
-msgstr "Invia"
-
-#: captcha.module:263
-msgid "Captcha type (module)"
-msgstr "Tipo di CAPTCHA (Modulo)"
-
-#: captcha.module:263
-msgid "Operations"
-msgstr "Operazioni"
-
-#: captcha.module:294
-msgid "Your captcha settings were saved."
-msgstr ""
-
-#: captcha.module:330
-msgid "Captcha problem: hook_captcha() of module %module returned nothing when trying to retrieve captcha type %type for form %form_id."
-msgstr ""
-
-#: captcha.module:408;420
-msgid "Captcha administration"
-msgstr "CAPTCHA-Verwaltung"
-
-#: captcha.module:409
-msgid "The captcha challenge \"@type\" (by module \"@module\") is enabled here for untrusted users: !edit or !disable."
-msgstr "La richiesta Captcha  \"@type\" (von Modul \"@module\") e' abilitata per utenti anonimi : !edit o !disable."
-
-#: captcha.module:412
-msgid "edit captcha type"
-msgstr "modifica il tipo di CAPTCHA"
-
-#: captcha.module:413
-msgid "disable captcha"
-msgstr "disabilita CAPTCHA"
-
-#: captcha.module:421
-msgid "Place a captcha challenge here for untrusted users."
-msgstr "Mostra Captcha agli utenti non autenticati"
-
-#: captcha.module:443
-msgid "Invalid captcha token."
-msgstr "Token Captcha non valido"
-
-#: captcha.module:450
-msgid "The answer you entered for the captcha challenge was not correct."
-msgstr "La risposta Captcha non e' corretta"
-
-#: captcha.module:490
-msgid "You can't request more than @num captcha challenges without solving them. Your previous captcha challenges were flushed."
-msgstr "Non puoi richiedere piu' di  @num CAPTCHA senza rispondere esattamente. I precedenti Captcha sono stati eliminati"
-
-#: captcha.module:543
-msgid "This page gives an overview of all available captcha types, generated with their current settings."
-msgstr "Questa pagina mostra i tipi di Captcha disponibili., generati con le impostazioni attuali"
-
-#: captcha.module:554
-msgid "Challenge \"%challenge\" by module \"%module\""
-msgstr "Richiesta  \"%challenge\" del modulo \"%module\""
-
-#: captcha.module:559
-msgid "10 more examples of this captcha type."
-msgstr "Altri 10 esempi per questo tipo di Captcha"
-
-#: captcha.module:588
-msgid "Math Question"
-msgstr "Domanda matematica"
-
-#: captcha.module:589
-msgid "Solve this simple math problem and enter the result. E.g. for 1+3, enter 4."
-msgstr "Risolvi la somma algebrica. Esempio : per 1 + 3 inserisci 4"
-
-#: captcha.module:590
-msgid "@x + @y = "
-msgstr "@x + @y ="
-
-#: captcha.module:329;0
-msgid "captcha"
-msgstr "CAPTCHA"
-
-#: captcha.module:85
-msgid "administer captcha"
-msgstr "Gestione CAPTCHA"
-
-#: captcha.module:85
-msgid "skip captcha challenges"
-msgstr "Salta la richiesta CAPTCHA"
-
-#: captcha.install:31;75
-msgid "Unsupported database."
-msgstr "Unsupported database."
-
-#: captcha.install:41
-msgid "The installation of the captcha_points table and some default entries was successful"
-msgstr "L'installazione della tabella  captcha_points con valori di default e' stata eseguita."
-
-#: captcha.install:43
-msgid "The installation of the captcha module failed"
-msgstr "L'installazione del modulo e' fallita"
-
-#: captcha.info:0
-msgid "Base captcha module for adding captcha challenges to registration, comment and contact forms for example."
-msgstr "Modulo Base per aggiungere Richiesta Captcha per la registrazione, commenti, e moduli di contatti"
-
-#: captcha.info:0
-#: image_captcha/image_captcha.info:0
-#: text_captcha/text_captcha.info:0
-msgid "Spam control"
-msgstr "Controllo SPAM"
-
-#: image_captcha/image_captcha.module:20
-msgid "The image captcha is a popular type of captcha challenge where a random textual code is obfuscated in an image. The image is generated on the fly for each request, which is rather CPU intensive for the server. Be carefull with the size and computation related settings."
-msgstr "Image Captcha e' un diffuso tipo di captcha dove viene esposta immagine che espone del testo.L'immagine e' generata al volo per ogni richiesta, con lavoro extra della CPU. Verifica le prestazioni del server ed eventualmente cambia le impostazioni"
-
-#: image_captcha/image_captcha.module:24
-msgid "<p>Example captcha image, generated with the current settings:</p>!img"
-msgstr "<p>Esempio di captcha image, generato con le impostazioni attuali:</p>!img"
-
-#: image_captcha/image_captcha.module:39
-#: image_captcha/image_captcha.info:0
-msgid "Image captcha"
-msgstr "Image captcha"
-
-#: image_captcha/image_captcha.module:67
-msgid "No font configured."
-msgstr "Nessuna font e' stata impostata"
-
-#: image_captcha/image_captcha.module:71
-msgid "Could not find or read the configured font \"%font\" for the image captcha."
-msgstr "Non e' possibile accedere alla font selezionata \"%font\" per creare una image captcha."
-
-#: image_captcha/image_captcha.module:98
-msgid "Image captchas cannot be generated, because your PHP installation's GD library has no JPEG support."
-msgstr "Le immagini Captcha non possono essere generate per la mancanza del supporto JPEG della libreria GD in uso dal PHP"
-
-#: image_captcha/image_captcha.module:103
-msgid "Characters to use in the code"
-msgstr "Caratteri in uso"
-
-#: image_captcha/image_captcha.module:108
-msgid "Code length"
-msgstr "Lunghezza del codice"
-
-#: image_captcha/image_captcha.module:111
-msgid "The code length influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr "La lunghezza del codice influenza sia l'uso della CPU che la dimensione della immagine creata."
-
-#: image_captcha/image_captcha.module:117
-msgid "The image captcha module requires a TrueType font file (.ttf) for generating the images, but because of licencing issues it is not allowed to package fonts with the module. You can install fonts yourself however, by putting them in the fonts directory of the image captcha module (directory \"%fontsdir\") or by uploading them to your Drupal file system (directory \"%filesdir\") with for example the upload module."
-msgstr ""
-
-#: image_captcha/image_captcha.module:124
-msgid "Select a font"
-msgstr "Seleziona un font"
-
-#: image_captcha/image_captcha.module:129
-msgid "Font"
-msgstr "Font"
-
-#: image_captcha/image_captcha.module:131
-msgid "The TrueType font (.ttf) to use for the text in the image captcha."
-msgstr "Il TrueType font (.ttf) da usare per generare il tessto nella immagine"
-
-#: image_captcha/image_captcha.module:139
-msgid "Font size"
-msgstr "Dimensine del font"
-
-#: image_captcha/image_captcha.module:141
-msgid "tiny"
-msgstr "molto piccolo"
-
-#: image_captcha/image_captcha.module:142
-msgid "small"
-msgstr "piccolo"
-
-#: image_captcha/image_captcha.module:143;164;202
-msgid "normal"
-msgstr "medio"
-
-#: image_captcha/image_captcha.module:144
-msgid "large"
-msgstr "grande"
-
-#: image_captcha/image_captcha.module:147
-msgid "The font size influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr "La dimensionedel font codice influenza sia l'uso della CPU che la dimensione della immagine creata."
-
-#: image_captcha/image_captcha.module:153
-msgid "Distortion and noise"
-msgstr "Distorsione e disturbo"
-
-#: image_captcha/image_captcha.module:154
-msgid "With these settings you can control the degree of obfuscation by distortion and added noise. Do not exaggerate the obfuscation and assure that the code in the image is reasonably readable. For example, do not combine high levels of distortion and noise."
-msgstr ""
-"Con questa impostazione puoi controllare il livello di affuscamento per distorsione ed il disturbo aggiunto. "
-"Da usare con cautela. La combinazione di questi valori possono portare a testi poco leggibili"
-
-#: image_captcha/image_captcha.module:159
-msgid "Distortion level"
-msgstr "Livello di distorsione"
-
-#: image_captcha/image_captcha.module:161
-msgid "none"
-msgstr "nessuno"
-
-#: image_captcha/image_captcha.module:162;201
-msgid "low"
-msgstr "basso"
-
-#: image_captcha/image_captcha.module:163
-msgid "moderate"
-msgstr "moderato"
-
-#: image_captcha/image_captcha.module:165;203
-msgid "high"
-msgstr "alto"
-
-#: image_captcha/image_captcha.module:166;204
-msgid "severe"
-msgstr "molto alto"
-
-#: image_captcha/image_captcha.module:169
-msgid "Set the degree of wave distortion in the image."
-msgstr "Imposta il livello di distorsione dell'immagine"
-
-#: image_captcha/image_captcha.module:173
-msgid "Smooth distortion"
-msgstr "Smussa angoli"
-
-#: image_captcha/image_captcha.module:175
-msgid "This option enables bilineair interpolation of the distortion which makes the image look smoother, but it is more CPU intensive."
-msgstr "Questa opzione abilita l'interpolazione lineare della distorsione, che smussa gli angoli dell'immagine. Richiede piu' CPU"
-
-#: image_captcha/image_captcha.module:180
-msgid "Double vision"
-msgstr "Doppia visione"
-
-#: image_captcha/image_captcha.module:182
-msgid "When enabled, characters appear twice in the image, overlayed onto each other."
-msgstr "Quando abilitato, il carattere appare 2 volte, con un effetto ombra"
-
-#: image_captcha/image_captcha.module:187
-msgid "Add salt and peper noise"
-msgstr "Aggiungi disturbo sale e pepe"
-
-#: image_captcha/image_captcha.module:189
-msgid "This option adds randomly colored point noise."
-msgstr "Questa opzione aggiunge punti colorati casuali di disturbo"
-
-#: image_captcha/image_captcha.module:193
-msgid "Add line noise"
-msgstr "Aggiungi linee di disturbo"
-
-#: image_captcha/image_captcha.module:195
-msgid "This option enables lines randomly drawn on top of the text code."
-msgstr "Questa opzione abilita le linee casuali a disturbo del testo nell'immagine"
-
-#: image_captcha/image_captcha.module:199
-msgid "Noise level"
-msgstr "Livello del disturbo"
-
-#: image_captcha/image_captcha.module:216;233
-msgid "You need to select a font"
-msgstr "Seleziona un font"
-
-#: image_captcha/image_captcha.module:228
-msgid "The list of characters to use should not contain spaces."
-msgstr "La lista dei caratteri da usare non deve contenere spazi"
-
-#: image_captcha/image_captcha.module:236
-msgid "Font does not exist or is not readable."
-msgstr "Il font non esiste o non e' leggibile"
-
-#: image_captcha/image_captcha.module:265
-msgid "Encountered an illegal byte while splitting an utf8 string in characters."
-msgstr "Errore nella divisione in caratteri della stringa utf8"
-
-#: image_captcha/image_captcha.module:311
-msgid "What code is in the image?"
-msgstr "Qual'e' il codice dell'immagine?"
-
-#: image_captcha/image_captcha.module:312
-msgid "Copy the characters (respecting upper/lower case) from the image."
-msgstr "Copiare i caratteri dell'immagine, rispettando minuscole/maiuscle"
-
-#: image_captcha/image_captcha.module:339
-msgid "Generation of image CAPTCHA failed. Check your image CAPTCHA configuration and especially the used font."
-msgstr "Creazione dell'immagine Captcha fallita. Verificare la configurazione del modulo, in partcolare le impostazioni del  font"
-
-#: image_captcha/image_captcha.module:265;339;365
-msgid "CAPTCHA"
-msgstr "CAPTCHA"
-
-#: image_captcha/image_captcha.module:0
-msgid "image_captcha"
-msgstr "image_captcha"
-
-#: image_captcha/image_captcha.info:0
-msgid "Captcha module that implements image based captchas."
-msgstr "Modulo CAPTCHA che fornisce Immagini Testuali per Captcha"
-
-#: text_captcha/text_captcha.module:19
-msgid "This text based captcha presents a captcha phrase of a given number of words and the visitor is asked to enter the n'th word."
-msgstr "Questo Captcha mostra delle frasi captcha composte di un certo numero di parole.viene chiesto ai visitatori di inserirne una in particolare"
-
-#: text_captcha/text_captcha.module:33
-#: text_captcha/text_captcha.info:0
-msgid "Text captcha"
-msgstr "Testo CAPTCHA"
-
-#: text_captcha/text_captcha.module:51
-msgid "Kind of words to use in the captcha phrase"
-msgstr "Tipo di parole da usare nella frase Captcha"
-
-#: text_captcha/text_captcha.module:53
-msgid "Generate nonsense random words."
-msgstr "Genera parole a caso senza senso"
-
-#: text_captcha/text_captcha.module:54
-msgid "Use user defined words."
-msgstr "Usa parole definite dall'utente"
-
-#: text_captcha/text_captcha.module:61
-msgid "User defined words"
-msgstr "Parole definite dall'utente"
-
-#: text_captcha/text_captcha.module:63
-msgid "Enter a bunch of space separated words (at least @min)."
-msgstr "Inserisci alcune parole separate da spazio (almeno @min)."
-
-#: text_captcha/text_captcha.module:68
-msgid "Number of words in the captcha phrase"
-msgstr "Numero di parole nella frase Captcha"
-
-#: text_captcha/text_captcha.module:85
-msgid "You need to enter at least @min words if you want to use user defined words."
-msgstr "Inserisci almeno  @min parole per usare Captcha con parole definite dall'utente"
-
-#: text_captcha/text_captcha.module:94
-msgid "Number of words in the captcha phrase should be between 4 and 10."
-msgstr "Il numero di parole della frase Captcha deve essere fra 4 e 10"
-
-#: text_captcha/text_captcha.module:146
-msgid "first"
-msgstr "prima"
-
-#: text_captcha/text_captcha.module:146
-msgid "second"
-msgstr "seconda"
-
-#: text_captcha/text_captcha.module:146
-msgid "third"
-msgstr "terza"
-
-#: text_captcha/text_captcha.module:147
-msgid "fourth"
-msgstr "quarta"
-
-#: text_captcha/text_captcha.module:147
-msgid "fifth"
-msgstr "quinta"
-
-#: text_captcha/text_captcha.module:147
-msgid "sixth"
-msgstr "sesta"
-
-#: text_captcha/text_captcha.module:147
-msgid "seventh"
-msgstr "settima"
-
-#: text_captcha/text_captcha.module:148
-msgid "eighth"
-msgstr "ottava"
-
-#: text_captcha/text_captcha.module:148
-msgid "ninth"
-msgstr "nona"
-
-#: text_captcha/text_captcha.module:148
-msgid "tenth"
-msgstr "decima"
-
-#: text_captcha/text_captcha.module:176
-msgid "What is the @nth word in the captcha phrase \"@words\"?"
-msgstr "Quale e' la @esimanth parola della frase captcha  \"@words\"?"
-
-#: text_captcha/text_captcha.module:0
-msgid "text_captcha"
-msgstr "text_capcha"
-
-#: text_captcha/text_captcha.info:0
-msgid "Captcha module that implements a simple text based captcha."
-msgstr "Modulo Captcha che fornisce un semplice captcha.testuale"
-
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/lt.po b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/lt.po
deleted file mode 100644
index fb54e15..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/lt.po
+++ /dev/null
@@ -1,651 +0,0 @@
-# LANGUAGE translation of Drupal (captcha.module)
-# Copyright YEAR NAME <EMAIL at ADDRESS>
-# Generated from file: captcha.module,v 1.24 2006/05/19 15:00:51 wundo
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: block-module5\n"
-"POT-Creation-Date: 2009-07-03 15:01+0200\n"
-"PO-Revision-Date: 2009-03-22 12:52+0300\n"
-"Last-Translator: Domas Jokubauskis <domasj at gmail.com>\n"
-"Language-Team: Domas Jokubauskis <domasj at gmail.com>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Poedit-Language: Lithuanian\n"
-"X-Poedit-Country: LITHUANIA\n"
-"X-Poedit-SourceCharset: utf-8\n"
-
-#: captcha.admin.inc:16 image_captcha/image_captcha.admin.inc:157;179
-msgid "none"
-msgstr "joks"
-
-#: captcha.admin.inc:17
-msgid "default challenge type"
-msgstr ""
-
-#: captcha.admin.inc:23
-msgid "@type (from module @module)"
-msgstr ""
-
-#: captcha.admin.inc:42
-msgid "Form protection"
-msgstr "Formos apsauga"
-
-#: captcha.admin.inc:43
-msgid "Select the challenge type you want for each of the listed forms (identified by their so called <em>form_id</em>'s). You can easily add arbitrary forms with textfield at the bottom of the table or with the help of the '%CAPTCHA_admin_links' option below."
-msgstr "Pasirinkite jūsų norimą užduotį kiekvienai išvardintai formai (atpažįstamai pagal jos <em>form_id</em> identifikatorių). Jūs galite lengvai pridėti reikiamas formas naudodamiesi lentelės apačioje esančiu laukeliu arba žemiau esančiu „%CAPTCHA_admin_links“ nustatymu."
-
-#: captcha.admin.inc:44;108 captcha.module:46
-msgid "Add CAPTCHA administration links to forms"
-msgstr "Pridėti CAPTCHA užduoties administravimo nuorodas prie formų"
-
-#: captcha.admin.inc:49
-msgid "Default challenge type"
-msgstr ""
-
-#: captcha.admin.inc:50
-msgid "Select the default challenge type for CAPTCHAs. This can be overriden for each form if desired."
-msgstr ""
-
-#: captcha.admin.inc:86
-msgid "delete"
-msgstr "Å¡alinti"
-
-#: captcha.admin.inc:110
-msgid "This option makes it easy to manage CAPTCHA settings on forms. When enabled, users with the \"%admincaptcha\" permission will see a fieldset with CAPTCHA administration links on all forms, except on administrative pages."
-msgstr ""
-
-#: captcha.admin.inc:110 captcha.module:107
-msgid "administer CAPTCHA settings"
-msgstr "administruoti CAPTCHA užduočių nustatymus"
-
-#: captcha.admin.inc:115
-msgid "Allow CAPTCHAs and CAPTCHA administration links on administrative pages"
-msgstr ""
-
-#: captcha.admin.inc:117
-msgid "This option makes it possible to add CAPTCHAs to forms on administrative pages. CAPTCHAs are disabled by default on administrative pages (which shouldn't be accessible to untrusted users normally) to avoid the related overhead. In some situations, e.g. in the case of demo sites, it can be usefull to allow CAPTCHAs on administrative pages."
-msgstr ""
-
-#: captcha.admin.inc:123
-msgid "Add a description to the CAPTCHA"
-msgstr ""
-
-#: captcha.admin.inc:124
-msgid "Add a configurable description to explain the purpose of the CAPTCHA to the visitor."
-msgstr ""
-
-#: captcha.admin.inc:132
-msgid "CAPTCHA description"
-msgstr ""
-
-#: captcha.admin.inc:133;149
-msgid "Configurable description of the CAPTCHA. An empty entry will reset the description."
-msgstr ""
-
-#: captcha.admin.inc:139
-msgid "For language %lang_name (code %lang_code)"
-msgstr "Kalba %lang_name (kodas %lang_code)"
-
-#: captcha.admin.inc:148
-msgid "Challenge description"
-msgstr "Užduoties aprašymas"
-
-#: captcha.admin.inc:159
-msgid "Default CAPTCHA validation"
-msgstr ""
-
-#: captcha.admin.inc:160
-msgid "Define how the response should be processed by default. Note that the modules that provide the actual challenges can override or ignore this."
-msgstr ""
-
-#: captcha.admin.inc:162
-msgid "Case sensitive validation: the response has to exactly match the solution."
-msgstr ""
-
-#: captcha.admin.inc:163
-msgid "Case insensitive validation: lowercase/uppercase errors are ignored."
-msgstr ""
-
-#: captcha.admin.inc:171
-msgid "Persistence"
-msgstr "Veikimas"
-
-#: captcha.admin.inc:174
-msgid "Always add a challenge."
-msgstr "Visuomet pridėti užduotį."
-
-#: captcha.admin.inc:175
-msgid "Omit challenges for a form once the user has successfully responded to a challenge for that form."
-msgstr "Nerodyti užduoties prie formos, kuomet naudotojas jau sėkmingai išsprendė užduotį tai formai."
-
-#: captcha.admin.inc:176
-msgid "Omit challenges for all forms once the user has successfully responded to a challenge."
-msgstr "Nerodyti užduočių prie visų formų, kuomet naudotojas jau sėkmingai išsprendė užduotį."
-
-#: captcha.admin.inc:178
-msgid "Define if challenges should be omitted during the rest of a session once the user successfully responses to a challenge."
-msgstr "Nurodykite, ar užduotys neturėtų būti rodomos likusį sesijos laiką, jei naudotojas sėkmingai išsprendžia užduotį."
-
-#: captcha.admin.inc:184
-msgid "Log wrong responses"
-msgstr "Įrašyti neteisingus atsakymus"
-
-#: captcha.admin.inc:185
-msgid "Report information about wrong responses to the !log."
-msgstr "Pranešti apie neteisingus atsakymus !log."
-
-#: captcha.admin.inc:185
-msgid "log"
-msgstr "žurnale"
-
-#: captcha.admin.inc:192
-msgid "Save configuration"
-msgstr "Įrašyti konfigūraciją"
-
-#: captcha.admin.inc:202;342
-msgid "Challenge type"
-msgstr "Užduotis"
-
-#: captcha.admin.inc:202
-msgid "Operations"
-msgstr "Veiksmai"
-
-#: captcha.admin.inc:229;363
-msgid "Illegal form_id"
-msgstr "Negalimas form_id"
-
-#: captcha.admin.inc:255
-msgid "Added CAPTCHA point."
-msgstr "Kitų formų CAPTCHA užduotis pridėta."
-
-#: captcha.admin.inc:270
-msgid "Reset of CAPTCHA description for language %language."
-msgstr ""
-
-#: captcha.admin.inc:281
-msgid "Reset of CAPTCHA description."
-msgstr ""
-
-#: captcha.admin.inc:289
-msgid "The CAPTCHA settings were saved."
-msgstr "CAPTCHA užduočių nustatymai išsaugoti."
-
-#: captcha.admin.inc:321;335
-msgid "Form ID"
-msgstr "Formos ID"
-
-#: captcha.admin.inc:322;336
-msgid "The Drupal form_id of the form to add the CAPTCHA to."
-msgstr "Drupal form_id identifikatorius formos, prie kurios pridėti CAPTCHA užduotį."
-
-#: captcha.admin.inc:343
-msgid "The CAPTCHA type to use for this form"
-msgstr "CAPTCHA užduotis, naudojama šiai formai"
-
-#: captcha.admin.inc:352
-msgid "Save"
-msgstr "Saugoti"
-
-#: captcha.admin.inc:375
-msgid "Saved CAPTCHA point settings."
-msgstr "Kitų formų CAPTCHA užduočių nustatymai išsaugoti."
-
-#: captcha.admin.inc:392
-msgid "Are you sure you want to delete the CAPTCHA for form_id %form_id?"
-msgstr "Ar jūs esate įsitikinę, jog norite pašalinti CAPTCHA užduotį formai, kurios ID yra %form_id?"
-
-#: captcha.admin.inc:393
-msgid "Delete"
-msgstr "Pašalinti"
-
-#: captcha.admin.inc:396
-msgid "Are you sure you want to disable the CAPTCHA for form_id %form_id?"
-msgstr "Ar jūs esate įsitikinę, jog norite išjungti CAPTCHA užduotį formai, kurios ID yra %form_id?"
-
-#: captcha.admin.inc:397
-msgid "Disable"
-msgstr "IÅ¡jungti"
-
-#: captcha.admin.inc:410
-msgid "Deleted CAPTCHA for form %form_id."
-msgstr "Pašalinta formos %form_id CAPTCHA užduotis."
-
-#: captcha.admin.inc:414
-msgid "Disabled CAPTCHA for form %form_id."
-msgstr "Išjungta formos %form_id CAPTCHA užduotis."
-
-#: captcha.admin.inc:451
-msgid "This page gives an overview of all available challenge types, generated with their current settings."
-msgstr "Šis puslapis leidžia peržvelgti visas galimas užduotis, sugeneruotas su jų dabartiniais nustatymais."
-
-#: captcha.admin.inc:459
-msgid "Challenge \"%challenge\" by module \"%module\""
-msgstr "Užduotis „%challenge“, kurią suteikia modulis „%module“"
-
-#: captcha.admin.inc:462
-msgid "10 more examples of this challenge."
-msgstr "10 papildomų šios užduoties pavyzdžių."
-
-#: captcha.inc:38
-msgid "Failed to set a CAPTCHA type for form %form_id: could not interpret value \"@captcha_type\""
-msgstr ""
-
-#: captcha.inc:145
-msgid "This question is for testing whether you are a human visitor and to prevent automated spam submissions."
-msgstr "Šis klausimas yra skirtas įsitikinti, jog jūs esate žmogus, ir sustabdyti automatinį šlamšto siuntimą."
-
-#: captcha.module:31
-msgid "\"CAPTCHA\" is an acronym for \"Completely Automated Public Turing test to tell Computers and Humans Apart\". It is typically a challenge-response test to determine whether the user is human. The CAPTCHA module is a tool to fight automated submission by malicious users (spamming) of for example comments forms, user registration forms, guestbook forms, etc. You can extend the desired forms with an additional challenge, which should be easy for a human to solve correctly, but hard enough to keep automated scripts and spam bots out."
-msgstr "„CAPTCHA“ yra anglų k. akronimas šiam pavadininimui: „Completely Automated Public Turing test to tell Computers and Humans Apart“. Jis reiškia visiškai automatizuotą viešą Turingo testą, skirtą nustatyti ar vartotojas yra kompiuteris ar žmogus. Dažniausiai tai yra užduotis-atsakymas testas, kuris nustato ar vartotojas yra žmogus. CAPTCHA užduoties modulis yra įrankis padedantis kovoti su automatiniais įrašais, kuriuos padaro blogų tikslų turintys naudotojai, komentarų, naudotojų registravimo, svečių knygos ir kitose formose. Jūs galite prie pasirinktų formų pridėti papildomą užduotį, kuri žmonėms turėtų būti lengvai teisingai išsprendžiama, bet pakankamai sudėtinga automatizuotiems scenarijams ir šlamštą platinantiems botams."
-
-#: captcha.module:32
-msgid "Note that the CAPTCHA module interacts with page caching (see <a href=\"!performancesettings\">performance settings</a>). Because the challenge should be unique for each generated form, the caching of the page it appears on is prevented. Make sure that these forms do not appear on too many pages or you will lose much caching efficiency. For example, if you put a CAPTCHA on the user login block, which typically appears on each page for anonymous visitors, caching will practically be disabled. The comment submission forms are another example. In this case you should set the \"%commentlocation\" to \"%separatepage\" in the comment settings of the relevant <a href=\"!contenttypes\">content types</a> for better caching efficiency."
-msgstr ""
-
-#: captcha.module:35
-msgid "Location of comment submission form"
-msgstr "Location of comment submission form"
-
-#: captcha.module:36
-msgid "Display on separate page"
-msgstr "Rodyti atskirame puslapyje"
-
-#: captcha.module:40
-msgid "CAPTCHA is a trademark of Carnegie Mellon University."
-msgstr "CAPTCHA yra  Carnegie Mellon University prekinis ženklas."
-
-#: captcha.module:45
-msgid "A CAPTCHA can be added to virtually each Drupal form. Some default forms are already provided in the form list, but arbitrary forms can be easily added and managed when the option \"%adminlinks\" is enabled."
-msgstr ""
-
-#: captcha.module:47
-msgid "Users with the \"%skipcaptcha\" <a href=\"@perm\">permission</a> won't be offered a challenge. Be sure to grant this permission to the trusted users (e.g. site administrators). If you want to test a protected form, be sure to do it as a user without the \"%skipcaptcha\" permission (e.g. as anonymous user)."
-msgstr ""
-
-#: captcha.module:48;107
-msgid "skip CAPTCHA"
-msgstr "praleisti CAPTCHA užduotį"
-
-#: (duplicate) captcha.module:269;322;119 ;222;442;60;71 captcha.info:0
-#: image_captcha/image_captcha.user.inc:29;72
-#: image_captcha/image_captcha.module:94
-msgid "CAPTCHA"
-msgstr "CAPTCHA"
-
-#: captcha.module:327
-msgid "CAPTCHA: challenge \"@type\" enabled"
-msgstr ""
-
-#: captcha.module:328
-msgid "Untrusted users will see a CAPTCHA here (!settings)."
-msgstr "Nepatikimi naudotojai čia matys CAPTCHA užduotį (!settings)."
-
-#: captcha.module:329
-msgid "general CAPTCHA settings"
-msgstr "bendri CAPTCHA užduoties nustatymai"
-
-#: captcha.module:333
-msgid "Enabled challenge"
-msgstr "Užduotis įjungta"
-
-#: captcha.module:334
-msgid "\"@type\" by module \"@module\" (!change, !disable)"
-msgstr ""
-
-#: captcha.module:337
-msgid "change"
-msgstr "keisti"
-
-#: captcha.module:338
-msgid "disable"
-msgstr "išjungti"
-
-#: captcha.module:343 image_captcha/image_captcha.admin.inc:49
-msgid "Example"
-msgstr ""
-
-#: captcha.module:344
-msgid "This is a pre-solved, non-blocking example of this challenge."
-msgstr ""
-
-#: captcha.module:353
-msgid "CAPTCHA: no challenge enabled"
-msgstr "CAPTCHA užduotis: nėra įjungtų užduočių"
-
-#: captcha.module:355
-msgid "Place a CAPTCHA here for untrusted users."
-msgstr "Čia rodyti CAPTCHA užduotį nepatikimiems naudotojams."
-
-#: captcha.module:417
-msgid "CAPTCHA test failed (unknown csid)."
-msgstr "CAPTCHA užduoties bandymas nepavyko (nežinomas csid)."
-
-#: captcha.module:437
-msgid "The answer you entered for the CAPTCHA was not correct."
-msgstr "Jūsų įvestas CAPTCHA užduoties atsakymas buvo neteisingas."
-
-#: captcha.module:524
-msgid "Math question"
-msgstr ""
-
-#: captcha.module:525
-msgid "Solve this simple math problem and enter the result. E.g. for 1+3, enter 4."
-msgstr "Išspręskite šią paprastą matematinę užduotį ir įveskite atsakymą. Pvz., jei užduotis yra 1+3, įveskite 4."
-
-#: captcha.module:526
-msgid "@x + @y = "
-msgstr "@x + @y = "
-
-#: captcha.module:545
-msgid "Test one two three"
-msgstr ""
-
-#: captcha.module:222
-msgid "CAPTCHA problem: hook_captcha() of module %module returned nothing when trying to retrieve challenge type %type for form %form_id."
-msgstr ""
-
-#: captcha.module:442
-msgid "%form_id post blocked by CAPTCHA module: challenge \"%challenge\" (by module \"%module\"), user answered \"%response\", but the solution was \"%solution\"."
-msgstr "%form_id įrašas užblokuotas CAPTCHA modulio: užduotis „%challenge“ (modulis „%module“), naudotojas atsakė „%response“, bet sprendimas buvo „%solution“."
-
-#: captcha.module:120
-msgid "Already 1 blocked form submission"
-msgid_plural "Already @count blocked form submissions"
-msgstr[0] ""
-msgstr[1] ""
-
-#: captcha.module:61
-msgid "Administer how and where CAPTCHAs are used."
-msgstr "Nustatykite kur ir kada naudoti CAPTCHA užduotis."
-
-#: captcha.module:77
-msgid "General settings"
-msgstr "Bendri nustatymai"
-
-#: captcha.module:83
-msgid "Examples"
-msgstr "Pavyzdžiai"
-
-#: captcha.module:84
-msgid "An overview of the available challenge types with examples."
-msgstr "Galimų užduočių su pavyzdžiais apžvalga."
-
-#: captcha.module:93
-msgid "CAPTCHA point administration"
-msgstr "Kitų formų CAPTCHA užduočių administravimas"
-
-#: captcha.install:156
-msgid "Unsupported database."
-msgstr "Nepalaikoma duomenų bazė."
-
-#: (duplicate) captcha.install:115
-msgid "You can now <a href=\"!captcha_admin\">configure the CAPTCHA module</a> for your site."
-msgstr "Dabar jūs galite <a href=\"!captcha_admin\">sukonfigūruoti CAPTCHA užduoties modulį</a> savo svetainei."
-
-#: captcha.info:0
-msgid "Base CAPTCHA module for adding challenges to arbitrary forms."
-msgstr "Pagrindinis CAPTCHA užduoties modulis, leidžiantis pridėti užduotis prie pasirinktų formų."
-
-#: captcha.info:0 image_captcha/image_captcha.info:0
-msgid "Spam control"
-msgstr "Šlamšto kontrolė"
-
-#: image_captcha/image_captcha.admin.inc:13
-msgid "Built-in font"
-msgstr "Vidinis Å¡riftas"
-
-#: image_captcha/image_captcha.admin.inc:39
-msgid "The Image CAPTCHA module can not generate images because your PHP setup does not support it (no <a href=\"!gdlib\">GD library</a>)."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:50
-msgid "Presolved image CAPTCHA example, generated with the current settings."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:61
-msgid "Code settings"
-msgstr "Kodo nustatymai"
-
-#: image_captcha/image_captcha.admin.inc:65
-msgid "Characters to use in the code"
-msgstr "Kode naudojami rašmenys"
-
-#: image_captcha/image_captcha.admin.inc:70
-msgid "Code length"
-msgstr "Kodo ilgis"
-
-#: image_captcha/image_captcha.admin.inc:73
-msgid "The code length influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr "Kodo ilgis daro įtaką paveikslėlio dydžiui. Reikia pastebėti, kad didesnės reikšmės reiškia daugiau darbo procesoriui generuojant paveikslėlius."
-
-#: image_captcha/image_captcha.admin.inc:79
-msgid "Font settings"
-msgstr "Å rifto nustatymai"
-
-#: image_captcha/image_captcha.admin.inc:85
-msgid "Font"
-msgstr "Å riftas"
-
-#: image_captcha/image_captcha.admin.inc:87
-msgid "The TrueType font (.ttf) to use for the text in the image CAPTCHA."
-msgstr "TrueType šriftas (.ttf), naudojamas tekstui vaizdinėje CAPTCHA užduotyje."
-
-#: image_captcha/image_captcha.admin.inc:96
-msgid "Font size"
-msgstr "Å rifto dydis"
-
-#: image_captcha/image_captcha.admin.inc:98
-msgid "tiny"
-msgstr "mažytis"
-
-#: image_captcha/image_captcha.admin.inc:99;158
-msgid "small"
-msgstr "mažas"
-
-#: image_captcha/image_captcha.admin.inc:101;125;185
-msgid "normal"
-msgstr "normalus"
-
-#: image_captcha/image_captcha.admin.inc:103
-msgid "large"
-msgstr "didelis"
-
-#: image_captcha/image_captcha.admin.inc:105
-msgid "extra large"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:108
-msgid "The font size influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr "Šrifto dydis daro įtaką paveikslėlio dydžiui. Reikia pastebėti, kad didesnis paveikslėlis reiškia daugiau darbo procesoriui generuojant jį."
-
-#: image_captcha/image_captcha.admin.inc:120
-msgid "Character spacing"
-msgstr "Tarpų plotis tarp simbolių"
-
-#: image_captcha/image_captcha.admin.inc:121
-msgid "Define the average spacing between characters. Note that larger values make the image generation more CPU intensive."
-msgstr "Nustatykite vidutinį tarpą tarp simbolių. Reikia pastebėti, kad didesnis paveikslėlis reiškia daugiau darbo procesoriui generuojant jį."
-
-#: image_captcha/image_captcha.admin.inc:124
-msgid "tight"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:126
-msgid "wide"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:127
-msgid "extra wide"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:134
-msgid "Color settings"
-msgstr "Spalvų nustatymai"
-
-#: image_captcha/image_captcha.admin.inc:135
-msgid "Configuration of the background and text colors in the image CAPTCHA."
-msgstr "Fono ir teksto spalvų vaizdinėje CAPTCHA užduotyje konfigūravimas."
-
-#: image_captcha/image_captcha.admin.inc:139
-msgid "Background color"
-msgstr "Fono spalva"
-
-#: image_captcha/image_captcha.admin.inc:140
-msgid "Enter the hexadecimal code for the background color (e.g. #FFF or #FFCE90)."
-msgstr "Įveskite šešioliktainį fono spalvos kodą, pvz., #FFF ar #FFCE90."
-
-#: image_captcha/image_captcha.admin.inc:147
-msgid "Text color"
-msgstr "Teksto"
-
-#: image_captcha/image_captcha.admin.inc:148
-msgid "Enter the hexadecimal code for the text color (e.g. #000 or #004283)."
-msgstr "Įveskite šešioliktainį teksto spalvos kodą, pvz., #000 ar #004283."
-
-#: image_captcha/image_captcha.admin.inc:155
-msgid "Additional variation of text color"
-msgstr "Papildomas teksto spalvos variavimas"
-
-#: image_captcha/image_captcha.admin.inc:159;183
-msgid "moderate"
-msgstr "vidutinis"
-
-#: image_captcha/image_captcha.admin.inc:160;187;221
-msgid "high"
-msgstr "aukštas"
-
-#: image_captcha/image_captcha.admin.inc:161
-msgid "very high"
-msgstr "labai aukštas"
-
-#: image_captcha/image_captcha.admin.inc:164
-msgid "The different characters will have randomized colors in the specified range around the text color."
-msgstr "Skirtingi simboliai turės atsitiktines spalvas, parenkamas iš panašių į nurodytą teksto spalvą."
-
-#: image_captcha/image_captcha.admin.inc:171
-msgid "Distortion and noise"
-msgstr "Iškraipymas ir triukšmas"
-
-#: image_captcha/image_captcha.admin.inc:172
-msgid "With these settings you can control the degree of obfuscation by distortion and added noise. Do not exaggerate the obfuscation and assure that the code in the image is reasonably readable. For example, do not combine high levels of distortion and noise."
-msgstr "Šiuo nustatymu jūs galite valdyti apgadinimo lygį iškraipant ir pridedant triukšmą. Nepersistenkite su apgadinimu ir įsitikinkite, kad kodas yra perskaitomas. Pvz., kartu nenaudokite aukštų iškraipymo ir triukšmo lygių."
-
-#: image_captcha/image_captcha.admin.inc:177
-msgid "Distortion level"
-msgstr "IÅ¡kraipymo lygis"
-
-#: image_captcha/image_captcha.admin.inc:181;217
-msgid "low"
-msgstr "žemas"
-
-#: image_captcha/image_captcha.admin.inc:189;223
-msgid "severe"
-msgstr "milžiniškas"
-
-#: image_captcha/image_captcha.admin.inc:192
-msgid "Set the degree of wave distortion in the image."
-msgstr "Nustatykite paveikslėlio iškraipymo bangelėmis lygį."
-
-#: image_captcha/image_captcha.admin.inc:196
-msgid "Smooth distortion"
-msgstr "Išlyginimo iškraipymas"
-
-#: image_captcha/image_captcha.admin.inc:198
-msgid "This option enables bilinear interpolation of the distortion which makes the image look smoother, but it is more CPU intensive."
-msgstr "Šis nustatymas įjungia „bilinear“ iškraipymų interpoliaciją. Tai paveikslėlį daro glotnesnį, bet labiau apkrauna procesorių"
-
-#: image_captcha/image_captcha.admin.inc:203
-msgid "Add salt and pepper noise"
-msgstr "Druskos ir pipirų triukšmas"
-
-#: image_captcha/image_captcha.admin.inc:205
-msgid "This option adds randomly colored point noise."
-msgstr "Šis nustatymas prideda atsitiktinės spalvos taškinį triukšmą."
-
-#: image_captcha/image_captcha.admin.inc:209
-msgid "Add line noise"
-msgstr "Linijinis triukšmas"
-
-#: image_captcha/image_captcha.admin.inc:211
-msgid "This option enables lines randomly drawn on top of the text code."
-msgstr "Šis nustatymas įjungia ant tekstinio kodo atsitiktinai piešiamas linijas."
-
-#: image_captcha/image_captcha.admin.inc:215
-msgid "Noise level"
-msgstr "Triukšmo lygis"
-
-#: image_captcha/image_captcha.admin.inc:219
-msgid "medium"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:240
-msgid "The Image CAPTCHA module can not use True Type fonts because your PHP setup does not support it. There is only a built-in bitmap font available."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:245
-msgid "The image CAPTCHA module works best with a TrueType font file (TTF) for generating the images, but because of licencing issues it is not allowed to package fonts with the module. A simple built-in bitmap font is provided as default instead. You can install TrueType fonts yourself by putting them in the fonts directory of the image CAPTCHA module (directory \"%fontsdir\") or by uploading them to your Drupal file system (directory \"%filesdir\") with for example the upload module."
-msgstr "Vaizdinės CAPTCHA užduoties modulis geriausiai veikia su su TrueType šriftų failais (TTF) paveikslėlių generavimui, bet dėl licencijavimo ypatybių negalima šriftų platinti kartu su moduliu. Vietoje to paprastas taškinės grafikos šriftas yra pridedamas kaip numatytas. Jūs patys galite įdiegti TrueType šriftus padėdami juos vaizdinės CAPTCHA užduoties modulio šriftų aplanke „%fontsdir“ arba atsiųsdami juos į jūsų Drupal failų sistemos aplanką „%filesdir“ pasinaudoję atsiuntimo moduliu."
-
-#: image_captcha/image_captcha.admin.inc:248
-msgid "The usage of the built-in bitmap font it is not recommended because of its small size and missing UTF-8 support."
-msgstr "Nerekomenduojama naudoti pateikiamą taškinės grafikos šriftą dėl jo mažo dydžio ir UTF-8 nepalaikymo."
-
-#: image_captcha/image_captcha.admin.inc:259
-msgid "The list of characters to use should not contain spaces."
-msgstr "Rašmenų sąraše neturi būti tarpų."
-
-#: image_captcha/image_captcha.admin.inc:264
-msgid "You need to select a font"
-msgstr "JÅ«s turite pasirinkti Å¡riftÄ…"
-
-#: image_captcha/image_captcha.admin.inc:267
-msgid "Font does not exist or is not readable."
-msgstr "Å riftas neegzistuoja ar yra neperskaitomas."
-
-#: image_captcha/image_captcha.admin.inc:272
-msgid "Background color is not a valid hexadecimal color value."
-msgstr "Fono spalva nėra galima šešioliktainė spalvos vertė."
-
-#: image_captcha/image_captcha.admin.inc:275
-msgid "Text color is not a valid hexadecimal color value."
-msgstr "Teksto spalva nėra galima šešioliktainė spalvos vertė."
-
-#: image_captcha/image_captcha.user.inc:29
-msgid "Generation of image CAPTCHA failed. Check your image CAPTCHA configuration and especially the used font."
-msgstr "Vaizdinės CAPTCHA užduoties generavimas nepavyko. Patikrinkite savo vaizdinės CAPTCHA užduoties konfigūraciją, atkreipkite dėmesį į naudojamus šriftus."
-
-#: image_captcha/image_captcha.user.inc:72
-msgid "Could not find or read the configured font (\"%font\") for the image CAPTCHA."
-msgstr ""
-
-#: image_captcha/image_captcha.module:28
-msgid "The image CAPTCHA is a popular challenge where a random textual code is obfuscated in an image. The image is generated on the fly for each request, which is rather CPU intensive for the server. Be careful with the size and computation related settings."
-msgstr "Vaizdinė CAPTCHA užduotis, kur atsitiktinis tekstinis kodas yra apgadinamas paveikslėlyje, yra labai plačiai naudojama. Paveikslėlis yra sugeneruojamas kiekvienai užklausai, dėl to tai gana stipriai apkrauna serverio procesorių. Būkite atsargūs su dydžio ir skaičiavimų nustatymais."
-
-#: image_captcha/image_captcha.module:166
-msgid "Enter the characters shown in the image. Ignore spaces and be careful about upper and lower case."
-msgstr "Įveskite paveikslėlyje esančius simbolius. Tarpų nepaisykite ir būkite atidūs su didžiosiomis ir mažosiomis raidėmis."
-
-#: image_captcha/image_captcha.module:169
-msgid "Enter the characters (without spaces) shown in the image."
-msgstr "Įveskite paveikslėlyje esančius simbolius be tarpų."
-
-#: image_captcha/image_captcha.module:179;179;40
-#: image_captcha/image_captcha.info:0
-msgid "Image CAPTCHA"
-msgstr "Vaizdinė CAPTCHA užduotis"
-
-#: image_captcha/image_captcha.module:184
-msgid "What code is in the image?"
-msgstr "Koks kodas yra paveikslÄ—lyje?"
-
-#: image_captcha/image_captcha.module:94
-msgid "Encountered an illegal byte while splitting an utf8 string in characters."
-msgstr "Prieitas negalimas baitas dalijant UTF8 simbolių eilutę į simbolius."
-
-#: image_captcha/image_captcha.info:0
-msgid "Provides an image based CAPTCHA."
-msgstr "Suteikia vaizdinę CAPTCHA užduotį."
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/nl.po b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/nl.po
deleted file mode 100644
index 0ce8a10..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/nl.po
+++ /dev/null
@@ -1,658 +0,0 @@
-# $Id: nl.po,v 1.8 2009/07/11 17:30:39 soxofaan Exp $
-#
-# Dutch translation of Drupal (general)
-# Copyright 2009 Stefaan Lippens
-# Generated from files:
-#  captcha.admin.inc,v 1.20 2009/04/27 20:35:08 soxofaan
-#  image_captcha.admin.inc,v 1.17 2009/04/24 22:16:48 soxofaan
-#  captcha.module,v 1.83 2009/04/27 20:35:08 soxofaan
-#  captcha.inc,v 1.1 2009/04/07 22:06:50 soxofaan
-#  captcha.info,v 1.7 2008/02/17 12:49:24 soxofaan
-#  image_captcha.user.inc,v 1.19 2009/04/24 22:16:48 soxofaan
-#  image_captcha.module,v 1.22 2009/04/15 01:41:35 soxofaan
-#  captcha.install,v 1.9 2009/03/22 20:06:39 soxofaan
-#  image_captcha.info,v 1.5 2008/02/17 12:49:24 soxofaan
-msgid ""
-msgstr ""
-"Project-Id-Version: nl\n"
-"POT-Creation-Date: 2009-07-03 15:01+0200\n"
-"PO-Revision-Date: 2009-04-28 00:26+0100\n"
-"Last-Translator: soxofaan\n"
-"Language-Team: Dutch\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n!=1);\n"
-
-#: captcha.admin.inc:16 image_captcha/image_captcha.admin.inc:157;179
-msgid "none"
-msgstr "geen"
-
-#: captcha.admin.inc:17
-msgid "default challenge type"
-msgstr "standaard CAPTCHA-type"
-
-#: captcha.admin.inc:23
-msgid "@type (from module @module)"
-msgstr ""
-
-#: captcha.admin.inc:42
-msgid "Form protection"
-msgstr "Formulierbescherming"
-
-#: captcha.admin.inc:43
-msgid "Select the challenge type you want for each of the listed forms (identified by their so called <em>form_id</em>'s). You can easily add arbitrary forms with textfield at the bottom of the table or with the help of the '%CAPTCHA_admin_links' option below."
-msgstr ""
-
-#: captcha.admin.inc:44;108 captcha.module:46
-msgid "Add CAPTCHA administration links to forms"
-msgstr "Voeg CAPTCHA-configuratielinks toe aan de formulieren."
-
-#: captcha.admin.inc:49
-msgid "Default challenge type"
-msgstr "Standaard CAPTCHA-type"
-
-#: captcha.admin.inc:50
-msgid "Select the default challenge type for CAPTCHAs. This can be overriden for each form if desired."
-msgstr ""
-
-#: captcha.admin.inc:86
-msgid "delete"
-msgstr "verwijderen"
-
-#: captcha.admin.inc:110
-msgid "This option makes it easy to manage CAPTCHA settings on forms. When enabled, users with the \"%admincaptcha\" permission will see a fieldset with CAPTCHA administration links on all forms, except on administrative pages."
-msgstr "Deze optie is handig om CAPTCHA's te beheren op formulieren. Wanneer deze optie ingeschakeld is, zien gebruikers met de \"%admincaptcha\" permissie de CAPTCHA-configuratielinks op alle formulieren, met uitzondering van de beheerpagina's."
-
-#: captcha.admin.inc:110 captcha.module:107
-msgid "administer CAPTCHA settings"
-msgstr "CAPTCHA-instellingen beheren"
-
-#: captcha.admin.inc:115
-msgid "Allow CAPTCHAs and CAPTCHA administration links on administrative pages"
-msgstr "Laat CAPTCHA's en CAPTCHA-configuratielinks toe op beheerspagina's."
-
-#: captcha.admin.inc:117
-msgid "This option makes it possible to add CAPTCHAs to forms on administrative pages. CAPTCHAs are disabled by default on administrative pages (which shouldn't be accessible to untrusted users normally) to avoid the related overhead. In some situations, e.g. in the case of demo sites, it can be usefull to allow CAPTCHAs on administrative pages."
-msgstr "Deze optie maakt het mogelijk om CAPTCHA's toe te voegen aan formulieren op beheerspagina's. CAPTCHA's zijn standaard afwezig op beheerspagina's (die normaal gezien niet toegankelijk zijn voor onbetrouwbare bezoekers) om de gerelateerde overhead te vermijden. In sommige situaties, zoals bij demo-websites kan het nuttig zijn om CAPTCHA's toe te laten op beheerspagina's."
-
-#: captcha.admin.inc:123
-msgid "Add a description to the CAPTCHA"
-msgstr "Een beschrijving toevoegen aan de CAPTCHA"
-
-#: captcha.admin.inc:124
-msgid "Add a configurable description to explain the purpose of the CAPTCHA to the visitor."
-msgstr "Voeg een instelbare beschrijving toe om de bedoeling van de CAPTCHA uit te leggen aan de bezoeker."
-
-#: captcha.admin.inc:132
-msgid "CAPTCHA description"
-msgstr "CAPTCHA-beschrijving"
-
-#: captcha.admin.inc:133;149
-msgid "Configurable description of the CAPTCHA. An empty entry will reset the description."
-msgstr ""
-
-#: captcha.admin.inc:139
-msgid "For language %lang_name (code %lang_code)"
-msgstr "Voor taal %lang_name (code %lang_code)"
-
-#: captcha.admin.inc:148
-msgid "Challenge description"
-msgstr "CAPTCHA-beschrijving"
-
-#: captcha.admin.inc:159
-msgid "Default CAPTCHA validation"
-msgstr "Standaard CAPTCHA-validatie"
-
-#: captcha.admin.inc:160
-msgid "Define how the response should be processed by default. Note that the modules that provide the actual challenges can override or ignore this."
-msgstr ""
-
-#: captcha.admin.inc:162
-msgid "Case sensitive validation: the response has to exactly match the solution."
-msgstr ""
-
-#: captcha.admin.inc:163
-msgid "Case insensitive validation: lowercase/uppercase errors are ignored."
-msgstr ""
-
-#: captcha.admin.inc:171
-msgid "Persistence"
-msgstr "CAPTCHA-volharding"
-
-#: captcha.admin.inc:174
-msgid "Always add a challenge."
-msgstr "Steeds een CAPTCHA voorschotelen."
-
-#: captcha.admin.inc:175
-msgid "Omit challenges for a form once the user has successfully responded to a challenge for that form."
-msgstr "CAPTCHA achterwege laten eens de gebruiker een CAPTCHA juist beantwoorde voor het formulier."
-
-#: captcha.admin.inc:176
-msgid "Omit challenges for all forms once the user has successfully responded to a challenge."
-msgstr "CAPTCHA achterwege laten eens de gebruiker een CAPTCHA juist beantwoorde ergens op de site."
-
-#: captcha.admin.inc:178
-msgid "Define if challenges should be omitted during the rest of a session once the user successfully responses to a challenge."
-msgstr ""
-
-#: captcha.admin.inc:184
-msgid "Log wrong responses"
-msgstr "Hou foute anwoorden bij"
-
-#: captcha.admin.inc:185
-msgid "Report information about wrong responses to the !log."
-msgstr "Informatie omtrent foute CAPTCHA-antwoorden worden bijgehouden in het !log."
-
-#: captcha.admin.inc:185
-msgid "log"
-msgstr "log"
-
-#: captcha.admin.inc:192
-msgid "Save configuration"
-msgstr ""
-
-#: captcha.admin.inc:202;342
-msgid "Challenge type"
-msgstr "CAPTCHA-type"
-
-#: captcha.admin.inc:202
-msgid "Operations"
-msgstr "Bewerkingen"
-
-#: captcha.admin.inc:229;363
-msgid "Illegal form_id"
-msgstr "Ongeldig form_id"
-
-#: captcha.admin.inc:255
-msgid "Added CAPTCHA point."
-msgstr "CAPTCHA point instellingen zijn bewaard."
-
-#: captcha.admin.inc:270
-msgid "Reset of CAPTCHA description for language %language."
-msgstr ""
-
-#: captcha.admin.inc:281
-msgid "Reset of CAPTCHA description."
-msgstr ""
-
-#: captcha.admin.inc:289
-msgid "The CAPTCHA settings were saved."
-msgstr "De CAPTCHA-instellingen werden opgeslagen."
-
-#: captcha.admin.inc:321;335
-msgid "Form ID"
-msgstr "Form ID"
-
-#: captcha.admin.inc:322;336
-msgid "The Drupal form_id of the form to add the CAPTCHA to."
-msgstr "Het Drupal form_id van het formulier waaraan de CAPTCHA toegevoegd moet worden."
-
-#: captcha.admin.inc:343
-msgid "The CAPTCHA type to use for this form"
-msgstr "Het CAPTCHA-type te gebruiken voor dit formulier"
-
-#: captcha.admin.inc:352
-msgid "Save"
-msgstr "Bewaren"
-
-#: captcha.admin.inc:375
-msgid "Saved CAPTCHA point settings."
-msgstr "CAPTCHA-point-instellingen zijn bewaard."
-
-#: captcha.admin.inc:392
-msgid "Are you sure you want to delete the CAPTCHA for form_id %form_id?"
-msgstr "Bent u zeker dat u de CAPTCHA voor het formulier met form_id %form_id wilt verwijderen?"
-
-#: captcha.admin.inc:393
-msgid "Delete"
-msgstr "Verwijderen"
-
-#: captcha.admin.inc:396
-msgid "Are you sure you want to disable the CAPTCHA for form_id %form_id?"
-msgstr "Bent u zeker dat u de CAPTCHA voor het formulier met form_id %form_id wilt uitschakelen?"
-
-#: captcha.admin.inc:397
-msgid "Disable"
-msgstr "Uitschakelen"
-
-#: captcha.admin.inc:410
-msgid "Deleted CAPTCHA for form %form_id."
-msgstr "CAPTCHA verwijderd voor formulier %form_id."
-
-#: captcha.admin.inc:414
-msgid "Disabled CAPTCHA for form %form_id."
-msgstr "CAPTCHA uitgeschakeld voor formulier %form_id."
-
-#: captcha.admin.inc:451
-msgid "This page gives an overview of all available challenge types, generated with their current settings."
-msgstr "Deze pagina geeft een overzicht van de beschikbare CAPTCHA types, gegenereerd met hun huidige instellingen."
-
-#: captcha.admin.inc:459
-msgid "Challenge \"%challenge\" by module \"%module\""
-msgstr "Uitdaging \"%challenge\" van module \"%module\""
-
-#: captcha.admin.inc:462
-msgid "10 more examples of this challenge."
-msgstr "10 extra voorbeelden van deze uitdaging."
-
-#: captcha.inc:38
-msgid "Failed to set a CAPTCHA type for form %form_id: could not interpret value \"@captcha_type\""
-msgstr ""
-
-#: captcha.inc:145
-msgid "This question is for testing whether you are a human visitor and to prevent automated spam submissions."
-msgstr "Deze vraag wordt gebruikt om te testen indien u een menselijke bezoeker bent teneinde spam-inzendingen te vermijden."
-
-#: captcha.module:31
-msgid "\"CAPTCHA\" is an acronym for \"Completely Automated Public Turing test to tell Computers and Humans Apart\". It is typically a challenge-response test to determine whether the user is human. The CAPTCHA module is a tool to fight automated submission by malicious users (spamming) of for example comments forms, user registration forms, guestbook forms, etc. You can extend the desired forms with an additional challenge, which should be easy for a human to solve correctly, but hard enough to keep automated scripts and spam bots out."
-msgstr ""
-
-#: captcha.module:32
-msgid "Note that the CAPTCHA module interacts with page caching (see <a href=\"!performancesettings\">performance settings</a>). Because the challenge should be unique for each generated form, the caching of the page it appears on is prevented. Make sure that these forms do not appear on too many pages or you will lose much caching efficiency. For example, if you put a CAPTCHA on the user login block, which typically appears on each page for anonymous visitors, caching will practically be disabled. The comment submission forms are another example. In this case you should set the \"%commentlocation\" to \"%separatepage\" in the comment settings of the relevant <a href=\"!contenttypes\">content types</a> for better caching efficiency."
-msgstr ""
-
-#: captcha.module:35
-msgid "Location of comment submission form"
-msgstr ""
-
-#: captcha.module:36
-msgid "Display on separate page"
-msgstr ""
-
-#: captcha.module:40
-msgid "CAPTCHA is a trademark of Carnegie Mellon University."
-msgstr "CAPTCHA is een trademark van Carnegie Mellon University."
-
-#: captcha.module:45
-msgid "A CAPTCHA can be added to virtually each Drupal form. Some default forms are already provided in the form list, but arbitrary forms can be easily added and managed when the option \"%adminlinks\" is enabled."
-msgstr "Een CAPTCHA kan toegevoegd worden aan zowat elk Drupal formulier. Sommige standaard formulieren zijn reeds beschikbaar in de formulier-lijst, maar willekeurige formulieren kunnen eenvoudig toegevoegd en beheerd worden indien de optie \"%adminlinks\" actief is."
-
-#: captcha.module:47
-msgid "Users with the \"%skipcaptcha\" <a href=\"@perm\">permission</a> won't be offered a challenge. Be sure to grant this permission to the trusted users (e.g. site administrators). If you want to test a protected form, be sure to do it as a user without the \"%skipcaptcha\" permission (e.g. as anonymous user)."
-msgstr "Gebruikers met de \"%skipcaptcha\" <a href=\"@perm\">permissie</a> krijgen geen CAPTCHA voorgeschoteld. Verleen deze permissie aan de betrouwbare gebruikers (b.v websitebeheerders). Indien u de CAPTCHA's wil testen, doe het dan als gebruiker zonder de \"%skipcaptcha\" permissie (b.v. als anonyme gebruiker)."
-
-#: captcha.module:48;107
-msgid "skip CAPTCHA"
-msgstr "CAPTCHA overslaan"
-
-#: (duplicate) captcha.module:269;322;119 ;222;442;60;71 captcha.info:0
-#: image_captcha/image_captcha.user.inc:29;72
-#: image_captcha/image_captcha.module:94
-msgid "CAPTCHA"
-msgstr "CAPTCHA"
-
-#: captcha.module:327
-msgid "CAPTCHA: challenge \"@type\" enabled"
-msgstr "CAPTCHA: beschermd met uitdaging \"@type\""
-
-#: captcha.module:328
-msgid "Untrusted users will see a CAPTCHA here (!settings)."
-msgstr "Onbetrouwbare gebruikers zien hier een CAPTCHA (!settings)."
-
-#: captcha.module:329
-msgid "general CAPTCHA settings"
-msgstr "algemene CAPTCHA instellingen"
-
-#: captcha.module:333
-msgid "Enabled challenge"
-msgstr "Ingeschakkelde uitdaging:"
-
-#: captcha.module:334
-msgid "\"@type\" by module \"@module\" (!change, !disable)"
-msgstr "\"@type\" door module \"@module\" (!change, !disable)"
-
-#: captcha.module:337
-msgid "change"
-msgstr "wijzigen"
-
-#: captcha.module:338
-msgid "disable"
-msgstr "uitschakelen"
-
-#: captcha.module:343 image_captcha/image_captcha.admin.inc:49
-msgid "Example"
-msgstr "Voorbeeld"
-
-#: captcha.module:344
-msgid "This is a pre-solved, non-blocking example of this challenge."
-msgstr "Dit is een op voorhand opgelost en niet blokkerend voorbeeld van deze uitdaging."
-
-#: captcha.module:353
-msgid "CAPTCHA: no challenge enabled"
-msgstr "CAPTCHA: geen uitdaging"
-
-#: captcha.module:355
-msgid "Place a CAPTCHA here for untrusted users."
-msgstr "CAPTCHA plaatsen voor onbetrouwbare gebruikers."
-
-#: captcha.module:417
-msgid "CAPTCHA test failed (unknown csid)."
-msgstr "CAPTCHA-test faalde (ongekende csid)."
-
-#: captcha.module:437
-msgid "The answer you entered for the CAPTCHA was not correct."
-msgstr "Het antwoord dat u opgaf voor de CAPTCHA was niet juist."
-
-#: captcha.module:524
-msgid "Math question"
-msgstr "Wiskunde vraag"
-
-#: captcha.module:525
-msgid "Solve this simple math problem and enter the result. E.g. for 1+3, enter 4."
-msgstr "Los deze eenvoudige rekenoefening op en voer het resultaat in. Bijvoorbeeld: voor 1+3, voer 4 in."
-
-#: captcha.module:526
-msgid "@x + @y = "
-msgstr ""
-
-#: captcha.module:545
-msgid "Test one two three"
-msgstr ""
-
-#: captcha.module:222
-msgid "CAPTCHA problem: hook_captcha() of module %module returned nothing when trying to retrieve challenge type %type for form %form_id."
-msgstr "CAPTCHA probleem: Bij het opvragen van CAPTCHA type %type voor het fomulier %form_id, gaf hook_captcha() van de module %module geen waarde terug."
-
-#: captcha.module:442
-msgid "%form_id post blocked by CAPTCHA module: challenge \"%challenge\" (by module \"%module\"), user answered \"%response\", but the solution was \"%solution\"."
-msgstr ""
-
-#: captcha.module:120
-msgid "Already 1 blocked form submission"
-msgid_plural "Already @count blocked form submissions"
-msgstr[0] "Reeds 1 tegengehouden formulierinzending"
-msgstr[1] "Reeds @counter tegengehouden formulierinzendingen"
-
-#: captcha.module:61
-msgid "Administer how and where CAPTCHAs are used."
-msgstr "Configureer hoe en waar CAPTCHA's gebruikt worden."
-
-#: captcha.module:77
-msgid "General settings"
-msgstr "Algemene instellingen"
-
-#: captcha.module:83
-msgid "Examples"
-msgstr "Voorbeelden"
-
-#: captcha.module:84
-msgid "An overview of the available challenge types with examples."
-msgstr "Overzicht van de beschikbare CAPTCHA-types met voorbeelden."
-
-#: captcha.module:93
-msgid "CAPTCHA point administration"
-msgstr "CAPTCHA-point-beheer"
-
-#: captcha.install:156
-msgid "Unsupported database."
-msgstr "Databank type is niet ondersteund."
-
-#: (duplicate) captcha.install:115
-msgid "You can now <a href=\"!captcha_admin\">configure the CAPTCHA module</a> for your site."
-msgstr "U kan nu <a href=\"!captcha_admin\">de CAPTCHA module instellen</a> voor uw site."
-
-#: captcha.info:0
-msgid "Base CAPTCHA module for adding challenges to arbitrary forms."
-msgstr "Basis CAPTCHA module om uitdagingen aan allerlei formulieren toe te voegen."
-
-#: captcha.info:0 image_captcha/image_captcha.info:0
-msgid "Spam control"
-msgstr "Spamcontrole"
-
-#: image_captcha/image_captcha.admin.inc:13
-msgid "Built-in font"
-msgstr "Ingebouwd lettertype"
-
-#: image_captcha/image_captcha.admin.inc:39
-msgid "The Image CAPTCHA module can not generate images because your PHP setup does not support it (no <a href=\"!gdlib\">GD library</a>)."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:50
-msgid "Presolved image CAPTCHA example, generated with the current settings."
-msgstr "Reeds opgeloste afbeelding-CAPTCHA, gegenereerd met de huidige instellingen:"
-
-#: image_captcha/image_captcha.admin.inc:61
-msgid "Code settings"
-msgstr "Code-instellingen"
-
-#: image_captcha/image_captcha.admin.inc:65
-msgid "Characters to use in the code"
-msgstr "Karakters die in de afbeelding kunnen verschijnen"
-
-#: image_captcha/image_captcha.admin.inc:70
-msgid "Code length"
-msgstr "Codelengte"
-
-#: image_captcha/image_captcha.admin.inc:73
-msgid "The code length influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr "De code lengte beïnvloedt de afmetingen van de afbeelding. Hou er rekening mee dat grotere waarden het genereren van de afbeeldingen CPU-intensiever maakt."
-
-#: image_captcha/image_captcha.admin.inc:79
-msgid "Font settings"
-msgstr "Lettertype-instellingen"
-
-#: image_captcha/image_captcha.admin.inc:85
-msgid "Font"
-msgstr "Lettertype"
-
-#: image_captcha/image_captcha.admin.inc:87
-msgid "The TrueType font (.ttf) to use for the text in the image CAPTCHA."
-msgstr "Het TrueType font (.ttf) te gebruiken vor de afbeelding-CAPTCHA"
-
-#: image_captcha/image_captcha.admin.inc:96
-msgid "Font size"
-msgstr "Lettertypegrootte"
-
-#: image_captcha/image_captcha.admin.inc:98
-msgid "tiny"
-msgstr "zeer klein"
-
-#: image_captcha/image_captcha.admin.inc:99;158
-msgid "small"
-msgstr "klein"
-
-#: image_captcha/image_captcha.admin.inc:101;125;185
-msgid "normal"
-msgstr "normaal"
-
-#: image_captcha/image_captcha.admin.inc:103
-msgid "large"
-msgstr "groot"
-
-#: image_captcha/image_captcha.admin.inc:105
-msgid "extra large"
-msgstr "extra groot"
-
-#: image_captcha/image_captcha.admin.inc:108
-msgid "The font size influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:120
-msgid "Character spacing"
-msgstr "Karakter spatiëring"
-
-#: image_captcha/image_captcha.admin.inc:121
-msgid "Define the average spacing between characters. Note that larger values make the image generation more CPU intensive."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:124
-msgid "tight"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:126
-msgid "wide"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:127
-msgid "extra wide"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:134
-msgid "Color settings"
-msgstr "Kleurinstellingen"
-
-#: image_captcha/image_captcha.admin.inc:135
-msgid "Configuration of the background and text colors in the image CAPTCHA."
-msgstr "Configuratie van de achtergrond- en tekstkleuren in de beeld-CAPTCHA."
-
-#: image_captcha/image_captcha.admin.inc:139
-msgid "Background color"
-msgstr "Achtergrondkleur"
-
-#: image_captcha/image_captcha.admin.inc:140
-msgid "Enter the hexadecimal code for the background color (e.g. #FFF or #FFCE90)."
-msgstr "Geef de hexadecimale code op voor de achtergrondkleur (e.g. #FFF of #FFCE90)."
-
-#: image_captcha/image_captcha.admin.inc:147
-msgid "Text color"
-msgstr "Tekstkleur"
-
-#: image_captcha/image_captcha.admin.inc:148
-msgid "Enter the hexadecimal code for the text color (e.g. #000 or #004283)."
-msgstr "Geed de hexadecimale code op voor de tekstkleur (e.g. #000 of #004283)."
-
-#: image_captcha/image_captcha.admin.inc:155
-msgid "Additional variation of text color"
-msgstr "Bijkomende varitatie op de tekstkleur"
-
-#: image_captcha/image_captcha.admin.inc:159;183
-msgid "moderate"
-msgstr "matig"
-
-#: image_captcha/image_captcha.admin.inc:160;187;221
-msgid "high"
-msgstr "hoog"
-
-#: image_captcha/image_captcha.admin.inc:161
-msgid "very high"
-msgstr "zeer hoog"
-
-#: image_captcha/image_captcha.admin.inc:164
-msgid "The different characters will have randomized colors in the specified range around the text color."
-msgstr "De verschillende karakters zullen een willekeurig kleur hebben in het opgegeven bereik rond de tekstkleur."
-
-#: image_captcha/image_captcha.admin.inc:171
-msgid "Distortion and noise"
-msgstr "Vervorming en ruis"
-
-#: image_captcha/image_captcha.admin.inc:172
-msgid "With these settings you can control the degree of obfuscation by distortion and added noise. Do not exaggerate the obfuscation and assure that the code in the image is reasonably readable. For example, do not combine high levels of distortion and noise."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:177
-msgid "Distortion level"
-msgstr "Vervormingsniveau"
-
-#: image_captcha/image_captcha.admin.inc:181;217
-msgid "low"
-msgstr "laag"
-
-#: image_captcha/image_captcha.admin.inc:189;223
-msgid "severe"
-msgstr "ernstig"
-
-#: image_captcha/image_captcha.admin.inc:192
-msgid "Set the degree of wave distortion in the image."
-msgstr "Stel de graad van golfverorming van het beeld in."
-
-#: image_captcha/image_captcha.admin.inc:196
-msgid "Smooth distortion"
-msgstr "Vloeiende vervorming"
-
-#: image_captcha/image_captcha.admin.inc:198
-msgid "This option enables bilinear interpolation of the distortion which makes the image look smoother, but it is more CPU intensive."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:203
-msgid "Add salt and pepper noise"
-msgstr "Zout- en peperruis toevoegen"
-
-#: image_captcha/image_captcha.admin.inc:205
-msgid "This option adds randomly colored point noise."
-msgstr "Deze optie voegt lukraak gekleurde puntruis toe."
-
-#: image_captcha/image_captcha.admin.inc:209
-msgid "Add line noise"
-msgstr "Lijn-ruis toevoegen"
-
-#: image_captcha/image_captcha.admin.inc:211
-msgid "This option enables lines randomly drawn on top of the text code."
-msgstr "Deze optie voegt lukraak getekende lijnen toe."
-
-#: image_captcha/image_captcha.admin.inc:215
-msgid "Noise level"
-msgstr "Ruisniveau"
-
-#: image_captcha/image_captcha.admin.inc:219
-msgid "medium"
-msgstr "medium"
-
-#: image_captcha/image_captcha.admin.inc:240
-msgid "The Image CAPTCHA module can not use True Type fonts because your PHP setup does not support it. There is only a built-in bitmap font available."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:245
-msgid "The image CAPTCHA module works best with a TrueType font file (TTF) for generating the images, but because of licencing issues it is not allowed to package fonts with the module. A simple built-in bitmap font is provided as default instead. You can install TrueType fonts yourself by putting them in the fonts directory of the image CAPTCHA module (directory \"%fontsdir\") or by uploading them to your Drupal file system (directory \"%filesdir\") with for example the upload module."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:248
-msgid "The usage of the built-in bitmap font it is not recommended because of its small size and missing UTF-8 support."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:259
-msgid "The list of characters to use should not contain spaces."
-msgstr "De karakterlijst mag geen spaties bevatten."
-
-#: image_captcha/image_captcha.admin.inc:264
-msgid "You need to select a font"
-msgstr "U dient een lettertype te selecteren"
-
-#: image_captcha/image_captcha.admin.inc:267
-msgid "Font does not exist or is not readable."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:272
-msgid "Background color is not a valid hexadecimal color value."
-msgstr "Achtergrondkleur is geen geldige hexadecimale kleurwaarde."
-
-#: image_captcha/image_captcha.admin.inc:275
-msgid "Text color is not a valid hexadecimal color value."
-msgstr "Tekstkleur is geen geldige hexadecimale kleurwaarde."
-
-#: image_captcha/image_captcha.user.inc:29
-msgid "Generation of image CAPTCHA failed. Check your image CAPTCHA configuration and especially the used font."
-msgstr ""
-
-#: image_captcha/image_captcha.user.inc:72
-msgid "Could not find or read the configured font (\"%font\") for the image CAPTCHA."
-msgstr ""
-
-#: image_captcha/image_captcha.module:28
-msgid "The image CAPTCHA is a popular challenge where a random textual code is obfuscated in an image. The image is generated on the fly for each request, which is rather CPU intensive for the server. Be careful with the size and computation related settings."
-msgstr ""
-
-#: image_captcha/image_captcha.module:166
-msgid "Enter the characters shown in the image. Ignore spaces and be careful about upper and lower case."
-msgstr "Vul de letters in uit de afbeelding. Negeer spaties en let op het gebruik van hoofdletters."
-
-#: image_captcha/image_captcha.module:169
-msgid "Enter the characters (without spaces) shown in the image."
-msgstr "Vul de letters in uit de afbeelding (zonder spaties)."
-
-#: image_captcha/image_captcha.module:179;179;40
-#: image_captcha/image_captcha.info:0
-msgid "Image CAPTCHA"
-msgstr "Beeld-CAPTCHA"
-
-#: image_captcha/image_captcha.module:184
-msgid "What code is in the image?"
-msgstr "Welke code staat in de afbeelding?"
-
-#: image_captcha/image_captcha.module:94
-msgid "Encountered an illegal byte while splitting an utf8 string in characters."
-msgstr ""
-
-#: image_captcha/image_captcha.info:0
-msgid "Provides an image based CAPTCHA."
-msgstr "Voorziet een afbeelding gebaseerde CAPTCHA"
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/pl.po b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/pl.po
deleted file mode 100644
index 60d0290..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/pl.po
+++ /dev/null
@@ -1,510 +0,0 @@
-# $Id: pl.po,v 1.2 2009/07/17 17:50:03 soxofaan Exp $
-#
-# LANGUAGE translation of Drupal (general)
-# Copyright YEAR NAME <EMAIL at ADDRESS>
-# Generated from files:
-#  captcha.admin.inc,v 1.9 2008/03/08 04:27:12 soxofaan
-#  image_captcha.admin.inc,v 1.5 2008/02/17 12:49:24 soxofaan
-#  captcha.module,v 1.65 2008/03/08 04:27:12 soxofaan
-#  captcha.pages.inc,v 1.2 2008/03/08 04:27:12 soxofaan
-#  captcha.info,v 1.7 2008/02/17 12:49:24 soxofaan
-#  image_captcha.user.inc,v 1.5 2008/02/17 12:49:24 soxofaan
-#  image_captcha.module,v 1.10 2008/02/17 12:49:24 soxofaan
-#  captcha.install,v 1.6 2008/02/17 18:35:25 soxofaan
-#  image_captcha.info,v 1.5 2008/02/17 12:49:24 soxofaan
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PROJECT VERSION\n"
-"POT-Creation-Date: 2008-03-08 06:39+0100\n"
-"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n"
-"Last-Translator: Sergiusz Pawłowicz <sergiusz at pawlowicz.name>\n"
-"Language-Team: Polish <sergiusz at pawlowicz.name>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-
-#: captcha.admin.inc:13 image_captcha/image_captcha.admin.inc:101
-msgid "none"
-msgstr "-"
-
-#: captcha.admin.inc:32;42 captcha.module:39
-msgid "Add CAPTCHA administration links to forms"
-msgstr "Dodaj linki CAPTCHA do formularzy"
-
-#: captcha.admin.inc:34
-msgid "This option is very helpful to enable/disable challenges on forms. When enabled, users with the \"%admincaptcha\" permission will see CAPTCHA administration links on all forms (except on administrative pages, which shouldn't be accessible to untrusted users in the first place). These links make it possible to enable a challenge of the desired type or disable it."
-msgstr ""
-
-#: captcha.admin.inc:39
-msgid "Challenge type per form"
-msgstr ""
-
-#: captcha.admin.inc:41
-msgid "Select the challenge type you want for each of the listed forms (identified by their so called <em>form_id</em>'s). You can easily add arbitrary forms with the help of the '%CAPTCHA_admin_links' option or the <a href=\"!add_captcha_point\">the CAPTCHA point form</a>."
-msgstr ""
-
-#: captcha.admin.inc:65
-msgid "delete"
-msgstr ""
-
-#: captcha.admin.inc:74;89
-msgid "Challenge description"
-msgstr ""
-
-#: captcha.admin.inc:75;90
-msgid "With this description you can explain the purpose of the challenge to the user."
-msgstr ""
-
-#: captcha.admin.inc:80
-msgid "For language %lang_name (code %lang_code)"
-msgstr ""
-
-#: captcha.admin.inc:98
-msgid "Persistence"
-msgstr ""
-
-#: captcha.admin.inc:101
-msgid "Always add a challenge."
-msgstr ""
-
-#: captcha.admin.inc:102
-msgid "Omit challenges for a form once the user has successfully responded to a challenge for that form."
-msgstr ""
-
-#: captcha.admin.inc:103
-msgid "Omit challenges for all forms once the user has successfully responded to a challenge."
-msgstr ""
-
-#: captcha.admin.inc:105
-msgid "Define if challenges should be omitted during the rest of a session once the user successfully responses to a challenge."
-msgstr ""
-
-#: captcha.admin.inc:110
-msgid "Log wrong responses"
-msgstr ""
-
-#: captcha.admin.inc:111
-msgid "Report information about wrong responses to the !log."
-msgstr ""
-
-#: captcha.admin.inc:111
-msgid "log"
-msgstr ""
-
-#: captcha.admin.inc:117;227
-msgid "Save"
-msgstr ""
-
-#: captcha.admin.inc:135
-msgid "Challenge type (module)"
-msgstr ""
-
-#: captcha.admin.inc:135
-msgid "Operations"
-msgstr ""
-
-#: captcha.admin.inc:166
-msgid "The CAPTCHA settings were saved."
-msgstr ""
-
-#: captcha.admin.inc:195;210
-msgid "Form ID"
-msgstr ""
-
-#: captcha.admin.inc:196;211
-msgid "The Drupal form_id of the form to add the CAPTCHA to."
-msgstr ""
-
-#: captcha.admin.inc:217
-msgid "Challenge type"
-msgstr ""
-
-#: captcha.admin.inc:218
-msgid "The CAPTCHA type to use for this form"
-msgstr ""
-
-#: captcha.admin.inc:237
-msgid "Illegal form_id"
-msgstr ""
-
-#: captcha.admin.inc:255
-msgid "Saved CAPTCHA point settings."
-msgstr ""
-
-#: captcha.admin.inc:272
-msgid "Are you sure you want to delete the CAPTCHA for form_id %form_id?"
-msgstr ""
-
-#: captcha.admin.inc:273
-msgid "Delete"
-msgstr ""
-
-#: captcha.admin.inc:276
-msgid "Are you sure you want to disable the CAPTCHA for form_id %form_id?"
-msgstr ""
-
-#: captcha.admin.inc:277
-msgid "Disable"
-msgstr ""
-
-#: captcha.admin.inc:290
-msgid "Deleted CAPTCHA for form %form_id."
-msgstr ""
-
-#: captcha.admin.inc:294
-msgid "Disabled CAPTCHA for form %form_id."
-msgstr ""
-
-#: captcha.admin.inc:320
-msgid "This page gives an overview of all available challenge types, generated with their current settings."
-msgstr ""
-
-#: captcha.admin.inc:331
-msgid "Challenge \"%challenge\" by module \"%module\""
-msgstr ""
-
-#: captcha.admin.inc:334
-msgid "10 more examples of this challenge."
-msgstr ""
-
-#: (duplicate) captcha.pages.inc:66;53;161 captcha.module:202;115  captcha.info:0 image_captcha/image_captcha.user.inc:28 image_captcha/image_captcha.module:91
-msgid "CAPTCHA"
-msgstr "CAPTCHA"
-
-#: captcha.pages.inc:108
-msgid "Another challenge"
-msgstr "Kolejna próba"
-
-#: captcha.pages.inc:109
-msgid "Get another challenge"
-msgstr "Kolejna próba"
-
-#: captcha.pages.inc:144
-msgid "CAPTCHA test failed (unknown challenge_id)."
-msgstr "CAPTCHA siÄ™ nie zgadza (nieznane challenge_id)."
-
-#: captcha.pages.inc:156
-msgid "The answer you entered for the CAPTCHA was not correct."
-msgstr "Odpowiedź na test CAPTCHA nie była prawidłowa."
-
-#: captcha.pages.inc:53
-msgid "CAPTCHA problem: hook_captcha() of module %module returned nothing when trying to retrieve challenge type %type for form %form_id."
-msgstr ""
-
-#: captcha.pages.inc:161
-msgid "%form_id post blocked by CAPTCHA module: challenge \"%challenge\" (by module \"%module\"), user answered \"%response\", but the solution was \"%solution\"."
-msgstr ""
-
-#: captcha.module:24
-msgid "\"CAPTCHA\" is an acronym for \"Completely Automated Public Turing test to tell Computers and Humans Apart\". It is typically a challenge-response test to determine whether the user is human. The CAPTCHA module is a tool to fight automated submission by malicious users (spamming) of for example comments forms, user registration forms, guestbook forms, etc. You can extend the desired forms with an additional challenge, which should be easy for a human to solve correctly, but hard enough to keep automated scripts and spam bots out."
-msgstr ""
-
-#: captcha.module:25
-msgid "Note that the CAPTCHA module interacts with page caching (see <a href=\"!performancesettings\">performance settings</a>). Because the challenge should be unique for each generated form, the caching of the page it appears on is prevented. Make sure that these forms do not appear on too many pages or you will lose much caching efficiency. For example, if you put a CAPTCHA on the user login block, which typically appears on each page for anonymous visitors, caching will practically be disabled. The comment submission forms are another example. In this case you should set the \"%commentlocation\" to \"%separatepage\" in the comment settings of the relevant <a href=\"!contenttypes\">content types</a> for better caching efficiency."
-msgstr ""
-
-#: captcha.module:28
-msgid "Location of comment submission form"
-msgstr ""
-
-#: captcha.module:29
-msgid "Display on separate page"
-msgstr ""
-
-#: captcha.module:33
-msgid "CAPTCHA is a trademark of Carnegie Mellon University."
-msgstr ""
-
-#: captcha.module:38
-msgid "A CAPTCHA can be added to virtually each Drupal form. Some default forms are already provided in the form list, but arbitrary forms can be easily added and managed when the option \"%adminlinks\" is enabled."
-msgstr ""
-
-#: captcha.module:40
-msgid "Users with the \"%skipcaptcha\" <a href=\"@perm\">permission</a> won't be offered a challenge. Be sure to grant this permission to the trusted users (e.g. site administrators). If you want to test a protected form, be sure to do it as a user without the \"%skipcaptcha\" permission (e.g. as anonymous user)."
-msgstr ""
-
-#: captcha.module:149
-msgid "This question is for testing whether you are a human visitor and to prevent automated spam submissions."
-msgstr ""
-
-#: captcha.module:207
-msgid "Untrusted users will see a CAPTCHA here (!settings)."
-msgstr ""
-
-#: captcha.module:208
-msgid "general CAPTCHA settings"
-msgstr ""
-
-#: captcha.module:212
-msgid "Enabled challenge"
-msgstr ""
-
-#: captcha.module:213
-msgid "\"@type\" by module \"@module\" (!change, !disable)"
-msgstr ""
-
-#: captcha.module:216
-msgid "change"
-msgstr ""
-
-#: captcha.module:217
-msgid "disable"
-msgstr ""
-
-#: captcha.module:223
-msgid "Place a CAPTCHA here for untrusted users."
-msgstr ""
-
-#: captcha.module:247
-msgid "Math Question"
-msgstr ""
-
-#: captcha.module:248
-msgid "Solve this simple math problem and enter the result. E.g. for 1+3, enter 4."
-msgstr ""
-
-#: captcha.module:249
-msgid "@x + @y = "
-msgstr ""
-
-#: (duplicate) captcha.module:116
-msgid "Already @counter blocked form submissions"
-msgstr ""
-
-#: captcha.install:9
-msgid "This table describes which challenges should be added to which forms."
-msgstr ""
-
-#: captcha.install:12
-msgid "The form_id of the form to add a CAPTCHA to."
-msgstr ""
-
-#: captcha.install:18
-msgid "The module that provides the challenge."
-msgstr ""
-
-#: captcha.install:23
-msgid "The challenge type to use."
-msgstr ""
-
-#: captcha.install:31;154
-msgid "Stores the solutions of the generated challenges."
-msgstr ""
-
-#: captcha.install:34;157
-msgid "Primary Key: Unique challenge ID."
-msgstr ""
-
-#: captcha.install:39;162
-msgid "Solution of the challenge."
-msgstr ""
-
-#: captcha.install:46;169
-msgid "Session ID of the user."
-msgstr ""
-
-#: captcha.install:53;176
-msgid "A Unix timestamp indicating when the challenge was generated."
-msgstr ""
-
-#: captcha.install:119
-msgid "Unsupported database."
-msgstr ""
-
-#: captcha.info:0
-msgid "Base CAPTCHA module for adding challenges to arbitrary forms."
-msgstr ""
-
-#: captcha.info:0 image_captcha/image_captcha.info:0
-msgid "Spam control"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:8
-msgid "Built-in font"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:26
-msgid "Images cannot be generated, because your PHP installation's GD library has no JPEG support."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:31
-msgid "Code settings"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:35
-msgid "Characters to use in the code"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:40
-msgid "Code length"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:43
-msgid "The code length influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:49
-msgid "Font settings"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:55
-msgid "Font"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:57
-msgid "The TrueType font (.ttf) to use for the text in the image CAPTCHA."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:66
-msgid "Font size"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:68
-msgid "tiny"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:69;84
-msgid "small"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:70;85;104;142
-msgid "normal"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:71;86
-msgid "large"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:74
-msgid "The font size influences the size of the image. Note that larger values make the image generation more CPU intensive."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:80
-msgid "Character spacing"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:81
-msgid "Define the average spacing between characters. Note that larger values make the image generation more CPU intensive."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:93
-msgid "Distortion and noise"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:94
-msgid "With these settings you can control the degree of obfuscation by distortion and added noise. Do not exaggerate the obfuscation and assure that the code in the image is reasonably readable. For example, do not combine high levels of distortion and noise."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:99
-msgid "Distortion level"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:102;141
-msgid "low"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:103
-msgid "moderate"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:105;143
-msgid "high"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:106;144
-msgid "severe"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:109
-msgid "Set the degree of wave distortion in the image."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:113
-msgid "Smooth distortion"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:115
-msgid "This option enables bilinear interpolation of the distortion which makes the image look smoother, but it is more CPU intensive."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:120
-msgid "Double vision"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:122
-msgid "When enabled, characters appear twice in the image, overlaid onto each other."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:127
-msgid "Add salt and pepper noise"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:129
-msgid "This option adds randomly colored point noise."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:133
-msgid "Add line noise"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:135
-msgid "This option enables lines randomly drawn on top of the text code."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:139
-msgid "Noise level"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:157
-msgid "The image captcha module works best with a TrueType font file (TTF) for generating the images, but because of licencing issues it is not allowed to package fonts with the module. A simple built-in bitmap font is provided as default instead. You can install TrueType fonts yourself by putting them in the fonts directory of the image captcha module (directory \"%fontsdir\") or by uploading them to your Drupal file system (directory \"%filesdir\") with for example the upload module."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:160
-msgid "The usage of the built-in bitmap font it is not recommended because of its small size and missing UTF-8 support."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:171
-msgid "The list of characters to use should not contain spaces."
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:176
-msgid "You need to select a font"
-msgstr ""
-
-#: image_captcha/image_captcha.admin.inc:179
-msgid "Font does not exist or is not readable."
-msgstr ""
-
-#: image_captcha/image_captcha.user.inc:28
-msgid "Generation of image CAPTCHA failed. Check your image CAPTCHA configuration and especially the used font."
-msgstr ""
-
-#: image_captcha/image_captcha.module:16
-msgid "The image CAPTCHA is a popular challenge where a random textual code is obfuscated in an image. The image is generated on the fly for each request, which is rather CPU intensive for the server. Be careful with the size and computation related settings."
-msgstr ""
-
-#: image_captcha/image_captcha.module:20
-msgid "<p>Example image, generated with the current settings:</p>!img"
-msgstr ""
-
-#: image_captcha/image_captcha.module:144
-msgid "What code is in the image?"
-msgstr ""
-
-#: image_captcha/image_captcha.module:145
-msgid "Copy the characters (respecting upper/lower case) from the image."
-msgstr ""
-
-#: image_captcha/image_captcha.module:91
-msgid "Encountered an illegal byte while splitting an utf8 string in characters."
-msgstr ""
-
-#: image_captcha/image_captcha.info:0
-msgid "Image CAPTCHA"
-msgstr ""
-
-#: image_captcha/image_captcha.info:0
-msgid "Provides an image based CAPTCHA."
-msgstr ""
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/uk-ua.po b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/uk-ua.po
deleted file mode 100644
index d1b40bb..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/uk-ua.po
+++ /dev/null
@@ -1,428 +0,0 @@
-# Ukrainian translation of CAPTCHA (all releases)
-# Copyright (c) 2009 by the Ukrainian translation team
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: CAPTCHA (all releases)\n"
-"POT-Creation-Date: 2009-10-08 19:53+0000\n"
-"PO-Revision-Date: 2009-10-08 22:54+0200\n"
-"Language-Team: Ukrainian\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=((((n%10)==1)&&((n%100)!=11))?(0):(((((n%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||((n%100)>=20)))?(1):2));\n"
-"Last-Translator: podarok <podarok at ua.fm>\n"
-"X-Poedit-Language: Ukrainian\n"
-"X-Poedit-Country: UKRAINE\n"
-"X-Poedit-SourceCharset: utf-8\n"
-
-msgid "Save configuration"
-msgstr "Запам'ятати конфігурацію"
-
-msgid "delete"
-msgstr "видалити"
-
-msgid "Delete"
-msgstr "Видалити"
-
-msgid "Submit"
-msgstr "Надіслати"
-
-msgid "Operations"
-msgstr "Дії"
-
-msgid "Disable"
-msgstr "Вимкнено"
-
-msgid "Math Question: What is %problem?"
-msgstr "Порахуйте: скільки буде %problem?"
-
-msgid "none"
-msgstr "нічого"
-
-msgid "General settings"
-msgstr "Загальні налаштування"
-
-msgid "Save"
-msgstr "Зберегти"
-
-msgid "Font"
-msgstr "Шрифт"
-
-msgid "Form ID"
-msgstr "Ідентифікатор форми"
-
-msgid "Example"
-msgstr "Приклад"
-
-msgid "Background color"
-msgstr "Колір тла"
-
-msgid "Text color"
-msgstr "Колір тексту"
-
-msgid "Unsupported database."
-msgstr "База даних не підтримується!"
-
-msgid "normal"
-msgstr "звичайний"
-
-msgid "second"
-msgstr "другий"
-
-msgid "Code length"
-msgstr "Довжина коду"
-
-msgid "Font size"
-msgstr "Розмір шрифта"
-
-msgid "Spam control"
-msgstr "КОнтроль спаму"
-
-msgid "The list of characters to use should not contain spaces."
-msgstr "Список символів не повинен містити пропусків"
-
-msgid "Math question"
-msgstr "Математичне завдання"
-
-msgid "Encountered an illegal byte while splitting an utf8 string in characters."
-msgstr "Трапився неправильний байт при розділенні utf8 строки в символи"
-
-msgid "For language %lang_name (code %lang_code)"
-msgstr "Для мови %lang_name ( код %lang_code )"
-
-msgid "first"
-msgstr "перший"
-
-msgid "third"
-msgstr "третій"
-
-msgid "fourth"
-msgstr "четвертий"
-
-msgid "fifth"
-msgstr "п'ятий"
-
-msgid "sixth"
-msgstr "шостий"
-
-msgid "seventh"
-msgstr "сьомий"
-
-msgid "eighth"
-msgstr "восьмий"
-
-msgid "ninth"
-msgstr "дев'ятий"
-
-msgid "tenth"
-msgstr "десятий"
-
-msgid "change"
-msgstr "зміна"
-
-msgid "disable"
-msgstr "вимкнути"
-
-msgid "low"
-msgstr "низько"
-
-msgid "medium"
-msgstr "середній"
-
-msgid "high"
-msgstr "високо"
-
-msgid "Display on separate page"
-msgstr "Показувати на окремій сторінці"
-
-msgid "Add CAPTCHA administration links to forms"
-msgstr "Додати CAPTCHA адміністративні посилання до форм"
-
-msgid "This option is very helpful to enable/disable challenges on forms. When enabled, users with the \"%admincaptcha\" permission will see CAPTCHA administration links on all forms (except on administrative pages, which shouldn't be accessible to untrusted users in the first place). These links make it possible to enable a challenge of the desired type or disable it."
-msgstr "Дана функциональність дуже корисна на перших порах налагодження вебсайтів. Коли увімкнена - користувачі з \"%admincaptcha\" доступом будуть бачити спеціальні посилання біля всіх форм, що дозволить швидко увімкнути-вимкнути капчу саме в потрібних місцях сайту."
-
-msgid "administer CAPTCHA settings"
-msgstr "керування параметрами CAPTCHA"
-
-msgid "Challenge type per form"
-msgstr "Типи в залежності від форм"
-
-msgid "Select the challenge type you want for each of the listed forms (identified by their so called <em>form_id</em>'s). You can easily add arbitrary forms with the help of the '%CAPTCHA_admin_links' option or the <a href=\"!add_captcha_point\">the CAPTCHA point form</a>."
-msgstr "Виберіть тип запитання, яке ви бажаєте відображати на перерахованих формах ( ідентифікатори - так звані <em>form_id</em> ). Ви можете легко і просто додати будь-які форми з допомогою '%CAPTCHA_admin_links' параметру або <a href=\"!add_captcha_point\">CAPTCHA point форми</a>."
-
-msgid "Challenge description"
-msgstr "Опис типу капчі"
-
-msgid "With this description you can explain the purpose of the challenge to the user."
-msgstr "Цей опис пояснюватиме користувачу вимогу виконання капчі."
-
-msgid "Persistence"
-msgstr "Стійкість"
-
-msgid "Always add a challenge."
-msgstr "Завжди вмикати капчу"
-
-msgid "Omit challenges for a form once the user has successfully responded to a challenge for that form."
-msgstr "Вмикати капчу для форми лише один раз до моменту правильної відповіді користувача."
-
-msgid "Omit challenges for all forms once the user has successfully responded to a challenge."
-msgstr "Вмикати капчу для всіх форм лише один раз до моменту правильної видповіді користувача"
-
-msgid "Define if challenges should be omitted during the rest of a session once the user successfully responses to a challenge."
-msgstr "Вказуєм чи потрібно вмикати капчу протягом подальшої сесії користувача після правильної відповіді одного разу"
-
-msgid "Log wrong responses"
-msgstr "Логувати неправильні відповіді"
-
-msgid "Report information about wrong responses to the !log."
-msgstr "Записувати інформацію про неправильні відповіді в !log"
-
-msgid "log"
-msgstr "лог"
-
-msgid "Challenge type (module)"
-msgstr "Тип капчі ( субмобуль )"
-
-msgid "The CAPTCHA settings were saved."
-msgstr "Параметри капчі було збережено"
-
-msgid "The Drupal form_id of the form to add the CAPTCHA to."
-msgstr "Ідентифікатор форми form_id Друпала, до якого застосувати капчу"
-
-msgid "Challenge type"
-msgstr "Тип капчі"
-
-msgid "The CAPTCHA type to use for this form"
-msgstr "Тип капчі, що використовувати до цієї форми"
-
-msgid "Illegal form_id"
-msgstr "Некоректний form_id"
-
-msgid "Saved CAPTCHA point settings."
-msgstr "Збережено параметри балів капчі"
-
-msgid "Are you sure you want to delete the CAPTCHA for form_id %form_id?"
-msgstr "Ви впевнені щодо видалення капчі для ідентифікатора форми form_id = %form_id ?"
-
-msgid "Are you sure you want to disable the CAPTCHA for form_id %form_id?"
-msgstr "Ви впевнені щодо вимкнення капчі для ідентифікатора форми form_id = %form_id ?"
-
-msgid "Deleted CAPTCHA for form %form_id."
-msgstr "Видалено капчу для форми %form_id."
-
-msgid "Disabled CAPTCHA for form %form_id."
-msgstr "Вимкнено капчу для форми %form_id."
-
-msgid "This page gives an overview of all available challenge types, generated with their current settings."
-msgstr "Ця сторінка надає опис всіх доступних типів капчі, згенерованих теперішніми параметрами."
-
-msgid "Challenge \"%challenge\" by module \"%module\""
-msgstr "Капча \"%challenge\" модуля \"%module\""
-
-msgid "10 more examples of this challenge."
-msgstr "Ще 10 прикладів даного типу капчі"
-
-msgid "\"CAPTCHA\" is an acronym for \"Completely Automated Public Turing test to tell Computers and Humans Apart\". It is typically a challenge-response test to determine whether the user is human. The CAPTCHA module is a tool to fight automated submission by malicious users (spamming) of for example comments forms, user registration forms, guestbook forms, etc. You can extend the desired forms with an additional challenge, which should be easy for a human to solve correctly, but hard enough to keep automated scripts and spam bots out."
-msgstr "CAPTCHA (англ. «completely automated public turing test to tell computers and humans apart» — повністю автоматизований публічний тест Тюринга для розрізнення комп'ютерів і людей) — торгова марка Університет Карнегі — Меллона, комп'ютерний тест, який використовується для того, щоб визначити, хто використовує систему — людина чи комп'ютер. Термін з'явився в 2000 році."
-
-msgid "Location of comment submission form"
-msgstr "Розміщення форми подання коментаря"
-
-msgid "CAPTCHA is a trademark of Carnegie Mellon University."
-msgstr "CAPTCHA is a trademark of Carnegie Mellon University."
-
-msgid "skip CAPTCHA"
-msgstr "обхід капчі"
-
-msgid "This question is for testing whether you are a human visitor and to prevent automated spam submissions."
-msgstr "Дайте відповідь на це запитання, щоб ми знали що ви людина, а не тупий робот )."
-
-msgid "CAPTCHA"
-msgstr "CAPTCHA"
-
-msgid "general CAPTCHA settings"
-msgstr "головні параметри капчі"
-
-msgid "Enabled challenge"
-msgstr "Ввімкнена капча"
-
-msgid "Place a CAPTCHA here for untrusted users."
-msgstr "Вставляти Капчу тут для недовірених користувачів"
-
-msgid "Invalid CAPTCHA token."
-msgstr "Неправильна Капча"
-
-msgid "The answer you entered for the CAPTCHA was not correct."
-msgstr "ВІдповідь, введена вами для Капчі - некоректна"
-
-msgid "Math Question"
-msgstr "Математичне завдання"
-
-msgid "Solve this simple math problem and enter the result. E.g. for 1+3, enter 4."
-msgstr "Розв'яжіть цю просту задачку і введіть відповідь. Наприклад, для 1+3 введіть 4."
-
-msgid "@x + @y = "
-msgstr "@x + @y = "
-
-msgid "Already @counter blocked form submissions"
-msgstr "Вже блоковано @counter некоректних відповідей на капчу"
-
-msgid "Administer how and where CAPTCHAs are used."
-msgstr "Керування використанням Капчі"
-
-msgid "Examples"
-msgstr "Приклади"
-
-msgid "CAPTCHA point adminstration"
-msgstr "Адміністрування балів капчі"
-
-msgid "Built-in font"
-msgstr "Вбудований шрифт"
-
-msgid "Code settings"
-msgstr "Параметри коду"
-
-msgid "Font settings"
-msgstr "Налаштування шрифтів"
-
-msgid "tiny"
-msgstr "дрібний"
-
-msgid "small"
-msgstr "малий"
-
-msgid "large"
-msgstr "великий"
-
-msgid "Character spacing"
-msgstr "Пропуски між символами"
-
-msgid "Color settings"
-msgstr "Параметри кольору"
-
-msgid "Additional variation of text color"
-msgstr "Додаткові варіанти кольорів тексту"
-
-msgid "moderate"
-msgstr "керувати"
-
-msgid "very high"
-msgstr "дуже високо"
-
-msgid "Distortion and noise"
-msgstr "Розмивання та шум"
-
-msgid "Distortion level"
-msgstr "Рівень розмивання"
-
-msgid "severe"
-msgstr "середньо"
-
-msgid "Set the degree of wave distortion in the image."
-msgstr "Встановити процент хвильового розмивання картинки"
-
-msgid "Smooth distortion"
-msgstr "М'яке розмивання"
-
-msgid "This option enables bilineair interpolation of the distortion which makes the image look smoother, but it is more CPU intensive."
-msgstr "Цей параметр вмикає білінійну інтерполяцію розмивання що робить картинку більш розмитою, але це створює більше навантаження на процесор!"
-
-msgid "Double vision"
-msgstr "Подвійне відображення"
-
-msgid "When enabled, characters appear twice in the image, overlayed onto each other."
-msgstr "Якщо увімкнено, символи малюються двічі на картинці, один над одним"
-
-msgid "Add salt and peper noise"
-msgstr "Додати шум \"сіль і перець\""
-
-msgid "This option adds randomly colored point noise."
-msgstr "Цей параметр додає випадкові кольорові точки шуму"
-
-msgid "Add line noise"
-msgstr "Додати лінійний шум"
-
-msgid "This option enables lines randomly drawn on top of the text code."
-msgstr "Цей параметр вмикає лінії, випадково намальовані поверх тексту"
-
-msgid "Noise level"
-msgstr "Рівень шуму"
-
-msgid "You need to select a font"
-msgstr "Вам потрібно обрати шрифт"
-
-msgid "Font does not exist or is not readable."
-msgstr "Шрифт недоступний або нечитаємий"
-
-msgid "Background color is not a valid hexadecimal color value."
-msgstr "Колір фону має неправильне шіснадцяткове значення"
-
-msgid "Text color is not a valid hexadecimal color value."
-msgstr "Колір тексту має неправильне шіснадцяткове значення"
-
-msgid "<p>Example image, generated with the current settings:</p>!img"
-msgstr "<p>Приклад картинки, згенерованої теперішнімі параметрами: </p> !img"
-
-msgid "Image CAPTCHA"
-msgstr "Фото Капча"
-
-msgid "What code is in the image?"
-msgstr "Які символи ви бачите на малюнку?"
-
-msgid "Copy the characters (respecting upper/lower case) from the image."
-msgstr "Впишіть символи із зображення ('а' та 'А' - це різні символи)."
-
-msgid "Provides an image based CAPTCHA."
-msgstr "Надає фото капчу"
-
-msgid "Kind of words to use in the phrase"
-msgstr "Тип слів для фрази"
-
-msgid "Generate nonsense random words."
-msgstr "Генерація беззмістовних випадкових слів"
-
-msgid "Use user defined words."
-msgstr "Використовувати слова, зазначені користувачем"
-
-msgid "User defined words"
-msgstr "Користувацькі слова"
-
-msgid "Enter a bunch of space separated words (at least @min)."
-msgstr "Введіть набір слів ( як мінімум @min )"
-
-msgid "Number of words in the phrase"
-msgstr "Кількість слів в фразі"
-
-msgid "You need to enter at least @min words if you want to use user defined words."
-msgstr "Вам потрібно ввести мінімум @min слів, якщо Ви хочете використовувати \"зазначені\" слова"
-
-msgid "Number of words in the phrase should be between 4 and 10."
-msgstr "КІлькість слів у фразі повинна бути між 4 та 10"
-
-msgid "In this challenge the visitor is asked for the n<sup>th</sup> word of a given phrase."
-msgstr "В даній капчі користувач зобов'язаний написати порядкове слово з цілої фрази"
-
-msgid "What is the @nth word in the phrase \"@words\"?"
-msgstr "Напишіть @nth слово в фразі \"@words\""
-
-msgid "Text CAPTCHA"
-msgstr "Текстова Капча"
-
-msgid "Provides a simple text based CAPTCHA."
-msgstr "Надає просту текстову капчу"
-
-msgid "File format"
-msgstr "Формат файлу"
-
-msgid "The GD library for PHP is missing or outdated. Please check the <a href=\"@url\">PHP image documentation</a> for information on how to correct this."
-msgstr "Бібліотека GD для PHP відсутня або застаріла. Будь-ласка, зверніться до <a href=\"@url\">документації по роботі PHP із зображеннями</a> щоб отримати інформацію по усуненню цієї помилки."
-
-msgid "CAPTCHA point administration"
-msgstr "керування CAPTCHA"
-
-msgid "JPEG"
-msgstr "JPEG"
-
-msgid "PNG"
-msgstr "PNG"
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/uk.po b/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/uk.po
deleted file mode 100644
index d1b40bb..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/captcha/translations/uk.po
+++ /dev/null
@@ -1,428 +0,0 @@
-# Ukrainian translation of CAPTCHA (all releases)
-# Copyright (c) 2009 by the Ukrainian translation team
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: CAPTCHA (all releases)\n"
-"POT-Creation-Date: 2009-10-08 19:53+0000\n"
-"PO-Revision-Date: 2009-10-08 22:54+0200\n"
-"Language-Team: Ukrainian\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=((((n%10)==1)&&((n%100)!=11))?(0):(((((n%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||((n%100)>=20)))?(1):2));\n"
-"Last-Translator: podarok <podarok at ua.fm>\n"
-"X-Poedit-Language: Ukrainian\n"
-"X-Poedit-Country: UKRAINE\n"
-"X-Poedit-SourceCharset: utf-8\n"
-
-msgid "Save configuration"
-msgstr "Запам'ятати конфігурацію"
-
-msgid "delete"
-msgstr "видалити"
-
-msgid "Delete"
-msgstr "Видалити"
-
-msgid "Submit"
-msgstr "Надіслати"
-
-msgid "Operations"
-msgstr "Дії"
-
-msgid "Disable"
-msgstr "Вимкнено"
-
-msgid "Math Question: What is %problem?"
-msgstr "Порахуйте: скільки буде %problem?"
-
-msgid "none"
-msgstr "нічого"
-
-msgid "General settings"
-msgstr "Загальні налаштування"
-
-msgid "Save"
-msgstr "Зберегти"
-
-msgid "Font"
-msgstr "Шрифт"
-
-msgid "Form ID"
-msgstr "Ідентифікатор форми"
-
-msgid "Example"
-msgstr "Приклад"
-
-msgid "Background color"
-msgstr "Колір тла"
-
-msgid "Text color"
-msgstr "Колір тексту"
-
-msgid "Unsupported database."
-msgstr "База даних не підтримується!"
-
-msgid "normal"
-msgstr "звичайний"
-
-msgid "second"
-msgstr "другий"
-
-msgid "Code length"
-msgstr "Довжина коду"
-
-msgid "Font size"
-msgstr "Розмір шрифта"
-
-msgid "Spam control"
-msgstr "КОнтроль спаму"
-
-msgid "The list of characters to use should not contain spaces."
-msgstr "Список символів не повинен містити пропусків"
-
-msgid "Math question"
-msgstr "Математичне завдання"
-
-msgid "Encountered an illegal byte while splitting an utf8 string in characters."
-msgstr "Трапився неправильний байт при розділенні utf8 строки в символи"
-
-msgid "For language %lang_name (code %lang_code)"
-msgstr "Для мови %lang_name ( код %lang_code )"
-
-msgid "first"
-msgstr "перший"
-
-msgid "third"
-msgstr "третій"
-
-msgid "fourth"
-msgstr "четвертий"
-
-msgid "fifth"
-msgstr "п'ятий"
-
-msgid "sixth"
-msgstr "шостий"
-
-msgid "seventh"
-msgstr "сьомий"
-
-msgid "eighth"
-msgstr "восьмий"
-
-msgid "ninth"
-msgstr "дев'ятий"
-
-msgid "tenth"
-msgstr "десятий"
-
-msgid "change"
-msgstr "зміна"
-
-msgid "disable"
-msgstr "вимкнути"
-
-msgid "low"
-msgstr "низько"
-
-msgid "medium"
-msgstr "середній"
-
-msgid "high"
-msgstr "високо"
-
-msgid "Display on separate page"
-msgstr "Показувати на окремій сторінці"
-
-msgid "Add CAPTCHA administration links to forms"
-msgstr "Додати CAPTCHA адміністративні посилання до форм"
-
-msgid "This option is very helpful to enable/disable challenges on forms. When enabled, users with the \"%admincaptcha\" permission will see CAPTCHA administration links on all forms (except on administrative pages, which shouldn't be accessible to untrusted users in the first place). These links make it possible to enable a challenge of the desired type or disable it."
-msgstr "Дана функциональність дуже корисна на перших порах налагодження вебсайтів. Коли увімкнена - користувачі з \"%admincaptcha\" доступом будуть бачити спеціальні посилання біля всіх форм, що дозволить швидко увімкнути-вимкнути капчу саме в потрібних місцях сайту."
-
-msgid "administer CAPTCHA settings"
-msgstr "керування параметрами CAPTCHA"
-
-msgid "Challenge type per form"
-msgstr "Типи в залежності від форм"
-
-msgid "Select the challenge type you want for each of the listed forms (identified by their so called <em>form_id</em>'s). You can easily add arbitrary forms with the help of the '%CAPTCHA_admin_links' option or the <a href=\"!add_captcha_point\">the CAPTCHA point form</a>."
-msgstr "Виберіть тип запитання, яке ви бажаєте відображати на перерахованих формах ( ідентифікатори - так звані <em>form_id</em> ). Ви можете легко і просто додати будь-які форми з допомогою '%CAPTCHA_admin_links' параметру або <a href=\"!add_captcha_point\">CAPTCHA point форми</a>."
-
-msgid "Challenge description"
-msgstr "Опис типу капчі"
-
-msgid "With this description you can explain the purpose of the challenge to the user."
-msgstr "Цей опис пояснюватиме користувачу вимогу виконання капчі."
-
-msgid "Persistence"
-msgstr "Стійкість"
-
-msgid "Always add a challenge."
-msgstr "Завжди вмикати капчу"
-
-msgid "Omit challenges for a form once the user has successfully responded to a challenge for that form."
-msgstr "Вмикати капчу для форми лише один раз до моменту правильної відповіді користувача."
-
-msgid "Omit challenges for all forms once the user has successfully responded to a challenge."
-msgstr "Вмикати капчу для всіх форм лише один раз до моменту правильної видповіді користувача"
-
-msgid "Define if challenges should be omitted during the rest of a session once the user successfully responses to a challenge."
-msgstr "Вказуєм чи потрібно вмикати капчу протягом подальшої сесії користувача після правильної відповіді одного разу"
-
-msgid "Log wrong responses"
-msgstr "Логувати неправильні відповіді"
-
-msgid "Report information about wrong responses to the !log."
-msgstr "Записувати інформацію про неправильні відповіді в !log"
-
-msgid "log"
-msgstr "лог"
-
-msgid "Challenge type (module)"
-msgstr "Тип капчі ( субмобуль )"
-
-msgid "The CAPTCHA settings were saved."
-msgstr "Параметри капчі було збережено"
-
-msgid "The Drupal form_id of the form to add the CAPTCHA to."
-msgstr "Ідентифікатор форми form_id Друпала, до якого застосувати капчу"
-
-msgid "Challenge type"
-msgstr "Тип капчі"
-
-msgid "The CAPTCHA type to use for this form"
-msgstr "Тип капчі, що використовувати до цієї форми"
-
-msgid "Illegal form_id"
-msgstr "Некоректний form_id"
-
-msgid "Saved CAPTCHA point settings."
-msgstr "Збережено параметри балів капчі"
-
-msgid "Are you sure you want to delete the CAPTCHA for form_id %form_id?"
-msgstr "Ви впевнені щодо видалення капчі для ідентифікатора форми form_id = %form_id ?"
-
-msgid "Are you sure you want to disable the CAPTCHA for form_id %form_id?"
-msgstr "Ви впевнені щодо вимкнення капчі для ідентифікатора форми form_id = %form_id ?"
-
-msgid "Deleted CAPTCHA for form %form_id."
-msgstr "Видалено капчу для форми %form_id."
-
-msgid "Disabled CAPTCHA for form %form_id."
-msgstr "Вимкнено капчу для форми %form_id."
-
-msgid "This page gives an overview of all available challenge types, generated with their current settings."
-msgstr "Ця сторінка надає опис всіх доступних типів капчі, згенерованих теперішніми параметрами."
-
-msgid "Challenge \"%challenge\" by module \"%module\""
-msgstr "Капча \"%challenge\" модуля \"%module\""
-
-msgid "10 more examples of this challenge."
-msgstr "Ще 10 прикладів даного типу капчі"
-
-msgid "\"CAPTCHA\" is an acronym for \"Completely Automated Public Turing test to tell Computers and Humans Apart\". It is typically a challenge-response test to determine whether the user is human. The CAPTCHA module is a tool to fight automated submission by malicious users (spamming) of for example comments forms, user registration forms, guestbook forms, etc. You can extend the desired forms with an additional challenge, which should be easy for a human to solve correctly, but hard enough to keep automated scripts and spam bots out."
-msgstr "CAPTCHA (англ. «completely automated public turing test to tell computers and humans apart» — повністю автоматизований публічний тест Тюринга для розрізнення комп'ютерів і людей) — торгова марка Університет Карнегі — Меллона, комп'ютерний тест, який використовується для того, щоб визначити, хто використовує систему — людина чи комп'ютер. Термін з'явився в 2000 році."
-
-msgid "Location of comment submission form"
-msgstr "Розміщення форми подання коментаря"
-
-msgid "CAPTCHA is a trademark of Carnegie Mellon University."
-msgstr "CAPTCHA is a trademark of Carnegie Mellon University."
-
-msgid "skip CAPTCHA"
-msgstr "обхід капчі"
-
-msgid "This question is for testing whether you are a human visitor and to prevent automated spam submissions."
-msgstr "Дайте відповідь на це запитання, щоб ми знали що ви людина, а не тупий робот )."
-
-msgid "CAPTCHA"
-msgstr "CAPTCHA"
-
-msgid "general CAPTCHA settings"
-msgstr "головні параметри капчі"
-
-msgid "Enabled challenge"
-msgstr "Ввімкнена капча"
-
-msgid "Place a CAPTCHA here for untrusted users."
-msgstr "Вставляти Капчу тут для недовірених користувачів"
-
-msgid "Invalid CAPTCHA token."
-msgstr "Неправильна Капча"
-
-msgid "The answer you entered for the CAPTCHA was not correct."
-msgstr "ВІдповідь, введена вами для Капчі - некоректна"
-
-msgid "Math Question"
-msgstr "Математичне завдання"
-
-msgid "Solve this simple math problem and enter the result. E.g. for 1+3, enter 4."
-msgstr "Розв'яжіть цю просту задачку і введіть відповідь. Наприклад, для 1+3 введіть 4."
-
-msgid "@x + @y = "
-msgstr "@x + @y = "
-
-msgid "Already @counter blocked form submissions"
-msgstr "Вже блоковано @counter некоректних відповідей на капчу"
-
-msgid "Administer how and where CAPTCHAs are used."
-msgstr "Керування використанням Капчі"
-
-msgid "Examples"
-msgstr "Приклади"
-
-msgid "CAPTCHA point adminstration"
-msgstr "Адміністрування балів капчі"
-
-msgid "Built-in font"
-msgstr "Вбудований шрифт"
-
-msgid "Code settings"
-msgstr "Параметри коду"
-
-msgid "Font settings"
-msgstr "Налаштування шрифтів"
-
-msgid "tiny"
-msgstr "дрібний"
-
-msgid "small"
-msgstr "малий"
-
-msgid "large"
-msgstr "великий"
-
-msgid "Character spacing"
-msgstr "Пропуски між символами"
-
-msgid "Color settings"
-msgstr "Параметри кольору"
-
-msgid "Additional variation of text color"
-msgstr "Додаткові варіанти кольорів тексту"
-
-msgid "moderate"
-msgstr "керувати"
-
-msgid "very high"
-msgstr "дуже високо"
-
-msgid "Distortion and noise"
-msgstr "Розмивання та шум"
-
-msgid "Distortion level"
-msgstr "Рівень розмивання"
-
-msgid "severe"
-msgstr "середньо"
-
-msgid "Set the degree of wave distortion in the image."
-msgstr "Встановити процент хвильового розмивання картинки"
-
-msgid "Smooth distortion"
-msgstr "М'яке розмивання"
-
-msgid "This option enables bilineair interpolation of the distortion which makes the image look smoother, but it is more CPU intensive."
-msgstr "Цей параметр вмикає білінійну інтерполяцію розмивання що робить картинку більш розмитою, але це створює більше навантаження на процесор!"
-
-msgid "Double vision"
-msgstr "Подвійне відображення"
-
-msgid "When enabled, characters appear twice in the image, overlayed onto each other."
-msgstr "Якщо увімкнено, символи малюються двічі на картинці, один над одним"
-
-msgid "Add salt and peper noise"
-msgstr "Додати шум \"сіль і перець\""
-
-msgid "This option adds randomly colored point noise."
-msgstr "Цей параметр додає випадкові кольорові точки шуму"
-
-msgid "Add line noise"
-msgstr "Додати лінійний шум"
-
-msgid "This option enables lines randomly drawn on top of the text code."
-msgstr "Цей параметр вмикає лінії, випадково намальовані поверх тексту"
-
-msgid "Noise level"
-msgstr "Рівень шуму"
-
-msgid "You need to select a font"
-msgstr "Вам потрібно обрати шрифт"
-
-msgid "Font does not exist or is not readable."
-msgstr "Шрифт недоступний або нечитаємий"
-
-msgid "Background color is not a valid hexadecimal color value."
-msgstr "Колір фону має неправильне шіснадцяткове значення"
-
-msgid "Text color is not a valid hexadecimal color value."
-msgstr "Колір тексту має неправильне шіснадцяткове значення"
-
-msgid "<p>Example image, generated with the current settings:</p>!img"
-msgstr "<p>Приклад картинки, згенерованої теперішнімі параметрами: </p> !img"
-
-msgid "Image CAPTCHA"
-msgstr "Фото Капча"
-
-msgid "What code is in the image?"
-msgstr "Які символи ви бачите на малюнку?"
-
-msgid "Copy the characters (respecting upper/lower case) from the image."
-msgstr "Впишіть символи із зображення ('а' та 'А' - це різні символи)."
-
-msgid "Provides an image based CAPTCHA."
-msgstr "Надає фото капчу"
-
-msgid "Kind of words to use in the phrase"
-msgstr "Тип слів для фрази"
-
-msgid "Generate nonsense random words."
-msgstr "Генерація беззмістовних випадкових слів"
-
-msgid "Use user defined words."
-msgstr "Використовувати слова, зазначені користувачем"
-
-msgid "User defined words"
-msgstr "Користувацькі слова"
-
-msgid "Enter a bunch of space separated words (at least @min)."
-msgstr "Введіть набір слів ( як мінімум @min )"
-
-msgid "Number of words in the phrase"
-msgstr "Кількість слів в фразі"
-
-msgid "You need to enter at least @min words if you want to use user defined words."
-msgstr "Вам потрібно ввести мінімум @min слів, якщо Ви хочете використовувати \"зазначені\" слова"
-
-msgid "Number of words in the phrase should be between 4 and 10."
-msgstr "КІлькість слів у фразі повинна бути між 4 та 10"
-
-msgid "In this challenge the visitor is asked for the n<sup>th</sup> word of a given phrase."
-msgstr "В даній капчі користувач зобов'язаний написати порядкове слово з цілої фрази"
-
-msgid "What is the @nth word in the phrase \"@words\"?"
-msgstr "Напишіть @nth слово в фразі \"@words\""
-
-msgid "Text CAPTCHA"
-msgstr "Текстова Капча"
-
-msgid "Provides a simple text based CAPTCHA."
-msgstr "Надає просту текстову капчу"
-
-msgid "File format"
-msgstr "Формат файлу"
-
-msgid "The GD library for PHP is missing or outdated. Please check the <a href=\"@url\">PHP image documentation</a> for information on how to correct this."
-msgstr "Бібліотека GD для PHP відсутня або застаріла. Будь-ласка, зверніться до <a href=\"@url\">документації по роботі PHP із зображеннями</a> щоб отримати інформацію по усуненню цієї помилки."
-
-msgid "CAPTCHA point administration"
-msgstr "керування CAPTCHA"
-
-msgid "JPEG"
-msgstr "JPEG"
-
-msgid "PNG"
-msgstr "PNG"
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/LICENSE.txt b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/README.txt b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/README.txt
index 0b1857e..921c0d3 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/README.txt
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/README.txt
@@ -12,7 +12,7 @@ INTRODUCTION
 
 Current Maintainer: Travis Carden <http://drupal.org/user/236758>
 
-Checklist API Provides a simple interface for modules to create fillable,
+Checklist API provides a simple interface for modules to create fillable,
 persistent checklists that track progress with completion times and users. See
 checklistapi_example.module for an example implementation.
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.admin.inc b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.admin.inc
index 041612a..382e566 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.admin.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.admin.inc
@@ -13,6 +13,7 @@
  * @ingroup forms
  */
 function checklistapi_report_form() {
+  // Define table header.
   $header = array(
     t('Checklist'),
     t('Progress'),
@@ -20,31 +21,36 @@ function checklistapi_report_form() {
     t('Last updated by'),
     t('Operations'),
   );
+
+  // Build table rows.
+  $rows = array();
   $definitions = checklistapi_get_checklist_info();
-  if (count($definitions)) {
-    $rows = array();
-    foreach ($definitions as $id => $definition) {
-      $checklist = checklistapi_checklist_load($id);
-      $row = array();
-      $row[] = array(
-        'data' => ($checklist->userHasAccess()) ? l($checklist->title, $checklist->path) : drupal_placeholder($checklist->title),
-        'title' => (!empty($checklist->description)) ? $checklist->description : '',
-      );
-      $row[] = t('@completed of @total (@percent%) complete', array(
-        '@completed' => $completed = (!empty($checklist->savedProgress['#completed_items'])) ? $checklist->savedProgress['#completed_items'] : 0,
-        '@total' => $checklist->totalItems,
-        '@percent' => round($completed / $checklist->totalItems * 100),
-      ));
-      $row[] = (!empty($checklist->savedProgress['#changed'])) ? format_date($checklist->savedProgress['#changed']) : t('n/a');
-      $row[] = (isset($checklist->savedProgress['#changed_by'])) ? theme('username', array('account' => user_load($checklist->savedProgress['#changed_by']))) : t('n/a');
-      $row[] = ($checklist->userHasAccess('edit') && $checklist->hasSavedProgress()) ? l(t('clear saved progress'), $checklist->path . '/clear', array(
-        'query' => array('destination' => 'admin/reports/checklistapi'),
-      )) : '';
-      $rows[] = $row;
-    }
-  }
-  else {
-    $rows[][] = array('data' => t('No checklists available.'), 'colspan' => 5);
+  foreach ($definitions as $id => $definition) {
+    $checklist = checklistapi_checklist_load($id);
+    $row = array();
+    $row[] = array(
+      'data' => ($checklist->userHasAccess()) ? l($checklist->title, $checklist->path) : drupal_placeholder($checklist->title),
+      'title' => (!empty($checklist->description)) ? $checklist->description : '',
+    );
+    $row[] = t('@completed of @total (@percent%)', array(
+      '@completed' => $checklist->getNumberCompleted(),
+      '@total' => $checklist->getNumberOfItems(),
+      '@percent' => round($checklist->getPercentComplete()),
+    ));
+    $row[] = $checklist->getLastUpdatedDate();
+    $row[] = $checklist->getLastUpdatedUser();
+    $row[] = ($checklist->userHasAccess('edit') && $checklist->hasSavedProgress()) ? l(t('clear saved progress'), $checklist->path . '/clear', array(
+      'query' => array('destination' => 'admin/reports/checklistapi'),
+    )) : '';
+    $rows[] = $row;
   }
-  return theme('table', array('header' => $header, 'rows' => $rows));
+
+  // Compile table.
+  $table = array(
+    'header' => $header,
+    'rows' => $rows,
+    'empty' => t('No checklists available.'),
+  );
+
+  return theme('table', $table);
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.api.php b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.api.php
index 93cd6a1..bc02a71 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.api.php
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.api.php
@@ -26,8 +26,9 @@
  *     corresponding menu item.
  *   - #help: (optional) User help to be displayed in the "System help" block
  *     via hook_help().
- *   - #menu_name: (optional) Set this to a custom menu if you don't want your
- *     item to be placed in Navigation.
+ *   - #menu_name: (optional) The machine name of a menu to place the checklist
+ *     into (e.g. "main-menu" or "navigation"). If this is omitted, Drupal will
+ *     try to infer the correct menu placement from the specified path.
  *   - #weight: (optional) A floating point number used to sort the list of
  *     checklists before being output. Lower numbers appear before higher
  *     numbers.
@@ -61,14 +62,6 @@
  *         - #path: The link path.
  *         - #options: (optional) An associative array of additional options
  *           used by the l() function.
- *         - #context: (optional) The context in which the link may appear. May
- *           be one of the following:
- *           - CHECKLISTAPI_LINK_CONTEXT_ANY: (default) The link will always
- *             appear.
- *           - CHECKLISTAPI_LINK_CONTEXT_ITEM_CHECKED: The link will appear if
- *             the item it belongs to has been previously checked.
- *           - CHECKLISTAPI_LINK_CONTEXT_ITEM_UNCHECKED: The link will appear if
- *             the item it belongs to has not been previously checked.
  *         - #weight: (optional) A floating point number used to sort the list
  *           of items before being output. Lower numbers appear before higher
  *           numbers.
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.css b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.css
index 4c7062d..b7cc6ea 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.css
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.css
@@ -9,3 +9,17 @@
 #checklistapi-checklist-form.compact-mode div.description p {
   display: none;
 }
+
+/**
+ * Progress bar.
+ *
+ * @see system.theme.css
+ */
+#checklistapi-checklist-form .progress {
+  font-weight: normal;
+  margin-bottom: 0.5em;
+}
+#checklistapi-checklist-form .progress .bar,
+#checklistapi-checklist-form .progress .filled {
+  background-image: none;
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.info b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.info
index 30ef9a8..4224d78 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.info
@@ -6,9 +6,9 @@ files[] = lib/Drupal/checklistapi/ChecklistapiChecklist.php
 files[] = tests/checklistapi.test
 configure = admin/reports/checklistapi
 
-; Information added by drupal.org packaging script on 2012-07-22
-version = "7.x-1.0-beta3"
+; Information added by  packaging script on 2013-11-11
+version = "7.x-1.1"
 core = "7.x"
 project = "checklistapi"
-datestamp = "1342935379"
+datestamp = "1384130305"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.install b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.install
new file mode 100644
index 0000000..a42f1b0
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.install
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the Checklist API module.
+ */
+
+/**
+ * Implements hook_uninstall().
+ */
+function checklistapi_uninstall() {
+  // Delete all Checklist API persistent variables.
+  db_delete('variable')
+    ->condition('name', db_like('checklistapi_') . '%', 'LIKE')
+    ->execute();
+  cache_clear_all('variables', 'cache_bootstrap');
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.js b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.js
index d40b105..c4c3707 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.js
@@ -1,31 +1,64 @@
 (function ($) {
-
   "use strict";
+
+  /**
+   * Provides the summary information for the checklist form vertical tabs.
+   */
   Drupal.behaviors.checklistapiFieldsetSummaries = {
     attach: function (context) {
-
-      // Vertical tabs summaries.
       $('#checklistapi-checklist-form .vertical-tabs-panes > fieldset', context).drupalSetSummary(function (context) {
         var total = $(':checkbox.checklistapi-item', context).size(), args = {};
         if (total) {
           args['@complete'] = $(':checkbox.checklistapi-item:checked', context).size();
           args['@total'] = total;
           args['@percent'] = Math.round(args['@complete'] / args['@total'] * 100);
-          return Drupal.t('@complete of @total (@percent%) complete', args);
+          return Drupal.t('@complete of @total (@percent%)', args);
         }
       });
+    }
+  };
 
-      // Compact mode link.
+  /**
+   * Adds dynamic item descriptions toggling.
+   */
+  Drupal.behaviors.checklistapiCompactModeLink = {
+    attach: function (context) {
       $('#checklistapi-checklist-form .compact-link a', context).click(function () {
+        $(this).closest('#checklistapi-checklist-form').toggleClass('compact-mode');
         var is_compact_mode = $(this).closest('#checklistapi-checklist-form').hasClass('compact-mode');
         $(this)
-          .text((is_compact_mode) ? Drupal.t('Hide descriptions') : Drupal.t('Show descriptions'))
-          .attr('title', (is_compact_mode) ? Drupal.t('Compress layout by hiding descriptions.') : Drupal.t('Expand layout to include descriptions.'))
-          .closest('#checklistapi-checklist-form').toggleClass('compact-mode');
-        document.cookie = 'Drupal.visitor.checklistapi_compact_mode=' + ((is_compact_mode) ? 0 : 1);
+          .text(is_compact_mode ? Drupal.t('Show item descriptions') : Drupal.t('Hide item descriptions'))
+          .attr('title', is_compact_mode ? Drupal.t('Expand layout to include item descriptions.') : Drupal.t('Compress layout by hiding item descriptions.'));
+        document.cookie = 'Drupal.visitor.checklistapi_compact_mode=' + (is_compact_mode ? 1 : 0);
         return false;
       });
+    }
+  };
 
+  /**
+   * Prompts the user if they try to leave the page with unsaved changes.
+   *
+   * Note: Auto-checked items are not considered unsaved changes for the purpose
+   * of this feature.
+   */
+  Drupal.behaviors.checklistapiPromptBeforeLeaving = {
+    getFormState: function () {
+      return $('#checklistapi-checklist-form :checkbox.checklistapi-item').serializeArray().toString();
+    },
+    attach: function () {
+      var beginningState = this.getFormState();
+      $(window).bind('beforeunload', function () {
+        var endingState = Drupal.behaviors.checklistapiPromptBeforeLeaving.getFormState();
+        if (beginningState !== endingState) {
+          return Drupal.t('Your changes will be lost if you leave the page without saving.');
+        }
+      });
+      $('#checklistapi-checklist-form').submit(function() {
+        $(window).unbind('beforeunload');
+      });
+      $('#checklistapi-checklist-form .clear-saved-progress').click(function() {
+        $(window).unbind('beforeunload');
+      });
     }
   };
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.module b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.module
index 3cdd752..c229177 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.module
@@ -9,47 +9,30 @@
  */
 
 /**
- * Link should always be shown.
- */
-define('CHECKLISTAPI_LINK_CONTEXT_ANY', 1);
-
-/**
- * Link should only be shown if the item it belongs to has been previously
- * checked.
- */
-define('CHECKLISTAPI_LINK_CONTEXT_ITEM_CHECKED', 2);
-
-/**
- * Link should only be shown if the item it belongs to has not been previously
- * checked.
- */
-define('CHECKLISTAPI_LINK_CONTEXT_ITEM_UNCHECKED', 3);
-
-/**
- * Access callback: Checks the current user's access to a checklist.
+ * Access callback: Checks the current user's access to a given checklist.
  *
  * @param string $id
  *   The checklist ID.
  * @param string $operation
- *   The operation to test access for. Possible values are "view", "edit", and
- *   "any". Defaults to "any".
+ *   (optional) The operation to test access for. Accepted values are "view",
+ *   "edit", and "any". Defaults to "any".
  *
  * @return bool
  *   Returns TRUE if the current user has access to perform a given operation on
  *   the specified checklist, or FALSE if not.
  */
 function checklistapi_checklist_access($id, $operation = 'any') {
-  $view_access = user_access('view any checklistapi checklist') || user_access('view ' . $id . ' checklistapi checklist');
-  $edit_access = user_access('edit any checklistapi checklist') || user_access('edit ' . $id . ' checklistapi checklist');
-  switch ($operation) {
-    case 'view':
-      return $view_access;
-    case 'edit':
-      return $edit_access;
-    case 'any':
-    default:
-      return $view_access || $edit_access;
+  $all_operations = array('view', 'edit', 'any');
+  if (!in_array($operation, $all_operations)) {
+    throw new Exception(t('No such operation "@operation"', array(
+      '@operation' => $operation,
+    )));
   }
+
+  $access['view'] = user_access('view any checklistapi checklist') || user_access('view ' . $id . ' checklistapi checklist');
+  $access['edit'] = user_access('edit any checklistapi checklist') || user_access('edit ' . $id . ' checklistapi checklist');
+  $access['any'] = $access['view'] || $access['edit'];
+  return $access[$operation];
 }
 
 /**
@@ -79,10 +62,13 @@ function checklistapi_checklist_load($id) {
 function checklistapi_get_checklist_info($id = NULL) {
   $definitions = &drupal_static(__FUNCTION__);
   if (!isset($definitions)) {
+    // Get definitions.
     $definitions = module_invoke_all('checklistapi_checklist_info');
     $definitions = checklistapi_sort_array($definitions);
+    // Let other modules alter them.
     drupal_alter('checklistapi_checklist_info', $definitions);
     $definitions = checklistapi_sort_array($definitions);
+    // Inject checklist IDs.
     foreach ($definitions as $key => $value) {
       $definitions[$key] = array('#id' => $key) + $definitions[$key];
     }
@@ -120,6 +106,7 @@ function checklistapi_init() {
  */
 function checklistapi_menu() {
   $items = array();
+
   // Checklists report.
   $items['admin/reports/checklistapi'] = array(
     'title' => 'Checklists',
@@ -128,43 +115,49 @@ function checklistapi_menu() {
     'description' => 'Get an overview of your installed checklists with progress details.',
     'file' => 'checklistapi.admin.inc',
   );
+
   // Individual checklists.
   foreach (checklistapi_get_checklist_info() as $id => $definition) {
-    if (!empty($definition['#path']) && !empty($definition['#title'])) {
-      // View/edit checklist.
-      $items[$definition['#path']] = array(
-        'title' => $definition['#title'],
-        'description' => (!empty($definition['#description'])) ? $definition['#description'] : '',
-        'page callback' => 'drupal_get_form',
-        'page arguments' => array('checklistapi_checklist_form', $id),
-        'access callback' => 'checklistapi_checklist_access',
-        'access arguments' => array($id),
-        'file' => 'checklistapi.pages.inc',
-      );
-      if (!empty($checklist['#menu_name'])) {
-        $items[$definition['#path']]['menu_name'] = $definition['#menu_name'];
-      }
-      // Clear saved progress.
-      $items[$definition['#path'] . '/clear'] = array(
-        'title' => 'Clear',
-        'page callback' => 'drupal_get_form',
-        'page arguments' => array('checklistapi_checklist_clear_confirm', $id),
-        'access callback' => 'checklistapi_checklist_access',
-        'access arguments' => array($id, 'edit'),
-        'file' => 'checklistapi.pages.inc',
-        'type' => MENU_CALLBACK,
-      );
-      // Toggle compact mode.
-      $items[$definition['#path'] . '/compact'] = array(
-        'title' => 'Compact mode',
-        'page callback' => 'checklistapi_compact_page',
-        'access callback' => 'checklistapi_checklist_access',
-        'access arguments' => array($id),
-        'file' => 'checklistapi.pages.inc',
-        'type' => MENU_CALLBACK,
-      );
+    if (empty($definition['#path']) || empty($definition['#title'])) {
+      continue;
+    }
+
+    // View/edit checklist.
+    $items[$definition['#path']] = array(
+      'title' => $definition['#title'],
+      'description' => (!empty($definition['#description'])) ? $definition['#description'] : '',
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('checklistapi_checklist_form', $id),
+      'access callback' => 'checklistapi_checklist_access',
+      'access arguments' => array($id),
+      'file' => 'checklistapi.pages.inc',
+    );
+    if (!empty($definition['#menu_name'])) {
+      $items[$definition['#path']]['menu_name'] = $definition['#menu_name'];
     }
+
+    // Clear saved progress.
+    $items[$definition['#path'] . '/clear'] = array(
+      'title' => 'Clear',
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('checklistapi_checklist_clear_confirm', $id),
+      'access callback' => 'checklistapi_checklist_access',
+      'access arguments' => array($id, 'edit'),
+      'file' => 'checklistapi.pages.inc',
+      'type' => MENU_CALLBACK,
+    );
+
+    // Toggle compact mode.
+    $items[$definition['#path'] . '/compact'] = array(
+      'title' => 'Compact mode',
+      'page callback' => 'checklistapi_compact_page',
+      'access callback' => 'checklistapi_checklist_access',
+      'access arguments' => array($id),
+      'file' => 'checklistapi.pages.inc',
+      'type' => MENU_CALLBACK,
+    );
   }
+
   return $items;
 }
 
@@ -173,6 +166,7 @@ function checklistapi_menu() {
  */
 function checklistapi_permission() {
   $perms = array();
+
   // Universal permissions.
   $perms['view checklistapi checklists report'] = array(
     'title' => t(
@@ -188,25 +182,28 @@ function checklistapi_permission() {
     'title' => t('Edit any checklist'),
     'description' => $edit_checklist_perm_description = t('Check and uncheck list items and save changes, or clear saved progress.'),
   );
+
   // Per checklist permissions.
   foreach (checklistapi_get_checklist_info() as $id => $definition) {
-    if (!empty($id)) {
-      $perms['view ' . $id . ' checklistapi checklist'] = array(
-        'title' => t(
-          'View the !name checklist',
-          array('!name' => (checklistapi_checklist_access($id)) ? l($definition['#title'], $definition['#path']) : drupal_placeholder($definition['#title']))
-        ),
-        'description' => $view_checklist_perm_description,
-      );
-      $perms['edit ' . $id . ' checklistapi checklist'] = array(
-        'title' => t(
-          'Edit the !name checklist',
-          array('!name' => (checklistapi_checklist_access($id)) ? l($definition['#title'], $definition['#path']) : drupal_placeholder($definition['#title']))
-        ),
-        'description' => $edit_checklist_perm_description,
-      );
+    if (empty($id)) {
+      continue;
     }
+    $perms['view ' . $id . ' checklistapi checklist'] = array(
+      'title' => t(
+        'View the !name checklist',
+        array('!name' => (checklistapi_checklist_access($id)) ? l($definition['#title'], $definition['#path']) : drupal_placeholder($definition['#title']))
+      ),
+      'description' => $view_checklist_perm_description,
+    );
+    $perms['edit ' . $id . ' checklistapi checklist'] = array(
+      'title' => t(
+        'Edit the !name checklist',
+        array('!name' => (checklistapi_checklist_access($id)) ? l($definition['#title'], $definition['#path']) : drupal_placeholder($definition['#title']))
+      ),
+      'description' => $edit_checklist_perm_description,
+    );
   }
+
   return $perms;
 }
 
@@ -224,33 +221,38 @@ function checklistapi_permission() {
  */
 function checklistapi_sort_array(array $array) {
   $child_keys = element_children($array);
-  if (count($child_keys)) {
-    $incrementer = 0;
-    $children = array();
-    foreach ($child_keys as $key) {
-      // Move child to a temporary array for sorting.
-      $children[$key] = $array[$key];
-      unset($array[$key]);
-      // Supply a default weight if missing or invalid.
-      if (empty($children[$key]['#weight']) || !is_numeric($children[$key]['#weight'])) {
-        $children[$key]['#weight'] = 0;
-      }
-      // Increase each weight incrementally to preserve the original order when
-      // not overridden. This accounts for undefined behavior in PHP's uasort()
-      // function when its comparison callback finds two values equal.
-      $children[$key]['#weight'] += ($incrementer++ / 1000);
-      // Descend into child.
-      $children[$key] = checklistapi_sort_array($children[$key]);
-    }
-    // Sort by weight.
-    uasort($children, 'element_sort');
-    // Remove incremental weight hack.
-    foreach ($children as $key => $child) {
-      $children[$key]['#weight'] = floor($children[$key]['#weight']);
+
+  if (!count($child_keys)) {
+    // No children to sort.
+    return $array;
+  }
+
+  $incrementer = 0;
+  $children = array();
+  foreach ($child_keys as $key) {
+    // Move child to a temporary array for sorting.
+    $children[$key] = $array[$key];
+    unset($array[$key]);
+    // Supply a default weight if missing or invalid.
+    if (empty($children[$key]['#weight']) || !is_numeric($children[$key]['#weight'])) {
+      $children[$key]['#weight'] = 0;
     }
-    // Put children back in the main array.
-    $array += $children;
+    // Increase each weight incrementally to preserve the original order when
+    // not overridden. This accounts for undefined behavior in PHP's uasort()
+    // function when its comparison callback finds two values equal.
+    $children[$key]['#weight'] += ($incrementer++ / 1000);
+    // Descend into child.
+    $children[$key] = checklistapi_sort_array($children[$key]);
   }
+  // Sort by weight.
+  uasort($children, 'element_sort');
+  // Remove incremental weight hack.
+  foreach ($children as $key => $child) {
+    $children[$key]['#weight'] = floor($children[$key]['#weight']);
+  }
+  // Put children back in the main array.
+  $array += $children;
+
   return $array;
 }
 
@@ -279,8 +281,17 @@ function checklistapi_strtolowercamel($string) {
 function checklistapi_theme() {
   return array(
     'checklistapi_compact_link' => array(
-      'variables' => array('id' => NULL),
       'file' => 'checklistapi.pages.inc',
     ),
+    'checklistapi_progress_bar' => array(
+      'path' => drupal_get_path('module', 'checklistapi') . '/templates',
+      'template' => 'checklistapi-progress-bar',
+      'variables' => array(
+        'message' => ' ',
+        'number_complete' => 0,
+        'number_of_items' => 0,
+        'percent_complete' => 0,
+      ),
+    ),
   );
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.pages.inc b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.pages.inc
index dd82ec9..9b832f3 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.pages.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi.pages.inc
@@ -18,25 +18,25 @@
 function checklistapi_checklist_clear_confirm($form, &$form_state, $id) {
   $checklist = checklistapi_checklist_load($id);
   $form['#checklist'] = $checklist;
-  return confirm_form(
-    $form,
-    t('Are you sure you want to clear %title saved progress?', array(
-      '%title' => $checklist->title,
-    )),
-    $checklist->path,
-    t('All progress details will be erased. This action cannot be undone.'),
-    t('Clear'),
-    t('Cancel')
-  );
+  $question = t('Are you sure you want to clear %title saved progress?', array(
+    '%title' => $checklist->title,
+  ));
+  $description = t('All progress details will be erased. This action cannot be undone.');
+  $yes = t('Clear');
+  $no = t('Cancel');
+  return confirm_form($form, $question, $checklist->path, $description, $yes, $no);
 }
 
 /**
  * Form submission handler for checklistapi_checklist_clear_confirm().
  */
 function checklistapi_checklist_clear_confirm_submit($form, &$form_state) {
+  // If user confirmed, clear saved progress.
   if ($form_state['values']['confirm']) {
     $form['#checklist']->clearSavedProgress();
   }
+
+  // Redirect back to checklist.
   $form_state['redirect'] = $form['#checklist']->path;
 }
 
@@ -53,12 +53,26 @@ function checklistapi_checklist_clear_confirm_submit($form, &$form_state) {
  */
 function checklistapi_checklist_form($form, &$form_state, $id) {
   $form['#checklist'] = $checklist = checklistapi_checklist_load($id);
+
+  $form['progress_bar'] = array(
+    '#type' => 'markup',
+    '#markup' => theme('checklistapi_progress_bar', array(
+      'message' => ($checklist->hasSavedProgress()) ? t('Last updated @date by !user', array(
+        '@date' => $checklist->getLastUpdatedDate(),
+        '!user' => $checklist->getLastUpdatedUser(),
+      )) : ' ',
+      'number_complete' => $checklist->getNumberCompleted(),
+      'number_of_items' => $checklist->getNumberOfItems(),
+      'percent_complete' => round($checklist->getPercentComplete()),
+    )),
+  );
   if (checklistapi_compact_mode()) {
     $form['#attributes']['class'] = array('compact-mode');
   }
   $form['compact_mode_link'] = array(
     '#markup' => theme('checklistapi_compact_link'),
   );
+
   $form['checklistapi'] = array(
     '#attached' => array(
       'css' => array(drupal_get_path('module', 'checklistapi') . '/checklistapi.css'),
@@ -67,6 +81,7 @@ function checklistapi_checklist_form($form, &$form_state, $id) {
     '#tree' => TRUE,
     '#type' => 'vertical_tabs',
   );
+
   // Loop through groups.
   $num_autochecked_items = 0;
   $groups = $checklist->items;
@@ -79,6 +94,7 @@ function checklistapi_checklist_form($form, &$form_state, $id) {
     if (!empty($group['#description'])) {
       $form['checklistapi'][$group_key]['#description'] = filter_xss_admin($group['#description']);
     }
+
     // Loop through items.
     foreach (element_children($group) as $item_key) {
       $item = &$group[$item_key];
@@ -112,21 +128,8 @@ function checklistapi_checklist_form($form, &$form_state, $id) {
       $links = array();
       foreach (element_children($item) as $link_key) {
         $link = &$item[$link_key];
-        $context = (!empty($link['#context'])) ? $link['#context'] : CHECKLISTAPI_LINK_CONTEXT_ANY;
-        $show_link = FALSE;
-        if ($context == CHECKLISTAPI_LINK_CONTEXT_ANY) {
-          $show_link = TRUE;
-        }
-        elseif ($saved_item && $context == CHECKLISTAPI_LINK_CONTEXT_ITEM_CHECKED) {
-          $show_link = TRUE;
-        }
-        elseif (!$saved_item && $context == CHECKLISTAPI_LINK_CONTEXT_ITEM_UNCHECKED) {
-          $show_link = TRUE;
-        }
-        if ($show_link) {
-          $options = (!empty($link['#options']) && is_array($link['#options'])) ? $link['#options'] : array();
-          $links[] = l($link['#text'], $link['#path'], $options);
-        }
+        $options = (!empty($link['#options']) && is_array($link['#options'])) ? $link['#options'] : array();
+        $links[] = l($link['#text'], $link['#path'], $options);
       }
       if (count($links)) {
         $description .= '<div class="links">' . implode(' | ', $links) . '</div>';
@@ -142,6 +145,7 @@ function checklistapi_checklist_form($form, &$form_state, $id) {
       );
     }
   }
+
   $form['actions'] = array(
     '#access' => $user_has_edit_access,
     '#type' => 'actions',
@@ -153,6 +157,7 @@ function checklistapi_checklist_form($form, &$form_state, $id) {
     ),
     'clear' => array(
       '#access' => $checklist->hasSavedProgress(),
+      '#attributes' => array('class' => array('clear-saved-progress')),
       '#href' => $checklist->path . '/clear',
       '#title' => t('Clear saved progress'),
       '#type' => 'link',
@@ -163,17 +168,16 @@ function checklistapi_checklist_form($form, &$form_state, $id) {
   // to prevent it from reappearing after saving the form. (Testing the request
   // method may not be the "correct" way to accomplish this.)
   if ($num_autochecked_items && $_SERVER['REQUEST_METHOD'] == 'GET') {
-    drupal_set_message(t(
-      format_plural(
-        $num_autochecked_items,
-        '%checklist found 1 unchecked item that was already completed and checked it for you. Save the form to record the change.',
-        '%checklist found @num unchecked items that were already completed and checked them for you. Save the form to record the changes.'
-      ),
-      array(
-        '%checklist' => $checklist->title,
-        '@num' => $num_autochecked_items,
-      )
-    ), 'status');
+    $args = array(
+      '%checklist' => $checklist->title,
+      '@num' => $num_autochecked_items,
+    );
+    $message = format_plural(
+      $num_autochecked_items,
+      t('%checklist found 1 unchecked item that was already completed and checked it for you. Save the form to record the change.', $args),
+      t('%checklist found @num unchecked items that were already completed and checked them for you. Save the form to record the changes.', $args)
+    );
+    drupal_set_message($message, 'status');
   }
 
   return $form;
@@ -200,7 +204,7 @@ function checklistapi_checklist_form_submit($form, &$form_state) {
  * can be set in the settings.php file.
  *
  * @return bool
- *   TRUE when in compact mode, FALSE when in expanded mode.
+ *   TRUE when in compact mode, or FALSE when in expanded mode.
  */
 function checklistapi_compact_mode() {
   return isset($_COOKIE['Drupal_visitor_checklistapi_compact_mode']) ? $_COOKIE['Drupal_visitor_checklistapi_compact_mode'] : variable_get('checklistapi_compact_mode', FALSE);
@@ -210,7 +214,8 @@ function checklistapi_compact_mode() {
  * Menu callback: Sets whether the admin menu is in compact mode or not.
  *
  * @param string $mode
- *   Valid values are 'on' and 'off'.
+ *   (optional) The mode to set compact mode to. Accepted values are "on" and
+ *   "off". Defaults to "off".
  */
 function checklistapi_compact_page($mode = 'off') {
   user_cookie_save(array('checklistapi_compact_mode' => ($mode == 'on')));
@@ -226,11 +231,11 @@ function theme_checklistapi_compact_link() {
   $output = '<div class="compact-link">';
   if (checklistapi_compact_mode()) {
     $output .= l(
-      t('Show descriptions'),
-      request_path() . '/compact/off',
+      t('Show item descriptions'),
+      current_path() . '/compact/off',
       array(
         'attributes' => array(
-          'title' => t('Expand layout to include descriptions.'),
+          'title' => t('Expand layout to include item descriptions.'),
         ),
         'query' => drupal_get_destination(),
       )
@@ -238,11 +243,11 @@ function theme_checklistapi_compact_link() {
   }
   else {
     $output .= l(
-      t('Hide descriptions'),
-      request_path() . '/compact/on',
+      t('Hide item descriptions'),
+      current_path() . '/compact/on',
       array(
         'attributes' => array(
-          'title' => t('Compress layout by hiding descriptions.'),
+          'title' => t('Compress layout by hiding item descriptions.'),
         ),
         'query' => drupal_get_destination(),
       )
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi_example/checklistapi_example.info b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi_example/checklistapi_example.info
index ad9f7ed..fe5e057 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi_example/checklistapi_example.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/checklistapi_example/checklistapi_example.info
@@ -5,9 +5,9 @@ package = Example modules
 dependencies[] = checklistapi
 configure = admin/config/development/checklistapi-example
 
-; Information added by drupal.org packaging script on 2012-07-22
-version = "7.x-1.0-beta3"
+; Information added by  packaging script on 2013-11-11
+version = "7.x-1.1"
 core = "7.x"
 project = "checklistapi"
-datestamp = "1342935379"
+datestamp = "1384130305"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/lib/Drupal/checklistapi/ChecklistapiChecklist.php b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/lib/Drupal/checklistapi/ChecklistapiChecklist.php
index 2903c72..6a06b33 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/lib/Drupal/checklistapi/ChecklistapiChecklist.php
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/lib/Drupal/checklistapi/ChecklistapiChecklist.php
@@ -64,7 +64,7 @@ class ChecklistapiChecklist {
    *
    * @var int
    */
-  public $totalItems = 0;
+  public $numberOfItems = 0;
 
   /**
    * The checklist groups and items.
@@ -88,7 +88,7 @@ class ChecklistapiChecklist {
    */
   public function __construct(array $definition) {
     foreach (element_children($definition) as $group_key) {
-      $this->totalItems += count(element_children($definition[$group_key]));
+      $this->numberOfItems += count(element_children($definition[$group_key]));
       $this->items[$group_key] = $definition[$group_key];
       unset($definition[$group_key]);
     }
@@ -100,6 +100,67 @@ class ChecklistapiChecklist {
   }
 
   /**
+   * Gets the total number of completed items.
+   *
+   * @return int
+   *   The number of completed items.
+   */
+  public function getNumberCompleted() {
+    return (!empty($this->savedProgress['#completed_items'])) ? $this->savedProgress['#completed_items'] : 0;
+  }
+
+  /**
+   * Gets the total number of items.
+   *
+   * @return int
+   *   The number of items.
+   */
+  public function getNumberOfItems() {
+    return $this->numberOfItems;
+  }
+
+  /**
+   * Gets the name of the last user to update the checklist.
+   *
+   * @return string
+   *   The themed name of the last user to update the checklist, or 'n/a' if
+   *   there is no record of such a user.
+   */
+  public function getLastUpdatedUser() {
+    if (isset($this->savedProgress['#changed_by'])) {
+      $last_updated_user = user_load($this->savedProgress['#changed_by']);
+      return theme('username', array('account' => $last_updated_user));
+    }
+    else {
+      return t('n/a');
+    }
+  }
+
+  /**
+   * Gets the last updated date.
+   *
+   * @return string
+   *   The last updated date formatted with format_date(), or 'n/a' if there is
+   *   no saved progress.
+   */
+  public function getLastUpdatedDate() {
+    return (!empty($this->savedProgress['#changed'])) ? format_date($this->savedProgress['#changed']) : t('n/a');
+  }
+
+  /**
+   * Gets the percentage of items complete.
+   *
+   * @return float
+   *   The percent complete.
+   */
+  public function getPercentComplete() {
+    if ($this->getNumberOfItems() == 0) {
+      return 100;
+    }
+    return ($this->getNumberCompleted() / $this->getNumberOfItems()) * 100;
+  }
+
+  /**
    * Clears the saved progress for the checklist.
    *
    * Deletes the Drupal variable containing the checklist's saved progress.
@@ -118,7 +179,7 @@ class ChecklistapiChecklist {
    *   The Drupal variable name.
    */
   public function getSavedProgressVariableName() {
-    return 'checklistapi_checklist_' . $this->id;
+    return "checklistapi_checklist_{$this->id}";
   }
 
   /**
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/templates/checklistapi-progress-bar.tpl.php b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/templates/checklistapi-progress-bar.tpl.php
new file mode 100644
index 0000000..383dbf8
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/templates/checklistapi-progress-bar.tpl.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation for the Checklist API progress bar.
+ *
+ * Available variables:
+ * - $message: The progress message.
+ * - $number_complete: The number of items complete.
+ * - $number_of_items: The total number of items.
+ * - $percent_complete: The percent of items complete.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_checklistapi_progress_bar()
+ * @see template_process()
+ */
+?>
+<div class="progress">
+  <div class="bar"><div class="filled" style="width:<?php print $percent_complete; ?>%;"></div></div>
+  <div class="percentage"><?php print $number_complete; ?> of <?php print $number_of_items; ?> (<?php print $percent_complete; ?>%)</div>
+  <div class="message"><?php print $message; ?></div>
+</div>
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/tests/checklistapi.test b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/tests/checklistapi.test
index 816216d..d96c3f1 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/tests/checklistapi.test
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/tests/checklistapi.test
@@ -11,7 +11,7 @@
 class ChecklistapiUnitTestCase extends DrupalUnitTestCase {
 
   /**
-   * Overrides DrupalUnitTestCase::getInfo().
+   * {@inheritdoc}
    */
   public static function getInfo() {
     return array(
@@ -22,7 +22,7 @@ class ChecklistapiUnitTestCase extends DrupalUnitTestCase {
   }
 
   /**
-   * Overrides DrupalUnitTestCase::setUp().
+   * {@inheritdoc}
    */
   public function setUp() {
     drupal_load('module', 'checklistapi');
@@ -34,7 +34,8 @@ class ChecklistapiUnitTestCase extends DrupalUnitTestCase {
    * Test checklistapi_sort_array().
    */
   public function testChecklistapiSortArray() {
-    $input = array_pop(checklistapi_test_checklistapi_checklist_info());
+    $checklistapi_test_definition = checklistapi_test_checklistapi_checklist_info();
+    $input = array_pop($checklistapi_test_definition);
     $output = checklistapi_sort_array($input);
     $this->assertEqual($output['group_two']['#weight'], 0, 'Supplied a default for omitted element weight.');
     $this->assertEqual($output['group_three']['#weight'], 0, 'Supplied a default in place of invalid element weight.');
@@ -71,7 +72,7 @@ class ChecklistapiWebTestCase extends DrupalWebTestCase {
   protected $privilegedUser;
 
   /**
-   * Overrides DrupalWebTestCase::getInfo().
+   * {@inheritdoc}
    */
   public static function getInfo() {
     return array(
@@ -82,7 +83,7 @@ class ChecklistapiWebTestCase extends DrupalWebTestCase {
   }
 
   /**
-   * Overrides DrupalWebTestCase::setUp().
+   * {@inheritdoc}
    */
   public function setUp() {
     parent::setUp('checklistapi_example');
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/tests/modules/checklistapi_test/checklistapi_test.info b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/tests/modules/checklistapi_test/checklistapi_test.info
index fba8b9c..13a6848 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/tests/modules/checklistapi_test/checklistapi_test.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/checklistapi/tests/modules/checklistapi_test/checklistapi_test.info
@@ -6,9 +6,9 @@ core = 7.x
 dependencies[] = checklistapi
 hidden = TRUE
 
-; Information added by drupal.org packaging script on 2012-07-22
-version = "7.x-1.0-beta3"
+; Information added by  packaging script on 2013-11-11
+version = "7.x-1.1"
 core = "7.x"
 project = "checklistapi"
-datestamp = "1342935379"
+datestamp = "1384130305"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/CHANGELOG.txt b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/CHANGELOG.txt
index 0e72a24..d47e6ea 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/CHANGELOG.txt
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/CHANGELOG.txt
@@ -1,3 +1,23 @@
+2013-04-12
+New stable release 7.x-1.13
+
+Bug fixes:
+
+[#1063482] by nod_, wwalc, roderik, helior, hadsie: Use Libraries API for CKEditor
+[#1898294] by kscheirer: Fatal error if Libraries module is enabled after CKEditor
+[#1961596] by jcisio: Added 'feature_source()' option so that ckeditor_profile() component is visible in drush.
+[#1356026] by Volx, hctom: Fixed Profile loses text formats when exported into a feature using Drush.
+[#1895278] by wwalc WYSIWYG editor should allow Drupal to trigger 'formUpdated' event
+[#1957066] by rudiedirkx: Use field_extra_fields to be able to position the "Rich text editor settings" fieldset
+[#1959754] by wwalc: CKFinder is not installed correctly - improve information in the status report
+[#1810910] by mokaspar, jcisio, DeFr: Fixed Comments gets filtered out by ckeditor_filter_xss().
+[#1909318] by Simon Georges: Useless file inclusion in ckeditor.info.
+[#1603014] by anou, SebCorbin: Corrected strings used in Security section.
+[#1889010] by michal_cksource: Problem with CKFinder files upload when private download method is used
+[#1885950] by michal_cksource: Fix HTML validation for iframe in profile configuration
+[#1885938] by michal_cksource: Disable div based editor on default
+[#1872064] by dczepierga: Undefined index: loadPlugins in ckeditor_modules_disabled() and ckeditor_modules_uninstalled()
+
 2012-12-22
 New stable release 7.x-1.12
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.api.php b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.api.php
index 447cea0..b9b91d6 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.api.php
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.api.php
@@ -2,7 +2,7 @@
 
 /**
  * CKEditor - The text editor for the Internet - http://ckeditor.com
- * Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  *
  * == BEGIN LICENSE ==
  *
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.config.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.config.js
index ef4c43d..01def49 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.config.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.config.js
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.info b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.info
index a5bf444..76f725f 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.info
@@ -3,10 +3,10 @@ description = "Enables CKEditor (WYSIWYG HTML editor) for use instead of plain t
 core        = 7.x
 package     = User interface
 configure   = admin/config/content/ckeditor
-files[]     = includes/ckeditor.user.inc
-; Information added by drupal.org packaging script on 2012-12-22
-version = "7.x-1.12"
+
+; Information added by drupal.org packaging script on 2013-04-12
+version = "7.x-1.13"
 core = "7.x"
 project = "ckeditor"
-datestamp = "1356180966"
+datestamp = "1365759619"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.install b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.install
index b35281d..1a6eadb 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.install
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.install
@@ -300,9 +300,10 @@ function _ckeditor_requirements_ckfinder_config_check($profile_name) {
   $config_path = ckfinder_path('local') . '/config.php';
 
   if (!file_exists($config_path)) {
-    return t('!ckfinder is not installed correctly: <code>!config</code> not found. Make sure that you uploaded all files and did not accidentally remove the configuration file.', array(
+    return t('!ckfinder is not installed correctly: <code>!config</code> not found. Make sure that you uploaded all files and did not accidentally remove the configuration file. If you installed CKFinder in other location (e.g. in the libraries folder), make sure to update the path to CKFinder in !global.', array(
           '!config' => $config_path,
-          '!ckfinder' => '<a href="http://ckfinder.com">CKFinder</a>'
+          '!ckfinder' => '<a href="http://cksource.com/ckfinder">CKFinder</a>',
+          '!global' => l(t('CKEditor Global Profile'), 'admin/config/content/ckeditor/editg')
         ));
   }
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.module b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.module
index ab868ee..809b201 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.module
@@ -2,7 +2,7 @@
 
 /**
  * CKEditor - The text editor for the Internet - http://ckeditor.com
- * Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  *
  * == BEGIN LICENSE ==
  *
@@ -299,7 +299,7 @@ function ckeditor_pre_render_text_format($element) {
 /**
  * Load all profiles. Just load one profile if $name is passed in.
  */
-function ckeditor_profile_load($name = '', $clear = FALSE) {
+function ckeditor_profile_load($name = '', $clear = FALSE, $check_access = TRUE) {
   static $profiles = array();
   global $user;
 
@@ -311,7 +311,12 @@ function ckeditor_profile_load($name = '', $clear = FALSE) {
 
       $profiles[$data->name] = $data;
     }
-    $input_formats = filter_formats($user);
+    if ($check_access === FALSE) {
+      // don't check if user has access to filter formats, needed for exporting as feature with drush
+      $input_formats = filter_formats();
+    } else {
+      $input_formats = filter_formats($user);
+    }
     $result = db_select('ckeditor_input_format', 'f')->fields('f')->execute();
     foreach ($result as $data) {
       if (isset($input_formats[$data->format])) {
@@ -361,14 +366,22 @@ function ckeditor_module_path($mode = 'relative') {
  *   Path of library in the Drupal installation.
  */
 function ckeditor_library_path($mode = 'relative') {
+  $lib_path = 'sites/all/libraries';
+
+  if (function_exists('libraries_get_path')) {
+    $path = libraries_get_path('ckeditor');
+    if ($path !== FALSE) {
+      $lib_path = drupal_substr($path, 0, strlen($path) - 9);
+    }
+  }
   switch ($mode) {
     default:
     case 'relative':
-      return ckeditor_base_path('relative') . '/sites/all/libraries';
+      return ckeditor_base_path('relative') . '/' . $lib_path;
     case 'local':
-      return ckeditor_base_path('local') . '/sites/all/libraries';
+      return ckeditor_base_path('local') . '/' . $lib_path;
     case 'url':
-      return 'sites/all/libraries';
+      return $lib_path;
   }
 }
 
@@ -545,6 +558,7 @@ function ckeditor_features_api() {
   return array(
     'ckeditor_profile' => array(
       'name' => t('CKEditor profiles'),
+      'feature_source' => TRUE,
       'default_hook' => 'ckeditor_profile_defaults',
       'default_file' => FEATURES_DEFAULTS_INCLUDED,
       'file' => drupal_get_path('module', 'ckeditor') . '/includes/ckeditor.features.inc',
@@ -603,6 +617,10 @@ function ckeditor_file_download($uri) {
  */
 function ckeditor_modules_enabled($modules) {
   module_load_include('inc', 'ckeditor', 'includes/ckeditor.lib');
+  if (in_array('libraries', $modules)) {
+    // Check and update path to CKEditor in the global profile
+    _ckeditor_requirements_isinstalled();
+  }
   $profiles_list = ckeditor_profile_input_formats();
   $plugins_list = ckeditor_load_plugins();
   foreach ($profiles_list AS $_profile => $_inputs) {
@@ -638,6 +656,7 @@ function ckeditor_modules_disabled($modules) {
   foreach ($profiles_list AS $_profile => $_inputs) {
     $changed = FALSE;
     $profile = ckeditor_profile_load($_profile);
+    if (!isset($profile->settings['loadPlugins'])) continue;
     foreach (array_keys((array) $profile->settings['loadPlugins']) as $plugin_name) {
       if (!array_key_exists($plugin_name, $plugins_list)) {
         $profile->settings['loadPlugins'][$plugin_name]['active'] = 0;
@@ -667,6 +686,7 @@ function ckeditor_modules_uninstalled($modules) {
   foreach ($profiles_list AS $_profile => $_inputs) {
     $changed = FALSE;
     $profile = ckeditor_profile_load($_profile);
+    if (!isset($profile->settings['loadPlugins'])) continue;
     foreach (array_keys((array) $profile->settings['loadPlugins']) as $plugin_name) {
       if (!array_key_exists($plugin_name, $plugins_list)) {
         unset($profile->settings['loadPlugins'][$plugin_name]);
@@ -682,4 +702,17 @@ function ckeditor_modules_uninstalled($modules) {
           ->execute();
     }
   }
-}
\ No newline at end of file
+}
+
+
+/**
+ * Implements hook_field_extra_fields().
+ */
+function ckeditor_field_extra_fields() {
+  $fields['user']['user']['form']['ckeditor'] = array(
+    'label' => t('Rich text editor settings'),
+    'description' => t('Rich text editor settings'),
+    'weight' => 10,
+  );
+  return $fields;
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.styles.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.styles.js
index fc80b18..b87d4b0 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.styles.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/ckeditor.styles.js
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.admin.inc b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.admin.inc
index b3c576f..88ff948 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.admin.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.admin.inc
@@ -2,7 +2,7 @@
 
 /**
  * CKEditor - The text editor for the Internet - http://ckeditor.com
- * Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  *
  * == BEGIN LICENSE ==
  *
@@ -350,7 +350,7 @@ function ckeditor_admin_global_profile_form($form, $form_state, $mode = 'add') {
     '#maxlength' => 128,
     '#description' => t(
         'The path to CKFinder (AJAX based file manager downloaded from !ckfindercom) relative to the document root.', array(
-      '!ckfindercom' => l(t('ckfinder.com'), 'http://ckfinder.com/download')
+      '!ckfindercom' => l(t('ckfinder.com'), 'http://cksource.com/ckfinder')
         )
     ) .
     '<br />' .
@@ -676,7 +676,7 @@ function ckeditor_admin_profile_form($form, $form_state, $profile = NULL) {
     '#type' => 'item',
     '#title' => t('Security filters'),
     '#description' => t(
-        'Below is a list of security filters along with their status for each text format.<br/><br/>The following statuses are available:!img_enabled - the filter is configured for a given text format and will be run on the content during the filtering proces.!img_disabled - the filter is disabled for a given text format and will not be run on the content during the filtering process.<br/><br/>In order to modify the security filters settings for each of the text formats, you need to visit the text format configuration sections as listed below: !elem_format_config', array(
+      'Below is a list of security filters along with their status for each text format.<br /><br />The following statuses are available: !img_enabled - the filter is configured for a given text format and will be run on the content during the filtering process. !img_disabled - the filter is disabled for a given text format and will not be run on the content during the filtering process.<br /><br />In order to modify the security filters settings for each of the text formats, you need to visit the text format configuration sections as listed below: !elem_format_config', array(
       '!img_enabled' => '</br><img src="' . $module_drupal_path . '/images/tick.png"/>',
       '!img_disabled' => '</br><img src="' . $module_drupal_path . '/images/delete.png"/>',
       '!elem_format_config' => '<ul class="text-formats-config"></ul>'
@@ -875,7 +875,7 @@ function ckeditor_admin_profile_form($form, $form_state, $profile = NULL) {
     $form['appearance']['use_divarea'] = array(
       '#type' => 'radios',
       '#title' => t('"Div-based" editor'),
-      '#default_value' => !empty($profile->settings['use_divarea']) ? $profile->settings['use_divarea'] : 't',
+      '#default_value' => !empty($profile->settings['use_divarea']) ? $profile->settings['use_divarea'] : 'f',
       '#options' => array(
         't' => t('Enabled'),
         'f' => t('Disabled')
@@ -1111,7 +1111,7 @@ function ckeditor_admin_profile_form($form, $form_state, $profile = NULL) {
         'Set the file browser settings. A file browser will allow you to browse the files stored on the server and embed them as links, images, or Flash movies. CKEditor is compatible with such Drupal modules as !imce or !elfinder. CKEditor can be also integrated with !ckfinder, an advanced Ajax file manager.', array(
       '!imce' => l(t('IMCE'), 'http://drupal.org/project/imce'),
       '!elfinder' => l(t('elFinder'), 'http://drupal.org/project/elfinder'),
-      '!ckfinder' => l(t('CKFinder'), 'http://ckfinder.com')
+      '!ckfinder' => l(t('CKFinder'), 'http://cksource.com/ckfinder')
         )
     )
   );
@@ -1744,7 +1744,7 @@ function _ckeditor_admin_profile_form_security_filters(&$form, $profile, $securi
           '#type' => 'item',
           '#title' => t("@data", array('@data' => $filter_conf['title'])),
           '#description' => t("!data", array('!data' => $filter_conf['description'])),
-          '#prefix' => t("<div class=\"filter-wrapper\"></div>!formats", array("!formats" => $filter_text_formats)),
+          '#prefix' => "<div class=\"filter-wrapper\"></div>" . $filter_text_formats,
           '#suffix' => "</div>"
         );
       }
@@ -1768,14 +1768,15 @@ function ckeditor_skinframe() {
   $module_drupal_path = ckeditor_module_path('relative');
 
   $html = "<!DOCTYPE html>";
+  $html .= "<html>";
   $html .= "<head>";
-  $html .= "<script src=\"{$editor_path}/ckeditor.js\"></script>";
+  $html .= '<title>CKEditor UI Color Picker</title>';
+  $html .= "<script type=\"text/javascript\" src=\"{$editor_path}/ckeditor.js\"></script>";
   $html .= "</head>";
   $html .= "<body>";
   $html .= "<input type=\"hidden\" name=\"uicolor_user\"/>";
   $html .= "<div id=\"editor\" style=\"height: 200px;\">Click the <strong>UI Color Picker</strong> button to set your color preferences.</div>";
-  $html .= "
-<script>
+  $html .= "<script type=\"text/javascript\">
 var skin = window.location.search.match(/skin=([^&]*)/)[1];
 var uicolor = window.location.search.match(/uicolor=([^&]*)/)[1];
 var ckeditorUiColorOnChange = function() {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.admin.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.admin.js
index f1d169f..39809ae 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.admin.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.admin.js
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */
 (function ($) {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.drush.inc b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.drush.inc
index 1d23960..05e12b1 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.drush.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.drush.inc
@@ -2,7 +2,7 @@
 
 /**
  * CKEditor - The text editor for the Internet - http://ckeditor.com
- * Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  *
  * == BEGIN LICENSE ==
  *
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.features.inc b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.features.inc
index ee5b517..c68c5a9 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.features.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.features.inc
@@ -2,7 +2,7 @@
 
 /**
  * CKEditor - The text editor for the Internet - http://ckeditor.com
- * Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  *
  * == BEGIN LICENSE ==
  *
@@ -73,7 +73,7 @@ function ckeditor_profile_features_export_render($module_name, $data) {
   $profiles = array();
   $roles = user_roles();
   foreach ($data as $name) {
-    $profile = (array) ckeditor_profile_load($name);
+    $profile = (array) ckeditor_profile_load($name, TRUE, FALSE);
 
     $profiles[$name] = $profile;
   }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.lib.inc b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.lib.inc
index e054d16..4fa5d68 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.lib.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.lib.inc
@@ -2,7 +2,7 @@
 
 /**
  * CKEditor - The text editor for the Internet - http://ckeditor.com
- * Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  *
  * == BEGIN LICENSE ==
  *
@@ -655,7 +655,7 @@ function _ckeditor_script_path() {
   elseif (file_exists($module_path . '/ckeditor/ckeditor/ckeditor.js')) {
     $jspath = '%m/ckeditor/ckeditor';
   }
-  elseif (file_exists('sites/all/libraries/ckeditor/ckeditor.js')) {
+  elseif (file_exists(ckeditor_library_path('url') . '/ckeditor/ckeditor.js')) {
     $jspath = '%l/ckeditor';
   }
   return $jspath;
@@ -830,8 +830,8 @@ function ckeditor_profile_settings_compile($global_profile, $profile) {
   }
 
   //add support for divarea plugin from CKE4
-  if (((isset($conf['use_divarea']) && $conf['use_divarea'] == 't') || !isset($conf['use_divarea'])) && file_exists($editor_local_path . '/plugins/divarea/plugin.js')) {
-    $settings['loadPlugins']['divarea'] = array('name' => 'divarea', 'path' => $editor_path . '/plugins/divarea/', 'buttons' => FALSE, 'default' => 't');
+  if (isset($conf['use_divarea']) && $conf['use_divarea'] == 't' && file_exists($editor_local_path . '/plugins/divarea/plugin.js')) {
+    $settings['loadPlugins']['divarea'] = array('name' => 'divarea', 'path' => $editor_path . '/plugins/divarea/', 'buttons' => FALSE, 'default' => 'f');
   }
 
   if (isset($conf['html_entities']) && $conf['html_entities'] == 'f') {
@@ -952,16 +952,25 @@ function ckeditor_profile_settings_compile($global_profile, $profile) {
         $_SESSION['ckeditor'][$profile_name]['UserFilesAbsolutePath'] = strtr('%d%b%f/', array("%f" => variable_get('file_public_path', conf_path() . '/files'), "%u" => $user->uid, "%b" => base_path(), "%d" => ckeditor_get_document_root_full_path(), "%n" => $user->name));
       }
       if (variable_get('file_default_scheme', '') == 'private') {
-        $private_dir = isset($global_profile->settings['private_dir']) ? trim($global_profile->settings['private_dir'], '\/') : '';
+        $private_dir = isset($global_profile->settings['private_dir']) ? trim($global_profile->settings['private_dir'], '/') : '';
         if (!empty($private_dir)) {
           $private_dir = strtr($private_dir, array('%u' => $user->uid, '%n' => $user->name));
           $_SESSION['ckeditor'][$profile_name]['UserFilesPath'] = url('system/files') . '/' . $private_dir . '/';
-          $_SESSION['ckeditor'][$profile_name]['UserFilesAbsolutePath'] = variable_get('file_private_path', '') . DIRECTORY_SEPARATOR . $private_dir . DIRECTORY_SEPARATOR;
+          $private_upload_path = file_uri_target('private://' . variable_get('file_private_path', '')) . '/' . $private_dir;
         }
         else {
           $_SESSION['ckeditor'][$profile_name]['UserFilesPath'] = url('system/files') . '/';
-          $_SESSION['ckeditor'][$profile_name]['UserFilesAbsolutePath'] = variable_get('file_private_path', '') . DIRECTORY_SEPARATOR;
+          $private_upload_path =  file_uri_target('private://' . variable_get('file_private_path', ''));
         }
+        //add '/' to beginning of path if necessary
+        if (strpos(variable_get('file_private_path', ''), '/') === 0 && $private_upload_path[0] != '/') {
+          $private_upload_path = '/' . $private_upload_path;
+        }
+        //check if CKEditor private dir exists and create it if not
+        if ($private_dir && !is_dir($private_upload_path)) {
+          mkdir($private_upload_path, 0755, TRUE);
+        }
+        $_SESSION['ckeditor'][$profile_name]['UserFilesAbsolutePath'] = drupal_realpath($private_upload_path) . '/';
       }
     }
   }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.page.inc b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.page.inc
index c207a64..ba74242 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.page.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.page.inc
@@ -2,7 +2,7 @@
 
 /**
  * CKEditor - The text editor for the Internet - http://ckeditor.com
- * Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  *
  * == BEGIN LICENSE ==
  *
@@ -160,7 +160,7 @@ function ckeditor_help_delegate($path, $arg) {
           '<ol>' .
           '<li>' .
           t('By using !ckfinder (commercial), an advanced Ajax file manager.', array(
-            '!ckfinder' => l(t('CKFinder'), 'http://ckfinder.com'),
+            '!ckfinder' => l(t('CKFinder'), 'http://cksource.com/ckfinder'),
               )
           ) .
           '</li>' .
@@ -215,7 +215,7 @@ function ckeditor_filter_xss() {
     if ($name == 'filter_html' && $security_filters['filters']['filter_html'] == 1) {
       preg_match_all("|</?([a-z][a-z0-9]*)(?:\b[^>]*)>|i", $text, $matches);
       if ($matches[1]) {
-        $tags = array_unique($matches[1]);
+        $tags = array_unique(array_merge($matches[1], array('!--')));
         $text = filter_xss($text, $tags);
       }
       continue;
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.user.inc b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.user.inc
index 063f1bc..11c667d 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.user.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.user.inc
@@ -2,7 +2,7 @@
 
 /**
  * CKEditor - The text editor for the Internet - http://ckeditor.com
- * Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  *
  * == BEGIN LICENSE ==
  *
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.utils.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.utils.js
index 27552a4..17a1769 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.utils.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/ckeditor.utils.js
@@ -51,6 +51,16 @@ window.CKEDITOR_BASEPATH = Drupal.settings.ckeditor.editor_path;
         else {
           CKEDITOR.addCss(ev.editor.config.extraCss);
         }
+        // Let Drupal trigger formUpdated event [#1895278]
+        ev.editor.on('change', function(ev) {
+          $(ev.editor.element.$).trigger('change');
+        });
+        ev.editor.on('blur', function(ev) {
+          $(ev.editor.element.$).trigger('blur');
+        });
+        ev.editor.on('focus', function(ev) {
+          $(ev.editor.element.$).trigger('click');
+        });
       },
       instanceReady : function(ev)
       {
@@ -78,13 +88,20 @@ window.CKEDITOR_BASEPATH = Drupal.settings.ckeditor.editor_path;
           body.attr('id', ev.editor.config.bodyId);
         if (typeof(Drupal.smileysAttach) != 'undefined' && typeof(ev.editor.dataProcessor.writer) != 'undefined')
           ev.editor.dataProcessor.writer.indentationChars = '    ';
+
+        // Let Drupal trigger formUpdated event [#1895278]
+        ((ev.editor.editable && ev.editor.editable()) || ev.editor.document.getBody()).on( 'keyup', function() {
+          $(ev.editor.element.$).trigger('keyup');
+        });
+        ((ev.editor.editable && ev.editor.editable()) || ev.editor.document.getBody()).on( 'keydown', function() {
+          $(ev.editor.element.$).trigger('keydown');
+        });
       },
       focus : function(ev)
       {
         Drupal.ckeditorInstance = ev.editor;
         Drupal.ckeditorActiveId = ev.editor.name;
-      }
-      ,
+      },
       afterCommandExec: function(ev)
       {
         if (ev.data.name != 'maximize') {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/filemanager.config.php b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/filemanager.config.php
index ea80deb..0adfe49 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/filemanager.config.php
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/filemanager.config.php
@@ -2,7 +2,7 @@
 
 /**
  * CKEditor - The text editor for the Internet - http://ckeditor.com
- * Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  *
  * == BEGIN LICENSE ==
  *
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/jqueryUI/sort.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/jqueryUI/sort.js
index 1598773..5acea57 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/jqueryUI/sort.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/jqueryUI/sort.js
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */
 jQuery(document).ready(function() {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/dialogs/uicolor.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/dialogs/uicolor.js
index 86c1d3a..16ddf2e 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/dialogs/uicolor.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/dialogs/uicolor.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/bg.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/bg.js
index 8447d0e..96e28ef 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/bg.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/bg.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/cs.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/cs.js
index 94ddba9..048ad31 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/cs.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/cs.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/cy.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/cy.js
index d8322bd..6e4adb8 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/cy.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/cy.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/da.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/da.js
index eb4965f..10040a8 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/da.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/da.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/de.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/de.js
index 9c303d9..b469f10 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/de.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/de.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/el.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/el.js
index 7be30c4..a84deea 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/el.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/el.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/en.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/en.js
index fbae027..80ad586 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/en.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/en.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/eo.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/eo.js
index a8efd89..ac2c79b 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/eo.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/eo.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/et.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/et.js
index 6a13b07..e2c4871 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/et.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/et.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/fa.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/fa.js
index 87ca9c3..98f0187 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/fa.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/fa.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/fi.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/fi.js
index 111eb69..08c2ac1 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/fi.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/fi.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/fr.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/fr.js
index 3feab4b..aa40c7b 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/fr.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/fr.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/he.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/he.js
index bbe2f21..7f9db2f 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/he.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/he.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/hr.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/hr.js
index c3d2e5b..f328bae 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/hr.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/hr.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/it.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/it.js
index 02065f5..58b4939 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/it.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/it.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/mk.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/mk.js
index 3d01092..880eee0 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/mk.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/mk.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/nb.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/nb.js
index 5758be1..611ccce 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/nb.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/nb.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/nl.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/nl.js
index 103152f..ac383f5 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/nl.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/nl.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/no.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/no.js
index 6b979e4..4b7e729 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/no.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/no.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/pl.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/pl.js
index 34c8163..2104dd9 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/pl.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/pl.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/tr.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/tr.js
index d1920bf..56c683b 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/tr.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/tr.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/ug.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/ug.js
index b067647..4eee7df 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/ug.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/ug.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/uk.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/uk.js
index d0c8ee3..7c738bd 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/uk.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/uk.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/vi.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/vi.js
index 090329b..0dc823a 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/vi.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/vi.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/zh-cn.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/zh-cn.js
index a0a3b33..df03892 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/zh-cn.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/lang/zh-cn.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/plugin.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/plugin.js
index 9ced4cc..cc638da 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/plugin.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/includes/uicolor/plugin.js
@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.html or http://ckeditor.com/license
  */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/drupalbreaks/plugin.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/drupalbreaks/plugin.js
index 62f0157..57e9887 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/drupalbreaks/plugin.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/drupalbreaks/plugin.js
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/imce/plugin.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/imce/plugin.js
index f5fd882..7be4ded 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/imce/plugin.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/imce/plugin.js
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/media/plugin.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/media/plugin.js
index c5c39fe..363f843 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/media/plugin.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/media/plugin.js
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/mediaembed/dialogs/mediaembed.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/mediaembed/dialogs/mediaembed.js
index d6bf683..6f49f62 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/mediaembed/dialogs/mediaembed.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/mediaembed/dialogs/mediaembed.js
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/mediaembed/plugin.js b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/mediaembed/plugin.js
index 14ae934..1412331 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/mediaembed/plugin.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/ckeditor/plugins/mediaembed/plugin.js
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/CHANGELOG.txt b/kolab.org/www/drupal-7.18/sites/all/modules/date/CHANGELOG.txt
index 99e8fb0..8c00161 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/CHANGELOG.txt
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/CHANGELOG.txt
@@ -1,9 +1,45 @@
 Date Module 7.x
 =================
 
-===================
-Version 7.x-2.x-dev
-===================
+
+======================
+Version 7.x-2.7
+======================
+- Issue #1691342 by Cyberwolf: Field description is displayed multiple times.
+- Issue #1668240 by ianthomas_uk: /themes/jquery.timeentry.css is not aggregated with other CSS files.
+- Issue #1974056 by pjcdawkins: Add a CSS class to the date repeat rule.
+- Issue #2065749 by vijaycs85, blackdog: $class in theme_date_repeat_rrule is not used.
+- Issue #1840008 by cr0ss, Alan D.: Unlock "Date attributes" (granularity) field setting.
+- Issue #1580032 by jmuzz | 30equals: Date values are not being saved when field is used in a nested field collection.
+- Issue #2071629 by blackdog: #after_build wrongly added, overwrites other modules.
+- Issue #1869962 by kaidjohnson: Date Context breaks context edit form.
+- Issue #1571258 by David_Rothstein | ddalvi: Date and time form elements do not have accessible labels when the label position is set to 'Within' or 'None'.
+- Issue #2130575 by kostajh: Unset() should be used with more caution in views_filter_handler_simple().inc.
+- Issue #1826598 by eromba, jyee: 'c' and 'r' formatter causes date to be printed twice in views.
+- Issue #1933472 by minorOffense: Added Optimize date_now() function.
+- Issue #1248786 by kenneth.venken | dboulet: Fixed appearance of marker for required date fields.
+- Issue #1810734 by ParisLiakos: Fixed Repeat checkboxes working reversed with updated jQuery.
+- Issue #1844092 by dboulet, kardave, Spleshka: Fixed Untranslated strings: month, day, ...
+- Issue #1202248 by james.williams, dawehner, mikehues | DamienMcKenna: Fixed Exported view doesn't include 'default_argument_options()' attribute.
+- Issue #1409120 by anrikun, akamustang | marsbidon: Added Date format in views exposed filter does not respect configured format.
+- Issue #1858112 by tomdearden: Fixed DateObject->difference not calculating correctly for future dates > 1 year away.
+- Issue #1659466 by artkon: Fixed Date filter does not remember value in views if the identifier is something other than date_filter().
+- Issue #1905096 by gielfeldt: Fixed Wrong usage of database API.
+- Issue #1791804 by 5n00py: Errors on form validation if date field placed in sub-form.
+- Issue [#636208] Date range: Expose a single filter to select events that start before the chosen date and end after the chosen date by anrikun.
+- Issue [#2024269] Date popup documentation fix by RoySegall.
+- Issue [#1835184] by Steven Jones, das-peter, jwhat: Fixed date_limit_format() can have poor performance.
+- Issue [#991830] by milesw | restyler: Fixed validation errors when date_popup() date is localized.
+- Issue [#2098715] by jhodgdon: Fixed Date field not obeying widget alters for #required.
+- Issue [#1266688] by linclark, rbayliss, fago, colette: Support microdata in date fields.
+- Issue [#1863610] by maximpodorov: Fixed Invalid date formatting.
+- META [#2034231] [#1832544] Class registration for Migrate 2.5 or later - mikeryan, [#1835214] Automated tests failing - Exception thrown in Date2 migration - PatchRanger, [#
+- Issue [#1350604] by Alan D., johaziel: Added Diff support for Date fields.
+- Issue [#2086313] by dooug: Fixed Wrong path in date_popup() README.txt
+- Issue [#1455558] by BTMash | mediameriquat: Fixed Missing file in date_views().info causes error 500.
+- Issue [#1697322] by Alan D., ianmthomasuk | pandikamal: Fixed Call to a member function getName() on a non-object in date api.
+- Code cleanup, remove #prev values that were never used in repeat functionality.
+- Small fix needed to ensure cardinality gets set correctly if repeat option is changed in the UI.
 
 ======================
 Version 7.x-2.6
@@ -110,7 +146,7 @@ Version 7.x-2.1
 
 - Issue #1437242 by zerbash, Remove extraneous leading slashes in module_load_include().
 - Issue #1436722 by hefox: Fixed Undefined variable $form_set_error() used as function.
-- Issue #1250626 by Gábor Hojtsy, B-Prod, hefox: Added start date and end date labels.
+- Issue #1250626 by G�bor Hojtsy, B-Prod, hefox: Added start date and end date labels.
 - Issue #1253482, Make sure $argument->is_default gets reset by the Date pager when altering results.
 - Adjust Date Tools to work with changes to use Views templates to create calendars.
 - Issue #1398584 by dhalbert and , Make sure groupby times is initialized.
@@ -194,7 +230,7 @@ The Date Browser has been removed. Please use the Date Pager instead. If you hav
 Browser the navigation will just disappear from them. If you add a Date Pager to the view you should get it back.
 Then delete the Date Browser attachment from the view, since it doesn't do anything any more.
 
-The UNTIL date was not getting included in repeating results and that is now fixed. This is an API change of sorts 
+The UNTIL date was not getting included in repeating results and that is now fixed. This is an API change of sorts
 for anyone who worked around the issue by setting it ahead.
 
 The All Day checkbox and All Day themes were moved into a separate module, using new hooks added to the date
@@ -219,7 +255,7 @@ New Features/Major Changes
 Bugfixes
 
 - Fix to new default date handling, the default date has to set a date in the database timezone, not the display timezone.
-- Issue #1245106 by Gábor Hojtsy, Hide the option to add the delta into the view for single value fields.
+- Issue #1245106 by G�bor Hojtsy, Hide the option to add the delta into the view for single value fields.
 - Issue #1370876, Make sure new Date All Day code does not try to set the popup values if Date Popup is disabled.
 - Issue #874322, Add back the date_field_all_day() function to avoid breaking other modules that are using it.
 - Fix Date text placeholder to display a formatted date instead of a format. Follow up to Date repeat UI changes.
@@ -316,7 +352,7 @@ Bugfixes
 - Issue #1179715, Default value callback for the timezone widget was not returning an array.
 - Issue #1179716, Remove value_callback for date_repeat and date_combo forms, the default behavior works fine.
 - Issue #1178716 by das-peter, Use drupal_array_get_nested_value() in Date Repeat instead of trying to find it manually.
-- Issue #1178716 by das-peter and KarenS, Tweak the date repeat widget to identify empty input when used on nodes with translation. 
+- Issue #1178716 by das-peter and KarenS, Tweak the date repeat widget to identify empty input when used on nodes with translation.
 - Issue #1178716 by das-peter and KarenS, Fix date repeat form values that are not arrays when hidden on a node that has translation.
 - Issue #1178176 by das-peter, Fix date_combo_value_callback to return NULL to avoid data lost on untranslatable dates used with Entity Translation.
 - Date Context module was making incorrect assumptions about the $language of the field.
@@ -350,7 +386,7 @@ field settings. Previous versions did not always honor those settings, this one
 
 New Features/UX Improvements
 
-- Issue #1249724 by KarenS, Gábor Hojtsy, David_Rothstein, Improve usability of date and time input configuration.
+- Issue #1249724 by KarenS, G�bor Hojtsy, David_Rothstein, Improve usability of date and time input configuration.
 - Issue #1250784 by David_Rothstein, Add user-friendly labels for start and end date values in Views.
 - Issue #742146, Add option to remove X-WR-CALNAME if VEVENT is not a feed.
 - Add option to change method from PUBLISH to REQUEST in VCALENDAR.
@@ -360,8 +396,8 @@ New Features/UX Improvements
 - Issue #1249724 by David_Rothstein: Improve usability of date and time input configuration
 - Issue #1177198 by tim.plunkett: Allow CTools to process #dependency for date elements.
 - Issue #1245562 by David_Rothstein, Rename the default date display format to something friendlier
-- Issue #1239934 by David_Rothstein and Gábor Hojtsy, Reuse the "years back and forward" dropdown widget on the Views filter settings page.
-- Issue #1239228 by Gábor Hojtsy, Date Views filter form UI improvements, clarify the way absolute and relative dates work.
+- Issue #1239934 by David_Rothstein and G�bor Hojtsy, Reuse the "years back and forward" dropdown widget on the Views filter settings page.
+- Issue #1239228 by G�bor Hojtsy, Date Views filter form UI improvements, clarify the way absolute and relative dates work.
 - Issue #233047 by ksenzee and David_Rothstein, Add the Vegas jQuery timepicker as a new time selector option.
 - Issue #1145976 by tim.plunkett and KarenS, Add 'is date' identifier to all date handlers.
 - Issue #1234140 by arlinsundbulte, Change terminology in user-facing text from 'From/To Date' to 'Start/End Date'.
@@ -408,10 +444,10 @@ Bugfixes
 - Issue #1254582 Repeat additions need to be adjusted to use the same time as the original date.
 - Move vcalendar and vevent templates from Date Views to Date API modules.
 - Follow up to Issue #1250344, We don't need extra space when there is a description, only when there is not.
-- Issue #1239228 by Gábor Hojtsy, More tweaks to filter css.
-- Issue #1244924 by Gábor Hojtsy, Minor text improvements in date filter configuration
+- Issue #1239228 by G�bor Hojtsy, More tweaks to filter css.
+- Issue #1244924 by G�bor Hojtsy, Minor text improvements in date filter configuration
 - Issue #1245556 by David_Rothstein, Date granularity description incorrectly implies that it affects the date attributes that are displayed
-- Issue #1247444 by Gábor Hojtsy, Give a little breathing space to the date year range "other" field
+- Issue #1247444 by G�bor Hojtsy, Give a little breathing space to the date year range "other" field
 - Issue #1250344 by jessebeach, Fix padding around date fields by adding clearfix class.
 - Issue #1249116 by yched, Fix various glitches with D6 migration code.
 - Issue #1243022 by fmosca and KarenS, Make sure all_day #states visibility is only set when there is a value for all_day.
@@ -419,7 +455,7 @@ Bugfixes
 - Issue #1246416, Test whether libraries_get_path() returns a valid path before using it.
 - Issue #1235994, Don't display 'All Day' when using a format that has no time.
 - Issue #1245690 by mikeryan, Migration plugin missing seconds from date formats
-- Issue #1229406 by David Rothstein, Gábor Hojtsy, and tim.plunkett Fix broken timepicker in Chrome and Safari.
+- Issue #1229406 by David Rothstein, G�bor Hojtsy, and tim.plunkett Fix broken timepicker in Chrome and Safari.
 - Issue #1239412 by keithm, Fix validation error when #access is false.
 - Issue #1232522, Don't alter field_ui_field_edit form except on date fields.
 - Issue #1243842, Make sure the All Day and Show End Date flags work correctly in unlimited value fields that use ajax.
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/LICENSE.txt b/kolab.org/www/drupal-7.18/sites/all/modules/date/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date.api.php b/kolab.org/www/drupal-7.18/sites/all/modules/date/date.api.php
index 17f7514..268ae86 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date.api.php
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date.api.php
@@ -344,9 +344,6 @@ function hook_date_combo_process_alter(&$element, &$form_state, $context) {
       '#date_increment'   => $instance['widget']['settings']['increment'],
       '#date_year_range'  => $instance['widget']['settings']['year_range'],
       '#date_label_position' => $instance['widget']['settings']['label_position'],
-      '#prev_value' => isset($item['value']) ? $item['value'] : '',
-      '#prev_value2' => isset($item['value2']) ? $item['value2'] : '',
-      '#prev_rrule' => isset($item['rrule']) ? $item['rrule'] : '',
       '#date_repeat_widget' => str_replace('_repeat', '', $instance['widget']['type']),
       '#date_repeat_collapsed' => $instance['widget']['settings']['repeat_collapsed'],
       '#date_flexible' => 0,
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date.diff.inc b/kolab.org/www/drupal-7.18/sites/all/modules/date/date.diff.inc
new file mode 100644
index 0000000..e46d3a1
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date.diff.inc
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * @file
+ * Provide diff field functions for the Date module.
+ */
+
+/**
+ * Diff field callback for parsing date fields comparative values.
+ */
+function date_field_diff_view($items, $context) {
+  $diff_items = array();
+  $display = $context['display'];
+  $display['settings']['format_type'] = $context['settings']['format_type'];
+  $display['settings']['fromto'] = $context['settings']['fromto'];
+  foreach ($items as $delta => $item) {
+    $date = date_formatter_process('date_default', $context['entity_type'], $context['entity'], $context['field'], $context['instance'], $context['language'], $item, $display);
+    switch ($display['settings']['fromto']) {
+      case 'both':
+        if ($date['value']['formatted'] != $date['value2']['formatted']) {
+          $diff_items[$delta] = t('@from to @to', array(
+            '@from' => $date['value']['formatted'],
+            '@to' => $date['value2']['formatted'],
+          ));
+        }
+        else {
+          $diff_items[$delta] = $date['value']['formatted'];
+        }
+        break;
+
+      case 'value':
+      case 'value2':
+        $diff_items[$delta] = $date[$display['settings']['fromto']]['formatted'];
+        break;
+
+    }
+  }
+  return $diff_items;
+}
+
+/**
+ * Provide default field comparison options.
+ */
+function date_field_diff_default_options($field_type) {
+  return array(
+    'format_type' => 'long',
+    'fromto' => 'both',
+  );
+}
+
+/**
+ * Provide a form for setting the field comparison options.
+ */
+function date_field_diff_options_form($field_type, $settings) {
+  $options_form = array();
+
+  $form['format_type'] = array(
+    '#title' => t('Choose how render dates and times'),
+    '#type' => 'select',
+    '#options' => date_format_type_options(),
+    '#default_value' => $settings['format_type'],
+    '#description' => t('To add or edit options, visit <a href="@date-time-page">Date and time settings</a>.', array('@date-time-page' => url('admin/config/regional/date-time'))),
+    '#weight' => 0,
+  );
+
+  $form['fromto'] = array(
+    '#title' => t('Display'),
+    '#type' => 'select',
+    '#options' => array(
+      'both' => t('Both Start and End dates'),
+      'value' => t('Start date only'),
+      'value2' => t('End date only'),
+    ),
+    '#default_value' => $settings['fromto'],
+    '#weight' => 1,
+  );
+
+  return $options_form;
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date.field.inc b/kolab.org/www/drupal-7.18/sites/all/modules/date/date.field.inc
index b104702..46ea317 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date.field.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date.field.inc
@@ -125,8 +125,16 @@ function date_field_formatter_view($entity_type, $entity, $field, $instance, $la
     'attributes' => array(),
     'rdf_mapping' => array(),
     'add_rdf' => module_exists('rdf'),
+    'microdata' => array(),
+    'add_microdata' => module_exists('microdata'),
   );
 
+  // If the microdata module is enabled, the microdata mapping will have been
+  // passed in via the entity.
+  if ($variables['add_microdata'] && isset($entity->microdata[$field['field_name']])) {
+    $variables['microdata'] = $entity->microdata[$field['field_name']];
+  }
+
   // If there is an RDf mapping for this date field, pass it down to the theme.
   $rdf_mapping = array();
   if (!empty($entity->rdf_mapping) && function_exists('rdf_rdfa_attributes')) {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date.info b/kolab.org/www/drupal-7.18/sites/all/modules/date/date.info
index e5b00c2..242937c 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date.info
@@ -4,15 +4,17 @@ dependencies[] = date_api
 package = Date/Time
 core = 7.x
 php = 5.2
+files[] = date.migrate.inc
 files[] = tests/date_api.test
 files[] = tests/date.test
 files[] = tests/date_field.test
+files[] = tests/date_migrate.test
 files[] = tests/date_validation.test
 files[] = tests/date_timezone.test
 
-; Information added by drupal.org packaging script on 2012-08-13
-version = "7.x-2.6"
+; Information added by Drupal.org packaging script on 2013-12-21
+version = "7.x-2.7"
 core = "7.x"
 project = "date"
-datestamp = "1344850024"
+datestamp = "1387659206"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date.migrate.inc b/kolab.org/www/drupal-7.18/sites/all/modules/date/date.migrate.inc
new file mode 100644
index 0000000..095c789
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date.migrate.inc
@@ -0,0 +1,200 @@
+<?php
+
+/**
+ * @file
+ * Support for migration into Date fields.
+ */
+
+/**
+ * Implements hook_migrate_api().
+ */
+function date_migrate_api() {
+  $api = array(
+    'api' => 2,
+    'field handlers' => array('DateMigrateFieldHandler'),
+  );
+  return $api;
+}
+
+class DateMigrateFieldHandler extends MigrateFieldHandler {
+
+  /**
+   * Declares the types of fields used.
+   */
+  public function __construct() {
+    $this->registerTypes(array('date', 'datestamp', 'datetime'));
+  }
+
+  /**
+   * Arguments for a date field migration.
+   *
+   * @param string $timezone
+   *   Timezone (such as UTC, America/New_York, etc.) to apply.
+   * @param string $timezone_db
+   *   Timezone_db value for the field.
+   * @param string $rrule
+   *   Rule string for a repeating date field.
+   * @param string $language
+   *   Language of the text (defaults to destination language)
+   *
+   * @return array
+   *   An array of the defined variables in this scope.
+   */
+  static function arguments($timezone = 'UTC', $timezone_db = 'UTC', $rrule = NULL, $language = NULL) {
+    return get_defined_vars();
+  }
+
+  /**
+   * Converts incoming data into the proper field arrays for Date fields.
+   *
+   * @param object $entity
+   *   The destination entity which will hold the field arrays.
+   * @param array $field_info
+   *   Metadata for the date field being populated.
+   * @param array $instance
+   *   Metadata for this instance of the date field being populated.
+   * @param array $values
+   *   Array of date values to be fielded.
+   *
+   * @return array|null
+   *   An array of date fields.
+   */
+  public function prepare($entity, array $field_info, array $instance, array $values) {
+    if (isset($values['arguments'])) {
+      $arguments = $values['arguments'];
+      unset($values['arguments']);
+    }
+    else {
+      $arguments = array();
+    }
+
+    $language = $this->getFieldLanguage($entity, $field_info, $arguments);
+
+    foreach ($values as $delta => $from) {
+      if (!empty($arguments['timezone'])) {
+        if (is_array($arguments['timezone'])) {
+          $timezone = $arguments['timezone'][$delta];
+        }
+        else {
+          $timezone = $arguments['timezone'];
+        }
+      }
+      else {
+        $timezone = 'UTC';
+      }
+
+      if (!empty($arguments['rrule'])) {
+        if (is_array($arguments['rrule'])) {
+          $rrule = $arguments['rrule'][$delta];
+        }
+        else {
+          $rrule = $arguments['rrule'];
+        }
+      }
+      else {
+        $rrule = NULL;
+      }
+
+      if (!empty($arguments['to'])) {
+        if (is_array($arguments['to'])) {
+          $to = $arguments['to'][$delta];
+        }
+        else {
+          $to = $arguments['to'];
+        }
+      }
+      else {
+        $to = NULL;
+      }
+
+      // Legacy support for JSON containing a set of properties - deprecated
+      // now that we have subfields.
+      if (!empty($from) && $from{0} == '{') {
+        $properties = drupal_json_decode($from);
+        $from = $properties['from'];
+        // Properties passed in with the date override any set via arguments.
+        if (!empty($properties['to'])) {
+          $to = $properties['to'];
+        }
+        if (!empty($properties['timezone'])) {
+          $timezone = $properties['timezone'];
+        }
+        if (!empty($properties['rrule'])) {
+          $rrule = $properties['rrule'];
+        }
+      }
+
+      // Missing data? Create an empty value and return;
+      // Don't try to turn the empty value into a bogus
+      // timestamp for 'now'.
+      if (empty($from)) {
+        $return[$language][$delta]['value'] = NULL;
+        if (!empty($field_info['settings']['todate'])) {
+          $return[$language][$delta]['value2'] = NULL;
+        }
+        return $return;
+      }
+
+      // If there is no 'to' date, just use the 'from' date.
+      if (!empty($field_info['settings']['todate']) && empty($to)) {
+        $to = $from;
+      }
+
+      // If we have a value, work from a timestamp.
+      $from = MigrationBase::timestamp($from);
+      if ($to) {
+        $to = MigrationBase::timestamp($to);
+      }
+
+      // What does the destination field expect?
+      switch ($field_info['type']) {
+        case 'datestamp':
+          // Already done.
+          break;
+        case 'datetime':
+          // YYYY-MM-DD HH:MM:SS.
+          $from = format_date($from, 'custom', 'Y-m-d H:i:s', $timezone);
+          if ($to) {
+            $to = format_date($to, 'custom', 'Y-m-d H:i:s', $timezone);
+          }
+          break;
+        case 'date':
+          // ISO date: YYYY-MM-DDTHH:MM:SS.
+          $from = format_date($from, 'custom', 'Y-m-d\TH:i:s', $timezone);
+          if ($to) {
+            $to = format_date($to, 'custom', 'Y-m-d\TH:i:s', $timezone);
+          }
+          break;
+        default:
+          break;
+      }
+
+      // Handle repeats, coming in as RRULEs. Many field instances may be
+      // created.
+      if (function_exists('date_repeat_build_dates') && !empty($field_info['settings']['repeat']) && $rrule) {
+        include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'date_api') . '/date_api_ical.inc';
+        $item = array('value' => $from, 'value2' => $to, 'timezone' => $timezone);
+        // Can be de-uglified when http://drupal.org/node/1159404 is committed.
+        $return[$language] = date_repeat_build_dates(NULL, date_ical_parse_rrule($field_info, $rrule), $field_info, $item);
+      }
+      else {
+        $return[$language][$delta]['value'] = $from;
+        if (!empty($to)) {
+          $return[$language][$delta]['value2'] = $to;
+        }
+      }
+    }
+    if (!isset($return)) {
+      $return = NULL;
+    }
+    return $return;
+  }
+
+  public function fields($migration = NULL) {
+    return array(
+      'timezone' => t('Timezone'),
+      'rrule' => t('Recurring event rule'),
+      'to' => t('End date date'),
+    );
+  }
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date.module b/kolab.org/www/drupal-7.18/sites/all/modules/date/date.module
index 4f6a013..6f4560b 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date.module
@@ -1,10 +1,8 @@
 <?php
-
 /**
  * @file
  * Defines date/time field types.
  */
-
 module_load_include('theme', 'date', 'date');
 module_load_include('inc', 'date', 'date.field');
 module_load_include('inc', 'date', 'date_elements');
@@ -78,6 +76,8 @@ function date_theme() {
         'attributes' => array(),
         'rdf_mapping' => NULL,
         'add_rdf' => NULL,
+        'microdata' => NULL,
+        'add_microdata' => NULL,
       ),
     ),
     'date_display_range' => $base + array(
@@ -95,6 +95,8 @@ function date_theme() {
         'attributes_end' => array(),
         'rdf_mapping' => NULL,
         'add_rdf' => NULL,
+        'microdata' => NULL,
+        'add_microdata' => NULL,
     )),
     'date_display_combination' => $base + array(
       'variables' => array(
@@ -110,6 +112,8 @@ function date_theme() {
         'attributes' => array(),
         'rdf_mapping' => NULL,
         'add_rdf' => NULL,
+        'microdata' => NULL,
+        'add_microdata' => NULL,
       ),
     ),
     'date_display_interval' => $base + array(
@@ -247,7 +251,7 @@ function date_formatter_process($formatter, $entity_type, $entity, $field, $inst
         elseif ($format == 'format_calendar_day') {
            $dates[$processed]['calendar_day'] = date_format_calendar_day($date);
         }
-        elseif ($format == 'U') {
+        elseif ($format == 'U' || $format == 'r' || $format == 'c') {
           $dates[$processed]['formatted'] = date_format_date($date, 'custom', $format);
           $dates[$processed]['formatted_date'] = date_format_date($date, 'custom', $format);
           $dates[$processed]['formatted_time'] = '';
@@ -543,6 +547,8 @@ function date_entity_metadata_property_info_alter(&$info, $entity_type, $field,
         // The getter and setter callbacks for 'value' and 'value2'
         // will not provide the field name as $name, we'll add it to $info.
         'field_name' => $field['field_name'],
+        // Alert Microdata module that this value can be exposed in microdata.
+        'microdata' => TRUE,
       ),
       'value2' => array(
         'type' => 'date',
@@ -552,6 +558,8 @@ function date_entity_metadata_property_info_alter(&$info, $entity_type, $field,
         // The getter and setter callbacks for 'value' and 'value2'
         // will not provide the field name as $name, we'll add it to $info.
         'field_name' => $field['field_name'],
+        // Alert Microdata module that this value can be exposed in microdata.
+        'microdata' => TRUE,
       ),
       'duration' => array(
         'type' => 'duration',
@@ -566,6 +574,11 @@ function date_entity_metadata_property_info_alter(&$info, $entity_type, $field,
     );
     unset($property['query callback']);
   }
+  else {
+    // If this doesn't have a todate, it is handled as a date rather than a
+    // struct. Enable microdata on the field itself rather than the properties.
+    $property['microdata'] = TRUE;
+  }
 }
 
 /**
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date.theme b/kolab.org/www/drupal-7.18/sites/all/modules/date/date.theme
index 70c6be4..cc88e87 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date.theme
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date.theme
@@ -74,6 +74,8 @@ function theme_date_display_combination($variables) {
   $attributes  = $variables['attributes'];
   $rdf_mapping = $variables['rdf_mapping'];
   $add_rdf     = $variables['add_rdf'];
+  $microdata   = $variables['microdata'];
+  $add_microdata = $variables['add_microdata'];
   $precision   = date_granularity_precision($field['settings']['granularity']);
 
   $output = '';
@@ -162,6 +164,8 @@ function theme_date_display_combination($variables) {
       'attributes' => $attributes,
       'rdf_mapping' => $rdf_mapping,
       'add_rdf' => $add_rdf,
+      'microdata' => $microdata,
+      'add_microdata' => $add_microdata,
       'dates' => $dates,
     ));
   }
@@ -179,6 +183,8 @@ function theme_date_display_combination($variables) {
       'attributes' => $attributes,
       'rdf_mapping' => $rdf_mapping,
       'add_rdf' => $add_rdf,
+      'microdata' => $microdata,
+      'add_microdata' => $add_microdata,
       'dates' => $dates,
     ));
     $replaced = str_replace($time1, $time, $date1);
@@ -200,6 +206,8 @@ function theme_date_display_combination($variables) {
       'attributes' => $attributes,
       'rdf_mapping' => $rdf_mapping,
       'add_rdf' => $add_rdf,
+      'microdata' => $microdata,
+      'add_microdata' => $add_microdata,
       'dates' => $dates,
     ));
   }
@@ -211,7 +219,7 @@ function theme_date_display_combination($variables) {
  * Template preprocess function for displaying a single date.
  */
 function template_preprocess_date_display_single(&$variables) {
-  if ($variables['add_rdf']) {
+  if ($variables['add_rdf'] || $variables['add_microdata']) {
     // Pass along the rdf mapping for this field, if any. Add some default rdf
     // attributes that will be used if not overridden by attributes passed in.
     $rdf_mapping = $variables['rdf_mapping'];
@@ -222,6 +230,24 @@ function template_preprocess_date_display_single(&$variables) {
     );
     $variables['attributes'] = $variables['attributes'] + $base_attributes;
   }
+
+  // Pass along microdata attributes, or set display to false if none are set.
+  if (!empty($variables['add_microdata'])) {
+    // Because the Entity API integration for Date has a variable data
+    // structure depending on whether there is an end value, the attributes
+    // could be attached to the field or to the value property.
+    if(!empty($variables['microdata']['#attributes']['itemprop'])) {
+      $variables['microdata']['value']['#attributes'] = $variables['microdata']['#attributes'];
+    }
+
+    // Add the machine readable time using the content attribute.
+    if(!empty($variables['microdata']['value']['#attributes'])) {
+      $variables['microdata']['value']['#attributes']['content'] = $variables['dates']['value']['formatted_iso'];
+    }
+    else {
+      $variables['add_microdata'] = FALSE;
+    }
+  }
 }
 
 /**
@@ -233,7 +259,13 @@ function theme_date_display_single($variables) {
   $attributes = $variables['attributes'];
 
   // Wrap the result with the attributes.
-  return '<span class="date-display-single"' . drupal_attributes($attributes) . '>' . $date . $timezone . '</span>';
+  $output = '<span class="date-display-single"' . drupal_attributes($attributes) . '>' . $date . $timezone . '</span>';
+
+  if ($variables['add_microdata']) {
+    $output .= '<meta' . drupal_attributes($variables['microdata']['value']['#attributes']) . '/>';
+  }
+
+  return $output;
 }
 
 /**
@@ -247,7 +279,6 @@ function template_preprocess_date_display_range(&$variables) {
   if ($variables['add_rdf']) {
     // Pass along the rdf mapping for this field, if any. Add some default rdf
     // attributes that will be used if not overridden by attributes passed in.
-    $rdf_mapping = $variables['rdf_mapping'];
     $dates = $variables['dates'];
     $base_attributes = array(
       'property' => array('dc:date'),
@@ -261,6 +292,17 @@ function template_preprocess_date_display_range(&$variables) {
       $variables['attributes_end']['property'][$delta] = str_replace('start', 'end', $property);
     }
   }
+
+  // Pass along microdata attributes, or set display to false if none are set.
+  if ($variables['add_microdata']) {
+    if (!empty($variables['microdata']['value']['#attributes'])) {
+      $variables['microdata']['value']['#attributes']['content'] = $variables['dates']['value']['formatted_iso'];
+      $variables['microdata']['value2']['#attributes']['content'] = $variables['dates']['value2']['formatted_iso'];
+    }
+    else {
+      $variables['add_microdata'] = FALSE;
+    }
+  }
 }
 
 /**
@@ -273,10 +315,20 @@ function theme_date_display_range($variables) {
   $attributes_start = $variables['attributes_start'];
   $attributes_end = $variables['attributes_end'];
 
+  $start_date = '<span class="date-display-start"' . drupal_attributes($attributes_start) . '>' . $date1 . '</span>';
+  $end_date = '<span class="date-display-end"' . drupal_attributes($attributes_end) . '>' . $date2 . $timezone . '</span>';
+
+  // If microdata attributes for the start date property have been passed in,
+  // add the microdata in meta tags.
+  if (!empty($variables['add_microdata'])) {
+    $start_date .= '<meta' . drupal_attributes($variables['microdata']['value']['#attributes']) . '/>';
+    $end_date .= '<meta' . drupal_attributes($variables['microdata']['value2']['#attributes']) . '/>';
+  }
+
   // Wrap the result with the attributes.
   return t('!start-date to !end-date', array(
-    '!start-date' => '<span class="date-display-start"' . drupal_attributes($attributes_start) . '>' . $date1 . '</span>',
-    '!end-date' => '<span class="date-display-end"' . drupal_attributes($attributes_end) . '>' . $date2 . $timezone . '</span>',
+    '!start-date' => $start_date,
+    '!end-date' => $end_date,
   ));
 }
 
@@ -326,6 +378,10 @@ function theme_date_combo($variables) {
     '#attributes' => array(),
     '#children' => $element['#children'],
   );
+  // Add marker to required date fields.
+  if ($element['#required']) {
+    $fieldset['#title'] .= " " . theme('form_required_marker');
+  }
   return theme('fieldset', array('element' => $fieldset));
 }
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_admin.inc b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_admin.inc
index 993aa09..0e32fc5 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_admin.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_admin.inc
@@ -370,11 +370,11 @@ function _date_field_widget_settings_form($field, $instance) {
   );
   if (in_array($widget['type'], array('date_select'))) {
     $options = array('above' => t('Above'), 'within' => t('Within'), 'none' => t('None'));
-    $description = t("The location of date part labels, like 'Year', 'Month', or 'Day' . 'Above' displays the label as titles above each date part. 'Within' inserts the label as the first option in the select list and in blank textfields. 'None' doesn't label any of the date parts. Theme functions like 'date_part_label_year' and 'date_part_label_month' control label text.");
+    $description = t("The location of date part labels, like 'Year', 'Month', or 'Day' . 'Above' displays the label as titles above each date part. 'Within' inserts the label as the first option in the select list and in blank textfields. 'None' doesn't visually label any of the date parts. Theme functions like 'date_part_label_year' and 'date_part_label_month' control label text.");
   }
   else {
     $options = array('above' => t('Above'), 'none' => t('None'));
-    $description = t("The location of date part labels, like 'Year', 'Month', or 'Day' . 'Above' displays the label as titles above each date part. 'None' doesn't label any of the date parts. Theme functions like 'date_part_label_year' and 'date_part_label_month' control label text.");
+    $description = t("The location of date part labels, like 'Year', 'Month', or 'Day' . 'Above' displays the label as titles above each date part. 'None' doesn't visually label any of the date parts. Theme functions like 'date_part_label_year' and 'date_part_label_month' control label text.");
   }
   $form['advanced']['label_position'] = array(
     '#type' => 'radios',
@@ -453,6 +453,9 @@ function _date_field_settings_form($field, $instance, $has_data) {
   $tz_handling = $settings['tz_handling'];
 
   $description = t('Select the date attributes to collect and store.');
+  if ($has_data) {
+    $description .= ' ' . t('Changes to date attributes only effects new or updated content.');
+  }
   $options = date_granularity_names();
   $checkbox_year = array(
     '#type' => 'checkbox',
@@ -469,7 +472,6 @@ function _date_field_settings_form($field, $instance, $has_data) {
     '#options' => $options,
     '#attributes' => array('class' => array('container-inline')),
     '#description' => $description,
-    '#disabled' => $has_data,
     'year' => $checkbox_year,
   );
 
@@ -499,7 +501,6 @@ function _date_field_settings_form($field, $instance, $has_data) {
     '#default_value' => $tz_handling,
     '#options' => date_timezone_handling_options(),
     '#description' => $description,
-    '#disabled' => $has_data,
     '#attached' => array(
       'js' => array(drupal_get_path('module', 'date') . '/date_admin.js'),
     ),
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_all_day/date_all_day.info b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_all_day/date_all_day.info
index 8f8bf48..14e1d86 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_all_day/date_all_day.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_all_day/date_all_day.info
@@ -5,9 +5,9 @@ dependencies[] = date
 package = Date/Time
 core = 7.x
 
-; Information added by drupal.org packaging script on 2012-08-13
-version = "7.x-2.6"
+; Information added by Drupal.org packaging script on 2013-12-21
+version = "7.x-2.7"
 core = "7.x"
 project = "date"
-datestamp = "1344850024"
+datestamp = "1387659206"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api.info b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api.info
index ee1a384..19ac12c 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api.info
@@ -9,9 +9,9 @@ stylesheets[all][] = date.css
 files[] = date_api.module
 files[] = date_api_sql.inc
 
-; Information added by drupal.org packaging script on 2012-08-13
-version = "7.x-2.6"
+; Information added by Drupal.org packaging script on 2013-12-21
+version = "7.x-2.7"
 core = "7.x"
 project = "date"
-datestamp = "1344850024"
+datestamp = "1387659206"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api.module b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api.module
index d85a8a5..2ca0a33 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api.module
@@ -276,18 +276,17 @@ class DateObject extends DateTime {
         $this->setGranularityFromTime($time, $tz);
       }
     }
-    // If this tz was given as just an offset or the timezone
-    // was invalid, we need to do some tweaking.
+
+    // If we haven't got a valid timezone name yet, we need to set one or
+    // we will get undefined index errors.
+    // This can happen if $time had an offset or no timezone.
     if (!$this->getTimezone() || !preg_match('/[a-zA-Z]/', $this->getTimezone()->getName())) {
 
-      // If the timezone name is an offset and the original
-      // $tz has a name, use it. This happens if you pass in
-      // a date string with an offset along with a specific timezone name.
-      if (!preg_match('/[a-zA-Z]/', $this->getTimezone()->getName()) && preg_match('/[a-zA-Z]/', $tz->getName())) {
+      // If the original $tz has a name, use it.
+      if (preg_match('/[a-zA-Z]/', $tz->getName())) {
         $this->setTimezone($tz);
       }
-      // If we get this far, we have no information about the timezone name,
-      // but we will get undefined index errors without any name.
+      // We have no information about the timezone so must fallback to a default.
       else {
         $this->setTimezone(new DateTimeZone("UTC"));
         $this->errors['timezone'] = t('No valid timezone name was provided.');
@@ -459,8 +458,8 @@ class DateObject extends DateTime {
     $true = $this->hasGranularity() && (!$granularity || $flexible || $this->hasGranularity($granularity));
     if (!$true && $granularity) {
       foreach ((array) $granularity as $part) {
-        if (!$this->hasGranularity($part)) {
-          $this->errors[$part] = t("The @part is missing.", array('@part' => $part));
+        if (!$this->hasGranularity($part) && in_array($part, array('second', 'minute', 'hour', 'day', 'month', 'year'))) {
+          $this->errors[$part] = t("The $part is missing.");
         }
       }
     }
@@ -574,7 +573,7 @@ class DateObject extends DateTime {
     $regex2 = preg_replace($patterns, $repl2, $format_regexp, 1);
     $regex2 = str_replace('A', '(AM|PM)', $regex2);
     $regex2 = str_replace('a', '(am|pm)', $regex2);
-    preg_match('`^' . $regex2 . '$`', $date, $values);
+    preg_match('`^' . $regex2 . '$`u', $date, $values);
     array_shift($values);
     // If we did not find all the values for the patterns in the format, abort.
     if (count($letters) != count($values)) {
@@ -951,6 +950,11 @@ class DateObject extends DateTime {
           if ($year_diff == 0) {
             return intval($item2 - $item1);
           }
+          elseif ($year_diff < 0) {
+            $item_diff = 0 - $item1;
+            $item_diff -= intval((abs($year_diff) - 1) * 12);
+            return $item_diff - (12 - $item2);
+          }
           else {
             $item_diff = 12 - $item1;
             $item_diff += intval(($year_diff - 1) * 12);
@@ -965,6 +969,14 @@ class DateObject extends DateTime {
           if ($year_diff == 0) {
             return intval($item2 - $item1);
           }
+          elseif ($year_diff < 0) {
+            $item_diff = 0 - $item1;
+            for ($i = 1; $i < abs($year_diff); $i++) {
+              date_modify($date1, '-1 year');
+              $item_diff -= date_days_in_year($date1);
+            }
+            return $item_diff - (date_days_in_year($date2) - $item2);
+          }
           else {
             $item_diff = date_days_in_year($date1) - $item1;
             for ($i = 1; $i < $year_diff; $i++) {
@@ -978,9 +990,12 @@ class DateObject extends DateTime {
         case 'weeks':
           $week_diff = date_format($date2, 'W') - date_format($date1, 'W');
           $year_diff = date_format($date2, 'o') - date_format($date1, 'o');
-          for ($i = 1; $i <= $year_diff; $i++) {
-            date_modify($date1, '+1 year');
-            $week_diff += date_iso_weeks_in_year($date1);
+
+          $sign = ($year_diff < 0) ? -1 : 1;
+
+          for ($i = 1; $i <= abs($year_diff); $i++) {
+            date_modify($date1, (($sign > 0) ? '+': '-').'1 year');
+            $week_diff += (date_iso_weeks_in_year($date1) * $sign);
           }
           return $week_diff;
       }
@@ -1705,13 +1720,21 @@ function date_format_interval($date, $granularity = 2, $display_ago = TRUE) {
  *   (optional) Optionally force time to a specific timezone, defaults to user
  *   timezone, if set, otherwise site timezone. Defaults to NULL.
  *
+ * @param boolean $reset [optional]
+ *  Static cache reset
+ *
  * @return object
  *   The current time as a date object.
  */
-function date_now($timezone = NULL) {
-  return new DateObject('now', $timezone);
-}
+function date_now($timezone = NULL, $reset = FALSE) {
+  $now = &drupal_static(__FUNCTION__);
 
+  if (!isset($now) || $reset) {
+    $now = new DateObject('now', $timezone);
+  }
+
+  return $now;
+}
 /**
  * Determines if a timezone string is valid.
  *
@@ -2100,6 +2123,17 @@ function date_part_format($part, $format) {
  *   The format string with all other elements removed.
  */
 function date_limit_format($format, $granularity) {
+  // Use the advanced drupal_static() pattern to improve performance.
+  static $drupal_static_fast;
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['formats'] = &drupal_static(__FUNCTION__);
+  }
+  $formats = &$drupal_static_fast['formats'];
+  $format_granularity_cid = $format .'|'. implode(',', $granularity);
+  if (isset($formats[$format_granularity_cid])) {
+    return $formats[$format_granularity_cid];
+  }
+
   // If punctuation has been escaped, remove the escaping. Done using strtr()
   // because it is easier than getting the escape character extracted using
   // preg_replace().
@@ -2169,11 +2203,14 @@ function date_limit_format($format, $granularity) {
   // After removing the non-desired parts of the format, test if the only things
   // left are escaped, non-date, characters. If so, return nothing.
   // Using S instead of w to pick up non-ASCII characters.
-  $test = trim(preg_replace('(\\\\\S{1,3})', '', $format));
+  $test = trim(preg_replace('(\\\\\S{1,3})u', '', $format));
   if (empty($test)) {
     $format = '';
   }
 
+  // Store the return value in the static array for performance.
+  $formats[$format_granularity_cid] = $format;
+
   return $format;
 }
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api_elements.inc b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api_elements.inc
index 7da4e58..57e4161 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api_elements.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api_elements.inc
@@ -239,7 +239,8 @@ function date_timezone_element_process($element, &$form_state, $form) {
   $label = theme('date_part_label_timezone', array('part_type' => 'select', 'element' => $element));
   $element['timezone'] = array(
     '#type' => 'select',
-    '#title' => $element['#date_label_position'] == 'above' ? $label : '',
+    '#title' => $label,
+    '#title_display' => $element['#date_label_position'] == 'above' ? 'before' : 'invisible',
     '#options' => date_timezone_names($element['#required']),
     '#value' => $element['#value'],
     '#weight' => $element['#weight'],
@@ -320,6 +321,8 @@ function date_text_element_process($element, &$form_state, $form) {
   $element['date']['#weight'] = !empty($element['date']['#weight']) ? $element['date']['#weight'] : $element['#weight'];
   $element['date']['#attributes'] = array('class' => isset($element['#attributes']['class']) ? $element['#attributes']['class'] += array('date-date') : array('date-date'));
   $now = date_example_date();
+  $element['date']['#title'] = t('Date');
+  $element['date']['#title_display'] = 'invisible';
   $element['date']['#description'] = ' ' . t('Format: @date', array('@date' => date_format_date(date_example_date(), 'custom', $element['#date_format'])));
   $element['date']['#ajax'] = !empty($element['#ajax']) ? $element['#ajax'] : FALSE;
 
@@ -585,6 +588,8 @@ function date_parts_element($element, $date, $format) {
       $sub_element[$field]['#type'] = 'textfield';
       $sub_element[$field]['#theme'] = 'date_textfield_element';
       $sub_element[$field]['#size'] = 7;
+      $sub_element[$field]['#title'] = $label;
+      $sub_element[$field]['#title_display'] = in_array($element['#date_label_position'], array('within', 'none')) ? 'invisible' : 'before';
       if ($element['#date_label_position'] == 'within') {
         if (!empty($sub_element[$field]['#options']) && is_array($sub_element[$field]['#options'])) {
           $sub_element[$field]['#options'] = array(
@@ -594,20 +599,16 @@ function date_parts_element($element, $date, $format) {
           $sub_element[$field]['#default_value'] = '-' . $label;
         }
       }
-      elseif ($element['#date_label_position'] != 'none') {
-        $sub_element[$field]['#title'] = $label;
-      }
     }
     else {
       $sub_element[$field]['#type'] = 'select';
       $sub_element[$field]['#theme'] = 'date_select_element';
+      $sub_element[$field]['#title'] = $label;
+      $sub_element[$field]['#title_display'] = in_array($element['#date_label_position'], array('within', 'none')) ? 'invisible' : 'before';
       if ($element['#date_label_position'] == 'within') {
         $sub_element[$field]['#options'] = array(
           '' => '-' . $label) + $sub_element[$field]['#options'];
       }
-      elseif ($element['#date_label_position'] != 'none') {
-        $sub_element[$field]['#title'] = $label;
-      }
     }
   }
 
@@ -621,9 +622,12 @@ function date_parts_element($element, $date, $format) {
   }
 
   if (($hours_format == 'g' || $hours_format == 'h') && date_has_time($granularity)) {
+    $label = theme('date_part_label_ampm', array('part_type' => 'ampm', 'element' => $element));
     $sub_element['ampm'] = array(
       '#type' => 'select',
       '#theme' => 'date_select_element',
+      '#title' => $label,
+      '#title_display' => in_array($element['#date_label_position'], array('within', 'none')) ? 'invisible' : 'before',
       '#default_value' => is_object($date) ? (date_format($date, 'G') >= 12 ? 'pm' : 'am') : '',
       '#options' => drupal_map_assoc(date_ampm($part_required)),
       '#required' => $part_required,
@@ -631,10 +635,7 @@ function date_parts_element($element, $date, $format) {
       '#attributes' => array('class' => array('date-ampm')),
     );
     if ($element['#date_label_position'] == 'within') {
-      $sub_element['ampm']['#options'] = array('' => '-' . theme('date_part_label_ampm', array('part_type' => 'ampm', 'eleement' => $element))) + $sub_element['ampm']['#options'];
-    }
-    elseif ($element['#date_label_position'] != 'none') {
-      $sub_element['ampm']['#title'] = theme('date_part_label_ampm', array('part_type' => 'ampm', 'element' => $element));
+      $sub_element['ampm']['#options'] = array('' => '-' . $label) + $sub_element['ampm']['#options'];
     }
   }
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api_sql.inc b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api_sql.inc
index a2adc65..e02f050 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api_sql.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_api/date_api_sql.inc
@@ -20,9 +20,8 @@
  *   Correct sql string for database type.
  */
 function date_sql_concat($array) {
-  switch (db_driver()) {
+  switch (Database::getConnection()->databaseType()) {
     case 'mysql':
-    case 'mysqli':
       return "CONCAT(" . implode(",", $array) . ")";
     case 'pgsql':
       return implode(" || ", $array);
@@ -39,9 +38,8 @@ function date_sql_concat($array) {
  *   SQL statement to return the first non-NULL value in the list.
  */
 function date_sql_coalesce($array) {
-  switch (db_driver()) {
+  switch (Database::getConnection()->databaseType()) {
     case 'mysql':
-    case 'mysqli':
     case 'pgsql':
       return "COALESCE(" . implode(',', $array) . ")";
   }
@@ -89,7 +87,7 @@ class date_sql_handler {
    * The object constuctor.
    */
   function __construct($date_type = DATE_DATETIME, $local_timezone = NULL, $offset = '+00:00') {
-    $this->db_type = db_driver();
+    $this->db_type = Database::getConnection()->databaseType();
     $this->date_type = $date_type;
     $this->db_timezone = 'UTC';
     $this->local_timezone = isset($local_timezone) ? $local_timezone : date_default_timezone();
@@ -105,7 +103,6 @@ class date_sql_handler {
       $has_support = FALSE;
       switch ($this->db_type) {
         case 'mysql':
-        case 'mysqli':
           $test = db_query("SELECT CONVERT_TZ('2008-02-15 12:00:00', 'UTC', 'US/Central')")->fetchField();
           if ($test == '2008-02-15 06:00:00') {
             $has_support = TRUE;
@@ -141,11 +138,10 @@ class date_sql_handler {
    */
   function set_db_timezone($offset = '+00:00') {
     static $already_set = FALSE;
-    $type = db_driver();
+    $type = Database::getConnection()->databaseType();
     if (!$already_set) {
       switch ($type) {
         case 'mysql':
-        case 'mysqli':
           db_query("SET @@session.time_zone = '$offset'");
           break;
         case 'pgsql':
@@ -199,7 +195,6 @@ class date_sql_handler {
     }
     switch ($this->db_type) {
       case 'mysql':
-      case 'mysqli':
         switch ($this->date_type) {
           case DATE_UNIX:
             $field = "FROM_UNIXTIME($field)";
@@ -258,7 +253,6 @@ class date_sql_handler {
     if (!empty($offset)) {
       switch ($this->db_type) {
         case 'mysql':
-        case 'mysqli':
           return "ADDTIME($field, SEC_TO_TIME($offset))";
         case 'pgsql':
           return "($field + INTERVAL '$offset SECONDS')";;
@@ -288,7 +282,6 @@ class date_sql_handler {
     $granularity = strtoupper($granularity);
     switch ($this->db_type) {
       case 'mysql':
-      case 'mysqli':
         switch ($direction) {
           case 'ADD':
             return "DATE_ADD($field, INTERVAL $count $granularity)";
@@ -358,7 +351,6 @@ class date_sql_handler {
     else {
       switch ($this->db_type) {
         case 'mysql':
-        case 'mysqli':
           return "CONVERT_TZ($field, $db_zone, $localzone)";
         case 'pgsql':
           // WITH TIME ZONE assumes the date is using the system
@@ -382,7 +374,6 @@ class date_sql_handler {
   function sql_format($format, $field) {
     switch ($this->db_type) {
       case 'mysql':
-      case 'mysqli':
         $replace = array(
           'Y' => '%Y',
           'y' => '%y',
@@ -553,7 +544,6 @@ class date_sql_handler {
       case 'WEEK':
         switch ($this->db_type) {
           case 'mysql':
-          case 'mysqli':
             // WEEK using arg 3 in MySQl should return the same value as
             // Postgres EXTRACT.
             return "WEEK($field, 3)";
@@ -563,7 +553,6 @@ class date_sql_handler {
       case 'DOW':
         switch ($this->db_type) {
           case 'mysql':
-          case 'mysqli':
             // MySQL returns 1 for Sunday through 7 for Saturday, PHP date
             // functions and Postgres use 0 for Sunday and 6 for Saturday.
             return "INTEGER(DAYOFWEEK($field) - 1)";
@@ -573,7 +562,6 @@ class date_sql_handler {
       case 'DOY':
         switch ($this->db_type) {
           case 'mysql':
-          case 'mysqli':
             return "DAYOFYEAR($field)";
           case 'pgsql':
             return "EXTRACT(DOY FROM($field))";
@@ -896,30 +884,30 @@ class date_sql_handler {
     }
     $formats = array('display', 'sql');
     // Start with the site long date format and add seconds to it.
-    $long = str_replace(':i', ':i:s', variable_get('date_format_long', 'l, F j, Y - H:i'));
+    $short = str_replace(':i', ':i:s', variable_get('date_format_short', 'l, F j, Y - H:i'));
     switch ($granularity) {
       case 'year':
         $formats['display'] = 'Y';
         $formats['sql'] = 'Y';
         break;
       case 'month':
-        $formats['display'] = date_limit_format($long, array('year', 'month'));
+        $formats['display'] = date_limit_format($short, array('year', 'month'));
         $formats['sql'] = 'Y-m';
         break;
       case 'day':
-        $formats['display'] = date_limit_format($long, array('year', 'month', 'day'));
+        $formats['display'] = date_limit_format($short, array('year', 'month', 'day'));
         $formats['sql'] = 'Y-m-d';
         break;
       case 'hour':
-        $formats['display'] = date_limit_format($long, array('year', 'month', 'day', 'hour'));
+        $formats['display'] = date_limit_format($short, array('year', 'month', 'day', 'hour'));
         $formats['sql'] = 'Y-m-d\TH';
         break;
       case 'minute':
-        $formats['display'] = date_limit_format($long, array('year', 'month', 'day', 'hour', 'minute'));
+        $formats['display'] = date_limit_format($short, array('year', 'month', 'day', 'hour', 'minute'));
         $formats['sql'] = 'Y-m-d\TH:i';
         break;
       case 'second':
-        $formats['display'] = date_limit_format($long, array('year', 'month', 'day', 'hour', 'minute', 'second'));
+        $formats['display'] = date_limit_format($short, array('year', 'month', 'day', 'hour', 'minute', 'second'));
         $formats['sql'] = 'Y-m-d\TH:i:s';
         break;
       case 'week':
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_context/date_context.info b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_context/date_context.info
index a69a599..5f4a042 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_context/date_context.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_context/date_context.info
@@ -8,9 +8,9 @@ dependencies[] = context
 
 files[] = date_context.module
 files[] = plugins/date_context_date_condition.inc
-; Information added by drupal.org packaging script on 2012-08-13
-version = "7.x-2.6"
+; Information added by Drupal.org packaging script on 2013-12-21
+version = "7.x-2.7"
 core = "7.x"
 project = "date"
-datestamp = "1344850024"
+datestamp = "1387659206"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_context/plugins/date_context_date_condition.inc b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_context/plugins/date_context_date_condition.inc
index 733fb5a..573b035 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_context/plugins/date_context_date_condition.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_context/plugins/date_context_date_condition.inc
@@ -41,7 +41,7 @@ class date_context_date_condition extends context_condition_node {
       '#description' => t("The value the field should contain to meet the condition. This can either be an absolute date in ISO format (YYYY-MM-DDTHH:MM:SS) or a relative string like '12AM today'. Examples: 2011-12-31T00:00:00, now, now +1 day, 12AM today, Monday next week. <a href=\"@relative_format\">More examples of relative date formats in the PHP documentation</a>.", array('@relative_format' => 'http://www.php.net/manual/en/datetime.formats.relative.php')),
       '#default_value' => isset($defaults['value']) ? $defaults['value'] : '',
       '#process' => array('ctools_dependent_process'),
-      '#dependency' => array(':input[name="conditions[plugins][date_context_date_condition][options][operation]"]' => array('<', '<=', '>', '>=', '=', '!=')),
+      '#dependency' => array('edit-conditions-plugins-date-context-date-condition-options-operation' => array('<', '<=', '>', '>=', '=', '!=')),
     );
     return $form;
   }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_elements.inc b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_elements.inc
index 20620ed..4303d13 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_elements.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_elements.inc
@@ -77,7 +77,7 @@ function date_field_widget_form(&$form, &$form_state, $field, $instance, $langco
   // lose all but the first value by doing this, so store the original values in case we need to replace them later.
   if (!empty($field['settings']['repeat'])) {
     if ($delta == 0) {
-      $form['#after_build'] = array('date_repeat_after_build');
+      $form['#after_build'][] = 'date_repeat_after_build';
       $form_state['storage']['repeat_fields'][$field_name] = array_merge($form['#parents'], array($field_name));
       $form_state['storage']['date_items'][$field_name][$langcode] = $items;
     }
@@ -320,7 +320,7 @@ function date_combo_element_process($element, &$form_state, $form) {
     '#field'         => $field,
     '#instance'      => $instance,
     '#weight'        => $instance['widget']['weight'],
-    '#required'      => ($instance['required'] && $delta == 0) ? 1 : 0,
+    '#required'      => ($element['#required'] && $delta == 0) ? 1 : 0,
     '#default_value' => isset($element['#default_value'][$from_field]) ? $element['#default_value'][$from_field] : '',
     '#delta'         => $delta,
     '#date_timezone' => $element['#date_timezone'],
@@ -331,7 +331,8 @@ function date_combo_element_process($element, &$form_state, $form) {
     '#date_label_position' => $instance['widget']['settings']['label_position'],
     );
 
-  $description =  !empty($instance['description']) ? t($instance['description']) : '';
+  $description =  !empty($element['#description']) ? t($element['#description']) : '';
+  unset($element['#description']);
 
   // Give this element the right type, using a Date API
   // or a Date Popup element type.
@@ -363,8 +364,8 @@ function date_combo_element_process($element, &$form_state, $form) {
   // is the 'Start' and which is the 'End' .
 
   if (!empty($field['settings']['todate'])) {
-    $element[$from_field]['#title'] = '';
     $element[$to_field] = $element[$from_field];
+    $element[$from_field]['#title_display'] = 'none';
     $element[$to_field]['#title'] = t('to:');
     $element[$from_field]['#wrapper_attributes']['class'][] = 'start-date-wrapper';
     $element[$to_field]['#wrapper_attributes']['class'][] = 'end-date-wrapper';
@@ -451,8 +452,8 @@ function date_combo_validate($element, &$form_state) {
     return;
   }
 
-  $item = $form_values[$field_name][$langcode][$delta];
-  $posted = $form_input[$field_name][$langcode][$delta];
+  $item = drupal_array_get_nested_value($form_state['values'], $element['#parents']);
+  $posted = drupal_array_get_nested_value($form_state['input'], $element['#parents']);
 
   $field = field_widget_field($element, $form_state);
   $instance = field_widget_instance($element, $form_state);
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date.migrate.inc b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date.migrate.inc
deleted file mode 100644
index 637a626..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date.migrate.inc
+++ /dev/null
@@ -1,175 +0,0 @@
-<?php
-
-/**
- * @file
- * Support for migration into Date fields.
- */
-
-class DateMigrateFieldHandler extends MigrateFieldHandler {
-
-  /**
-   * Declares the types of fields used.
-   */
-  public function __construct() {
-    $this->registerTypes(array('date', 'datestamp', 'datetime'));
-  }
-
-  /**
-   * Arguments for a date field migration.
-   *
-   * @param string $timezone
-   *   Timezone (such as UTC, America/New_York, etc.) to apply.
-   * @param string $timezone_db
-   *   Timezone_db value for the field.
-   * @param string $rrule
-   *   Rule string for a repeating date field.
-   * @param string $language
-   *   Language of the text (defaults to destination language)
-   *
-   * @return array
-   *   An array of the defined variables in this scope.
-   */
-  static function arguments($timezone = 'UTC', $timezone_db = 'UTC', $rrule = NULL, $language = NULL) {
-    return get_defined_vars();
-  }
-
-  /**
-   * Converts incoming data into the proper field arrays for Date fields.
-   *
-   * @param object $entity
-   *   The destination entity which will hold the field arrays.
-   * @param array $field_info
-   *   Metadata for the date field being populated.
-   * @param array $instance
-   *   Metadata for this instance of the date field being populated.
-   * @param array $values
-   *   Array of date values to be fielded.
-   *
-   * @return array|null
-   *   An array of date fields.
-   */
-  public function prepare($entity, array $field_info, array $instance, array $values) {
-    if (isset($values['arguments'])) {
-      $arguments = $values['arguments'];
-      unset($values['arguments']);
-    }
-    else {
-      $arguments = array();
-    }
-
-    if (isset($arguments['timezone'])) {
-      $default_timezone = $arguments['timezone'];
-    }
-    else {
-      $default_timezone = 'UTC';
-    }
-    if (isset($arguments['timezone_db'])) {
-      $default_timezone_db = $arguments['timezone_db'];
-    }
-    else {
-      $default_timezone_db = NULL;
-    }
-    if (isset($arguments['rrule'])) {
-      $default_rrule = $arguments['rrule'];
-    }
-    else {
-      $default_rrule = NULL;
-    }
-    $language = $this->getFieldLanguage($entity, $field_info, $arguments);
-
-    // Setup the standard Field API array for saving.
-    $delta = 0;
-    foreach ($values as $from) {
-      // Set defaults.
-      $to = NULL;
-      $timezone = $default_timezone;
-      $timezone_db = $default_timezone_db;
-      $rrule = $default_rrule;
-
-      // Is the value a straight datetime value, or JSON containing a set of
-      // properties?
-      if (!empty($from) && $from{0} == '{') {
-        $properties = drupal_json_decode($from);
-        $from = $properties['from'];
-        // Properties passed in with the date override any set via arguments.
-        if (!empty($properties['to'])) {
-          $to = $properties['to'];
-        }
-        if (!empty($properties['timezone'])) {
-          $timezone = $properties['timezone'];
-        }
-        if (!empty($properties['timezone_db'])) {
-          $timezone_db = $properties['timezone_db'];
-        }
-        if (!empty($properties['rrule'])) {
-          $rrule = $properties['rrule'];
-        }
-      }
-
-      // Missing data? Create an empty value and return;
-      // Don't try to turn the empty value into a bogus
-      // timestamp for 'now'.
-      if (empty($from)) {
-        $return[$language][$delta]['value'] = NULL;
-        if (!empty($field_info['settings']['todate'])) {
-          $return[$language][$delta]['value2'] = NULL;
-        }
-        return $return;
-      }
-
-      // If there is no 'to' date, just use the 'from' date.
-      if (!empty($field_info['settings']['todate']) && empty($to)) {
-        $to = $from;
-      }
-
-      // If we have a value, work from a timestamp.
-      $from = MigrationBase::timestamp($from);
-      if ($to) {
-        $to = MigrationBase::timestamp($to);
-      }
-
-      // What does the destination field expect?
-      switch ($field_info['type']) {
-        case 'datestamp':
-          // Already done.
-          break;
-        case 'datetime':
-          // YYYY-MM-DD HH:MM:SS.
-          $from = format_date($from, 'custom', 'Y-m-d H:i:s', $timezone);
-          if ($to) {
-            $to = format_date($to, 'custom', 'Y-m-d H:i:s', $timezone);
-          }
-          break;
-        case 'date':
-          // ISO date: YYYY-MM-DDTHH:MM:SS.
-          $from = format_date($from, 'custom', 'Y-m-d\TH:i:s', $timezone);
-          if ($to) {
-            $to = format_date($to, 'custom', 'Y-m-d\TH:i:s', $timezone);
-          }
-          break;
-        default:
-          break;
-      }
-
-      // Handle repeats, coming in as RRULEs. Many field instances may be
-      // created.
-      if (function_exists('date_repeat_build_dates') && !empty($field_info['settings']['repeat']) && $rrule) {
-        include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'date_api') . '/date_api_ical.inc';
-        $item = array('value' => $from, 'value2' => $to, 'timezone' => $timezone);
-        // Can be de-uglified when http://drupal.org/node/1159404 is committed.
-        $return[$language] = date_repeat_build_dates(NULL, date_ical_parse_rrule($field_info, $rrule), $field_info, $item);
-      }
-      else {
-        $return[$language][$delta]['value'] = $from;
-        if (!empty($to)) {
-          $return[$language][$delta]['value2'] = $to;
-        }
-      }
-      $delta++;
-    }
-    if (!isset($return)) {
-      $return = NULL;
-    }
-    return $return;
-  }
-}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate.info b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate.info
index c0d536f..7cd23a4 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate.info
@@ -1,16 +1,12 @@
 name = Date Migration
-description = Provides support for importing into date fields with the Migrate module.
+description = Obsolete data migration module. Disable if no other modules depend on it.
 core = 7.x
 package = Date/Time
+hidden = TRUE
 
-dependencies[] = migrate
-dependencies[] = date
-files[] = date.migrate.inc
-files[] = date_migrate.test
-
-; Information added by drupal.org packaging script on 2012-08-13
-version = "7.x-2.6"
+; Information added by Drupal.org packaging script on 2013-12-21
+version = "7.x-2.7"
 core = "7.x"
 project = "date"
-datestamp = "1344850024"
+datestamp = "1387659206"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate.module b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate.module
index accdcf8..158791a 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate.module
@@ -2,15 +2,5 @@
 
 /**
  * @file
- * Migration integration for Date Migrate.
+ * Obsolete migration integration for Date - now in Date itself.
  */
-
-/**
- * Implements hook_migrate_api().
- */
-function date_migrate_migrate_api() {
-  $api = array(
-    'api' => 2,
-  );
-  return $api;
-}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate.test b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate.test
deleted file mode 100644
index 400b2d2..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate.test
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-
-/**
- * @file
- * Test for using date fields with Migrate module.
- */
-
-/**
- * Test date migration.
- */
-class DateMigrateExampleUnitTest extends DrupalWebTestCase {
-
-  /**
-   * Provides information about this test.
-   */
-  public static function getInfo() {
-    return array(
-      'name' => 'Date2 migration',
-      'description' => 'Testing migration of date fields',
-      'group' => 'Migrate',
-    );
-  }
-
-  /**
-   * Declars the module dependencies for the test.
-   */
-  function setUp() {
-    parent::setUp('migrate', 'features', 'date', 'date_repeat', 'date_repeat_field', 'date_migrate_example');
-  }
-
-  /**
-   * Verify that date fields are imported correctly. When no timezone is
-   * explicitly provided with the source data, we want the displayed time on the
-   * Drupal site to match that in the source data. To validate that, we make
-   * sure we have set a consistent timezone at the PHP and Drupal levels, and
-   * that the format used on the page is not locale-dependent (no day or month
-   * names). Then, we can just look for the desired date/time strings in the
-   * node page.
-   */
-  function testDateImport() {
-    date_default_timezone_set('America/Los_Angeles');
-    variable_set('date_default_timezone', 'America/Los_Angeles');
-    variable_set('date_format_medium', 'Y-m-d H:i');
-    $migration = Migration::getInstance('DateExample');
-    $result = $migration->processImport();
-    $this->assertEqual($result, Migration::RESULT_COMPLETED, t('Variety term import returned RESULT_COMPLETED'));
-    $rawnodes = node_load_multiple(FALSE, array('type' => 'date_migrate_example'), TRUE);
-    $this->assertEqual(count($rawnodes), 2, t('Two sample nodes created'));
-    $node = reset($rawnodes);
-    $this->drupalGet('/node/' . $node->nid);
-    $this->assertText('2011-05-12 19:43', t('Simple date field found'));
-    $this->assertText('2011-06-13 18:32 to 2011-07-23 10:32', t('Date range field found'));
-    $this->assertText('2011-07-22 12:13', t('Datestamp field found'));
-    $this->assertText('2011-08-01 00:00 to 2011-09-01 00:00', t('Datestamp range field found'));
-    $this->assertText('2011-11-18 15:00', t('Datetime field with +9 timezone found'));
-    $this->assertText('2011-10-30 14:43 to 2011-12-31 17:59', t('Datetime range field with -5 timezone found'));
-    $this->assertText('2011-11-25 09:01', t('First date repeat instance found'));
-    $this->assertText('2011-12-09 09:01', t('Second date repeat instance found'));
-    $this->assertNoText('2011-12-23 09:01', t('Skipped date repeat instance not found'));
-    $this->assertText('2012-05-11 09:01', t('Last date repeat instance found'));
-    $node = next($rawnodes);
-    $this->drupalGet('/node/' . $node->nid);
-    $this->assertText('2012-06-21 15:32', t('First date value found'));
-    $this->assertText('2012-12-02 11:08', t('Second date value found'));
-    $this->assertText('2004-02-03 01:15', t('Start for first date range found'));
-    $this->assertText('2005-03-04 22:11', t('End for first date range found'));
-    $this->assertText('2014-09-01 17:21', t('Start for second date range found'));
-    $this->assertText('2015-12-23 00:01', t('End for first second range found'));
-  }
-}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate_example/date_migrate_example.info b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate_example/date_migrate_example.info
index b54a3f7..e5bbc8a 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate_example/date_migrate_example.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate_example/date_migrate_example.info
@@ -2,7 +2,6 @@ core = "7.x"
 dependencies[] = "date"
 dependencies[] = "date_repeat"
 dependencies[] = "date_repeat_field"
-dependencies[] = "date_migrate"
 dependencies[] = "features"
 dependencies[] = "migrate"
 description = "Examples of migrating with the Date module"
@@ -21,9 +20,9 @@ package = "Features"
 project = "date_migrate_example"
 version = "7.x-2.0"
 
-; Information added by drupal.org packaging script on 2012-08-13
-version = "7.x-2.6"
+; Information added by Drupal.org packaging script on 2013-12-21
+version = "7.x-2.7"
 core = "7.x"
 project = "date"
-datestamp = "1344850024"
+datestamp = "1387659206"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate_example/date_migrate_example.migrate.inc b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate_example/date_migrate_example.migrate.inc
index 491c27f..fcc2a22 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate_example/date_migrate_example.migrate.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate_example/date_migrate_example.migrate.inc
@@ -13,8 +13,8 @@ class DateExampleMigration extends XMLMigration {
   /**
    * Sets up the migration.
    */
-  public function __construct() {
-    parent::__construct();
+  public function __construct($arguments = array()) {
+    parent::__construct($arguments);
     $this->description = t('Example migration into date fields');
 
     $this->map = new MigrateSQLMap($this->machineName,
@@ -66,28 +66,34 @@ class DateExampleMigration extends XMLMigration {
 
     // For date ranges, we add the "end" value in prepareRow() below.
     $this->addFieldMapping('field_date_range', 'date_range_from');
+    $this->addFieldMapping('field_date_range:to', 'date_range_to');
 
     // RRULEs on repeat fields are also done in prepareRow().
     $this->addFieldMapping('field_date_repeat', 'date_repeat');
+    $this->addFieldMapping('field_date_repeat:rrule', 'date_repeat_rrule');
 
     $this->addFieldMapping('field_datestamp', 'datestamp')
       ->xpath('datestamp');
     $this->addFieldMapping('field_datestamp_range', 'datestamp_range_from');
+    $this->addFieldMapping('field_datestamp_range:to', 'datestamp_range_to');
 
     // You can specify a timezone to be applied to all values going into the
     // field (Tokyo is UTC+9, no DST)
-    $arguments = DateMigrateFieldHandler::arguments('Asia/Tokyo');
     $this->addFieldMapping('field_datetime', 'datetime')
-      ->xpath('datetime')
-      ->arguments($arguments);
+      ->xpath('datetime');
+    $this->addFieldMapping('field_datetime:timezone')
+      ->defaultValue('Asia/Tokyo');
 
     // You can also get the timezone from the source data - it can be different
     // for each instance of the field. Like To and RRULE values, it is added
     // in prepareRow().
     $this->addFieldMapping('field_datetime_range', 'datetime_range_from');
+    $this->addFieldMapping('field_datetime_range:to', 'datetime_range_to');
+    $this->addFieldMapping('field_datetime_range:timezone', 'datetime_range_timezone');
 
     // Unmapped destination fields.
-    $this->addUnmigratedDestinations(array('is_new', 'status', 'promote', 'revision', 'language', 'sticky', 'created', 'changed', 'revision_uid'));
+    $this->addUnmigratedDestinations(array('is_new', 'status', 'promote',
+      'revision', 'language', 'sticky', 'created', 'changed', 'revision_uid'));
   }
 
   /**
@@ -101,30 +107,25 @@ class DateExampleMigration extends XMLMigration {
     // The date range field can have multiple values.
     $current_row->date_range_from = array();
     foreach ($current_row->xml->date_range as $range) {
-      $date_data = array(
-        'from' => (string) $range->from[0],
-        'to' => (string) $range->to[0],
-      );
-      $current_row->date_range_from[] = drupal_json_encode($date_data);
+      $current_row->date_range_from[] = (string)$range->from[0];
+      $current_row->date_range_to[] = (string)$range->to[0];
     }
 
-    $date_data = array(
-      'from' => (string) $current_row->xml->datestamp_range->from[0],
-      'to' => (string) $current_row->xml->datestamp_range->to[0],
-    );
-    $current_row->datestamp_range_from = drupal_json_encode($date_data);
-
-    $date_data = array(
-      'from' => (string) $current_row->xml->datetime_range->from[0],
-      'to' => (string) $current_row->xml->datetime_range->to[0],
-      'timezone' => (string) $current_row->xml->datetime_range->timezone[0],
-    );
-    $current_row->datetime_range_from = drupal_json_encode($date_data);
-
-    $date_data = array(
-      'from' => (string) $current_row->xml->date_repeat->date[0],
-      'rrule' => (string) $current_row->xml->date_repeat->rule[0],
-    );
-    $current_row->date_repeat = drupal_json_encode($date_data);
+    $current_row->datestamp_range_from =
+      (string) $current_row->xml->datestamp_range->from[0];
+    $current_row->datestamp_range_to =
+      (string) $current_row->xml->datestamp_range->to[0];
+
+    $current_row->datetime_range_from =
+      (string) $current_row->xml->datetime_range->from[0];
+    $current_row->datetime_range_to =
+      (string) $current_row->xml->datetime_range->to[0];
+    $current_row->datetime_range_timezone =
+      (string) $current_row->xml->datetime_range->timezone[0];
+
+    $current_row->date_repeat =
+      (string) $current_row->xml->date_repeat->date[0];
+    $current_row->date_repeat_rrule =
+      (string) $current_row->xml->date_repeat->rule[0];
   }
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate_example/date_migrate_example.module b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate_example/date_migrate_example.module
index 993bd11..2ed7a61 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate_example/date_migrate_example.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_migrate/date_migrate_example/date_migrate_example.module
@@ -13,6 +13,9 @@ include_once 'date_migrate_example.features.inc';
 function date_migrate_example_migrate_api() {
   $api = array(
     'api' => 2,
+    'migrations' => array(
+      'DateExample' => array('class_name' => 'DateExampleMigration')
+    ),
   );
   return $api;
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_popup/README.txt b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_popup/README.txt
index 149810f..7a66628 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_popup/README.txt
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_popup/README.txt
@@ -18,7 +18,7 @@ Timepicker
 ================================================================================
 
 There are three ways to let users select time in the Date Popup widgets.
-You can choose between them by going to admin/config/content/date_popup.
+You can choose between them by going to admin/config/date/date_popup.
 
 The options are:
 
@@ -99,10 +99,10 @@ Example:
 
 $form['date'] = array(
   '#type' => 'date_popup',
-  '#default_value' => '2007-01-01 10:30:00,
+  '#default_value' => '2007-01-01 10:30:00',
   '#date_type' => DATE_DATETIME,
   '#date_timezone' => date_default_timezone(),
-  '#date_format' => 'm/d/Y - H:i',
+  '#date_format' => 'm-d-Y H:i',
   '#date_increment' => 1,
   '#date_year_range' => '-3:+3',
 );
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_popup/date_popup.info b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_popup/date_popup.info
index 767aaca..cdaf48e 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_popup/date_popup.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_popup/date_popup.info
@@ -7,9 +7,9 @@ configure = admin/config/date/date_popup
 
 stylesheets[all][] = themes/datepicker.1.7.css
 
-; Information added by drupal.org packaging script on 2012-08-13
-version = "7.x-2.6"
+; Information added by Drupal.org packaging script on 2013-12-21
+version = "7.x-2.7"
 core = "7.x"
 project = "date"
-datestamp = "1344850024"
+datestamp = "1387659206"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_popup/date_popup.module b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_popup/date_popup.module
index ca292ef..a2d0ebb 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_popup/date_popup.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_popup/date_popup.module
@@ -87,7 +87,7 @@ function date_popup_library() {
       $path . '/jquery.timeentry.pack.js' => array(),
     ),
     'css' => array(
-      $path . '/themes/jquery.timeentry.css' => array('preprocess' => FALSE),
+      $path . '/themes/jquery.timeentry.css' => array(),
     ),
   );
   return $libraries;
@@ -352,7 +352,8 @@ function date_popup_process_date_part(&$element) {
   $parents = array_merge($element['#parents'], array('date'));
   $sub_element = array(
     '#type' => 'textfield',
-    '#title' => $element['#date_label_position'] == 'above' ? theme('date_part_label_date', array('part_type' => 'date', 'element' => $element)) : '',
+    '#title' => theme('date_part_label_date', array('part_type' => 'date', 'element' => $element)),
+    '#title_display' => $element['#date_label_position'] == 'above' ? 'before' : 'invisible',
     '#default_value' => $element['#value']['date'],
     '#id' => $id,
     '#input' => FALSE,
@@ -427,7 +428,8 @@ function date_popup_process_time_part(&$element) {
   $parents = array_merge($element['#parents'], array('time'));
   $sub_element = array(
     '#type' => 'textfield',
-    '#title' => $element['#date_label_position'] == 'above' ? theme('date_part_label_time', array('part_type' => 'time', 'element' => $element)) : '',
+    '#title' => theme('date_part_label_time', array('part_type' => 'time', 'element' => $element)),
+    '#title_display' => $element['#date_label_position'] == 'above' ? 'before' : 'invisible',
     '#default_value' => $element['#value']['time'],
     '#id' => $id,
     '#size' => 15,
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat/date_repeat.info b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat/date_repeat.info
index 1d1720a..d42bec9 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat/date_repeat.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat/date_repeat.info
@@ -7,9 +7,9 @@ php = 5.2
 files[] = tests/date_repeat.test
 files[] = tests/date_repeat_form.test
 
-; Information added by drupal.org packaging script on 2012-08-13
-version = "7.x-2.6"
+; Information added by Drupal.org packaging script on 2013-12-21
+version = "7.x-2.7"
 core = "7.x"
 project = "date"
-datestamp = "1344850024"
+datestamp = "1387659206"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat/date_repeat_form.inc b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat/date_repeat_form.inc
index 9cef000..db7a79b 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat/date_repeat_form.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat/date_repeat_form.inc
@@ -941,7 +941,6 @@ function theme_date_repeat_current_additions($rows = array()) {
  */
 function theme_date_repeat_rrule($vars) {
   $element = $vars['element'];
-  $class = $element['#date_repeat_collapsed'] ? array('date-no-float', 'collapsible', 'collapsed') : array('date-no-float', 'collapsible');
   $id = drupal_html_id('repeat-settings-fieldset');
   $parents = $element['#parents'];
   $selector = "{$parents[0]}[{$parents[1]}][{$parents[2]}][show_repeat_settings]";
@@ -949,11 +948,10 @@ function theme_date_repeat_rrule($vars) {
     '#type' => 'item',
     '#title' => t('Repeat settings'),
     '#title_display' => 'invisible',
-    '#attributes' => array('class' => $class),
     '#markup' => $element['#children'],
     '#states' => array(
-      'visible' => array(
-        ":input[name=\"{$selector}\"]" => array('checked' => TRUE),
+      'invisible' => array(
+        ":input[name=\"{$selector}\"]" => array('checked' => FALSE),
       ),
     ),
     '#id' => $id,
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat_field/date_repeat_field.info b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat_field/date_repeat_field.info
index 803105c..90d556c 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat_field/date_repeat_field.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat_field/date_repeat_field.info
@@ -7,9 +7,9 @@ stylesheets[all][] = date_repeat_field.css
 package = Date/Time
 core = 7.x
 
-; Information added by drupal.org packaging script on 2012-08-13
-version = "7.x-2.6"
+; Information added by Drupal.org packaging script on 2013-12-21
+version = "7.x-2.7"
 core = "7.x"
 project = "date"
-datestamp = "1344850024"
+datestamp = "1387659206"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat_field/date_repeat_field.module b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat_field/date_repeat_field.module
index 675ed02..c04e13e 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat_field/date_repeat_field.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_repeat_field/date_repeat_field.module
@@ -55,7 +55,7 @@ function theme_date_repeat_display($vars) {
   $output = '';
   if (!empty($item['rrule'])) {
     $output = date_repeat_rrule_description($item['rrule']);
-    $output = '<div>' . $output . '</div>';
+    $output = '<div class="date-repeat-rule">' . $output . '</div>';
   }
   return $output;
 }
@@ -346,15 +346,8 @@ function date_repeat_field_widget_validate($element, &$form_state) {
   // the repeating dates, wipe out the previous values, and populate the
   // field with the new values.
 
-  // TODO
-  // Is it right to not do anything unless there are changes? Will that
-  // confuse anyone? Commenting that out for now...
   $rrule = $item['rrule'];
-  if (!empty($rrule)
-    //&& ($rrule != $element['rrule']['#prev_rrule']
-    //|| $item['value'] != $element['rrule']['#prev_value']
-    //|| $item['value2'] != $element['rrule']['#prev_value2'])
-    ) {
+  if (!empty($rrule)) {
 
     // Avoid undefined index problems on dates that don't have all parts.
     $possible_items = array('value', 'value2', 'timezone', 'offset', 'offset2');
@@ -514,9 +507,6 @@ function date_repeat_field_date_combo_process_alter(&$element, &$form_state, $co
       '#date_increment'   => $instance['widget']['settings']['increment'],
       '#date_year_range'  => $instance['widget']['settings']['year_range'],
       '#date_label_position' => $instance['widget']['settings']['label_position'],
-      '#prev_value' => isset($item['value']) ? $item['value'] : '',
-      '#prev_value2' => isset($item['value2']) ? $item['value2'] : '',
-      '#prev_rrule' => isset($item['rrule']) ? $item['rrule'] : '',
       '#date_repeat_widget' => str_replace('_repeat', '', $instance['widget']['type']),
       '#date_repeat_collapsed' => $instance['widget']['settings']['repeat_collapsed'],
       '#date_flexible' => 0,
@@ -626,6 +616,17 @@ function date_repeat_field_form_field_ui_field_edit_form_alter(&$form, &$form_st
     $form['field']['cardinality']['#disabled'] = TRUE;
     $form['field']['cardinality']['#value'] = FIELD_CARDINALITY_UNLIMITED;
   }
+  // Repeating dates need unlimited values, confirm that in element_validate.
+  $form['field']['#element_validate'] = array('date_repeat_field_set_cardinality');
+}
+
+/**
+ * Ensure the cardinality gets updated if the option to make a date repeating is checked.
+ */
+function date_repeat_field_set_cardinality($element, &$form_state) {
+  if (!empty($form_state['values']['field']['settings']['repeat'])) {
+    form_set_value($element['cardinality'], FIELD_CARDINALITY_UNLIMITED, $form_state);
+  }
 }
 
 /**
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_tools/date_tools.info b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_tools/date_tools.info
index 3f392a4..51b8691 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_tools/date_tools.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_tools/date_tools.info
@@ -6,9 +6,9 @@ core = 7.x
 configure = admin/config/date/tools
 files[] = tests/date_tools.test
 
-; Information added by drupal.org packaging script on 2012-08-13
-version = "7.x-2.6"
+; Information added by Drupal.org packaging script on 2013-12-21
+version = "7.x-2.7"
 core = "7.x"
 project = "date"
-datestamp = "1344850024"
+datestamp = "1387659206"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/date_views.info b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/date_views.info
index ef7da6c..4abeb60 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/date_views.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/date_views.info
@@ -9,13 +9,12 @@ files[] = includes/date_views_argument_handler.inc
 files[] = includes/date_views_argument_handler_simple.inc
 files[] = includes/date_views_filter_handler.inc
 files[] = includes/date_views_filter_handler_simple.inc
-files[] = includes/date_views.views_default.inc
 files[] = includes/date_views.views.inc
 files[] = includes/date_views_plugin_pager.inc
 
-; Information added by drupal.org packaging script on 2012-08-13
-version = "7.x-2.6"
+; Information added by Drupal.org packaging script on 2013-12-21
+version = "7.x-2.7"
 core = "7.x"
 project = "date"
-datestamp = "1344850024"
+datestamp = "1387659206"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/includes/date_views_argument_handler_simple.inc b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/includes/date_views_argument_handler_simple.inc
index faff05a..2d3fb7c 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/includes/date_views_argument_handler_simple.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/includes/date_views_argument_handler_simple.inc
@@ -85,7 +85,7 @@ class date_views_argument_handler_simple extends views_handler_argument_date {
     $options = parent::option_definition();
     $options['year_range'] = array('default' => '-3:+3');
     $options['granularity'] = array('default' => 'month');
-    $options['default_argument_type'] = array('default' => 'date');
+    $options['default_argument_type']['default'] = 'date';
     $options['add_delta'] = array('default' => '');
     $options['use_fromto'] = array('default' => '');
     $options['title_format'] = array('default' => '');
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/includes/date_views_filter_handler.inc b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/includes/date_views_filter_handler.inc
index 5eb5ebc..0cfc7fc 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/includes/date_views_filter_handler.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/includes/date_views_filter_handler.inc
@@ -36,6 +36,10 @@ class date_views_filter_handler extends date_views_filter_handler_simple {
     $this->date_combine_conditions('op_simple');
   }
 
+  function op_contains($field) {
+    $this->date_combine_conditions('op_contains');
+  }
+
   /**
    * Combines multiple date WHERE expressions into a single WHERE expression.
    *
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/includes/date_views_filter_handler_simple.inc b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/includes/date_views_filter_handler_simple.inc
index 8a46253..b84eac3 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/includes/date_views_filter_handler_simple.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/date_views/includes/date_views_filter_handler_simple.inc
@@ -42,6 +42,17 @@ class date_views_filter_handler_simple extends views_handler_filter_date {
     return $options;
   }
 
+  function operators() {
+    $operators = parent::operators();
+    $operators['contains'] = array(
+      'title' => t('Contains'),
+      'method' => 'op_contains',
+      'short' => t('contains'),
+      'values' => 1,
+    );
+    return $operators;
+  }
+
   /**
    * Helper function to find a default value.
    */
@@ -53,8 +64,8 @@ class date_views_filter_handler_simple extends views_handler_filter_date {
     // If this is a remembered value, use the value from the SESSION.
     if (!empty($this->options['expose']['remember'])) {
       $display_id = ($this->view->display_handler->is_defaulted('filters')) ? 'default' : $this->view->current_display;
-      if (!empty($_SESSION['views'][$this->view->name][$display_id]['date_filter'][$prefix])) {
-        return $_SESSION['views'][$this->view->name][$display_id]['date_filter'][$prefix];
+      if (!empty($_SESSION['views'][$this->view->name][$display_id][$this->options['expose']['identifier']][$prefix])) {
+        return $_SESSION['views'][$this->view->name][$display_id][$this->options['expose']['identifier']][$prefix];
       }
     }
 
@@ -104,8 +115,12 @@ class date_views_filter_handler_simple extends views_handler_filter_date {
       $element_input['value'] = $this->get_filter_value('value', !empty($element_input['value']) ? $element_input['value'] : '');
       $element_input['min'] = $this->get_filter_value('min', !empty($element_input['min']) ? $element_input['min'] : '');
       $element_input['max'] = $this->get_filter_value('max', !empty($element_input['max']) ? $element_input['max'] : '');
-      unset($element_input['default_date']);
-      unset($element_input['default_to_date']);
+      if (is_array($element_input) && isset($element_input['default_date'])) {
+        unset($element_input['default_date']);
+      }
+      if (is_array($element_input) && isset($element_input['default_to_date'])) {
+        unset($element_input['default_to_date']);
+      }
 
       $input[$this->options['expose']['identifier']] = $element_input;
     }
@@ -163,6 +178,29 @@ class date_views_filter_handler_simple extends views_handler_filter_date {
     $this->query->add_where_expression($group, "$field $this->operator $placeholder", array($placeholder => $value));
   }
 
+  function op_contains($field) {
+
+    // Add the delta field to the view so we can later find the value that matched our query.
+    list($table_name, $field_name) = explode('.', $field);
+    if (!empty($this->options['add_delta']) && (substr($field_name, -6) == '_value' || substr($field_name, -7) == '_value2')) {
+      $this->query->add_field($table_name, 'delta');
+    }
+
+    $value = $this->get_filter_value('value', $this->value['value']);
+    $comp_date = new DateObject($value, date_default_timezone(), $this->format);
+    $fields = date_views_fields($this->base_table);
+    $fields = $fields['name'];
+    $fromto = $fields[$field]['fromto'];
+    $field_min = $this->date_handler->sql_field($fromto[0], NULL, $comp_date);
+    $field_min = $this->date_handler->sql_format($this->format, $field_min);
+    $field_max = $this->date_handler->sql_field($fromto[1], NULL, $comp_date);
+    $field_max = $this->date_handler->sql_format($this->format, $field_max);
+    $placeholder_min = $this->placeholder();
+    $placeholder_max = $this->placeholder();
+    $group = !empty($this->options['date_group']) ? $this->options['date_group'] : $this->options['group'];
+    $this->query->add_where_expression($group, "$field_max >= $placeholder_min AND $field_min <= $placeholder_max", array($placeholder_min => $value, $placeholder_max => $value));
+  }
+
   /**
    * Set the granularity of the date parts to use in the filter.
     */
@@ -316,7 +354,7 @@ class date_views_filter_handler_simple extends views_handler_filter_date {
       $type = 'date_text';
     }
 
-    $format = $this->date_handler->views_formats($this->options['granularity'], 'sql');
+    $format = $this->date_handler->views_formats($this->options['granularity'], 'display');
     $granularity = array_keys($this->date_handler->date_parts($this->options['granularity']));
     $relative_value = ($prefix == 'max' ? $this->options['default_to_date'] : $this->options['default_date']);
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/date/tests/date_migrate.test b/kolab.org/www/drupal-7.18/sites/all/modules/date/tests/date_migrate.test
new file mode 100644
index 0000000..cdde115
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/date/tests/date_migrate.test
@@ -0,0 +1,80 @@
+<?php
+
+/**
+ * @file
+ * Test for using date fields with Migrate module.
+ */
+
+/**
+ * Test date migration.
+ */
+class DateMigrateExampleUnitTest extends DrupalWebTestCase {
+
+  /**
+   * Provides information about this test.
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'Date Migration',
+      'description' => 'Test migration into date fields',
+      'group' => 'Date',
+    );
+  }
+
+  /**
+   * Declars the module dependencies for the test.
+   */
+  function setUp() {
+    parent::setUp('migrate', 'features', 'date', 'date_repeat',
+                  'date_repeat_field', 'date_migrate_example');
+    // Make sure the migration is registered.
+    if (function_exists('migrate_static_registration')) {
+      // Migrate 2.6 and later
+      migrate_static_registration();
+    }
+    else {
+      // Migrate 2.5 and earlier
+      migrate_get_module_apis(TRUE);
+    }
+  }
+
+  /**
+   * Verify that date fields are imported correctly. When no timezone is
+   * explicitly provided with the source data, we want the displayed time on the
+   * Drupal site to match that in the source data. To validate that, we make
+   * sure we have set a consistent timezone at the PHP and Drupal levels, and
+   * that the format used on the page is not locale-dependent (no day or month
+   * names). Then, we can just look for the desired date/time strings in the
+   * node page.
+   */
+  function testDateImport() {
+    date_default_timezone_set('America/Los_Angeles');
+    variable_set('date_default_timezone', 'America/Los_Angeles');
+    variable_set('date_format_medium', 'Y-m-d H:i');
+    $migration = Migration::getInstance('DateExample');
+    $result = $migration->processImport();
+    $this->assertEqual($result, Migration::RESULT_COMPLETED, t('Variety term import returned RESULT_COMPLETED'));
+    $rawnodes = node_load_multiple(FALSE, array('type' => 'date_migrate_example'), TRUE);
+    $this->assertEqual(count($rawnodes), 2, t('Two sample nodes created'));
+    $node = reset($rawnodes);
+    $this->drupalGet('/node/' . $node->nid);
+    $this->assertText('2011-05-12 19:43', t('Simple date field found'));
+    $this->assertText('2011-06-13 18:32 to 2011-07-23 10:32', t('Date range field found'));
+    $this->assertText('2011-07-22 12:13', t('Datestamp field found'));
+    $this->assertText('2011-08-01 00:00 to 2011-09-01 00:00', t('Datestamp range field found'));
+    $this->assertText('2011-11-18 15:00', t('Datetime field with +9 timezone found'));
+    $this->assertText('2011-10-30 14:43 to 2011-12-31 17:59', t('Datetime range field with -5 timezone found'));
+    $this->assertText('2011-11-25 09:01', t('First date repeat instance found'));
+    $this->assertText('2011-12-09 09:01', t('Second date repeat instance found'));
+    $this->assertNoText('2011-12-23 09:01', t('Skipped date repeat instance not found'));
+    $this->assertText('2012-05-11 09:01', t('Last date repeat instance found'));
+    $node = next($rawnodes);
+    $this->drupalGet('/node/' . $node->nid);
+    $this->assertText('2012-06-21 15:32', t('First date value found'));
+    $this->assertText('2012-12-02 11:08', t('Second date value found'));
+    $this->assertText('2004-02-03 01:15', t('Start for first date range found'));
+    $this->assertText('2005-03-04 22:11', t('End for first date range found'));
+    $this->assertText('2014-09-01 17:21', t('Start for second date range found'));
+    $this->assertText('2015-12-23 00:01', t('End for first second range found'));
+  }
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n.info
index 28c5770..c81b368 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n.info
@@ -4,15 +4,13 @@ dependencies[] = locale
 dependencies[] = variable
 package = Multilingual - Internationalization
 core = 7.x
-
-files[] = i18n.install
 files[] = i18n_object.inc
 files[] = i18n.test
 configure = admin/config/regional/i18n
 
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n.test b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n.test
index 247af33..491d7ef 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n.test
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n.test
@@ -144,12 +144,14 @@ class Drupali18nTestCase extends DrupalWebTestCase {
   }
 
   /**
-   * Create a "Basic page" in the specified language.
-   *
+   * Create a node of the specified type in the specified language.
+   
+   * @param $type
+   *   The node type.
    * @param $title
-   *   Title of basic page in specified language.
+   *   Title of node in specified language.
    * @param $body
-   *   Body of basic page in specified language.
+   *   Body of node in specified language.
    * @param $langcode
    *   Language code.
    */
@@ -159,7 +161,9 @@ class Drupali18nTestCase extends DrupalWebTestCase {
     $edit["body[$lang][0][value]"] = $body;
     $edit['language'] = $langcode;
     $this->drupalPost('node/add/' . $type, $edit, t('Save'));
-    $this->assertRaw(t('Basic @type %title has been created.', array('@type' => $type, '%title' => $title)), t('Basic page created.'));
+    $info = node_type_load($type);
+    $message = t('@name %title has been created.', array('@name' => $info->name, '%title' => $title));
+    $this->assertRaw($message);
 
     // Check to make sure the node was created.
     $node = $this->drupalGetNodeByTitle($title);
@@ -169,15 +173,14 @@ class Drupali18nTestCase extends DrupalWebTestCase {
   }
 
   /**
-   * Create a translation for the specified basic page in the specified
-   * language.
+   * Create a translation for the specified node in the specified language.
    *
    * @param $node
    *   The basic page to create translation for.
    * @param $title
-   *   Title of basic page in specified language.
+   *   Title of node in specified language.
    * @param $body
-   *   Body of basic page in specified language.
+   *   Body of node in specified language.
    * @param $language
    *   Language code.
    */
@@ -196,8 +199,9 @@ class Drupali18nTestCase extends DrupalWebTestCase {
     $edit["title"] = $title;
     $edit[$body_key] = $body;
     $this->drupalPost(NULL, $edit, t('Save'));
-    $this->assertRaw(t('Basic page %title has been created.', array('%title' => $title)), t('Translation created.'));
-
+    $info = node_type_load($node->type);
+    $message = t('@name %title has been created.', array('@name' => $info->name, '%title' => $title));
+    $this->assertRaw($message);
     // Check to make sure that translation was successful.
     $translation = $this->drupalGetNodeByTitle($title);
     $this->assertTrue($translation, t('Node found in database.'));
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_block/i18n_block.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_block/i18n_block.info
index 52de33c..9b1c51e 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_block/i18n_block.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_block/i18n_block.info
@@ -8,9 +8,9 @@ files[] = i18n_block.inc
 files[] = i18n_block.test
 
 
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_contact/i18n_contact.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_contact/i18n_contact.info
index 9ca0957..fa1351c 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_contact/i18n_contact.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_contact/i18n_contact.info
@@ -5,9 +5,9 @@ dependencies[] = i18n_string
 package = Multilingual - Internationalization
 core = 7.x
 
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_field/i18n_field.api.php b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_field/i18n_field.api.php
new file mode 100644
index 0000000..3f5b01c
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_field/i18n_field.api.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * @file
+ * API documentation file for Field translation module.
+ *
+ * This module takes care of translating common field elements like title and
+ * description for all fields, plus some field specific values (default, options)
+ * for field types defined by Drupal core.
+ *
+ * Before implementing any of these hooks, consider whether you would be better
+ * off implementing Drupal core's hook_field_widget_form_alter().
+ *
+ * @see i18n_field_field_widget_form_alter()
+ */
+
+/**
+ * Provide information about callbacks for translating specific field types.
+ *
+ * This information can be retrieved using i18n_field_type_info().
+ * @return
+ *   Array of values indexed by field type. Valid keys are:
+ *   - 'translate_default', Callback for translating the default value for this field type.
+ *   - 'translate_options', Callback for translating options for this field type.
+ *
+ * @see i18n_field_type_info()
+ * @see i18n_field_i18n_field_info()
+ *
+ * For examples of both callback types:
+ *
+ * @see i18n_field_translate_allowed_values()
+ * @see i18n_field_translate_default()
+ *
+ */
+function hook_i18n_field_info() {
+  $info['text'] = $info['text_long'] = $info['text_with_summary'] = array(
+    'translate_default' => 'i18n_field_translate_default',
+  );
+  $info['list_text'] = $info['list_boolean'] = $info['list_integer'] = array(
+    'translate_options' => 'i18n_field_translate_allowed_values',
+  );
+  return $info;
+}
+
+/**
+ * Alter information provided by hook_i18n_field_info().
+ *
+ * @see i18n_field_type_info()
+ */
+function hook_i18n_field_info_alter(&$info) {
+  // Unset the default callback for text fields.
+  unset($info['text']['translate_default']);
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_field/i18n_field.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_field/i18n_field.info
index c3a40a3..ebd630e 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_field/i18n_field.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_field/i18n_field.info
@@ -6,9 +6,9 @@ package = Multilingual - Internationalization
 core = 7.x
 files[] = i18n_field.inc
 files[] = i18n_field.test
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_field/i18n_field.module b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_field/i18n_field.module
index f39a6a7..b682397 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_field/i18n_field.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_field/i18n_field.module
@@ -163,7 +163,6 @@ function i18n_field_field_formatter_view($entity_type, $entity, $field, $instanc
   return $element;
 }
 
-
 /**
  * Implements hook_field_widget_form_alter().
  *
@@ -176,8 +175,8 @@ function i18n_field_field_formatter_view($entity_type, $entity, $field, $instanc
 function i18n_field_field_widget_form_alter(&$element, &$form_state, $context) {
   global $language;
 
-  // Skip the node type edit fields by checking for existing entity
-  if (empty($element['#entity'])) {
+  // Don't translate if the widget is being shown on the field edit form.
+  if ($form_state['build_info']['form_id'] == 'field_ui_field_edit_form') {
     return;
   }
 
@@ -189,8 +188,38 @@ function i18n_field_field_widget_form_alter(&$element, &$form_state, $context) {
   $instance = $context['instance'];
   $langcode = $context['langcode'];
 
+  // Get the element to alter. Account for inconsistencies in how the element
+  // is built for different field types.
+  if (isset($element[0]) && count($element) == 1) {
+    // Single-value file fields and image fields.
+    $alter_element = &$element[0];
+  }
+  elseif (isset($element['value'])) {
+    // Number fields. Single-value text fields.
+    $alter_element = &$element['value'];
+  }
+  elseif ($field['type'] == 'entityreference' && isset($element['target_id'])) {
+    // Entityreference fields using the entityreference_autocomplete widget.
+    $alter_element = &$element['target_id'];
+  }
+  else {
+    // All other fields.
+    $alter_element = &$element;
+  }
+
+  // If a subelement has the same title as the parent, translate it instead.
+  // Allows fields such as email and commerce_price to be translated.
+  foreach (element_get_visible_children($element) as $key) {
+    $single_value = ($field['cardinality'] == 1);
+    $has_title = (isset($element['#title']) && isset($element[$key]['#title']));
+    if ($single_value && $has_title && $element[$key]['#title'] == $element['#title']) {
+      $alter_element = &$element[$key];
+      break;
+    }
+  }
+
   // The field language may affect some variables (default) but not others (description will be in current page language)
-  $i18n_langcode = empty($element['#language']) || $element['#language'] == LANGUAGE_NONE ? $language->language : $element['#language'];
+  $i18n_langcode = empty($alter_element['#language']) || $alter_element['#language'] == LANGUAGE_NONE ? $language->language : $alter_element['#language'];
 
   // Translate instance to current page language and set to form_state
   // so it will be used for validation messages later.
@@ -200,37 +229,60 @@ function i18n_field_field_widget_form_alter(&$element, &$form_state, $context) {
   }
 
   // Translate field title if set and it is the default one.
-  // When cardinality is 1, $element['value'] is used instead.
   if (!empty($instance_current['label']) && $instance_current['label'] != $instance['label']) {
-    if (!empty($element['#title']) && $element['#title'] == $instance['label']) {
-      $element['#title'] = $instance_current['label'];
-    }
-    if (isset($element['value']) && !empty($element['value']['#title']) && $element['value']['#title'] == $instance['label']) {
-      $element['value']['#title'] = $instance_current['label'];
+    if (!empty($alter_element['#title']) && $alter_element['#title'] == check_plain($instance['label'])) {
+      $alter_element['#title'] = check_plain($instance_current['label']);
     }
   }
 
   // Translate field description if set and it is the default one.
-  // When cardinality is 1, $element['value'] is used instead.
   if (!empty($instance_current['description']) && $instance_current['description'] != $instance['description']) {
-    if (!empty($element['#description']) && $element['#description'] == $instance['description']) {
-      $element['#description'] = $instance_current['description'];
-    }
-    if (isset($element['value']) && !empty($element['value']['#description']) && $element['value']['#description'] == $instance['description']) {
-      $element['value']['#description'] = $instance_current['description'];
+    if (!empty($alter_element['#description'])) {
+      // Allow single-value file fields and image fields to have their
+      // descriptions translated. file_field_widget_form() passes the
+      // description through theme('file_upload_help'), so i18n_field
+      // must do the same.
+      $filefield = in_array($field['type'], array('file', 'image'));
+      $single_value = ($field['cardinality'] == 1);
+      $no_default = empty($alter_element['#default_value']['fid']);
+      if ($filefield && $single_value && $no_default) {
+        $help_variables = array(
+          'description' => field_filter_xss($instance['description']),
+          'upload_validators' => $alter_element['#upload_validators'],
+        );
+        $original_description = theme('file_upload_help', $help_variables);
+        if ($alter_element['#description'] == $original_description) {
+          $help_variables = array(
+            'description' => field_filter_xss($instance_current['description']),
+            'upload_validators' => $alter_element['#upload_validators'],
+          );
+          $alter_element['#description'] = theme('file_upload_help', $help_variables);
+        }
+      }
+      elseif ($alter_element['#description'] == field_filter_xss($instance['description'])) {
+        $alter_element['#description'] = field_filter_xss($instance_current['description']);
+      }
     }
   }
 
-  // Translate list options
-  if (!empty($element['#options']) && ($translate = i18n_field_type_info($field['type'], 'translate_options')) && !empty($field['settings']['allowed_values'])) {
-    $element['#options'] = $translate($field, $i18n_langcode);
-    if (isset($element['#properties']) && !empty($element['#properties']['empty_option'])) {
-      $label = theme('options_none', array('instance' => $instance, 'option' => $element['#properties']['empty_option']));
-      $element['#options'] = array('_none' => $label) + $element['#options'];
-      // For some elements, change title to new translated option
-      if (!empty($element['#title']) && $field['type'] == 'list_boolean' && !empty($element['#on_value'])) {
-        $on_value = $element['#on_value'];
-        $element['#title'] = $element['#options'][$on_value];
+  // Translate list options.
+  $has_options = (!empty($alter_element['#options']) || $field['type'] == 'list_boolean');
+  $has_allowed_values = !empty($field['settings']['allowed_values']);
+  $translate = i18n_field_type_info($field['type'], 'translate_options');
+  if ($has_options && $has_allowed_values && $translate) {
+    $alter_element['#options'] = $translate($field, $i18n_langcode);
+    if (isset($alter_element['#properties']) && !empty($alter_element['#properties']['empty_option'])) {
+      $label = theme('options_none', array('instance' => $instance, 'option' => $alter_element['#properties']['empty_option']));
+      $alter_element['#options'] = array('_none' => $label) + $alter_element['#options'];
+    }
+    // Translate list_boolean fields using the checkboxes widget.
+    if (!empty($alter_element['#title']) && $field['type'] == 'list_boolean' && !empty($alter_element['#on_value'])) {
+      $on_value = $alter_element['#on_value'];
+      $alter_element['#options'];
+      $alter_element['#title'] = $alter_element['#options'][$on_value];
+      // For using label instead of "On value".
+      if ($instance['widget']['settings']['display_label']) {
+        $alter_element['#title'] = $instance_current['label'];
       }
     }
   }
@@ -242,11 +294,15 @@ function i18n_field_field_widget_form_alter(&$element, &$form_state, $context) {
   $delta = $context['delta'];
   $items = $context['items'];
 
-  // Translate default value if exists and the current value is the default
-  if (isset($element['value']['#default_value']) && ($translate = i18n_field_type_info($field['type'], 'translate_default')) &&
-      !empty($instance['default_value'][$delta]['value']) && !empty($items[$delta]['value']) &&
-      $instance['default_value'][$delta]['value'] === $items[$delta]['value']) {
-    $element['value']['#default_value'] = $translate($instance, $items[$delta]['value'], $i18n_langcode);
+  // Translate default value.
+  $has_default_value = (isset($alter_element['#default_value']) && !empty($instance['default_value'][$delta]['value']));
+  $storage_has_value = !empty($items[$delta]['value']);
+  $translate = i18n_field_type_info($field['type'], 'translate_default');
+  if ($has_default_value && $storage_has_value && $translate) {
+    // Compare the default value with the value currently in storage.
+    if ($instance['default_value'][$delta]['value'] === $items[$delta]['value']) {
+      $alter_element['#default_value'] = $translate($instance, $items[$delta]['value'], $i18n_langcode);
+    }
   }
 }
 
@@ -344,7 +400,7 @@ function i18n_field_translate_allowed_values($field, $langcode = NULL) {
 }
 
 /**
- * Translate field default
+ * Translate field default.
  */
 function i18n_field_translate_default($instance, $value, $langcode = NULL) {
   return i18n_string_translate(array('field', $instance['field_name'], $instance['bundle'], 'default_value'), $value, array('langcode' => $langcode));
@@ -360,7 +416,17 @@ function i18n_field_translate_property($instance, $property, $langcode = NULL) {
 }
 
 /**
- * Get i18n information for fields
+ * Get i18n information for translating fields.
+ *
+ * @param $type
+ *   Optional field type.
+ * @param $property
+ *   Optional property to get from field type.
+ *
+ * @return
+ *   - The property for the field if $type and $property set.
+ *   - Array of properties for the field type if only $type is set.
+ *   - Array of translation information for all field types.
  */
 function i18n_field_type_info($type = NULL, $property = NULL) {
   $info = &drupal_static(__FUNCTION__);
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_forum/i18n_forum.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_forum/i18n_forum.info
index d645355..a007cc8 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_forum/i18n_forum.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_forum/i18n_forum.info
@@ -7,9 +7,9 @@ package = Multilingual - Internationalization
 core = 7.x
 files[] = i18n_forum.test
 
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_menu/i18n_menu.inc b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_menu/i18n_menu.inc
index 570bf9e..a33d846 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_menu/i18n_menu.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_menu/i18n_menu.inc
@@ -69,6 +69,7 @@ class i18n_menu_link extends i18n_string_object_wrapper {
       return I18N_MODE_NONE;
     }
   }
+
   /**
    * Access to object translation. This should check object properties and permissions
    */
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_menu/i18n_menu.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_menu/i18n_menu.info
index 0c65b83..a436da1 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_menu/i18n_menu.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_menu/i18n_menu.info
@@ -10,9 +10,9 @@ core = 7.x
 files[] = i18n_menu.inc
 files[] = i18n_menu.test
 
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_menu/i18n_menu.module b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_menu/i18n_menu.module
index df670e5..8f91fc5 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_menu/i18n_menu.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_menu/i18n_menu.module
@@ -343,6 +343,8 @@ function i18n_menu_variable_info_alter(&$variables, $options) {
   // Make menu variables translatable
   $variables['menu_main_links_source']['localize'] = TRUE;
   $variables['menu_secondary_links_source']['localize'] = TRUE;
+  $variables['menu_parent_[node_type]']['localize'] = TRUE;
+  $variables['menu_options_[node_type]']['localize'] = TRUE;
 }
 
 /**
@@ -468,7 +470,8 @@ function i18n_menu_navigation_links($menu_name, $level = 0) {
  * Get localized menu title
  */
 function _i18n_menu_link_title($link, $langcode = NULL) {
-  return i18n_string_translate(array('menu', 'item', $link['mlid'], 'title'), $link['link_title'], array('langcode' => $langcode, 'sanitize' => FALSE));
+  $key = i18n_object_info('menu_link', 'key');
+  return i18n_string_translate(array('menu', 'item', $link[$key], 'title'), $link['link_title'], array('langcode' => $langcode, 'sanitize' => FALSE));
 }
 
 /**
@@ -500,7 +503,8 @@ function _i18n_menu_link_localize(&$link, $langcode = NULL) {
  */
 function _i18n_menu_link_description($link, $langcode = NULL) {
   if (!empty($link['options']['attributes']['title'])) {
-    return i18n_string_translate(array('menu', 'item', $link['mlid'], 'description'), $link['options']['attributes']['title'], array('langcode' => $langcode));
+    $key = i18n_object_info('menu_link', 'key');
+    return i18n_string_translate(array('menu', 'item', $link[$key], 'description'), $link['options']['attributes']['title'], array('langcode' => $langcode));
   }
   else {
     return NULL;
@@ -710,6 +714,26 @@ function i18n_menu_form_menu_edit_item_alter(&$form, &$form_state) {
 }
 
 /**
+ * Implements hook_form_FORM_ID_alter().
+ * FORM_ID = menu-overview-form.
+ * Add a "translate" link in operations column for each menu item.
+ */
+function i18n_menu_form_menu_overview_form_alter(&$form, &$form_state) {
+  foreach (element_children($form) as $element) {
+    if (substr($element, 0, 5) == 'mlid:') {
+      $mlid = $form[$element]['#item']['mlid'];
+      if (i18n_get_object('menu', $mlid)->get_translate_access()) {
+        $form[$element]['operations']['translate'] = array(
+          '#type' => 'link',
+          '#title' => t('translate'),
+          '#href' => "admin/structure/menu/item/{$mlid}/translate",
+        );
+      }
+    }
+  }
+}
+
+/**
  * Normal path should be checked with menu item's language to avoid
  * troubles when a node and it's translation has the same url alias.
  */
@@ -727,6 +751,9 @@ function i18n_menu_item_get_language($item) {
   }
   else {
     $menu = menu_load($item['menu_name']);
+    if (!isset($menu['i18n_mode'])) {
+      return LANGUAGE_NONE;
+    }
     switch ($menu['i18n_mode']) {
       case I18N_MODE_LANGUAGE:
         return $menu['language'];
@@ -859,6 +886,14 @@ function i18n_menu_link_load($path, $langcode) {
 }
 
 /**
+ * Implements hook_query_TAG_alter() for features_menu_links.
+ * Add needed fields to properly serialize localization information.
+ */
+function i18n_menu_query_features_menu_link_alter($query) {
+  $query->fields('menu_links', array('language', 'customized'));
+}
+
+/**
  * Implements hook_init().
  */
 function i18n_menu_init() {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_node/i18n_node.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_node/i18n_node.info
index 56670fa..fe6bc65 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_node/i18n_node.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_node/i18n_node.info
@@ -9,9 +9,9 @@ configure = admin/config/regional/i18n/node
 files[]=i18n_node.test
 files[]=i18n_node.variable.inc
 
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_node/i18n_node.pages.inc b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_node/i18n_node.pages.inc
index 34cbe4b..a8adc7a 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_node/i18n_node.pages.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_node/i18n_node.pages.inc
@@ -213,6 +213,7 @@ function i18n_node_select_translation_submit($form, &$form_state) {
       ))
       ->condition('nid', $add)
       ->execute();
+    entity_get_controller('node')->resetCache($add);
     if (count($new)) {
       drupal_set_message(format_plural(count($new), 'Added a node to the translation set.', 'Added @count nodes to the translation set.'));
     }
@@ -224,6 +225,7 @@ function i18n_node_select_translation_submit($form, &$form_state) {
       ))
       ->condition('nid', $remove)
       ->execute();
+    entity_get_controller('node')->resetCache($remove);
     drupal_set_message(format_plural(count($remove), 'Removed a node from the translation set.', 'Removed @count nodes from the translation set.'));
   }
 }
@@ -246,7 +248,7 @@ function i18n_node_autocomplete($type, $language, $string = '') {
  */
 function i18n_node_nid2autocomplete($nid) {
   if ($node = node_load($nid)) {
-    return check_plain($node->title) . ' [nid:' . $nid . ']';
+    return $node->title . ' [nid:' . $nid . ']';
   }
   else {
     return t('Not found');
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_path/i18n_path.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_path/i18n_path.info
index 33c0635..d5d919c 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_path/i18n_path.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_path/i18n_path.info
@@ -6,9 +6,9 @@ core = 7.x
 
 files[] = i18n_path.inc
 files[] = i18n_path.test
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_redirect/i18n_redirect.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_redirect/i18n_redirect.info
index 8149e51..d9e241f 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_redirect/i18n_redirect.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_redirect/i18n_redirect.info
@@ -4,9 +4,9 @@ dependencies[] = i18n
 package = Multilingual - Internationalization
 core = 7.x
 
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_select/i18n_select.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_select/i18n_select.info
index 8d84ef4..f695ee1 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_select/i18n_select.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_select/i18n_select.info
@@ -6,9 +6,9 @@ core = 7.x
 configure = admin/config/regional/i18n/select
 files[] = i18n_select.test
 
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_string/i18n_string.inc b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_string/i18n_string.inc
index 65f4c1b..3136aad 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_string/i18n_string.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_string/i18n_string.inc
@@ -1188,6 +1188,10 @@ class i18n_string_object_wrapper extends i18n_object_wrapper {
    * Translate access (localize strings)
    */
   protected function localize_access() {
+    // We could check also whether the object has strings to translate:
+    //   && $this->get_strings(array('empty' => TRUE))
+    // However it may be better to display the 'No available strings' message
+    // for the user to have a clue of what's going on. See i18n_string_translate_page_object()
     return user_access('translate interface') && user_access('translate user-defined strings');
   }
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_string/i18n_string.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_string/i18n_string.info
index 7da968d..10a08e1 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_string/i18n_string.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_string/i18n_string.info
@@ -10,9 +10,9 @@ files[] = i18n_string.inc
 files[] = i18n_string.test
 configure = admin/config/regional/i18n/strings
 
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_string/i18n_string.pages.inc b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_string/i18n_string.pages.inc
index 86e7432..28005d6 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_string/i18n_string.pages.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_string/i18n_string.pages.inc
@@ -12,7 +12,14 @@ include_once DRUPAL_ROOT . '/includes/locale.inc';
 include_once drupal_get_path('module', 'locale') . '/locale.admin.inc';
 
 /**
- * Generate translate page from object
+ * Generate translate page from object.
+ *
+ * @param string $object_type
+ *   Obejct type as declared in hook_i18n_object_info().
+ * @param object $object_value
+ *   Drupal object to translate.
+ * @param object $language
+ *   Optional language object.
  */
 function i18n_string_translate_page_object($object_type, $object_value, $language = NULL) {
   // For backwards compatibility, ensure parameter is a language object
@@ -22,6 +29,13 @@ function i18n_string_translate_page_object($object_type, $object_value, $languag
   $object = i18n_object($object_type, $object_value);
   $strings = $object->get_strings(array('empty' => TRUE));
 
+  // If no localizable strings, print message and fail gracefully.
+  // Possibly this object comes from some other contrib module.
+  // See http://drupal.org/node/1889878
+  if (!$strings) {
+    return t('This object has no strings available for translation.');
+  }
+
   if (empty($langcode)) {
     drupal_set_title(t('Translate !name', array('!name' => i18n_object_info($object_type, 'title'))));
     return i18n_string_translate_page_overview($object, $strings);
@@ -44,7 +58,6 @@ function i18n_string_translate_page_overview($object, $strings) {
  * Provide a core translation module like overview page for this object.
  */
 function i18n_string_translate_page_overview_form($form, &$form_state, $object, $strings) {
-  //include_once DRUPAL_ROOT . '/includes/language.inc';
   // Set the default item key, assume it's the first.
   $item_title = reset($strings);
   $header = array(
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_sync/i18n_sync.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_sync/i18n_sync.info
index 3d66753..1ad3ca9 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_sync/i18n_sync.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_sync/i18n_sync.info
@@ -10,9 +10,9 @@ files[] = i18n_sync.install
 files[] = i18n_sync.module.inc
 files[] = i18n_sync.node.inc
 files[] = i18n_sync.test
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_sync/i18n_sync.node.inc b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_sync/i18n_sync.node.inc
index 0480eb7..b18c6f0 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_sync/i18n_sync.node.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_sync/i18n_sync.node.inc
@@ -27,6 +27,7 @@
  *   Node operation (insert|update).
  */
 function i18n_sync_node_translation($node, $translations, $field_names, $op) {
+  $total = count($translations);
   $count = 0;
   // Disable language selection and synchronization temporarily, enable it again later
   $i18n_select = i18n_select(FALSE);
@@ -34,10 +35,11 @@ function i18n_sync_node_translation($node, $translations, $field_names, $op) {
   foreach ($translations as $translation) {
     // If translation is the same node, we cannot synchronize with itself
     if ($node->nid == $translation->nid) {
+      $total--;
       continue;
     }
     // Load full node, we need all data here.
-    $translation = node_load($translation->nid, NULL, TRUE);
+    $translation = node_load($translation->nid);
     $i18n_options = i18n_sync_node_options($node->type);
     // Invoke callback for each field, the default is just copy over
     foreach ($field_names as $field) {
@@ -53,6 +55,13 @@ function i18n_sync_node_translation($node, $translations, $field_names, $op) {
     module_invoke_all('i18n_sync_translation', 'node', $translation, $translation->language, $node, $node->language, $field_names);
     node_save($translation);
     $count++;
+    // Flush each entity from the load cache after processing, to
+    // avoid exceeding PHP memory limits. It should be safe to keep
+    // at least one, however; so we retain the final translation in
+    // the cache after saving it.
+    if ($count < $total) {
+      entity_get_controller('node')->resetCache(array($translation->nid));
+    }
   }
   i18n_sync(TRUE);
   i18n_select($i18n_select);
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_taxonomy/i18n_taxonomy.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_taxonomy/i18n_taxonomy.info
index 0d26403..3e7297b 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_taxonomy/i18n_taxonomy.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_taxonomy/i18n_taxonomy.info
@@ -11,9 +11,9 @@ files[] = i18n_taxonomy.pages.inc
 files[] = i18n_taxonomy.admin.inc
 files[] = i18n_taxonomy.test
 
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_taxonomy/i18n_taxonomy.module b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_taxonomy/i18n_taxonomy.module
index d5c1793..0a051b2 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_taxonomy/i18n_taxonomy.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_taxonomy/i18n_taxonomy.module
@@ -184,11 +184,11 @@ function i18n_taxonomy_field_formatter_info() {
 }
 
  /**
-- * Implements hook_field_formatter_prepare_view().
-- *
-- * This preloads all taxonomy terms for multiple loaded objects at once and
-- * unsets values for invalid terms that do not exist.
-- */
+ * Implements hook_field_formatter_prepare_view().
+ *
+ * This preloads all taxonomy terms for multiple loaded objects at once and
+ * unsets values for invalid terms that do not exist.
+ */
 function i18n_taxonomy_field_formatter_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items, $displays) {
   return taxonomy_field_formatter_prepare_view($entity_type, $entities, $field, $instances, $langcode, $items, $displays);
 }
@@ -318,7 +318,7 @@ function i18n_taxonomy_field_storage_details_alter(&$details, &$field) {
 
 /**
  * Implements hook_field_attach_prepare_translation_alter().
-
+ *
  * Prepare and synchronize translation for term reference fields.
  */
 function i18n_taxonomy_field_attach_prepare_translation_alter(&$entity, $context) {
@@ -468,7 +468,8 @@ function i18n_taxonomy_theme() {
  * Get localized term name unfiltered.
  */
 function i18n_taxonomy_term_name($term, $langcode = NULL) {
-  return i18n_taxonomy_vocabulary_mode($term->vid, I18N_MODE_LOCALIZE) ? i18n_string(array('taxonomy', 'term', $term->tid, 'name'), $term->name, array('langcode' => $langcode, 'sanitize' => FALSE)) : $term->name;
+  $key = i18n_object_info('taxonomy_term', 'key');
+  return i18n_taxonomy_vocabulary_mode($term->vid, I18N_MODE_LOCALIZE) ? i18n_string(array('taxonomy', 'term', $term->{$key}, 'name'), $term->name, array('langcode' => $langcode, 'sanitize' => FALSE)) : $term->name;
 }
 
 
@@ -476,7 +477,8 @@ function i18n_taxonomy_term_name($term, $langcode = NULL) {
  * Get localized term description unfiltered.
  */
 function i18n_taxonomy_term_description($term, $langcode = NULL) {
-  return i18n_taxonomy_vocabulary_mode($term->vid, I18N_MODE_LOCALIZE) ? i18n_string(array('taxonomy', 'term', $term->tid, 'description'), $term->description, array('langcode' => $langcode, 'sanitize' => FALSE)) : $term->description;
+  $key = i18n_object_info('taxonomy_term', 'key');
+  return i18n_taxonomy_vocabulary_mode($term->vid, I18N_MODE_LOCALIZE) ? i18n_string(array('taxonomy', 'term', $term->{$key}, 'description'), $term->description, array('langcode' => $langcode, 'sanitize' => FALSE)) : $term->description;
 }
 
 /**
@@ -1260,10 +1262,10 @@ function i18n_taxonomy_modules_enabled($modules) {
   $modules = drupal_map_assoc($modules);
   if (isset($modules['i18n_taxonomy'])) {
     foreach (field_info_fields() as $fieldname => $field) {
-        if ($field['type'] == 'taxonomy_term_reference') {
-          $field['settings']['options_list_callback'] = 'i18n_taxonomy_allowed_values';
-          field_update_field($field);
-        }
+      if ($field['type'] == 'taxonomy_term_reference') {
+        $field['settings']['options_list_callback'] = 'i18n_taxonomy_allowed_values';
+        field_update_field($field);
       }
+    }
   }
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_translation/i18n_translation.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_translation/i18n_translation.info
index b9b54e7..113bbe3 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_translation/i18n_translation.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_translation/i18n_translation.info
@@ -6,9 +6,9 @@ core = 7.x
 
 files[] = i18n_translation.inc
 
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_user/i18n_user.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_user/i18n_user.info
index e438321..45ec115 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_user/i18n_user.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_user/i18n_user.info
@@ -4,9 +4,9 @@ core = 7.x
 package = Multilingual - Internationalization
 dependencies[] = i18n_variable
 
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_variable/i18n_variable.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_variable/i18n_variable.info
index 59a4674..4a57d30 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_variable/i18n_variable.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/i18n_variable/i18n_variable.info
@@ -10,9 +10,9 @@ configure = admin/config/regional/i18n/variable
 files[] = i18n_variable.class.inc
 files[] = i18n_variable.test
 
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/tests/i18n_test.info b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/tests/i18n_test.info
index f764aa0..af9f978 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/i18n/tests/i18n_test.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/i18n/tests/i18n_test.info
@@ -7,9 +7,9 @@ package = Testing
 core = 6.x
 hidden = TRUE
 
-; Information added by drupal.org packaging script on 2013-01-13
-version = "7.x-1.8"
+; Information added by drupal.org packaging script on 2013-08-21
+version = "7.x-1.10"
 core = "7.x"
 project = "i18n"
-datestamp = "1358075001"
+datestamp = "1377069696"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/imce/LICENSE.txt b/kolab.org/www/drupal-7.18/sites/all/modules/imce/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/imce/imce.info b/kolab.org/www/drupal-7.18/sites/all/modules/imce/imce.info
index 6394ad4..e8699c8 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/imce/imce.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/imce/imce.info
@@ -4,9 +4,9 @@ core = "7.x"
 package = "Media"
 configure = "admin/config/media/imce"
 
-; Information added by drupal.org packaging script on 2011-10-20
-version = "7.x-1.5"
+; Information added by Drupal.org packaging script on 2013-12-17
+version = "7.x-1.8"
 core = "7.x"
 project = "imce"
-datestamp = "1319104232"
+datestamp = "1387302359"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/imce/imce.install b/kolab.org/www/drupal-7.18/sites/all/modules/imce/imce.install
index 8d3e420..688c6b5 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/imce/imce.install
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/imce/imce.install
@@ -11,13 +11,13 @@
 function imce_install() {
   module_load_include('inc', 'imce', 'inc/imce.core.profiles');
   imce_install_profiles();
-  drupal_set_message(st('!module has been installed.', array('!module' => l(st('IMCE'), 'admin/config/media/imce'))));
 }
 
 /**
  * Implements hook_uninstall().
  */
 function imce_uninstall() {
+  db_delete('file_usage')->condition('module', 'imce')->execute();
   variable_del('imce_profiles');
   variable_del('imce_roles_profiles');
   variable_del('imce_settings_textarea');
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/imce/imce.module b/kolab.org/www/drupal-7.18/sites/all/modules/imce/imce.module
index fe93a12..f3dc4bf 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/imce/imce.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/imce/imce.module
@@ -15,6 +15,7 @@ function imce_menu() {
     'title' => 'File browser',
     'page callback' => 'imce',
     'access callback' => 'imce_access',
+    'access arguments' => array(FALSE, 1),
     'file' => 'inc/imce.page.inc',
     'type' => MENU_CALLBACK,
   );
@@ -118,7 +119,7 @@ function imce_textarea($element) {
   if (!isset($regexp)) {
     $regexp = FALSE;
     if (imce_access() && $regexp = str_replace(' ', '', variable_get('imce_settings_textarea', ''))) {
-      $regexp = '@^' . str_replace(',', '|', implode('.*', array_map('preg_quote', explode('*', $regexp)))) . '$@';
+      $regexp = '@^(' . str_replace(',', '|', implode('.*', array_map('preg_quote', explode('*', $regexp)))) . ')$@';
     }
   }
   if ($regexp && preg_match($regexp, $element['#id'])) {
@@ -132,58 +133,39 @@ function imce_textarea($element) {
  * Returns the configuration profile assigned to a user for a specific file scheme.
  */
 function imce_user_profile($user, $scheme = NULL) {
-  $profiles = variable_get('imce_profiles', array());
-  $swrappers = file_get_stream_wrappers();
-  $default_scheme = variable_get('file_default_scheme', 'public');
+  static $ups = array();
 
-  //handle user#1 separately
-  if ($user->uid == 1) {
-    $scheme = empty($scheme) ? $default_scheme : $scheme;
-    if (isset($profiles[1]) && isset($swrappers[$scheme])) {
-      return $profiles[1] + array('scheme' => $scheme);
-    }
-    return FALSE;
+  // Set scheme
+  if (empty($scheme)) {
+    $scheme = variable_get('file_default_scheme', 'public');
   }
 
-  //handle regular users
-  $roles_profiles = variable_get('imce_roles_profiles', array());
-  //store assigned configuration
-  $conf = array();
-  foreach ($roles_profiles as $rid => $role) {
-    if (isset($user->roles[$rid])) {
-      $conf = $role;
-      break;
-    }
+  // Return from cache.
+  if (isset($ups[$scheme][$user->uid])) {
+    return $ups[$scheme][$user->uid];
   }
+  $ups[$scheme][$user->uid] = FALSE;
 
-  //no scheme-profile assignment
-  if (empty($conf)) {
+  // Check scheme
+  $swrappers = file_get_stream_wrappers();
+  if (!isset($swrappers[$scheme])) {
     return FALSE;
   }
 
-  //return the profile for the specified scheme
-  if (!empty($scheme)) {
-    $key = $scheme . '_pid';
-    if (isset($conf[$key]) && isset($profiles[$conf[$key]]) && isset($swrappers[$scheme])) {
-      return $profiles[$conf[$key]] + array('scheme' => $scheme);
-    }
-    return FALSE;
-  }
+  $profiles = variable_get('imce_profiles', array());
+  $scinfo = array('scheme' => $scheme);
 
-  //no scheme specified. check the default
-  $scheme = $default_scheme;
-  $key = $scheme . '_pid';
-  if (isset($conf[$key]) && isset($profiles[$conf[$key]]) && isset($swrappers[$scheme])) {
-    return $profiles[$conf[$key]] + array('scheme' => $scheme);
+  // Handle user#1 separately
+  if ($user->uid == 1) {
+    return $ups[$scheme][$user->uid] = isset($profiles[1]) ? $profiles[1] + $scinfo : FALSE;
   }
 
-  //check if any of the schemes has a profile assigned.
-  foreach ($conf as $key => $pid) {
-    if (substr($key, -4) == '_pid' && isset($profiles[$pid])) {
-      $scheme = substr($key, 0, -4);
-      if (isset($swrappers[$scheme])) {
-        return $profiles[$pid] + array('scheme' => $scheme);
-      }
+  // Handle regular users.
+  $roles_profiles = variable_get('imce_roles_profiles', array());
+  $sckey = $scheme . '_pid';
+  foreach ($roles_profiles as $rid => $conf) {
+    if (isset($user->roles[$rid]) && isset($conf[$sckey]) && isset($profiles[$conf[$sckey]])) {
+      return $ups[$scheme][$user->uid] = $profiles[$conf[$sckey]] + $scinfo;
     }
   }
 
@@ -194,28 +176,11 @@ function imce_user_profile($user, $scheme = NULL) {
  * Checks if the user is assigned an imce profile.
  * A more detailed assignment check is performed before imce loads.
  */
-function imce_access($user = FALSE) {
+function imce_access($user = FALSE, $scheme = NULL) {
   if ($user === FALSE) {
     global $user;
   }
-
-  if ($user->uid == 1) {
-    return TRUE;
-  }
-
-  $roles_profiles = variable_get('imce_roles_profiles', array());
-  foreach ($roles_profiles as $rid => $role) {
-    if (isset($user->roles[$rid])) {
-      foreach ($role as $key => $pid) {
-        if (substr($key, -4) == '_pid' && $pid) {
-          return TRUE;
-        }
-      }
-      break;
-    }
-  }
-
-  return FALSE;
+  return imce_user_profile($user, $scheme) ? TRUE : FALSE;
 }
 
 /**
@@ -225,7 +190,6 @@ function imce_user_page_access($account, $user = FALSE) {
   if ($user === FALSE) {
     global $user;
   }
-
   return ($user->uid == 1 || $account->uid == $user->uid) && ($profile = imce_user_profile($account)) && $profile['usertab'];
 }
 
@@ -233,5 +197,5 @@ function imce_user_page_access($account, $user = FALSE) {
  * Check if the directory name is regular.
  */
 function imce_reg_dir($dirname) {
-  return $dirname == '.' || (is_string($dirname) && $dirname != '' && !preg_match('@(^\s)|(^/)|(^\./)|(\s$)|(/$)|(/\.$)|(\.\.)|(//)|(\\\\)|(/\./)@', $dirname));
+  return $dirname == '.' || is_int($dirname) || (is_string($dirname) && $dirname != '' && !preg_match('@(^\s)|(^/)|(^\./)|(\s$)|(/$)|(/\.$)|(\.\.)|(//)|(\\\\)|(/\./)@', $dirname));
 }
\ No newline at end of file
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/imce/inc/imce.admin.inc b/kolab.org/www/drupal-7.18/sites/all/modules/imce/inc/imce.admin.inc
index 4ff3077..d88cd28 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/imce/inc/imce.admin.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/imce/inc/imce.admin.inc
@@ -16,7 +16,8 @@ function imce_admin() {
   $rows = array();
 
   foreach ($profiles as $pid => $profile) {
-    $rows[] = array($profile['name'],
+    $rows[] = array(
+      check_plain($profile['name']),
       l(t('Edit'), 'admin/config/media/imce/profile/edit/' . $pid),
       $pid == 1 ? '' : l(t('Delete'), 'admin/config/media/imce/profile/delete/' . $pid),
     );
@@ -116,7 +117,7 @@ function imce_admin_theme($variables) {
   $swrappers = file_get_stream_wrappers(STREAM_WRAPPERS_VISIBLE);
   foreach ($swrappers as $scheme => $info) {
     $header[] = l($info['name'], 'imce/' . $scheme);
-    $rows[0][] = $profile1['name'];
+    $rows[0][] = check_plain($profile1['name']);
     $keys[] = $scheme . '_pid';
   }
 
@@ -249,7 +250,7 @@ function imce_profile_form($form, &$form_state, $pid = 0) {
   );
   $form['dimensions'] = array(
     '#type' => 'textfield',
-    '#title' => t('Maximum image resolution'),
+    '#title' => t('Maximum image dimensions'),
     '#default_value' => $profile['dimensions'],
     '#description' => t('The maximum allowed image size (e.g. 640x480). Set to 0 for no restriction. If an <a href="!image-toolkit-link">image toolkit</a> is installed, files exceeding this value will be scaled down to fit.', array('!image-toolkit-link' => url('admin/config/media/image-toolkit'))),
     '#field_suffix' => '<kbd>' . t('WIDTHxHEIGHT') . '</kbd>',
@@ -482,7 +483,7 @@ function imce_thumbnails_theme($variables) {
  */
 function imce_role_form($role, $weight = TRUE, $core = TRUE) {
   $form['name'] = array(
-    '#markup' => $role['name'],
+    '#markup' => check_plain($role['name']),
   );
   if ($weight) {
     $form['weight'] = $core ? array(
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/imce/inc/imce.page.inc b/kolab.org/www/drupal-7.18/sites/all/modules/imce/inc/imce.page.inc
index 27b27ad..bcb00b2 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/imce/inc/imce.page.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/imce/inc/imce.page.inc
@@ -11,6 +11,7 @@
 function imce($scheme = NULL) {
   module_invoke('admin_menu', 'suppress');//suppress admin_menu
   $jsop = isset($_GET['jsop']) ? $_GET['jsop'] : NULL;
+  drupal_add_http_header('Content-Type', 'text/html; charset=utf-8');
   print imce_page($GLOBALS['user'], $scheme, $jsop);
   exit();
 }
@@ -258,7 +259,7 @@ function imce_fileop_form_validate($form, &$form_state) {
     return form_error($form['filenames'], t('Please select a file.'));
   }
 
-  //filenames come seperated by colon
+  //filenames come separated by colon
   $filenames = explode(':', $form_state['values']['filenames']);
   $cnt = count($filenames);
   //check the number of files.
@@ -359,7 +360,7 @@ function imce_resize_submit($form, &$form_state) {
   //check dimensions
   $width = (int) $form_state['values']['width'];
   $height = (int) $form_state['values']['height'];
-  list($maxw, $maxh) = explode('x', $imce['dimensions']);
+  list($maxw, $maxh) = $imce['dimensions'] ? explode('x', $imce['dimensions']) : array(0, 0);
   if ($width < 1 || $height < 1 || ($maxw && ($width > $maxw || $height > $maxh))) {
     drupal_set_message(t('Please specify dimensions within the allowed range that is from 1x1 to @dimensions.', array('@dimensions' => $imce['dimensions'] ? $imce['dimensions'] : t('unlimited'))), 'error');
     return;
@@ -424,10 +425,6 @@ function imce_delete_filepath($uri) {
     if (!file_delete($file, TRUE)) {
       return FALSE;
     }
-    // Remove imce usage
-    if ($is_imce) {
-      file_usage_delete($file, 'imce');
-    }
   }
   // Not in db. Probably loaded via ftp.
   elseif (!file_unmanaged_delete($uri)) {
@@ -676,13 +673,25 @@ function imce_validate_quotas($file, &$imce, $add = 0) {
 }
 
 /**
- * Check if the file is an image and return info.
+ * Checks if the file is an image and returns info.
+ * There are two switchable versions that use image_get_info() and getimagesize()
  */
-function imce_image_info($file) {
-  if (is_file($file) && ($dot = strrpos($file, '.')) && in_array(strtolower(substr($file, $dot+1)), array('jpg', 'jpeg', 'gif', 'png')) && ($info = @getimagesize($file)) && in_array($info[2], array(IMAGETYPE_JPEG, IMAGETYPE_GIF, IMAGETYPE_PNG)) ) {
-    return array('width' => $info[0], 'height' => $info[1], 'type' => $info[2], 'mime' => $info['mime']);
+if (variable_get('imce_image_get_info', 0)) {
+  function imce_image_info($file) {
+    $mimes = array('image/jpeg' => IMAGETYPE_JPEG, 'image/gif'  => IMAGETYPE_GIF, 'image/png'  => IMAGETYPE_PNG);
+    if (is_file($file) && ($dot = strrpos($file, '.')) && in_array(strtolower(substr($file, $dot+1)), array('jpg', 'jpeg', 'gif', 'png')) && ($info = @image_get_info($file)) && isset($mimes[$info['mime_type']]) ) {
+      return array('width' => $info['width'], 'height' => $info['height'], 'type' => $mimes[$info['mime_type']], 'mime' => $info['mime_type']);
+    }
+    return FALSE;
+  }
+}
+else {
+  function imce_image_info($file) {
+    if (is_file($file) && ($dot = strrpos($file, '.')) && in_array(strtolower(substr($file, $dot+1)), array('jpg', 'jpeg', 'gif', 'png')) && ($info = @getimagesize($file)) && in_array($info[2], array(IMAGETYPE_JPEG, IMAGETYPE_GIF, IMAGETYPE_PNG)) ) {
+      return array('width' => $info[0], 'height' => $info[1], 'type' => $info[2], 'mime' => $info['mime']);
+    }
+    return FALSE;
   }
-  return FALSE;
 }
 
 /**
@@ -838,6 +847,7 @@ function imce_working_directory(&$imce) {
 
   //or the whole list.
   foreach ($imce['directories'] as $dirname => $info) {
+    $dirname = (string) $dirname;
     if (imce_check_directory($dirname, $imce)) {
       if ($sess) {
         $_SESSION['imce_directory'] = rawurlencode($dirname);
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/imce/js/imce.js b/kolab.org/www/drupal-7.18/sites/all/modules/imce/js/imce.js
index 2a2f9b4..2e97b4a 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/imce/js/imce.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/imce/js/imce.js
@@ -1,4 +1,3 @@
-
 (function($) {
 //Global container.
 window.imce = {tree: {}, findex: [], fids: {}, selected: {}, selcount: 0, ops: {}, cache: {}, urlId: {},
@@ -8,6 +7,7 @@ hooks: {load: [], list: [], navigate: [], cache: []},
 //initiate imce.
 initiate: function() {
   imce.conf = Drupal.settings.imce || {};
+  imce.ie = (navigator.userAgent.match(/msie (\d+)/i) || ['', 0])[1] * 1;
   if (imce.conf.error != false) return;
   imce.FLW = imce.el('file-list-wrapper'), imce.SBW = imce.el('sub-browse-wrapper');
   imce.NW = imce.el('navigation-wrapper'), imce.BW = imce.el('browse-wrapper');
@@ -79,7 +79,7 @@ dirCollapsible: function (branch) {
     if (branch.ul) {
       $(branch.ul).toggle();
       $(branch.li).toggleClass('expanded');
-      $.browser.msie && $('#navigation-header').css('top', imce.NW.scrollTop);
+      imce.ie && $('#navigation-header').css('top', imce.NW.scrollTop);
     }
     else if (branch.clkbl){
       $(branch.a).click();
@@ -424,7 +424,7 @@ navCache: function (dir, newdir) {
 
 //validate upload form
 uploadValidate: function (data, form, options) {
-  var path = data[0].value;
+  var path = $('#edit-imce').val();
   if (!path) return false;
   if (imce.conf.extensions != '*') {
     var ext = path.substr(path.lastIndexOf('.') + 1);
@@ -432,7 +432,6 @@ uploadValidate: function (data, form, options) {
       return imce.setMessage(Drupal.t('Only files with the following extensions are allowed: %files-allowed.', {'%files-allowed': imce.conf.extensions}), 'error');
     }
   }
-  var sep = path.indexOf('/') == -1 ? '\\' : '/';
   options.url = imce.ajaxURL('upload');//make url contain current dir.
   imce.fopLoading('upload', true);
   return true;
@@ -487,12 +486,12 @@ commonSubmit: function(fop) {
 
 //settings for default file operations
 fopSettings: function (fop) {
-  return {url: imce.ajaxURL(fop), type: 'POST', dataType: 'json', success: imce.processResponse, complete: function (response) {imce.fopLoading(fop, false);}, data: imce.vars.opform +'&filenames='+ imce.serialNames() +'&jsop='+ fop + (imce.ops[fop].div ? '&'+ $('input, select, textarea', imce.ops[fop].div).serialize() : '')};
+  return {url: imce.ajaxURL(fop), type: 'POST', dataType: 'json', success: imce.processResponse, complete: function (response) {imce.fopLoading(fop, false);}, data: imce.vars.opform +'&filenames='+ escape(imce.serialNames()) +'&jsop='+ fop + (imce.ops[fop].div ? '&'+ $('input, select, textarea', imce.ops[fop].div).serialize() : '')};
 },
 
 //toggle loading state
 fopLoading: function(fop, state) {
-  var el = imce.el('edit-'+ fop), func = state ? 'addClass' : 'removeClass'
+  var el = imce.el('edit-'+ fop), func = state ? 'addClass' : 'removeClass';
   if (el) {
     $(el)[func]('loading').attr('disabled', state);
   }
@@ -789,7 +788,7 @@ updateUI: function() {
     imce.opAdd({name: 'help', title: $('#help-box-title').remove().text(), content: $('#help-box').show()});
   });
   //add ie classes
-  $.browser.msie && $('html').addClass('ie') && parseFloat($.browser.version) < 8 && $('html').addClass('ie-7');
+  imce.ie && $('html').addClass('ie') && imce.ie < 8 && $('html').addClass('ie-7');
   // enable box view for file list
   imce.vars.boxW && imce.boxView();
   //scrolling file list
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/imce/js/imce_extras.js b/kolab.org/www/drupal-7.18/sites/all/modules/imce/js/imce_extras.js
index 349de2d..f5cff02 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/imce/js/imce_extras.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/imce/js/imce_extras.js
@@ -117,15 +117,10 @@ imce.firstSort = function() {
 //sort file list according to column index.
 imce.columnSort = function(cid, dsc) {
   if (imce.findex.length < 2) return;
-  if (cid == imce.vars.cid && dsc != imce.vars.dsc) {
-    imce.findex.reverse();
-  }
-  else {
-    var func = 'sort'+ (cid == 0 ? 'Str' : 'Num') + (dsc ? 'Dsc' : 'Asc');
-    var prop = cid == 2 || cid == 3 ? 'innerHTML' : 'id';
-    //sort rows
-    imce.findex.sort(cid ? function(r1, r2) {return imce[func](r1.cells[cid][prop], r2.cells[cid][prop])} : function(r1, r2) {return imce[func](r1.id, r2.id)});
-  }
+  var func = 'sort'+ (cid == 0 ? 'Str' : 'Num') + (dsc ? 'Dsc' : 'Asc');
+  var prop = cid == 2 || cid == 3 ? 'innerHTML' : 'id';
+  //sort rows
+  imce.findex.sort(cid ? function(r1, r2) {return imce[func](r1.cells[cid][prop], r2.cells[cid][prop])} : function(r1, r2) {return imce[func](r1.id, r2.id)});
   //insert sorted rows
   for (var row, i=0; row = imce.findex[i]; i++) {
     imce.tbody.appendChild(row);
@@ -197,7 +192,7 @@ imce.recallDimensions = function() {
 //set row heights with respect to window height
 imce.recallHeights = function(bwFixedHeight) {
   //window & body dimensions
-  var winHeight = $.browser.opera ? window.innerHeight : $(window).height();
+  var winHeight = window.opera ? window.innerHeight : $(window).height();
   var bodyHeight = $(document.body).outerHeight(true);
   var diff = winHeight - bodyHeight;
   var bwHeight = $(imce.BW).height(), pwHeight = $(imce.PW).height();
@@ -264,12 +259,12 @@ imce.imagestyleURL = function (url, stylename) {
 // replace table view with box view for file list
 imce.boxView = function () {
   var w = imce.vars.boxW, h = imce.vars.boxH;
-  if (!w || !h || $.browser.msie && parseFloat($.browser.version) < 8) return;
+  if (!w || !h || imce.ie && imce.ie < 8) return;
   var $body = $(document.body);
   var toggle = function() {
     $body.toggleClass('box-view');
     // refresh dom. required by all except FF.
-    !$.browser.mozilla && $('#file-list').appendTo(imce.FW).appendTo(imce.FLW);
+    $('#file-list').appendTo(imce.FW).appendTo(imce.FLW);
   };
   $body.append('<style type="text/css">.box-view #file-list td.name {width: ' + w + 'px;height: ' + h + 'px;} .box-view #file-list td.name span {width: ' + w + 'px;word-wrap: normal;text-overflow: ellipsis;}</style>');
   imce.hooks.load.push(function() {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/imce/tpl/imce-page.tpl.php b/kolab.org/www/drupal-7.18/sites/all/modules/imce/tpl/imce-page.tpl.php
index 197858a..cfe2185 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/imce/tpl/imce-page.tpl.php
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/imce/tpl/imce-page.tpl.php
@@ -4,6 +4,7 @@
 
 <head>
   <title><?php print t('File Browser'); ?></title>
+  <meta name="robots" content="noindex,nofollow" />
   <?php if (isset($_GET['app'])): drupal_add_js(drupal_get_path('module', 'imce') .'/js/imce_set_app.js'); endif;?>
   <?php print drupal_get_html_head(); ?>
   <?php print drupal_get_css(); ?>
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/CHANGELOG.txt b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/CHANGELOG.txt
deleted file mode 100644
index 5bdf490..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/CHANGELOG.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Note: This file is out of date.
-
-jQuery Update 7.x-1.0, 2010-02-11
----------------------------------
-#1046720 by Rob Loach: Updated to jQuery 1.5 and jQuery UI 1.8.9
-#701496 by Rob Loach: Moved to hook_library_alter()
-#771062 by quiptime: Fixed module administration path
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/LICENSE.txt b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/LICENSE.txt
index 2c095c8..d159169 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/LICENSE.txt
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/LICENSE.txt
@@ -1,274 +1,339 @@
-GNU GENERAL PUBLIC LICENSE
-
-              Version 2, June 1991
-
-Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave,
-Cambridge, MA 02139, USA. Everyone is permitted to copy and distribute
-verbatim copies of this license document, but changing it is not allowed.
-
-                  Preamble
-
-The licenses for most software are designed to take away your freedom to
-share and change it. By contrast, the GNU General Public License is
-intended to guarantee your freedom to share and change free software--to
-make sure the software is free for all its users. This General Public License
-applies to most of the Free Software Foundation's software and to any other
-program whose authors commit to using it. (Some other Free Software
-Foundation software is covered by the GNU Library General Public License
-instead.) You can apply it to your programs, too.
-
-When we speak of free software, we are referring to freedom, not price. Our
-General Public Licenses are designed to make sure that you have the
-freedom to distribute copies of free software (and charge for this service if
-you wish), that you receive source code or can get it if you want it, that you
-can change the software or use pieces of it in new free programs; and that
-you know you can do these things.
-
-To protect your rights, we need to make restrictions that forbid anyone to
-deny you these rights or to ask you to surrender the rights. These restrictions
-translate to certain responsibilities for you if you distribute copies of the
-software, or if you modify it.
-
-For example, if you distribute copies of such a program, whether gratis or for
-a fee, you must give the recipients all the rights that you have. You must make
-sure that they, too, receive or can get the source code. And you must show
-them these terms so they know their rights.
-
-We protect your rights with two steps: (1) copyright the software, and (2)
-offer you this license which gives you legal permission to copy, distribute
-and/or modify the software.
-
-Also, for each author's protection and ours, we want to make certain that
-everyone understands that there is no warranty for this free software. If the
-software is modified by someone else and passed on, we want its recipients
-to know that what they have is not the original, so that any problems
-introduced by others will not reflect on the original authors' reputations.
-
-Finally, any free program is threatened constantly by software patents. We
-wish to avoid the danger that redistributors of a free program will individually
-obtain patent licenses, in effect making the program proprietary. To prevent
-this, we have made it clear that any patent must be licensed for everyone's
-free use or not licensed at all.
-
-The precise terms and conditions for copying, distribution and modification
-follow.
-
-           GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND
-               MODIFICATION
-
-0. This License applies to any program or other work which contains a notice
-placed by the copyright holder saying it may be distributed under the terms
-of this General Public License. The "Program", below, refers to any such
-program or work, and a "work based on the Program" means either the
-Program or any derivative work under copyright law: that is to say, a work
-containing the Program or a portion of it, either verbatim or with
-modifications and/or translated into another language. (Hereinafter, translation
-is included without limitation in the term "modification".) Each licensee is
-addressed as "you".
-
-Activities other than copying, distribution and modification are not covered
-by this License; they are outside its scope. The act of running the Program is
-not restricted, and the output from the Program is covered only if its contents
-constitute a work based on the Program (independent of having been made
-by running the Program). Whether that is true depends on what the Program
-does.
-
-1. You may copy and distribute verbatim copies of the Program's source
-code as you receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice and
-disclaimer of warranty; keep intact all the notices that refer to this License
-and to the absence of any warranty; and give any other recipients of the
-Program a copy of this License along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and you
-may at your option offer warranty protection in exchange for a fee.
-
-2. You may modify your copy or copies of the Program or any portion of it,
-thus forming a work based on the Program, and copy and distribute such
-modifications or work under the terms of Section 1 above, provided that you
-also meet all of these conditions:
-
-a) You must cause the modified files to carry prominent notices stating that
-you changed the files and the date of any change.
-
-b) You must cause any work that you distribute or publish, that in whole or in
-part contains or is derived from the Program or any part thereof, to be
-licensed as a whole at no charge to all third parties under the terms of this
-License.
-
-c) If the modified program normally reads commands interactively when run,
-you must cause it, when started running for such interactive use in the most
-ordinary way, to print or display an announcement including an appropriate
-copyright notice and a notice that there is no warranty (or else, saying that
-you provide a warranty) and that users may redistribute the program under
-these conditions, and telling the user how to view a copy of this License.
-(Exception: if the Program itself is interactive but does not normally print such
-an announcement, your work based on the Program is not required to print
-an announcement.)
-
-These requirements apply to the modified work as a whole. If identifiable
-sections of that work are not derived from the Program, and can be
-reasonably considered independent and separate works in themselves, then
-this License, and its terms, do not apply to those sections when you distribute
-them as separate works. But when you distribute the same sections as part
-of a whole which is a work based on the Program, the distribution of the
-whole must be on the terms of this License, whose permissions for other
-licensees extend to the entire whole, and thus to each and every part
-regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest your rights to
-work written entirely by you; rather, the intent is to exercise the right to
-control the distribution of derivative or collective works based on the
-Program.
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
 
 In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of a
-storage or distribution medium does not bring the other work under the scope
-of this License.
-
-3. You may copy and distribute the Program (or a work based on it, under
-Section 2) in object code or executable form under the terms of Sections 1
-and 2 above provided that you also do one of the following:
-
-a) Accompany it with the complete corresponding machine-readable source
-code, which must be distributed under the terms of Sections 1 and 2 above
-on a medium customarily used for software interchange; or,
-
-b) Accompany it with a written offer, valid for at least three years, to give
-any third party, for a charge no more than your cost of physically performing
-source distribution, a complete machine-readable copy of the corresponding
-source code, to be distributed under the terms of Sections 1 and 2 above on
-a medium customarily used for software interchange; or,
-
-c) Accompany it with the information you received as to the offer to distribute
-corresponding source code. (This alternative is allowed only for
-noncommercial distribution and only if you received the program in object
-code or executable form with such an offer, in accord with Subsection b
-above.)
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
 
 The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source code
-means all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation and
-installation of the executable. However, as a special exception, the source
-code distributed need not include anything that is normally distributed (in
-either source or binary form) with the major components (compiler, kernel,
-and so on) of the operating system on which the executable runs, unless that
-component itself accompanies the executable.
-
-If distribution of executable or object code is made by offering access to
-copy from a designated place, then offering equivalent access to copy the
-source code from the same place counts as distribution of the source code,
-even though third parties are not compelled to copy the source along with the
-object code.
-
-4. You may not copy, modify, sublicense, or distribute the Program except as
-expressly provided under this License. Any attempt otherwise to copy,
-modify, sublicense or distribute the Program is void, and will automatically
-terminate your rights under this License. However, parties who have received
-copies, or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-5. You are not required to accept this License, since you have not signed it.
-However, nothing else grants you permission to modify or distribute the
-Program or its derivative works. These actions are prohibited by law if you
-do not accept this License. Therefore, by modifying or distributing the
-Program (or any work based on the Program), you indicate your acceptance
-of this License to do so, and all its terms and conditions for copying,
-distributing or modifying the Program or works based on it.
-
-6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the original
-licensor to copy, distribute or modify the Program subject to these terms and
-conditions. You may not impose any further restrictions on the recipients'
-exercise of the rights granted herein. You are not responsible for enforcing
-compliance by third parties to this License.
-
-7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues), conditions
-are imposed on you (whether by court order, agreement or otherwise) that
-contradict the conditions of this License, they do not excuse you from the
-conditions of this License. If you cannot distribute so as to satisfy
-simultaneously your obligations under this License and any other pertinent
-obligations, then as a consequence you may not distribute the Program at all.
-For example, if a patent license would not permit royalty-free redistribution
-of the Program by all those who receive copies directly or indirectly through
-you, then the only way you could satisfy both it and this License would be to
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
 refrain entirely from distribution of the Program.
 
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply and
-the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any patents or
-other property right claims or to contest validity of any such claims; this
-section has the sole purpose of protecting the integrity of the free software
-distribution system, which is implemented by public license practices. Many
-people have made generous contributions to the wide range of software
-distributed through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing to
-distribute software through any other system and a licensee cannot impose
-that choice.
-
-This section is intended to make thoroughly clear what is believed to be a
-consequence of the rest of this License.
-
-8. If the distribution and/or use of the Program is restricted in certain
-countries either by patents or by copyrighted interfaces, the original copyright
-holder who places the Program under this License may add an explicit
-geographical distribution limitation excluding those countries, so that
-distribution is permitted only in or among countries not thus excluded. In such
-case, this License incorporates the limitation as if written in the body of this
-License.
-
-9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will be
-similar in spirit to the present version, but may differ in detail to address new
-problems or concerns.
-
-Each version is given a distinguishing version number. If the Program specifies
-a version number of this License which applies to it and "any later version",
-you have the option of following the terms and conditions either of that
-version or of any later version published by the Free Software Foundation. If
-the Program does not specify a version number of this License, you may
-choose any version ever published by the Free Software Foundation.
-
-10. If you wish to incorporate parts of the Program into other free programs
-whose distribution conditions are different, write to the author to ask for
-permission. For software which is copyrighted by the Free Software
-Foundation, write to the Free Software Foundation; we sometimes make
-exceptions for this. Our decision will be guided by the two goals of
-preserving the free status of all derivatives of our free software and of
-promoting the sharing and reuse of software generally.
-
-               NO WARRANTY
-
-11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE,
-THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT
-PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
-STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
-WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
-PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR
-AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR
-ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL,
-SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
-ARISING OUT OF THE USE OR INABILITY TO USE THE
-PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA
-OR DATA BEING RENDERED INACCURATE OR LOSSES
-SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE
-PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN
-IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.
-
-          END OF TERMS AND CONDITIONS
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            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
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision 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, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This 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.
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/jquery_update.info b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/jquery_update.info
index 2028a9b..c5e8b7b 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/jquery_update.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/jquery_update.info
@@ -1,15 +1,15 @@
 name = jQuery Update
-description = Updates jQuery to jQuery 1.5.2 and jQuery UI 1.8.11.
+description = Update jQuery and jQuery UI to a more recent version.
 package = User interface
 core = 7.x
 files[] = jquery_update.module
 files[] = jquery_update.install
 
-configure = admin/config/development/performance
+configure = admin/config/development/jquery_update
 
-; Information added by drupal.org packaging script on 2011-04-04
-version = "7.x-2.2"
+; Information added by drupal.org packaging script on 2013-02-09
+version = "7.x-2.3"
 core = "7.x"
 project = "jquery_update"
-datestamp = "1301920269"
+datestamp = "1360375905"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/jquery_update.install b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/jquery_update.install
index 8eee7bf..a4e9168 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/jquery_update.install
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/jquery_update.install
@@ -30,15 +30,18 @@ function jquery_update_requirements($phase) {
  */
 function jquery_update_uninstall() {
   variable_del('jquery_update_compression_type');
+  variable_del('jquery_update_jquery_version');
 }
 
 /**
- * The packed version of jQuery is no longer distributed. If that is the chosen
- * version update to minified.
+ * Update from Drupal 6.
  */
 function jquery_update_update_7000() {
   if (variable_get('jquery_update_compression_type', 'min') == 'pack') {
     variable_set('jquery_update_compression_type', 'min');
   }
   variable_del('jquery_update_replace');
+
+  // Restore the default version of jQuery.
+  variable_del('jquery_update_jquery_version');
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/jquery_update.module b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/jquery_update.module
index 89d706c..520e076 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/jquery_update.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/jquery_update.module
@@ -2,10 +2,23 @@
 
 /**
  * @file
- * Updates Drupal to use the latest versions of jQuery and jQuery UI.
+ * Updates Drupal to use the latest version of jQuery.
  */
 
 /**
+ * Implements hook_help().
+ */
+function jquery_update_help($path, $arg) {
+  switch ($path) {
+      // Help for another path in the block module
+    case 'admin/config/development/jquery_update':
+      return '<p>' . t('Configure how <a href="@jquery">jQuery</a> behaves on the site. Select which jQuery version, the compression level and whether or not to use a CDN.', array(
+        '@jquery' => 'http://jquery.com',
+      )) . '</p>';
+  }
+}
+
+/**
  * Implements hook_library().
  */
 function jquery_update_library() {
@@ -48,9 +61,9 @@ function jquery_update_library() {
 }
 
 /**
- * Implements hook_library_alter().
+ * Implementation of hook_library_alter().
  */
-function jquery_update_library_alter(&$libraries, $module) {
+function jquery_update_library_alter(&$javascript, $module) {
 
   // We are updating just the system module. For all other cases we return.
   if ($module != 'system') {
@@ -63,28 +76,59 @@ function jquery_update_library_alter(&$libraries, $module) {
   $min = variable_get('jquery_update_compression_type', 'min') == 'none' ? '' : '.min';
   $cdn = variable_get('jquery_update_jquery_cdn', 'none');
 
-  // Replace jQuery.
-  jquery_update_jquery_replace($libraries, $cdn, $path, $min); 
-  $libraries['jquery']['version'] = '1.5.2';
+  // Replace jQuery with the latest version.
+  $version = variable_get('jquery_update_jquery_version', '1.5');
+  jquery_update_jquery_replace($javascript, $cdn, $path, $min, $version);
 
   // Replace jQuery UI with CDN or local files. If from a CDN include all of jQuery UI.
-  jquery_update_jqueryui_replace($libraries, $cdn, $path, $min);
+  jquery_update_jqueryui_replace($javascript, $cdn, $path, $min);
 
   // Replace the jQuery Cookie plugin.
-  $libraries['jquery.cookie']['js']['misc/jquery.cookie.js']['data'] = $path . '/replace/ui/external/jquery.cookie.js';
+  $javascript['cookie']['js']['misc/jquery.cookie.js']['data'] = $path . '/replace/ui/external/jquery.cookie.js';
   // Noting the version based on git commit as no version number is available.
-  $libraries['jquery.cookie']['version'] = '67fb34f6a866c40d0570';
+  $javascript['cookie']['version'] = '67fb34f6a866c40d0570';
 
   // Replace jQuery Form plugin.
-  $libraries['jquery.form']['js']['misc/jquery.form.js']['data'] = $path . '/replace/misc/jquery.form.js';
-  $libraries['jquery.form']['version'] = '2.67';
+  $javascript['jquery.form']['js']['misc/jquery.form.js']['data'] = $path . '/replace/misc/jquery.form' . $min . '.js';
+  $javascript['jquery.form']['version'] = '2.69';
+
+  // Replace files for jQuery 1.7 and up
+  if (version_compare($version, '1.7', '>=')) {
+    $javascript['drupal.states']['js']['misc/states.js']['data'] = $path . '/replace/misc/1.7/states.js';
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function jquery_update_menu() {
+  $items['admin/config/development/jquery_update'] = array(
+    'title' => 'jQuery update',
+    'description' => 'Configure settings related to the jQuery upgrade, the library path and compression.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('jquery_update_settings_form'),
+    'access arguments' => array('administer site configuration'),
+  );
+
+  return $items;
 }
 
 /**
- * Implements hook_form_FORM_ID_alter().
+ * Implementation of hook_form_FORM_ID().
  */
-function jquery_update_form_system_performance_settings_alter(&$form, &$form_state, $form_id) {
-  $form['bandwidth_optimization']['jquery_update_compression_type'] = array(
+function jquery_update_settings_form() {
+  $form['jquery_update_jquery_version'] = array(
+    '#type' => 'select',
+    '#title' => t('jQuery Version'),
+    '#options' => array(
+      '1.5' => '1.5',
+      '1.7' => '1.7',
+      '1.8' => '1.8',
+    ),
+    '#default_value' => variable_get('jquery_update_jquery_version', '1.5'),
+    '#description' => t('Select which jQuery version branch to use.'),
+  );
+  $form['jquery_update_compression_type'] = array(
     '#type' => 'radios',
     '#title' => t('jQuery compression level'),
     '#options' => array(
@@ -93,44 +137,71 @@ function jquery_update_form_system_performance_settings_alter(&$form, &$form_sta
     ),
     '#default_value' => variable_get('jquery_update_compression_type', 'min'),
   );
-  $form['bandwidth_optimization']['jquery_update_jquery_cdn'] = array(
-    '#type' => 'radios',
+  $form['jquery_update_jquery_cdn'] = array(
+    '#type' => 'select',
     '#title' => t('jQuery and jQuery UI CDN'),
     '#options' => array(
       'none' => t('None'),
       'google' => t('Google'),
       'microsoft' => t('Microsoft'),
+      'jquery' => t('jQuery'),
     ),
     '#default_value' => variable_get('jquery_update_jquery_cdn', 'none'),
     '#description' => t('Use jQuery and jQuery UI from a CDN. If the CDN is not available the local version of jQuery and jQuery UI will be used.'),
   );
+
+  return system_settings_form($form);
 }
 
 /**
  * Update jQuery to the CDN or local path.
  *
- * @param array $libraries
+ * @param array $javascript
  *   The library definition array as seen in hook_library_alter().
  * @param string $cdn
  *   The name of the CDN option to use. Possible options are:
  *   - none
  *   - google
  *   - microsoft
+ * @param string $version
+ *   The version of jQuery to use.
  */
-function jquery_update_jquery_replace(&$libraries, $cdn, $path, $min) {
+function jquery_update_jquery_replace(&$javascript, $cdn, $path, $min, $version) {
+  // Make sure to use the latest version in given branch.
+  $trueversion = NULL;
+  switch ($version) {
+    case '1.5':
+      $trueversion = '1.5.2';
+      break;
+    case '1.7':
+      $trueversion = '1.7.1';
+      break;
+    case '1.8':
+      $trueversion = '1.8.2';
+      break;
+  }
+  $javascript['jquery']['version'] = $trueversion;
+
+  // Check for CDN support.
   switch($cdn) {
     case 'google':
-      $libraries['jquery']['js']['misc/jquery.js']['data'] = 'https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery' . $min . '.js';
-      $libraries['jquery']['js']['misc/jquery.js']['type'] = 'external';
-      jquery_update_jquery_backup($libraries, $path, $min);
+      $javascript['jquery']['js']['misc/jquery.js']['data'] = 'https://ajax.googleapis.com/ajax/libs/jquery/'. $trueversion . '/jquery' . $min . '.js';
+      $javascript['jquery']['js']['misc/jquery.js']['type'] = 'external';
+      jquery_update_jquery_backup($javascript, $path, $min, $version);
       break;
     case 'microsoft':
-      $libraries['jquery']['js']['misc/jquery.js']['data'] = 'http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.2' . $min . '.js';
-      $libraries['jquery']['js']['misc/jquery.js']['type'] = 'external';
-      jquery_update_jquery_backup($libraries, $path, $min);
+      $javascript['jquery']['js']['misc/jquery.js']['data'] = 'http://ajax.aspnetcdn.com/ajax/jQuery/jquery-'. $trueversion . $min . '.js';
+      $javascript['jquery']['js']['misc/jquery.js']['type'] = 'external';
+      jquery_update_jquery_backup($javascript, $path, $min, $version);
+      break;
+    case 'jquery':
+      $javascript['jquery']['js']['misc/jquery.js']['data'] = 'http://code.jquery.com/jquery-'. $trueversion . $min . '.js';
+      $javascript['jquery']['js']['misc/jquery.js']['type'] = 'external';
+      jquery_update_jquery_backup($javascript, $path, $min, $version);
       break;
     case 'none':
-      $libraries['jquery']['js']['misc/jquery.js']['data'] = $path . '/replace/jquery/jquery' . $min . '.js';
+    default:
+      $javascript['jquery']['js']['misc/jquery.js']['data'] = $path . '/replace/jquery/'. $version . '/jquery' . $min . '.js';
       break;
   }
 }
@@ -138,16 +209,18 @@ function jquery_update_jquery_replace(&$libraries, $cdn, $path, $min) {
 /**
  * Add the local fallback in case jQuery from the CDN is unavailable.
  *
- * @param array $libraries
+ * @param array $javascript
  *   The $libraries array as seen in hook_library_alter()
  * @param string $path
  *   The path to the module where replacements can be found.
  * @param string $min
  *   The '.min' to include in the file name if we are requesting a minified version.
+ * @param string $version
+ *   The verison of jQuery to use.
  */
-function jquery_update_jquery_backup(&$libraries, $path, $min) {
-  $libraries['jquery']['js'][] = array(
-    'data' => 'window.jQuery || document.write("<script src=\'' . base_path() . $path . '/replace/jquery/jquery' . $min . '.js\'>\x3C/script>")',
+function jquery_update_jquery_backup(&$javascript, $path, $min, $version) {
+  $javascript['jquery']['js'][] = array(
+    'data' => 'window.jQuery || document.write("<script src=\'' . base_path() . $path . '/replace/jquery/'. $version . '/jquery' . $min . '.js\'>\x3C/script>")',
     'type' => 'inline',
     'group' => JS_LIBRARY,
     'weight' => -19.999999999,
@@ -157,7 +230,7 @@ function jquery_update_jquery_backup(&$libraries, $path, $min) {
 /**
  * Update jQuery UI to the CDN or local path.
  *
- * @param array $libraries
+ * @param array $javascript
  *   The library definition array as seen in hook_library_alter().
  * @param string $cdn
  *   The name of the CDN option to use. Possible options are:
@@ -165,7 +238,7 @@ function jquery_update_jquery_backup(&$libraries, $path, $min) {
  *   - google
  *   - microsoft
  */
-function jquery_update_jqueryui_replace(&$libraries, $cdn, $path, $min) {
+function jquery_update_jqueryui_replace(&$javascript, $cdn, $path, $min) {
   // Replace all CSS files.
   $names = drupal_map_assoc(array(
     'ui.accordion', 'ui.autocomplete', 'ui.button', 'ui.datepicker',
@@ -175,10 +248,10 @@ function jquery_update_jqueryui_replace(&$libraries, $cdn, $path, $min) {
   $names['ui'] = 'ui.core';
   $csspath = $path . '/replace/ui/themes/base/' . (($min == '.min') ? 'minified/' : '');
   foreach ($names as $name => $file) {
-    $libraries[$name]['css']["misc/ui/jquery.$file.css"]['data'] = $csspath . 'jquery.' . $file . $min . '.css';
+    $javascript[$name]['css']["misc/ui/jquery.$file.css"]['data'] = $csspath . 'jquery.' . $file . $min . '.css';
   }
   // Make sure ui.theme is replaced as well.
-  $libraries['ui']['css']['misc/ui/jquery.ui.theme.css']['data'] = $csspath . 'jquery.ui.theme' . $min . '.css';
+  $javascript['ui']['css']['misc/ui/jquery.ui.theme.css']['data'] = $csspath . 'jquery.ui.theme' . $min . '.css';
 
   // Replace jQuery UI's JavaScript, beginning by defining the mapping.
   $names = drupal_map_assoc(array(
@@ -196,16 +269,16 @@ function jquery_update_jqueryui_replace(&$libraries, $cdn, $path, $min) {
   switch($cdn) {
     case 'google':
       $cdn = 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.11/jquery-ui' . $min . '.js';
-      jquery_update_jqueryui_cdn($cdn, $libraries, $path, $min, $names);
-      jquery_update_jqueryui_backup($libraries, $path, $min);
+      jquery_update_jqueryui_cdn($cdn, $javascript, $path, $min, $names);
+      jquery_update_jqueryui_backup($javascript, $path, $min);
       break;
     case 'microsoft':
       $cdn = 'http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.11/jquery-ui' . $min . '.js';
-      jquery_update_jqueryui_cdn($cdn, $libraries, $path, $min, $names);
-      jquery_update_jqueryui_backup($libraries, $path, $min);
+      jquery_update_jqueryui_cdn($cdn, $javascript, $path, $min, $names);
+      jquery_update_jqueryui_backup($javascript, $path, $min);
       break;
     case 'none':
-      jquery_update_jqueryui_local($libraries, $path, $min, $names);
+      jquery_update_jqueryui_local($javascript, $path, $min, $names);
       break;
   }
 }
@@ -213,16 +286,16 @@ function jquery_update_jqueryui_replace(&$libraries, $cdn, $path, $min) {
 /**
  * Add the local fallback in case jQuery UI from the CDN is unavailable.
  *
- * @param array $libraries
+ * @param array $javascript
  *   The $libraries array as seen in hook_library_alter()
  * @param string $path
  *   The path to the module where replacements can be found.
  * @param string $min
  *   The '.min' to include in the file name if we are requesting a minified version.
  */
-function jquery_update_jqueryui_backup(&$libraries, $path, $min) {
+function jquery_update_jqueryui_backup(&$javascript, $path, $min) {
   $js_path = ($min == '.min') ? '/replace/ui/ui/minified/jquery-ui.min.js' : '/replace/ui/ui/jquery-ui.js';
-  $libraries['ui']['js'][] = array(
+  $javascript['ui']['js'][] = array(
     'data' => 'window.jQuery.ui || document.write("<script src=\'' . base_path() . $path . $js_path . '\'>\x3C/script>")',
     'type' => 'inline',
     'group' => JS_LIBRARY,
@@ -233,7 +306,7 @@ function jquery_update_jqueryui_backup(&$libraries, $path, $min) {
 /**
  * Handle when jQuery UI is updated to the cdn version.
  *
- * @param array $libraries
+ * @param array $javascript
  *   The $libraries array as seen in hook_library_alter()
  * @param string $path
  *   The path to the module where replacements can be found.
@@ -242,19 +315,19 @@ function jquery_update_jqueryui_backup(&$libraries, $path, $min) {
  * @param array $names
  *   An array mapping jquery ui parts to their file names.
  */
-function jquery_update_jqueryui_cdn($cdn, &$libraries, $path, $min, $names) {
+function jquery_update_jqueryui_cdn($cdn, &$javascript, $path, $min, $names) {
 
   // Construct the jQuery UI path and replace the JavaScript.
   $jspath = $path . '/replace/ui/ui/' . ($min == '.min' ? 'minified/' : '');
   foreach ($names as $name => $file) {
     $corefile = 'misc/ui/jquery.' . $file . '.min.js';
     // Remove the core files.
-    unset($libraries[$name]['js'][$corefile]);
-    $libraries[$name]['version'] = '1.8.11';
+    unset($javascript[$name]['js'][$corefile]);
+    $javascript[$name]['version'] = '1.8.11';
   }
 
   // UI is used by all of UI. Add the js cdn here.
-  $libraries['ui']['js'][$cdn] = array(
+  $javascript['ui']['js'][$cdn] = array(
     'data' => $cdn,
     'type' => 'external',
     'group' => JS_LIBRARY,
@@ -265,7 +338,7 @@ function jquery_update_jqueryui_cdn($cdn, &$libraries, $path, $min, $names) {
 /**
  * Handle when jQuery UI is updated to the local version.
  *
- * @param array $libraries
+ * @param array $javascript
  *   The $libraries array as seen in hook_library_alter()
  * @param string $path
  *   The path to the module where replacements can be found.
@@ -274,13 +347,13 @@ function jquery_update_jqueryui_cdn($cdn, &$libraries, $path, $min, $names) {
  * @param array $names
  *   An array mapping jquery ui parts to their file names.
  */
-function jquery_update_jqueryui_local(&$libraries, $path, $min, $names) {
+function jquery_update_jqueryui_local(&$javascript, $path, $min, $names) {
 
   // Construct the jQuery UI path and replace the JavaScript.
   $jspath = $path . '/replace/ui/ui/' . ($min == '.min' ? 'minified/' : '');
   foreach ($names as $name => $file) {
     $corefile = 'misc/ui/jquery.' . $file . '.min.js';
-    $libraries[$name]['js'][$corefile]['data'] = $jspath . 'jquery.' . $file . $min . '.js';
-    $libraries[$name]['version'] = '1.8.11';
+    $javascript[$name]['js'][$corefile]['data'] = $jspath . 'jquery.' . $file . $min . '.js';
+    $javascript[$name]['version'] = '1.8.11';
   }
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.5/jquery.js b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.5/jquery.js
new file mode 100644
index 0000000..78fcfa4
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.5/jquery.js
@@ -0,0 +1,8316 @@
+/*!
+ * jQuery JavaScript Library v1.5.1
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Wed Feb 23 13:55:29 2011 -0500
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// A simple way to check for HTML strings or ID strings
+	// (both of which we optimize for)
+	quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,
+
+	// Check if a string has a non-whitespace character in it
+	rnotwhite = /\S/,
+
+	// Used for trimming whitespace
+	trimLeft = /^\s+/,
+	trimRight = /\s+$/,
+
+	// Check for digits
+	rdigit = /\d/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+	// Useragent RegExp
+	rwebkit = /(webkit)[ \/]([\w.]+)/,
+	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+	rmsie = /(msie) ([\w.]+)/,
+	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+	// Keep a UserAgent string for use with jQuery.browser
+	userAgent = navigator.userAgent,
+
+	// For matching the engine and version of the browser
+	browserMatch,
+
+	// Has the ready events already been bound?
+	readyBound = false,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// Promise methods
+	promiseMethods = "then done fail isResolved isRejected promise".split( " " ),
+
+	// The ready event handler
+	DOMContentLoaded,
+
+	// Save a reference to some core methods
+	toString = Object.prototype.toString,
+	hasOwn = Object.prototype.hasOwnProperty,
+	push = Array.prototype.push,
+	slice = Array.prototype.slice,
+	trim = String.prototype.trim,
+	indexOf = Array.prototype.indexOf,
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), or $(undefined)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// The body element only exists once, optimize finding it
+		if ( selector === "body" && !context && document.body ) {
+			this.context = document;
+			this[0] = document.body;
+			this.selector = "body";
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			match = quickExpr.exec( selector );
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = (context ? context.ownerDocument || context : document);
+
+					// If a single string is passed in and it's a single tag
+					// just do a createElement and skip the rest
+					ret = rsingleTag.exec( selector );
+
+					if ( ret ) {
+						if ( jQuery.isPlainObject( context ) ) {
+							selector = [ document.createElement( ret[1] ) ];
+							jQuery.fn.attr.call( selector, context, true );
+
+						} else {
+							selector = [ doc.createElement( ret[1] ) ];
+						}
+
+					} else {
+						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+						selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
+					}
+
+					return jQuery.merge( this, selector );
+
+				// HANDLE: $("#id")
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return (context || rootjQuery).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if (selector.selector !== undefined) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.5.1",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return slice.call( this, 0 );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = this.constructor();
+
+		if ( jQuery.isArray( elems ) ) {
+			push.apply( ret, elems );
+
+		} else {
+			jQuery.merge( ret, elems );
+		}
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + (this.selector ? " " : "") + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Attach the listeners
+		jQuery.bindReady();
+
+		// Add the callback
+		readyList.done( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, +i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ),
+			"slice", slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		window.$ = _$;
+
+		if ( deep ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+		// A third-party is pushing the ready event forwards
+		if ( wait === true ) {
+			jQuery.readyWait--;
+		}
+
+		// Make sure that the DOM is not already loaded
+		if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) {
+			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+			if ( !document.body ) {
+				return setTimeout( jQuery.ready, 1 );
+			}
+
+			// Remember that the DOM is ready
+			jQuery.isReady = true;
+
+			// If a normal DOM Ready event fired, decrement, and wait if need be
+			if ( wait !== true && --jQuery.readyWait > 0 ) {
+				return;
+			}
+
+			// If there are functions bound, to execute
+			readyList.resolveWith( document, [ jQuery ] );
+
+			// Trigger any bound ready events
+			if ( jQuery.fn.trigger ) {
+				jQuery( document ).trigger( "ready" ).unbind( "ready" );
+			}
+		}
+	},
+
+	bindReady: function() {
+		if ( readyBound ) {
+			return;
+		}
+
+		readyBound = true;
+
+		// Catch cases where $(document).ready() is called after the
+		// browser event has already occurred.
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Mozilla, Opera and webkit nightlies currently support this event
+		if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else if ( document.attachEvent ) {
+			// ensure firing before onload,
+			// maybe late but safe also for iframes
+			document.attachEvent("onreadystatechange", DOMContentLoaded);
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var toplevel = false;
+
+			try {
+				toplevel = window.frameElement == null;
+			} catch(e) {}
+
+			if ( document.documentElement.doScroll && toplevel ) {
+				doScrollCheck();
+			}
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	// A crude way of determining if an object is a window
+	isWindow: function( obj ) {
+		return obj && typeof obj === "object" && "setInterval" in obj;
+	},
+
+	isNaN: function( obj ) {
+		return obj == null || !rdigit.test( obj ) || isNaN( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		// Not own constructor property must be Object
+		if ( obj.constructor &&
+			!hasOwn.call(obj, "constructor") &&
+			!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		for ( var name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw msg;
+	},
+
+	parseJSON: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test(data.replace(rvalidescape, "@")
+			.replace(rvalidtokens, "]")
+			.replace(rvalidbraces, "")) ) {
+
+			// Try to use the native JSON parser first
+			return window.JSON && window.JSON.parse ?
+				window.JSON.parse( data ) :
+				(new Function("return " + data))();
+
+		} else {
+			jQuery.error( "Invalid JSON: " + data );
+		}
+	},
+
+	// Cross-browser xml parsing
+	// (xml & tmp used internally)
+	parseXML: function( data , xml , tmp ) {
+
+		if ( window.DOMParser ) { // Standard
+			tmp = new DOMParser();
+			xml = tmp.parseFromString( data , "text/xml" );
+		} else { // IE
+			xml = new ActiveXObject( "Microsoft.XMLDOM" );
+			xml.async = "false";
+			xml.loadXML( data );
+		}
+
+		tmp = xml.documentElement;
+
+		if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evalulates a script in a global context
+	globalEval: function( data ) {
+		if ( data && rnotwhite.test(data) ) {
+			// Inspired by code by Andrea Giammarchi
+			// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
+			var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement,
+				script = document.createElement( "script" );
+
+			if ( jQuery.support.scriptEval() ) {
+				script.appendChild( document.createTextNode( data ) );
+			} else {
+				script.text = data;
+			}
+
+			// Use insertBefore instead of appendChild to circumvent an IE6 bug.
+			// This arises when a base node is used (#2709).
+			head.insertBefore( script, head.firstChild );
+			head.removeChild( script );
+		}
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0,
+			length = object.length,
+			isObj = length === undefined || jQuery.isFunction(object);
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.apply( object[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( object[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( var value = object[0];
+					i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
+			}
+		}
+
+		return object;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: trim ?
+		function( text ) {
+			return text == null ?
+				"" :
+				trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( array, results ) {
+		var ret = results || [];
+
+		if ( array != null ) {
+			// The window, strings (and functions) also have 'length'
+			// The extra typeof function check is to prevent crashes
+			// in Safari 2 (See: #3039)
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			var type = jQuery.type(array);
+
+			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+				push.call( ret, array );
+			} else {
+				jQuery.merge( ret, array );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array ) {
+		if ( array.indexOf ) {
+			return array.indexOf( elem );
+		}
+
+		for ( var i = 0, length = array.length; i < length; i++ ) {
+			if ( array[ i ] === elem ) {
+				return i;
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var i = first.length,
+			j = 0;
+
+		if ( typeof second.length === "number" ) {
+			for ( var l = second.length; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var ret = [], retVal;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var ret = [], value;
+
+		// Go through the array, translating each of the items to their
+		// new value (or values).
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			value = callback( elems[ i ], i, arg );
+
+			if ( value != null ) {
+				ret[ ret.length ] = value;
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	proxy: function( fn, proxy, thisObject ) {
+		if ( arguments.length === 2 ) {
+			if ( typeof proxy === "string" ) {
+				thisObject = fn;
+				fn = thisObject[ proxy ];
+				proxy = undefined;
+
+			} else if ( proxy && !jQuery.isFunction( proxy ) ) {
+				thisObject = proxy;
+				proxy = undefined;
+			}
+		}
+
+		if ( !proxy && fn ) {
+			proxy = function() {
+				return fn.apply( thisObject || this, arguments );
+			};
+		}
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		if ( fn ) {
+			proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+		}
+
+		// So proxy can be declared as an argument
+		return proxy;
+	},
+
+	// Mutifunctional method to get and set values to a collection
+	// The value/s can be optionally by executed if its a function
+	access: function( elems, key, value, exec, fn, pass ) {
+		var length = elems.length;
+
+		// Setting many attributes
+		if ( typeof key === "object" ) {
+			for ( var k in key ) {
+				jQuery.access( elems, k, key[k], exec, fn, value );
+			}
+			return elems;
+		}
+
+		// Setting one attribute
+		if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = !pass && exec && jQuery.isFunction(value);
+
+			for ( var i = 0; i < length; i++ ) {
+				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+			}
+
+			return elems;
+		}
+
+		// Getting an attribute
+		return length ? fn( elems[0], key ) : undefined;
+	},
+
+	now: function() {
+		return (new Date()).getTime();
+	},
+
+	// Create a simple deferred (one callbacks list)
+	_Deferred: function() {
+		var // callbacks list
+			callbacks = [],
+			// stored [ context , args ]
+			fired,
+			// to avoid firing when already doing so
+			firing,
+			// flag to know if the deferred has been cancelled
+			cancelled,
+			// the deferred itself
+			deferred  = {
+
+				// done( f1, f2, ...)
+				done: function() {
+					if ( !cancelled ) {
+						var args = arguments,
+							i,
+							length,
+							elem,
+							type,
+							_fired;
+						if ( fired ) {
+							_fired = fired;
+							fired = 0;
+						}
+						for ( i = 0, length = args.length; i < length; i++ ) {
+							elem = args[ i ];
+							type = jQuery.type( elem );
+							if ( type === "array" ) {
+								deferred.done.apply( deferred, elem );
+							} else if ( type === "function" ) {
+								callbacks.push( elem );
+							}
+						}
+						if ( _fired ) {
+							deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
+						}
+					}
+					return this;
+				},
+
+				// resolve with given context and args
+				resolveWith: function( context, args ) {
+					if ( !cancelled && !fired && !firing ) {
+						firing = 1;
+						try {
+							while( callbacks[ 0 ] ) {
+								callbacks.shift().apply( context, args );
+							}
+						}
+						// We have to add a catch block for
+						// IE prior to 8 or else the finally
+						// block will never get executed
+						catch (e) {
+							throw e;
+						}
+						finally {
+							fired = [ context, args ];
+							firing = 0;
+						}
+					}
+					return this;
+				},
+
+				// resolve with this as context and given arguments
+				resolve: function() {
+					deferred.resolveWith( jQuery.isFunction( this.promise ) ? this.promise() : this, arguments );
+					return this;
+				},
+
+				// Has this deferred been resolved?
+				isResolved: function() {
+					return !!( firing || fired );
+				},
+
+				// Cancel
+				cancel: function() {
+					cancelled = 1;
+					callbacks = [];
+					return this;
+				}
+			};
+
+		return deferred;
+	},
+
+	// Full fledged deferred (two callbacks list)
+	Deferred: function( func ) {
+		var deferred = jQuery._Deferred(),
+			failDeferred = jQuery._Deferred(),
+			promise;
+		// Add errorDeferred methods, then and promise
+		jQuery.extend( deferred, {
+			then: function( doneCallbacks, failCallbacks ) {
+				deferred.done( doneCallbacks ).fail( failCallbacks );
+				return this;
+			},
+			fail: failDeferred.done,
+			rejectWith: failDeferred.resolveWith,
+			reject: failDeferred.resolve,
+			isRejected: failDeferred.isResolved,
+			// Get a promise for this deferred
+			// If obj is provided, the promise aspect is added to the object
+			promise: function( obj ) {
+				if ( obj == null ) {
+					if ( promise ) {
+						return promise;
+					}
+					promise = obj = {};
+				}
+				var i = promiseMethods.length;
+				while( i-- ) {
+					obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
+				}
+				return obj;
+			}
+		} );
+		// Make sure only one callback list will be used
+		deferred.done( failDeferred.cancel ).fail( deferred.cancel );
+		// Unexpose cancel
+		delete deferred.cancel;
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( object ) {
+		var lastIndex = arguments.length,
+			deferred = lastIndex <= 1 && object && jQuery.isFunction( object.promise ) ?
+				object :
+				jQuery.Deferred(),
+			promise = deferred.promise();
+
+		if ( lastIndex > 1 ) {
+			var array = slice.call( arguments, 0 ),
+				count = lastIndex,
+				iCallback = function( index ) {
+					return function( value ) {
+						array[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value;
+						if ( !( --count ) ) {
+							deferred.resolveWith( promise, array );
+						}
+					};
+				};
+			while( ( lastIndex-- ) ) {
+				object = array[ lastIndex ];
+				if ( object && jQuery.isFunction( object.promise ) ) {
+					object.promise().then( iCallback(lastIndex), deferred.reject );
+				} else {
+					--count;
+				}
+			}
+			if ( !count ) {
+				deferred.resolveWith( promise, array );
+			}
+		} else if ( deferred !== object ) {
+			deferred.resolve( object );
+		}
+		return promise;
+	},
+
+	// Use of jQuery.browser is frowned upon.
+	// More details: http://docs.jquery.com/Utilities/jQuery.browser
+	uaMatch: function( ua ) {
+		ua = ua.toLowerCase();
+
+		var match = rwebkit.exec( ua ) ||
+			ropera.exec( ua ) ||
+			rmsie.exec( ua ) ||
+			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+			[];
+
+		return { browser: match[1] || "", version: match[2] || "0" };
+	},
+
+	sub: function() {
+		function jQuerySubclass( selector, context ) {
+			return new jQuerySubclass.fn.init( selector, context );
+		}
+		jQuery.extend( true, jQuerySubclass, this );
+		jQuerySubclass.superclass = this;
+		jQuerySubclass.fn = jQuerySubclass.prototype = this();
+		jQuerySubclass.fn.constructor = jQuerySubclass;
+		jQuerySubclass.subclass = this.subclass;
+		jQuerySubclass.fn.init = function init( selector, context ) {
+			if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) {
+				context = jQuerySubclass(context);
+			}
+
+			return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
+		};
+		jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;
+		var rootjQuerySubclass = jQuerySubclass(document);
+		return jQuerySubclass;
+	},
+
+	browser: {}
+});
+
+// Create readyList deferred
+readyList = jQuery._Deferred();
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+	jQuery.browser[ browserMatch.browser ] = true;
+	jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+	jQuery.browser.safari = true;
+}
+
+if ( indexOf ) {
+	jQuery.inArray = function( elem, array ) {
+		return indexOf.call( array, elem );
+	};
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+	trimLeft = /^[\s\xA0]+/;
+	trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+	DOMContentLoaded = function() {
+		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+		jQuery.ready();
+	};
+
+} else if ( document.attachEvent ) {
+	DOMContentLoaded = function() {
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	};
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+	if ( jQuery.isReady ) {
+		return;
+	}
+
+	try {
+		// If IE is used, use the trick by Diego Perini
+		// http://javascript.nwbox.com/IEContentLoaded/
+		document.documentElement.doScroll("left");
+	} catch(e) {
+		setTimeout( doScrollCheck, 1 );
+		return;
+	}
+
+	// and execute any waiting functions
+	jQuery.ready();
+}
+
+// Expose jQuery to the global object
+return jQuery;
+
+})();
+
+
+(function() {
+
+	jQuery.support = {};
+
+	var div = document.createElement("div");
+
+	div.style.display = "none";
+	div.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+	var all = div.getElementsByTagName("*"),
+		a = div.getElementsByTagName("a")[0],
+		select = document.createElement("select"),
+		opt = select.appendChild( document.createElement("option") ),
+		input = div.getElementsByTagName("input")[0];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return;
+	}
+
+	jQuery.support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: div.firstChild.nodeType === 3,
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText insted)
+		style: /red/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: a.getAttribute("href") === "/a",
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.55$/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: input.value === "on",
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Will be defined later
+		deleteExpando: true,
+		optDisabled: false,
+		checkClone: false,
+		noCloneEvent: true,
+		noCloneChecked: true,
+		boxModel: null,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableHiddenOffsets: true
+	};
+
+	input.checked = true;
+	jQuery.support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as diabled)
+	select.disabled = true;
+	jQuery.support.optDisabled = !opt.disabled;
+
+	var _scriptEval = null;
+	jQuery.support.scriptEval = function() {
+		if ( _scriptEval === null ) {
+			var root = document.documentElement,
+				script = document.createElement("script"),
+				id = "script" + jQuery.now();
+
+			try {
+				script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
+			} catch(e) {}
+
+			root.insertBefore( script, root.firstChild );
+
+			// Make sure that the execution of code works by injecting a script
+			// tag with appendChild/createTextNode
+			// (IE doesn't support this, fails, and uses .text instead)
+			if ( window[ id ] ) {
+				_scriptEval = true;
+				delete window[ id ];
+			} else {
+				_scriptEval = false;
+			}
+
+			root.removeChild( script );
+			// release memory in IE
+			root = script = id  = null;
+		}
+
+		return _scriptEval;
+	};
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+
+	} catch(e) {
+		jQuery.support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent("onclick", function click() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			jQuery.support.noCloneEvent = false;
+			div.detachEvent("onclick", click);
+		});
+		div.cloneNode(true).fireEvent("onclick");
+	}
+
+	div = document.createElement("div");
+	div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
+
+	var fragment = document.createDocumentFragment();
+	fragment.appendChild( div.firstChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
+
+	// Figure out if the W3C box model works as expected
+	// document.body must exist before we can do this
+	jQuery(function() {
+		var div = document.createElement("div"),
+			body = document.getElementsByTagName("body")[0];
+
+		// Frameset documents with no body should not run this code
+		if ( !body ) {
+			return;
+		}
+
+		div.style.width = div.style.paddingLeft = "1px";
+		body.appendChild( div );
+		jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
+
+		if ( "zoom" in div.style ) {
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			// (IE < 8 does this)
+			div.style.display = "inline";
+			div.style.zoom = 1;
+			jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2;
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "";
+			div.innerHTML = "<div style='width:4px;'></div>";
+			jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2;
+		}
+
+		div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+		var tds = div.getElementsByTagName("td");
+
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		// (only IE 8 fails this test)
+		jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0;
+
+		tds[0].style.display = "";
+		tds[1].style.display = "none";
+
+		// Check if empty table cells still have offsetWidth/Height
+		// (IE < 8 fail this test)
+		jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0;
+		div.innerHTML = "";
+
+		body.removeChild( div ).style.display = "none";
+		div = tds = null;
+	});
+
+	// Technique from Juriy Zaytsev
+	// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
+	var eventSupported = function( eventName ) {
+		var el = document.createElement("div");
+		eventName = "on" + eventName;
+
+		// We only care about the case where non-standard event systems
+		// are used, namely in IE. Short-circuiting here helps us to
+		// avoid an eval call (in setAttribute) which can cause CSP
+		// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+		if ( !el.attachEvent ) {
+			return true;
+		}
+
+		var isSupported = (eventName in el);
+		if ( !isSupported ) {
+			el.setAttribute(eventName, "return;");
+			isSupported = typeof el[eventName] === "function";
+		}
+		el = null;
+
+		return isSupported;
+	};
+
+	jQuery.support.submitBubbles = eventSupported("submit");
+	jQuery.support.changeBubbles = eventSupported("change");
+
+	// release memory in IE
+	div = all = a = null;
+})();
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/;
+
+jQuery.extend({
+	cache: {},
+
+	// Please use with caution
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache,
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ jQuery.expando ] = id = ++jQuery.uuid;
+			} else {
+				id = jQuery.expando;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+			// metadata on plain JS objects when the object is serialized using
+			// JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
+			} else {
+				cache[ id ] = jQuery.extend(cache[ id ], name);
+			}
+		}
+
+		thisCache = cache[ id ];
+
+		// Internal jQuery data is stored in a separate object inside the object's data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data
+		if ( pvt ) {
+			if ( !thisCache[ internalKey ] ) {
+				thisCache[ internalKey ] = {};
+			}
+
+			thisCache = thisCache[ internalKey ];
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ name ] = data;
+		}
+
+		// TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
+		// not attempt to inspect the internal events object using jQuery.data, as this
+		// internal data object is undocumented and subject to change.
+		if ( name === "events" && !thisCache[name] ) {
+			return thisCache[ internalKey ] && thisCache[ internalKey ].events;
+		}
+
+		return getByName ? thisCache[ name ] : thisCache;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var internalKey = jQuery.expando, isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+
+			// See jQuery.data for more information
+			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+			var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
+
+			if ( thisCache ) {
+				delete thisCache[ name ];
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !isEmptyDataObject(thisCache) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( pvt ) {
+			delete cache[ id ][ internalKey ];
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject(cache[ id ]) ) {
+				return;
+			}
+		}
+
+		var internalCache = cache[ id ][ internalKey ];
+
+		// Browsers that fail expando deletion also refuse to delete expandos on
+		// the window, but it will allow it on all other JS objects; other browsers
+		// don't care
+		if ( jQuery.support.deleteExpando || cache != window ) {
+			delete cache[ id ];
+		} else {
+			cache[ id ] = null;
+		}
+
+		// We destroyed the entire user cache at once because it's faster than
+		// iterating through each key, but we need to continue to persist internal
+		// data if it existed
+		if ( internalCache ) {
+			cache[ id ] = {};
+			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+			// metadata on plain JS objects when the object is serialized using
+			// JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+
+			cache[ id ][ internalKey ] = internalCache;
+
+		// Otherwise, we need to eliminate the expando on the node to avoid
+		// false lookups in the cache for entries that no longer exist
+		} else if ( isNode ) {
+			// IE does not allow us to delete expando properties from nodes,
+			// nor does it have a removeAttribute function on Document nodes;
+			// we must handle all of these cases
+			if ( jQuery.support.deleteExpando ) {
+				delete elem[ jQuery.expando ];
+			} else if ( elem.removeAttribute ) {
+				elem.removeAttribute( jQuery.expando );
+			} else {
+				elem[ jQuery.expando ] = null;
+			}
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		if ( elem.nodeName ) {
+			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+			if ( match ) {
+				return !(match === true || elem.getAttribute("classid") !== match);
+			}
+		}
+
+		return true;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var data = null;
+
+		if ( typeof key === "undefined" ) {
+			if ( this.length ) {
+				data = jQuery.data( this[0] );
+
+				if ( this[0].nodeType === 1 ) {
+					var attr = this[0].attributes, name;
+					for ( var i = 0, l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = name.substr( 5 );
+							dataAttr( this[0], name, data[ name ] );
+						}
+					}
+				}
+			}
+
+			return data;
+
+		} else if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		var parts = key.split(".");
+		parts[1] = parts[1] ? "." + parts[1] : "";
+
+		if ( value === undefined ) {
+			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+			// Try to fetch any internally stored data first
+			if ( data === undefined && this.length ) {
+				data = jQuery.data( this[0], key );
+				data = dataAttr( this[0], key, data );
+			}
+
+			return data === undefined && parts[1] ?
+				this.data( parts[0] ) :
+				data;
+
+		} else {
+			return this.each(function() {
+				var $this = jQuery( this ),
+					args = [ parts[0], value ];
+
+				$this.triggerHandler( "setData" + parts[1] + "!", args );
+				jQuery.data( this, key, value );
+				$this.triggerHandler( "changeData" + parts[1] + "!", args );
+			});
+		}
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+		data = elem.getAttribute( "data-" + key );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+				data === "false" ? false :
+				data === "null" ? null :
+				!jQuery.isNaN( data ) ? parseFloat( data ) :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
+// property to be considered empty objects; this property always exists in
+// order to make sure JSON.stringify does not expose internal metadata
+function isEmptyDataObject( obj ) {
+	for ( var name in obj ) {
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
+
+
+jQuery.extend({
+	queue: function( elem, type, data ) {
+		if ( !elem ) {
+			return;
+		}
+
+		type = (type || "fx") + "queue";
+		var q = jQuery._data( elem, type );
+
+		// Speed up dequeue by getting out quickly if this is just a lookup
+		if ( !data ) {
+			return q || [];
+		}
+
+		if ( !q || jQuery.isArray(data) ) {
+			q = jQuery._data( elem, type, jQuery.makeArray(data) );
+
+		} else {
+			q.push( data );
+		}
+
+		return q;
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift();
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+		}
+
+		if ( fn ) {
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift("inprogress");
+			}
+
+			fn.call(elem, function() {
+				jQuery.dequeue(elem, type);
+			});
+		}
+
+		if ( !queue.length ) {
+			jQuery.removeData( elem, type + "queue", true );
+		}
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+		}
+
+		if ( data === undefined ) {
+			return jQuery.queue( this[0], type );
+		}
+		return this.each(function( i ) {
+			var queue = jQuery.queue( this, type, data );
+
+			if ( type === "fx" && queue[0] !== "inprogress" ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function() {
+			var elem = this;
+			setTimeout(function() {
+				jQuery.dequeue( elem, type );
+			}, time );
+		});
+	},
+
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	}
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+	rspaces = /\s+/,
+	rreturn = /\r/g,
+	rspecialurl = /^(?:href|src|style)$/,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea)?$/i,
+	rradiocheck = /^(?:radio|checkbox)$/i;
+
+jQuery.props = {
+	"for": "htmlFor",
+	"class": "className",
+	readonly: "readOnly",
+	maxlength: "maxLength",
+	cellspacing: "cellSpacing",
+	rowspan: "rowSpan",
+	colspan: "colSpan",
+	tabindex: "tabIndex",
+	usemap: "useMap",
+	frameborder: "frameBorder"
+};
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.attr );
+	},
+
+	removeAttr: function( name, fn ) {
+		return this.each(function(){
+			jQuery.attr( this, name, "" );
+			if ( this.nodeType === 1 ) {
+				this.removeAttribute( name );
+			}
+		});
+	},
+
+	addClass: function( value ) {
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				self.addClass( value.call(this, i, self.attr("class")) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			var classNames = (value || "").split( rspaces );
+
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				var elem = this[i];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className ) {
+						elem.className = value;
+
+					} else {
+						var className = " " + elem.className + " ",
+							setClass = elem.className;
+
+						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
+								setClass += " " + classNames[c];
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				self.removeClass( value.call(this, i, self.attr("class")) );
+			});
+		}
+
+		if ( (value && typeof value === "string") || value === undefined ) {
+			var classNames = (value || "").split( rspaces );
+
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				var elem = this[i];
+
+				if ( elem.nodeType === 1 && elem.className ) {
+					if ( value ) {
+						var className = (" " + elem.className + " ").replace(rclass, " ");
+						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
+							className = className.replace(" " + classNames[c] + " ", " ");
+						}
+						elem.className = jQuery.trim( className );
+
+					} else {
+						elem.className = "";
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.split( rspaces );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space seperated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ";
+		for ( var i = 0, l = this.length; i < l; i++ ) {
+			if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		if ( !arguments.length ) {
+			var elem = this[0];
+
+			if ( elem ) {
+				if ( jQuery.nodeName( elem, "option" ) ) {
+					// attributes.value is undefined in Blackberry 4.7 but
+					// uses .value. See #6932
+					var val = elem.attributes.value;
+					return !val || val.specified ? elem.value : elem.text;
+				}
+
+				// We need to handle select boxes special
+				if ( jQuery.nodeName( elem, "select" ) ) {
+					var index = elem.selectedIndex,
+						values = [],
+						options = elem.options,
+						one = elem.type === "select-one";
+
+					// Nothing was selected
+					if ( index < 0 ) {
+						return null;
+					}
+
+					// Loop through all the selected options
+					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+						var option = options[ i ];
+
+						// Don't return options that are disabled or in a disabled optgroup
+						if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+								(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+							// Get the specific value for the option
+							value = jQuery(option).val();
+
+							// We don't need an array for one selects
+							if ( one ) {
+								return value;
+							}
+
+							// Multi-Selects return an array
+							values.push( value );
+						}
+					}
+
+					// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+					if ( one && !values.length && options.length ) {
+						return jQuery( options[ index ] ).val();
+					}
+
+					return values;
+				}
+
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
+					return elem.getAttribute("value") === null ? "on" : elem.value;
+				}
+
+				// Everything else, we just grab the value
+				return (elem.value || "").replace(rreturn, "");
+
+			}
+
+			return undefined;
+		}
+
+		var isFunction = jQuery.isFunction(value);
+
+		return this.each(function(i) {
+			var self = jQuery(this), val = value;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call(this, i, self.val());
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray(val) ) {
+				val = jQuery.map(val, function (value) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
+				this.checked = jQuery.inArray( self.val(), val ) >= 0;
+
+			} else if ( jQuery.nodeName( this, "select" ) ) {
+				var values = jQuery.makeArray(val);
+
+				jQuery( "option", this ).each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					this.selectedIndex = -1;
+				}
+
+			} else {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	attrFn: {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true
+	},
+
+	attr: function( elem, name, value, pass ) {
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || elem.nodeType === 2 ) {
+			return undefined;
+		}
+
+		if ( pass && name in jQuery.attrFn ) {
+			return jQuery(elem)[name](value);
+		}
+
+		var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
+			// Whether we are setting (or getting)
+			set = value !== undefined;
+
+		// Try to normalize/fix the name
+		name = notxml && jQuery.props[ name ] || name;
+
+		// Only do all the following if this is a node (faster for style)
+		if ( elem.nodeType === 1 ) {
+			// These attributes require special treatment
+			var special = rspecialurl.test( name );
+
+			// Safari mis-reports the default selected property of an option
+			// Accessing the parent's selectedIndex property fixes it
+			if ( name === "selected" && !jQuery.support.optSelected ) {
+				var parent = elem.parentNode;
+				if ( parent ) {
+					parent.selectedIndex;
+
+					// Make sure that it also works with optgroups, see #5701
+					if ( parent.parentNode ) {
+						parent.parentNode.selectedIndex;
+					}
+				}
+			}
+
+			// If applicable, access the attribute via the DOM 0 way
+			// 'in' checks fail in Blackberry 4.7 #6931
+			if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) {
+				if ( set ) {
+					// We can't allow the type property to be changed (since it causes problems in IE)
+					if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
+						jQuery.error( "type property can't be changed" );
+					}
+
+					if ( value === null ) {
+						if ( elem.nodeType === 1 ) {
+							elem.removeAttribute( name );
+						}
+
+					} else {
+						elem[ name ] = value;
+					}
+				}
+
+				// browsers index elements by id/name on forms, give priority to attributes.
+				if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
+					return elem.getAttributeNode( name ).nodeValue;
+				}
+
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				if ( name === "tabIndex" ) {
+					var attributeNode = elem.getAttributeNode( "tabIndex" );
+
+					return attributeNode && attributeNode.specified ?
+						attributeNode.value :
+						rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+							0 :
+							undefined;
+				}
+
+				return elem[ name ];
+			}
+
+			if ( !jQuery.support.style && notxml && name === "style" ) {
+				if ( set ) {
+					elem.style.cssText = "" + value;
+				}
+
+				return elem.style.cssText;
+			}
+
+			if ( set ) {
+				// convert the value to a string (all browsers do this but IE) see #1070
+				elem.setAttribute( name, "" + value );
+			}
+
+			// Ensure that missing attributes return undefined
+			// Blackberry 4.7 returns "" from getAttribute #6938
+			if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) {
+				return undefined;
+			}
+
+			var attr = !jQuery.support.hrefNormalized && notxml && special ?
+					// Some attributes require a special call on IE
+					elem.getAttribute( name, 2 ) :
+					elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return attr === null ? undefined : attr;
+		}
+		// Handle everything which isn't a DOM element node
+		if ( set ) {
+			elem[ name ] = value;
+		}
+		return elem[ name ];
+	}
+});
+
+
+
+
+var rnamespaces = /\.(.*)$/,
+	rformElems = /^(?:textarea|input|select)$/i,
+	rperiod = /\./g,
+	rspace = / /g,
+	rescape = /[^\w\s.|`]/g,
+	fcleanup = function( nm ) {
+		return nm.replace(rescape, "\\$&");
+	};
+
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code originated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+	// Bind an event to an element
+	// Original by Dean Edwards
+	add: function( elem, types, handler, data ) {
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// TODO :: Use a try/catch until it's safe to pull this out (likely 1.6)
+		// Minor release fix for bug #8018
+		try {
+			// For whatever reason, IE has trouble passing the window object
+			// around, causing it to be cloned in the process
+			if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) {
+				elem = window;
+			}
+		}
+		catch ( e ) {}
+
+		if ( handler === false ) {
+			handler = returnFalse;
+		} else if ( !handler ) {
+			// Fixes bug #7229. Fix recommended by jdalton
+			return;
+		}
+
+		var handleObjIn, handleObj;
+
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+		}
+
+		// Make sure that the function being executed has a unique ID
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure
+		var elemData = jQuery._data( elem );
+
+		// If no elemData is found then we must be trying to bind to one of the
+		// banned noData elements
+		if ( !elemData ) {
+			return;
+		}
+
+		var events = elemData.events,
+			eventHandle = elemData.handle;
+
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = function() {
+				// Handle the second event of a trigger and when
+				// an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
+					jQuery.event.handle.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+		}
+
+		// Add elem as a property of the handle function
+		// This is to prevent a memory leak with non-native events in IE.
+		eventHandle.elem = elem;
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = types.split(" ");
+
+		var type, i = 0, namespaces;
+
+		while ( (type = types[ i++ ]) ) {
+			handleObj = handleObjIn ?
+				jQuery.extend({}, handleObjIn) :
+				{ handler: handler, data: data };
+
+			// Namespaced event handlers
+			if ( type.indexOf(".") > -1 ) {
+				namespaces = type.split(".");
+				type = namespaces.shift();
+				handleObj.namespace = namespaces.slice(0).sort().join(".");
+
+			} else {
+				namespaces = [];
+				handleObj.namespace = "";
+			}
+
+			handleObj.type = type;
+			if ( !handleObj.guid ) {
+				handleObj.guid = handler.guid;
+			}
+
+			// Get the current list of functions bound to this event
+			var handlers = events[ type ],
+				special = jQuery.event.special[ type ] || {};
+
+			// Init the event handler queue
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+
+				// Check for a special event handler
+				// Only use addEventListener/attachEvent if the special
+				// events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add the function to the element's handler list
+			handlers.push( handleObj );
+
+			// Keep track of which events have been used, for global triggering
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, pos ) {
+		// don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		if ( handler === false ) {
+			handler = returnFalse;
+		}
+
+		var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+			events = elemData && elemData.events;
+
+		if ( !elemData || !events ) {
+			return;
+		}
+
+		// types is actually an event object here
+		if ( types && types.type ) {
+			handler = types.handler;
+			types = types.type;
+		}
+
+		// Unbind all events for the element
+		if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
+			types = types || "";
+
+			for ( type in events ) {
+				jQuery.event.remove( elem, type + types );
+			}
+
+			return;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).unbind("mouseover mouseout", fn);
+		types = types.split(" ");
+
+		while ( (type = types[ i++ ]) ) {
+			origType = type;
+			handleObj = null;
+			all = type.indexOf(".") < 0;
+			namespaces = [];
+
+			if ( !all ) {
+				// Namespaced event handlers
+				namespaces = type.split(".");
+				type = namespaces.shift();
+
+				namespace = new RegExp("(^|\\.)" +
+					jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
+			}
+
+			eventType = events[ type ];
+
+			if ( !eventType ) {
+				continue;
+			}
+
+			if ( !handler ) {
+				for ( j = 0; j < eventType.length; j++ ) {
+					handleObj = eventType[ j ];
+
+					if ( all || namespace.test( handleObj.namespace ) ) {
+						jQuery.event.remove( elem, origType, handleObj.handler, j );
+						eventType.splice( j--, 1 );
+					}
+				}
+
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+
+			for ( j = pos || 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( handler.guid === handleObj.guid ) {
+					// remove the given handler for the given type
+					if ( all || namespace.test( handleObj.namespace ) ) {
+						if ( pos == null ) {
+							eventType.splice( j--, 1 );
+						}
+
+						if ( special.remove ) {
+							special.remove.call( elem, handleObj );
+						}
+					}
+
+					if ( pos != null ) {
+						break;
+					}
+				}
+			}
+
+			// remove generic event handler if no more handlers exist
+			if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				ret = null;
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			var handle = elemData.handle;
+			if ( handle ) {
+				handle.elem = null;
+			}
+
+			delete elemData.events;
+			delete elemData.handle;
+
+			if ( jQuery.isEmptyObject( elemData ) ) {
+				jQuery.removeData( elem, undefined, true );
+			}
+		}
+	},
+
+	// bubbling is internal
+	trigger: function( event, data, elem /*, bubbling */ ) {
+		// Event object or event type
+		var type = event.type || event,
+			bubbling = arguments[3];
+
+		if ( !bubbling ) {
+			event = typeof event === "object" ?
+				// jQuery.Event object
+				event[ jQuery.expando ] ? event :
+				// Object literal
+				jQuery.extend( jQuery.Event(type), event ) :
+				// Just the event type (string)
+				jQuery.Event(type);
+
+			if ( type.indexOf("!") >= 0 ) {
+				event.type = type = type.slice(0, -1);
+				event.exclusive = true;
+			}
+
+			// Handle a global trigger
+			if ( !elem ) {
+				// Don't bubble custom events when global (to avoid too much overhead)
+				event.stopPropagation();
+
+				// Only trigger if we've ever bound an event for it
+				if ( jQuery.event.global[ type ] ) {
+					// XXX This code smells terrible. event.js should not be directly
+					// inspecting the data cache
+					jQuery.each( jQuery.cache, function() {
+						// internalKey variable is just used to make it easier to find
+						// and potentially change this stuff later; currently it just
+						// points to jQuery.expando
+						var internalKey = jQuery.expando,
+							internalCache = this[ internalKey ];
+						if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
+							jQuery.event.trigger( event, data, internalCache.handle.elem );
+						}
+					});
+				}
+			}
+
+			// Handle triggering a single element
+
+			// don't do events on text and comment nodes
+			if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
+				return undefined;
+			}
+
+			// Clean up in case it is reused
+			event.result = undefined;
+			event.target = elem;
+
+			// Clone the incoming data, if any
+			data = jQuery.makeArray( data );
+			data.unshift( event );
+		}
+
+		event.currentTarget = elem;
+
+		// Trigger the event, it is assumed that "handle" is a function
+		var handle = jQuery._data( elem, "handle" );
+
+		if ( handle ) {
+			handle.apply( elem, data );
+		}
+
+		var parent = elem.parentNode || elem.ownerDocument;
+
+		// Trigger an inline bound script
+		try {
+			if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
+				if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
+					event.result = false;
+					event.preventDefault();
+				}
+			}
+
+		// prevent IE from throwing an error for some elements with some event types, see #3533
+		} catch (inlineError) {}
+
+		if ( !event.isPropagationStopped() && parent ) {
+			jQuery.event.trigger( event, data, parent, true );
+
+		} else if ( !event.isDefaultPrevented() ) {
+			var old,
+				target = event.target,
+				targetType = type.replace( rnamespaces, "" ),
+				isClick = jQuery.nodeName( target, "a" ) && targetType === "click",
+				special = jQuery.event.special[ targetType ] || {};
+
+			if ( (!special._default || special._default.call( elem, event ) === false) &&
+				!isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
+
+				try {
+					if ( target[ targetType ] ) {
+						// Make sure that we don't accidentally re-trigger the onFOO events
+						old = target[ "on" + targetType ];
+
+						if ( old ) {
+							target[ "on" + targetType ] = null;
+						}
+
+						jQuery.event.triggered = true;
+						target[ targetType ]();
+					}
+
+				// prevent IE from throwing an error for some elements with some event types, see #3533
+				} catch (triggerError) {}
+
+				if ( old ) {
+					target[ "on" + targetType ] = old;
+				}
+
+				jQuery.event.triggered = false;
+			}
+		}
+	},
+
+	handle: function( event ) {
+		var all, handlers, namespaces, namespace_re, events,
+			namespace_sort = [],
+			args = jQuery.makeArray( arguments );
+
+		event = args[0] = jQuery.event.fix( event || window.event );
+		event.currentTarget = this;
+
+		// Namespaced event handlers
+		all = event.type.indexOf(".") < 0 && !event.exclusive;
+
+		if ( !all ) {
+			namespaces = event.type.split(".");
+			event.type = namespaces.shift();
+			namespace_sort = namespaces.slice(0).sort();
+			namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)");
+		}
+
+		event.namespace = event.namespace || namespace_sort.join(".");
+
+		events = jQuery._data(this, "events");
+
+		handlers = (events || {})[ event.type ];
+
+		if ( events && handlers ) {
+			// Clone the handlers to prevent manipulation
+			handlers = handlers.slice(0);
+
+			for ( var j = 0, l = handlers.length; j < l; j++ ) {
+				var handleObj = handlers[ j ];
+
+				// Filter the functions by class
+				if ( all || namespace_re.test( handleObj.namespace ) ) {
+					// Pass in a reference to the handler function itself
+					// So that we can later remove it
+					event.handler = handleObj.handler;
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					var ret = handleObj.handler.apply( this, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+
+					if ( event.isImmediatePropagationStopped() ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// store a copy of the original event object
+		// and "clone" to set read-only properties
+		var originalEvent = event;
+		event = jQuery.Event( originalEvent );
+
+		for ( var i = this.props.length, prop; i; ) {
+			prop = this.props[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary
+		if ( !event.target ) {
+			// Fixes #1925 where srcElement might not be defined either
+			event.target = event.srcElement || document;
+		}
+
+		// check if target is a textnode (safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// Add relatedTarget, if necessary
+		if ( !event.relatedTarget && event.fromElement ) {
+			event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
+		}
+
+		// Calculate pageX/Y if missing and clientX/Y available
+		if ( event.pageX == null && event.clientX != null ) {
+			var doc = document.documentElement,
+				body = document.body;
+
+			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+			event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
+		}
+
+		// Add which for key events
+		if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
+			event.which = event.charCode != null ? event.charCode : event.keyCode;
+		}
+
+		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+		if ( !event.metaKey && event.ctrlKey ) {
+			event.metaKey = event.ctrlKey;
+		}
+
+		// Add which for click: 1 === left; 2 === middle; 3 === right
+		// Note: button is not normalized, so don't use it
+		if ( !event.which && event.button !== undefined ) {
+			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+		}
+
+		return event;
+	},
+
+	// Deprecated, use jQuery.guid instead
+	guid: 1E8,
+
+	// Deprecated, use jQuery.proxy instead
+	proxy: jQuery.proxy,
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: jQuery.bindReady,
+			teardown: jQuery.noop
+		},
+
+		live: {
+			add: function( handleObj ) {
+				jQuery.event.add( this,
+					liveConvert( handleObj.origType, handleObj.selector ),
+					jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
+			},
+
+			remove: function( handleObj ) {
+				jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
+			}
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	}
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		if ( elem.detachEvent ) {
+			elem.detachEvent( "on" + type, handle );
+		}
+	};
+
+jQuery.Event = function( src ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !this.preventDefault ) {
+		return new jQuery.Event( src );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// timeStamp is buggy for some events on Firefox(#3843)
+	// So we won't rely on the native value
+	this.timeStamp = jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function( event ) {
+	// Check if mouse(over|out) are still within the same parent element
+	var parent = event.relatedTarget;
+
+	// Firefox sometimes assigns relatedTarget a XUL element
+	// which we cannot access the parentNode property of
+	try {
+
+		// Chrome does something similar, the parentNode property
+		// can be accessed but is null.
+		if ( parent !== document && !parent.parentNode ) {
+			return;
+		}
+		// Traverse up the tree
+		while ( parent && parent !== this ) {
+			parent = parent.parentNode;
+		}
+
+		if ( parent !== this ) {
+			// set the correct event type
+			event.type = event.data;
+
+			// handle event if we actually just moused on to a non sub-element
+			jQuery.event.handle.apply( this, arguments );
+		}
+
+	// assuming we've left the element since we most likely mousedover a xul element
+	} catch(e) { }
+},
+
+// In case of event delegation, we only need to rename the event.type,
+// liveHandler will take care of the rest.
+delegate = function( event ) {
+	event.type = event.data;
+	jQuery.event.handle.apply( this, arguments );
+};
+
+// Create mouseenter and mouseleave events
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		setup: function( data ) {
+			jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
+		},
+		teardown: function( data ) {
+			jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
+		}
+	};
+});
+
+// submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function( data, namespaces ) {
+			if ( this.nodeName && this.nodeName.toLowerCase() !== "form" ) {
+				jQuery.event.add(this, "click.specialSubmit", function( e ) {
+					var elem = e.target,
+						type = elem.type;
+
+					if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
+						trigger( "submit", this, arguments );
+					}
+				});
+
+				jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
+					var elem = e.target,
+						type = elem.type;
+
+					if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
+						trigger( "submit", this, arguments );
+					}
+				});
+
+			} else {
+				return false;
+			}
+		},
+
+		teardown: function( namespaces ) {
+			jQuery.event.remove( this, ".specialSubmit" );
+		}
+	};
+
+}
+
+// change delegation, happens here so we have bind.
+if ( !jQuery.support.changeBubbles ) {
+
+	var changeFilters,
+
+	getVal = function( elem ) {
+		var type = elem.type, val = elem.value;
+
+		if ( type === "radio" || type === "checkbox" ) {
+			val = elem.checked;
+
+		} else if ( type === "select-multiple" ) {
+			val = elem.selectedIndex > -1 ?
+				jQuery.map( elem.options, function( elem ) {
+					return elem.selected;
+				}).join("-") :
+				"";
+
+		} else if ( elem.nodeName.toLowerCase() === "select" ) {
+			val = elem.selectedIndex;
+		}
+
+		return val;
+	},
+
+	testChange = function testChange( e ) {
+		var elem = e.target, data, val;
+
+		if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
+			return;
+		}
+
+		data = jQuery._data( elem, "_change_data" );
+		val = getVal(elem);
+
+		// the current data will be also retrieved by beforeactivate
+		if ( e.type !== "focusout" || elem.type !== "radio" ) {
+			jQuery._data( elem, "_change_data", val );
+		}
+
+		if ( data === undefined || val === data ) {
+			return;
+		}
+
+		if ( data != null || val ) {
+			e.type = "change";
+			e.liveFired = undefined;
+			jQuery.event.trigger( e, arguments[1], elem );
+		}
+	};
+
+	jQuery.event.special.change = {
+		filters: {
+			focusout: testChange,
+
+			beforedeactivate: testChange,
+
+			click: function( e ) {
+				var elem = e.target, type = elem.type;
+
+				if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
+					testChange.call( this, e );
+				}
+			},
+
+			// Change has to be called before submit
+			// Keydown will be called before keypress, which is used in submit-event delegation
+			keydown: function( e ) {
+				var elem = e.target, type = elem.type;
+
+				if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
+					(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
+					type === "select-multiple" ) {
+					testChange.call( this, e );
+				}
+			},
+
+			// Beforeactivate happens also before the previous element is blurred
+			// with this event you can't trigger a change event, but you can store
+			// information
+			beforeactivate: function( e ) {
+				var elem = e.target;
+				jQuery._data( elem, "_change_data", getVal(elem) );
+			}
+		},
+
+		setup: function( data, namespaces ) {
+			if ( this.type === "file" ) {
+				return false;
+			}
+
+			for ( var type in changeFilters ) {
+				jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
+			}
+
+			return rformElems.test( this.nodeName );
+		},
+
+		teardown: function( namespaces ) {
+			jQuery.event.remove( this, ".specialChange" );
+
+			return rformElems.test( this.nodeName );
+		}
+	};
+
+	changeFilters = jQuery.event.special.change.filters;
+
+	// Handle when the input is .focus()'d
+	changeFilters.focus = changeFilters.beforeactivate;
+}
+
+function trigger( type, elem, args ) {
+	// Piggyback on a donor event to simulate a different one.
+	// Fake originalEvent to avoid donor's stopPropagation, but if the
+	// simulated event prevents default then we do the same on the donor.
+	// Don't pass args or remember liveFired; they apply to the donor event.
+	var event = jQuery.extend( {}, args[ 0 ] );
+	event.type = type;
+	event.originalEvent = {};
+	event.liveFired = undefined;
+	jQuery.event.handle.call( elem, event );
+	if ( event.isDefaultPrevented() ) {
+		args[ 0 ].preventDefault();
+	}
+}
+
+// Create "bubbling" focus and blur events
+if ( document.addEventListener ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				this.addEventListener( orig, handler, true );
+			},
+			teardown: function() {
+				this.removeEventListener( orig, handler, true );
+			}
+		};
+
+		function handler( e ) {
+			e = jQuery.event.fix( e );
+			e.type = fix;
+			return jQuery.event.handle.call( this, e );
+		}
+	});
+}
+
+jQuery.each(["bind", "one"], function( i, name ) {
+	jQuery.fn[ name ] = function( type, data, fn ) {
+		// Handle object literals
+		if ( typeof type === "object" ) {
+			for ( var key in type ) {
+				this[ name ](key, data, type[key], fn);
+			}
+			return this;
+		}
+
+		if ( jQuery.isFunction( data ) || data === false ) {
+			fn = data;
+			data = undefined;
+		}
+
+		var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
+			jQuery( this ).unbind( event, handler );
+			return fn.apply( this, arguments );
+		}) : fn;
+
+		if ( type === "unload" && name !== "one" ) {
+			this.one( type, data, fn );
+
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				jQuery.event.add( this[i], type, handler, data );
+			}
+		}
+
+		return this;
+	};
+});
+
+jQuery.fn.extend({
+	unbind: function( type, fn ) {
+		// Handle object literals
+		if ( typeof type === "object" && !type.preventDefault ) {
+			for ( var key in type ) {
+				this.unbind(key, type[key]);
+			}
+
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				jQuery.event.remove( this[i], type, fn );
+			}
+		}
+
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.live( types, data, fn, selector );
+	},
+
+	undelegate: function( selector, types, fn ) {
+		if ( arguments.length === 0 ) {
+				return this.unbind( "live" );
+
+		} else {
+			return this.die( types, null, fn, selector );
+		}
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			var event = jQuery.Event( type );
+			event.preventDefault();
+			event.stopPropagation();
+			jQuery.event.trigger( event, data, this[0] );
+			return event.result;
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			i = 1;
+
+		// link all the functions, so any of them can unbind this click handler
+		while ( i < args.length ) {
+			jQuery.proxy( fn, args[ i++ ] );
+		}
+
+		return this.click( jQuery.proxy( fn, function( event ) {
+			// Figure out which function to execute
+			var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+			jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+			// Make sure that clicks stop
+			event.preventDefault();
+
+			// and execute the function
+			return args[ lastToggle ].apply( this, arguments ) || false;
+		}));
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+var liveMap = {
+	focus: "focusin",
+	blur: "focusout",
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+};
+
+jQuery.each(["live", "die"], function( i, name ) {
+	jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
+		var type, i = 0, match, namespaces, preType,
+			selector = origSelector || this.selector,
+			context = origSelector ? this : jQuery( this.context );
+
+		if ( typeof types === "object" && !types.preventDefault ) {
+			for ( var key in types ) {
+				context[ name ]( key, data, types[key], selector );
+			}
+
+			return this;
+		}
+
+		if ( jQuery.isFunction( data ) ) {
+			fn = data;
+			data = undefined;
+		}
+
+		types = (types || "").split(" ");
+
+		while ( (type = types[ i++ ]) != null ) {
+			match = rnamespaces.exec( type );
+			namespaces = "";
+
+			if ( match )  {
+				namespaces = match[0];
+				type = type.replace( rnamespaces, "" );
+			}
+
+			if ( type === "hover" ) {
+				types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
+				continue;
+			}
+
+			preType = type;
+
+			if ( type === "focus" || type === "blur" ) {
+				types.push( liveMap[ type ] + namespaces );
+				type = type + namespaces;
+
+			} else {
+				type = (liveMap[ type ] || type) + namespaces;
+			}
+
+			if ( name === "live" ) {
+				// bind live handler
+				for ( var j = 0, l = context.length; j < l; j++ ) {
+					jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
+						{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
+				}
+
+			} else {
+				// unbind live handler
+				context.unbind( "live." + liveConvert( type, selector ), fn );
+			}
+		}
+
+		return this;
+	};
+});
+
+function liveHandler( event ) {
+	var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
+		elems = [],
+		selectors = [],
+		events = jQuery._data( this, "events" );
+
+	// Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
+	if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
+		return;
+	}
+
+	if ( event.namespace ) {
+		namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
+	}
+
+	event.liveFired = this;
+
+	var live = events.live.slice(0);
+
+	for ( j = 0; j < live.length; j++ ) {
+		handleObj = live[j];
+
+		if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
+			selectors.push( handleObj.selector );
+
+		} else {
+			live.splice( j--, 1 );
+		}
+	}
+
+	match = jQuery( event.target ).closest( selectors, event.currentTarget );
+
+	for ( i = 0, l = match.length; i < l; i++ ) {
+		close = match[i];
+
+		for ( j = 0; j < live.length; j++ ) {
+			handleObj = live[j];
+
+			if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
+				elem = close.elem;
+				related = null;
+
+				// Those two events require additional checking
+				if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
+					event.type = handleObj.preType;
+					related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
+				}
+
+				if ( !related || related !== elem ) {
+					elems.push({ elem: elem, handleObj: handleObj, level: close.level });
+				}
+			}
+		}
+	}
+
+	for ( i = 0, l = elems.length; i < l; i++ ) {
+		match = elems[i];
+
+		if ( maxLevel && match.level > maxLevel ) {
+			break;
+		}
+
+		event.currentTarget = match.elem;
+		event.data = match.handleObj.data;
+		event.handleObj = match.handleObj;
+
+		ret = match.handleObj.origHandler.apply( match.elem, arguments );
+
+		if ( ret === false || event.isPropagationStopped() ) {
+			maxLevel = match.level;
+
+			if ( ret === false ) {
+				stop = false;
+			}
+			if ( event.isImmediatePropagationStopped() ) {
+				break;
+			}
+		}
+	}
+
+	return stop;
+}
+
+function liveConvert( type, selector ) {
+	return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&");
+}
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.bind( name, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( jQuery.attrFn ) {
+		jQuery.attrFn[ name ] = true;
+	}
+});
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+	done = 0,
+	toString = Object.prototype.toString,
+	hasDuplicate = false,
+	baseHasDuplicate = true,
+	rBackslash = /\\/g,
+	rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+	baseHasDuplicate = false;
+	return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+
+	var origContext = context;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+		return [];
+	}
+	
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var m, set, checkSet, extra, ret, cur, pop, i,
+		prune = true,
+		contextXML = Sizzle.isXML( context ),
+		parts = [],
+		soFar = selector;
+	
+	// Reset the position of the chunker regexp (start from head)
+	do {
+		chunker.exec( "" );
+		m = chunker.exec( soFar );
+
+		if ( m ) {
+			soFar = m[3];
+		
+			parts.push( m[1] );
+		
+			if ( m[2] ) {
+				extra = m[3];
+				break;
+			}
+		}
+	} while ( m );
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context );
+
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] ) {
+					selector += parts.shift();
+				}
+				
+				set = posProcess( selector, set );
+			}
+		}
+
+	} else {
+		// Take a shortcut and set the context if the root selector is an ID
+		// (but not if it'll be faster if the inner selector is an ID)
+		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+			ret = Sizzle.find( parts.shift(), context, contextXML );
+			context = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set )[0] :
+				ret.set[0];
+		}
+
+		if ( context ) {
+			ret = seed ?
+				{ expr: parts.pop(), set: makeArray(seed) } :
+				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+			set = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set ) :
+				ret.set;
+
+			if ( parts.length > 0 ) {
+				checkSet = makeArray( set );
+
+			} else {
+				prune = false;
+			}
+
+			while ( parts.length ) {
+				cur = parts.pop();
+				pop = cur;
+
+				if ( !Expr.relative[ cur ] ) {
+					cur = "";
+				} else {
+					pop = parts.pop();
+				}
+
+				if ( pop == null ) {
+					pop = context;
+				}
+
+				Expr.relative[ cur ]( checkSet, pop, contextXML );
+			}
+
+		} else {
+			checkSet = parts = [];
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		Sizzle.error( cur || selector );
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+
+		} else if ( context && context.nodeType === 1 ) {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+
+		} else {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, origContext, results, seed );
+		Sizzle.uniqueSort( results );
+	}
+
+	return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+	if ( sortOrder ) {
+		hasDuplicate = baseHasDuplicate;
+		results.sort( sortOrder );
+
+		if ( hasDuplicate ) {
+			for ( var i = 1; i < results.length; i++ ) {
+				if ( results[i] === results[ i - 1 ] ) {
+					results.splice( i--, 1 );
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+	return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+	return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+	var set;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+		var match,
+			type = Expr.order[i];
+		
+		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+			var left = match[1];
+			match.splice( 1, 1 );
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace( rBackslash, "" );
+				set = Expr.find[ type ]( match, context, isXML );
+
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( "*" ) :
+			[];
+	}
+
+	return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+	var match, anyFound,
+		old = expr,
+		result = [],
+		curLoop = set,
+		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+	while ( expr && set.length ) {
+		for ( var type in Expr.filter ) {
+			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+				var found, item,
+					filter = Expr.filter[ type ],
+					left = match[1];
+
+				anyFound = false;
+
+				match.splice(1,1);
+
+				if ( left.substr( left.length - 1 ) === "\\" ) {
+					continue;
+				}
+
+				if ( curLoop === result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							var pass = not ^ !!found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+
+								} else {
+									curLoop[i] = false;
+								}
+
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr === old ) {
+			if ( anyFound == null ) {
+				Sizzle.error( expr );
+
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+	throw "Syntax error, unrecognized expression: " + msg;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+	},
+
+	leftMatch: {},
+
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+
+	attrHandle: {
+		href: function( elem ) {
+			return elem.getAttribute( "href" );
+		},
+		type: function( elem ) {
+			return elem.getAttribute( "type" );
+		}
+	},
+
+	relative: {
+		"+": function(checkSet, part){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !rNonWord.test( part ),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag ) {
+				part = part.toLowerCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+
+		">": function( checkSet, part ) {
+			var elem,
+				isPartStr = typeof part === "string",
+				i = 0,
+				l = checkSet.length;
+
+			if ( isPartStr && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+					}
+				}
+
+			} else {
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+
+		"": function(checkSet, part, isXML){
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+		},
+
+		"~": function( checkSet, part, isXML ) {
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+		}
+	},
+
+	find: {
+		ID: function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		},
+
+		NAME: function( match, context ) {
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [],
+					results = context.getElementsByName( match[1] );
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+
+		TAG: function( match, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( match[1] );
+			}
+		}
+	},
+	preFilter: {
+		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+			match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+						if ( !inplace ) {
+							result.push( elem );
+						}
+
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+
+		ID: function( match ) {
+			return match[1].replace( rBackslash, "" );
+		},
+
+		TAG: function( match, curLoop ) {
+			return match[1].replace( rBackslash, "" ).toLowerCase();
+		},
+
+		CHILD: function( match ) {
+			if ( match[1] === "nth" ) {
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				match[2] = match[2].replace(/^\+|\s*/g, '');
+
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+			else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+
+		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+			var name = match[1] = match[1].replace( rBackslash, "" );
+			
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			// Handle if an un-quoted value was used
+			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+
+		PSEUDO: function( match, curLoop, inplace, result, not ) {
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+
+					return false;
+				}
+
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+			
+			return match;
+		},
+
+		POS: function( match ) {
+			match.unshift( true );
+
+			return match;
+		}
+	},
+	
+	filters: {
+		enabled: function( elem ) {
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+
+		disabled: function( elem ) {
+			return elem.disabled === true;
+		},
+
+		checked: function( elem ) {
+			return elem.checked === true;
+		},
+		
+		selected: function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+			
+			return elem.selected === true;
+		},
+
+		parent: function( elem ) {
+			return !!elem.firstChild;
+		},
+
+		empty: function( elem ) {
+			return !elem.firstChild;
+		},
+
+		has: function( elem, i, match ) {
+			return !!Sizzle( match[3], elem ).length;
+		},
+
+		header: function( elem ) {
+			return (/h\d/i).test( elem.nodeName );
+		},
+
+		text: function( elem ) {
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
+			// use getAttribute instead to test this case
+			return "text" === elem.getAttribute( 'type' );
+		},
+		radio: function( elem ) {
+			return "radio" === elem.type;
+		},
+
+		checkbox: function( elem ) {
+			return "checkbox" === elem.type;
+		},
+
+		file: function( elem ) {
+			return "file" === elem.type;
+		},
+		password: function( elem ) {
+			return "password" === elem.type;
+		},
+
+		submit: function( elem ) {
+			return "submit" === elem.type;
+		},
+
+		image: function( elem ) {
+			return "image" === elem.type;
+		},
+
+		reset: function( elem ) {
+			return "reset" === elem.type;
+		},
+
+		button: function( elem ) {
+			return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
+		},
+
+		input: function( elem ) {
+			return (/input|select|textarea|button/i).test( elem.nodeName );
+		}
+	},
+	setFilters: {
+		first: function( elem, i ) {
+			return i === 0;
+		},
+
+		last: function( elem, i, match, array ) {
+			return i === array.length - 1;
+		},
+
+		even: function( elem, i ) {
+			return i % 2 === 0;
+		},
+
+		odd: function( elem, i ) {
+			return i % 2 === 1;
+		},
+
+		lt: function( elem, i, match ) {
+			return i < match[3] - 0;
+		},
+
+		gt: function( elem, i, match ) {
+			return i > match[3] - 0;
+		},
+
+		nth: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		},
+
+		eq: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		}
+	},
+	filter: {
+		PSEUDO: function( elem, match, i, array ) {
+			var name = match[1],
+				filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var j = 0, l = not.length; j < l; j++ ) {
+					if ( not[j] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+
+			} else {
+				Sizzle.error( name );
+			}
+		},
+
+		CHILD: function( elem, match ) {
+			var type = match[1],
+				node = elem;
+
+			switch ( type ) {
+				case "only":
+				case "first":
+					while ( (node = node.previousSibling) )	 {
+						if ( node.nodeType === 1 ) { 
+							return false; 
+						}
+					}
+
+					if ( type === "first" ) { 
+						return true; 
+					}
+
+					node = elem;
+
+				case "last":
+					while ( (node = node.nextSibling) )	 {
+						if ( node.nodeType === 1 ) { 
+							return false; 
+						}
+					}
+
+					return true;
+
+				case "nth":
+					var first = match[2],
+						last = match[3];
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+					
+					var doneName = match[0],
+						parent = elem.parentNode;
+	
+					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+						var count = 0;
+						
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						} 
+
+						parent.sizcache = doneName;
+					}
+					
+					var diff = elem.nodeIndex - last;
+
+					if ( first === 0 ) {
+						return diff === 0;
+
+					} else {
+						return ( diff % first === 0 && diff / first >= 0 );
+					}
+			}
+		},
+
+		ID: function( elem, match ) {
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+
+		TAG: function( elem, match ) {
+			return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
+		},
+		
+		CLASS: function( elem, match ) {
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+
+		ATTR: function( elem, match ) {
+			var name = match[1],
+				result = Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value !== check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+
+		POS: function( elem, match, i, array ) {
+			var name = match[2],
+				filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS,
+	fescape = function(all, num){
+		return "\\" + (num - 0 + 1);
+	};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+	array = Array.prototype.slice.call( array, 0 );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+	
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+	makeArray = function( array, results ) {
+		var i = 0,
+			ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+
+			} else {
+				for ( ; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+			return a.compareDocumentPosition ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+	};
+
+} else {
+	sortOrder = function( a, b ) {
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		} else if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+	siblingCheck = function( a, b, ret ) {
+		if ( a === b ) {
+			return ret;
+		}
+
+		var cur = a.nextSibling;
+
+		while ( cur ) {
+			if ( cur === b ) {
+				return -1;
+			}
+
+			cur = cur.nextSibling;
+		}
+
+		return 1;
+	};
+}
+
+// Utility function for retreiving the text value of an array of DOM nodes
+Sizzle.getText = function( elems ) {
+	var ret = "", elem;
+
+	for ( var i = 0; elems[i]; i++ ) {
+		elem = elems[i];
+
+		// Get the text from text nodes and CDATA nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
+			ret += elem.nodeValue;
+
+		// Traverse everything else, except comment nodes
+		} else if ( elem.nodeType !== 8 ) {
+			ret += Sizzle.getText( elem.childNodes );
+		}
+	}
+
+	return ret;
+};
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("div"),
+		id = "script" + (new Date()).getTime(),
+		root = document.documentElement;
+
+	form.innerHTML = "<a name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( document.getElementById( id ) ) {
+		Expr.find.ID = function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+
+				return m ?
+					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+
+		Expr.filter.ID = function( elem, match ) {
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+
+	// release memory in IE
+	root = form = null;
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function( match, context ) {
+			var results = context.getElementsByTagName( match[1] );
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+
+		Expr.attrHandle.href = function( elem ) {
+			return elem.getAttribute( "href", 2 );
+		};
+	}
+
+	// release memory in IE
+	div = null;
+})();
+
+if ( document.querySelectorAll ) {
+	(function(){
+		var oldSizzle = Sizzle,
+			div = document.createElement("div"),
+			id = "__sizzle__";
+
+		div.innerHTML = "<p class='TEST'></p>";
+
+		// Safari can't handle uppercase or unicode characters when
+		// in quirks mode.
+		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+			return;
+		}
+	
+		Sizzle = function( query, context, extra, seed ) {
+			context = context || document;
+
+			// Only use querySelectorAll on non-XML documents
+			// (ID selectors don't work in non-HTML documents)
+			if ( !seed && !Sizzle.isXML(context) ) {
+				// See if we find a selector to speed up
+				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+				
+				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+					// Speed-up: Sizzle("TAG")
+					if ( match[1] ) {
+						return makeArray( context.getElementsByTagName( query ), extra );
+					
+					// Speed-up: Sizzle(".CLASS")
+					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+						return makeArray( context.getElementsByClassName( match[2] ), extra );
+					}
+				}
+				
+				if ( context.nodeType === 9 ) {
+					// Speed-up: Sizzle("body")
+					// The body element only exists once, optimize finding it
+					if ( query === "body" && context.body ) {
+						return makeArray( [ context.body ], extra );
+						
+					// Speed-up: Sizzle("#ID")
+					} else if ( match && match[3] ) {
+						var elem = context.getElementById( match[3] );
+
+						// Check parentNode to catch when Blackberry 4.6 returns
+						// nodes that are no longer in the document #6963
+						if ( elem && elem.parentNode ) {
+							// Handle the case where IE and Opera return items
+							// by name instead of ID
+							if ( elem.id === match[3] ) {
+								return makeArray( [ elem ], extra );
+							}
+							
+						} else {
+							return makeArray( [], extra );
+						}
+					}
+					
+					try {
+						return makeArray( context.querySelectorAll(query), extra );
+					} catch(qsaError) {}
+
+				// qSA works strangely on Element-rooted queries
+				// We can work around this by specifying an extra ID on the root
+				// and working up from there (Thanks to Andrew Dupont for the technique)
+				// IE 8 doesn't work on object elements
+				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					var oldContext = context,
+						old = context.getAttribute( "id" ),
+						nid = old || id,
+						hasParent = context.parentNode,
+						relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+					if ( !old ) {
+						context.setAttribute( "id", nid );
+					} else {
+						nid = nid.replace( /'/g, "\\$&" );
+					}
+					if ( relativeHierarchySelector && hasParent ) {
+						context = context.parentNode;
+					}
+
+					try {
+						if ( !relativeHierarchySelector || hasParent ) {
+							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+						}
+
+					} catch(pseudoError) {
+					} finally {
+						if ( !old ) {
+							oldContext.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+		
+			return oldSizzle(query, context, extra, seed);
+		};
+
+		for ( var prop in oldSizzle ) {
+			Sizzle[ prop ] = oldSizzle[ prop ];
+		}
+
+		// release memory in IE
+		div = null;
+	})();
+}
+
+(function(){
+	var html = document.documentElement,
+		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector,
+		pseudoWorks = false;
+
+	try {
+		// This should fail with an exception
+		// Gecko does not error, returns false instead
+		matches.call( document.documentElement, "[test!='']:sizzle" );
+	
+	} catch( pseudoError ) {
+		pseudoWorks = true;
+	}
+
+	if ( matches ) {
+		Sizzle.matchesSelector = function( node, expr ) {
+			// Make sure that attribute selectors are quoted
+			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+			if ( !Sizzle.isXML( node ) ) {
+				try { 
+					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+						return matches.call( node, expr );
+					}
+				} catch(e) {}
+			}
+
+			return Sizzle(expr, null, null, [node]).length > 0;
+		};
+	}
+})();
+
+(function(){
+	var div = document.createElement("div");
+
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	// Also, make sure that getElementsByClassName actually exists
+	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+		return;
+	}
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 ) {
+		return;
+	}
+	
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function( match, context, isXML ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+
+	// release memory in IE
+	div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem.sizcache = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName.toLowerCase() === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+			
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem.sizcache = doneName;
+						elem.sizset = i;
+					}
+
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+if ( document.documentElement.contains ) {
+	Sizzle.contains = function( a, b ) {
+		return a !== b && (a.contains ? a.contains(b) : true);
+	};
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+	Sizzle.contains = function( a, b ) {
+		return !!(a.compareDocumentPosition(b) & 16);
+	};
+
+} else {
+	Sizzle.contains = function() {
+		return false;
+	};
+}
+
+Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833) 
+	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context ) {
+	var match,
+		tmpSet = [],
+		later = "",
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+	// Note: This RegExp should be improved, or likely pulled from Sizzle
+	rmultiselector = /,/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	slice = Array.prototype.slice,
+	POS = jQuery.expr.match.POS,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var ret = this.pushStack( "", "find", selector ),
+			length = 0;
+
+		for ( var i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( var n = length; n < ret.length; n++ ) {
+					for ( var r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target );
+		return this.filter(function() {
+			for ( var i = 0, l = targets.length; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && jQuery.filter( selector, this ).length > 0;
+	},
+
+	closest: function( selectors, context ) {
+		var ret = [], i, l, cur = this[0];
+
+		if ( jQuery.isArray( selectors ) ) {
+			var match, selector,
+				matches = {},
+				level = 1;
+
+			if ( cur && selectors.length ) {
+				for ( i = 0, l = selectors.length; i < l; i++ ) {
+					selector = selectors[i];
+
+					if ( !matches[selector] ) {
+						matches[selector] = jQuery.expr.match.POS.test( selector ) ?
+							jQuery( selector, context || this.context ) :
+							selector;
+					}
+				}
+
+				while ( cur && cur.ownerDocument && cur !== context ) {
+					for ( selector in matches ) {
+						match = matches[selector];
+
+						if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
+							ret.push({ selector: selector, elem: cur, level: level });
+						}
+					}
+
+					cur = cur.parentNode;
+					level++;
+				}
+			}
+
+			return ret;
+		}
+
+		var pos = POS.test( selectors ) ?
+			jQuery( selectors, context || this.context ) : null;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+
+				} else {
+					cur = cur.parentNode;
+					if ( !cur || !cur.ownerDocument || cur === context ) {
+						break;
+					}
+				}
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique(ret) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+		if ( !elem || typeof elem === "string" ) {
+			return jQuery.inArray( this[0],
+				// If it receives a string, the selector is used
+				// If it receives nothing, the siblings are used
+				elem ? jQuery( elem ) : this.parent().children() );
+		}
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	}
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return jQuery.nth( elem, 2, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return jQuery.nth( elem, 2, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( elem.parentNode.firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.makeArray( elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until ),
+			// The variable 'args' was introduced in
+			// https://github.com/jquery/jquery/commit/52a0238
+			// to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
+			// http://code.google.com/p/v8/issues/detail?id=1050
+			args = slice.call(arguments);
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, args.join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	nth: function( cur, result, dir, elem ) {
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] ) {
+			if ( cur.nodeType === 1 && ++num === result ) {
+				break;
+			}
+		}
+
+		return cur;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return (elem === qualifier) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
+	});
+}
+
+
+
+
+var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	};
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( text ) {
+		if ( jQuery.isFunction(text) ) {
+			return this.each(function(i) {
+				var self = jQuery( this );
+
+				self.text( text.call(this, i, self.text()) );
+			});
+		}
+
+		if ( typeof text !== "object" && text !== undefined ) {
+			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+		}
+
+		return jQuery.text( this );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append(this);
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		return this.each(function() {
+			jQuery( this ).wrapAll( html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery(arguments[0]);
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery(arguments[0]).toArray() );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		if ( value === undefined ) {
+			return this[0] && this[0].nodeType === 1 ?
+				this[0].innerHTML.replace(rinlinejQuery, "") :
+				null;
+
+		// See if we can take a shortcut and just use innerHTML
+		} else if ( typeof value === "string" && !rnocache.test( value ) &&
+			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+			value = value.replace(rxhtmlTag, "<$1></$2>");
+
+			try {
+				for ( var i = 0, l = this.length; i < l; i++ ) {
+					// Remove element nodes and prevent memory leaks
+					if ( this[i].nodeType === 1 ) {
+						jQuery.cleanData( this[i].getElementsByTagName("*") );
+						this[i].innerHTML = value;
+					}
+				}
+
+			// If using innerHTML throws an exception, use the fallback method
+			} catch(e) {
+				this.empty().append( value );
+			}
+
+		} else if ( jQuery.isFunction( value ) ) {
+			this.each(function(i){
+				var self = jQuery( this );
+
+				self.html( value.call(this, i, self.html()) );
+			});
+
+		} else {
+			this.empty().append( value );
+		}
+
+		return this;
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || (l > 1 && i < lastIndex) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, evalScript );
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var internalKey = jQuery.expando,
+		oldData = jQuery.data( src ),
+		curData = jQuery.data( dest, oldData );
+
+	// Switch to use the internal data object, if it exists, for the next
+	// stage of data copying
+	if ( (oldData = oldData[ internalKey ]) ) {
+		var events = oldData.events;
+				curData = curData[ internalKey ] = jQuery.extend({}, oldData);
+
+		if ( events ) {
+			delete curData.handle;
+			curData.events = {};
+
+			for ( var type in events ) {
+				for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
+					jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+				}
+			}
+		}
+	}
+}
+
+function cloneFixAttributes(src, dest) {
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	var nodeName = dest.nodeName.toLowerCase();
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	dest.clearAttributes();
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	dest.mergeAttributes(src);
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults,
+		doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
+		args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
+
+		cacheable = true;
+		cacheresults = jQuery.fragments[ args[0] ];
+		if ( cacheresults ) {
+			if ( cacheresults !== 1 ) {
+				fragment = cacheresults;
+			}
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = (i > 0 ? this.clone(true) : this).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( "getElementsByTagName" in elem ) {
+		return elem.getElementsByTagName( "*" );
+	
+	} else if ( "querySelectorAll" in elem ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var clone = elem.cloneNode(true),
+				srcElements,
+				destElements,
+				i;
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName
+			// instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				cloneFixAttributes( srcElements[i], destElements[i] );
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Return the cloned set
+		return clone;
+},
+	clean: function( elems, context, fragment, scripts ) {
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		var ret = [];
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" && !rhtml.test( elem ) ) {
+				elem = context.createTextNode( elem );
+
+			} else if ( typeof elem === "string" ) {
+				// Fix "XHTML"-style tags in all browsers
+				elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+				// Trim whitespace, otherwise indexOf won't work as expected
+				var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
+					wrap = wrapMap[ tag ] || wrapMap._default,
+					depth = wrap[0],
+					div = context.createElement("div");
+
+				// Go to html and back, then peel off extra wrappers
+				div.innerHTML = wrap[1] + elem + wrap[2];
+
+				// Move to the right depth
+				while ( depth-- ) {
+					div = div.lastChild;
+				}
+
+				// Remove IE's autoinserted <tbody> from table fragments
+				if ( !jQuery.support.tbody ) {
+
+					// String was a <table>, *may* have spurious <tbody>
+					var hasBody = rtbody.test(elem),
+						tbody = tag === "table" && !hasBody ?
+							div.firstChild && div.firstChild.childNodes :
+
+							// String was a bare <thead> or <tfoot>
+							wrap[1] === "<table>" && !hasBody ?
+								div.childNodes :
+								[];
+
+					for ( var j = tbody.length - 1; j >= 0 ; --j ) {
+						if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+							tbody[ j ].parentNode.removeChild( tbody[ j ] );
+						}
+					}
+
+				}
+
+				// IE completely kills leading whitespace when innerHTML is used
+				if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+					div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+				}
+
+				elem = div.childNodes;
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			for ( i = 0; ret[i]; i++ ) {
+				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+				} else {
+					if ( ret[i].nodeType === 1 ) {
+						ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
+					}
+					fragment.appendChild( ret[i] );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ] && cache[ id ][ internalKey ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						if ( special[ type ] ) {
+							jQuery.event.remove( elem, type );
+
+						// This is a shortcut to avoid jQuery.event.remove's overhead
+						} else {
+							jQuery.removeEvent( elem, type, data.handle );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+function evalScript( i, elem ) {
+	if ( elem.src ) {
+		jQuery.ajax({
+			url: elem.src,
+			async: false,
+			dataType: "script"
+		});
+	} else {
+		jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
+	}
+
+	if ( elem.parentNode ) {
+		elem.parentNode.removeChild( elem );
+	}
+}
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	rdashAlpha = /-([a-z])/ig,
+	rupper = /([A-Z])/g,
+	rnumpx = /^-?\d+(?:px)?$/i,
+	rnum = /^-?\d/,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssWidth = [ "Left", "Right" ],
+	cssHeight = [ "Top", "Bottom" ],
+	curCSS,
+
+	getComputedStyle,
+	currentStyle,
+
+	fcamelCase = function( all, letter ) {
+		return letter.toUpperCase();
+	};
+
+jQuery.fn.css = function( name, value ) {
+	// Setting 'undefined' is a no-op
+	if ( arguments.length === 2 && value === undefined ) {
+		return this;
+	}
+
+	return jQuery.access( this, name, value, true, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	});
+};
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity", "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"zIndex": true,
+		"fontWeight": true,
+		"opacity": true,
+		"zoom": true,
+		"lineHeight": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( typeof value === "number" && isNaN( value ) || value == null ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( typeof value === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra ) {
+		// Make sure that we're working with the right name
+		var ret, origName = jQuery.camelCase( name ),
+			hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name, origName );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( var name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+	},
+
+	camelCase: function( string ) {
+		return string.replace( rdashAlpha, fcamelCase );
+	}
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			var val;
+
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					val = getWH( elem, name, extra );
+
+				} else {
+					jQuery.swap( elem, cssShow, function() {
+						val = getWH( elem, name, extra );
+					});
+				}
+
+				if ( val <= 0 ) {
+					val = curCSS( elem, name, name );
+
+					if ( val === "0px" && currentStyle ) {
+						val = currentStyle( elem, name, name );
+					}
+
+					if ( val != null ) {
+						// Should return "auto" instead of 0, use 0 for
+						// temporary backwards-compat
+						return val === "" || val === "auto" ? "0px" : val;
+					}
+				}
+
+				if ( val < 0 || val == null ) {
+					val = elem.style[ name ];
+
+					// Should return "auto" instead of 0, use 0 for
+					// temporary backwards-compat
+					return val === "" || val === "auto" ? "0px" : val;
+				}
+
+				return typeof val === "string" ? val : val + "px";
+			}
+		},
+
+		set: function( elem, value ) {
+			if ( rnumpx.test( value ) ) {
+				// ignore negative width and height values #1599
+				value = parseFloat(value);
+
+				if ( value >= 0 ) {
+					return value + "px";
+				}
+
+			} else {
+				return value;
+			}
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ?
+				(parseFloat(RegExp.$1) / 100) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style;
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// Set the alpha filter to set the opacity
+			var opacity = jQuery.isNaN(value) ?
+				"" :
+				"alpha(opacity=" + value * 100 + ")",
+				filter = style.filter || "";
+
+			style.filter = ralpha.test(filter) ?
+				filter.replace(ralpha, opacity) :
+				style.filter + ' ' + opacity;
+		}
+	};
+}
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, newName, name ) {
+		var ret, defaultView, computedStyle;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( !(defaultView = elem.ownerDocument.defaultView) ) {
+			return undefined;
+		}
+
+		if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
+			style = elem.style;
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+			// Remember the original values
+			left = style.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : (ret || 0);
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+	var which = name === "width" ? cssWidth : cssHeight,
+		val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
+
+	if ( extra === "border" ) {
+		return val;
+	}
+
+	jQuery.each( which, function() {
+		if ( !extra ) {
+			val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0;
+		}
+
+		if ( extra === "margin" ) {
+			val += parseFloat(jQuery.css( elem, "margin" + this )) || 0;
+
+		} else {
+			val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0;
+		}
+	});
+
+	return val;
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /(?:^file|^widget|\-extension):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	rucHeaders = /(^|\-)([a-z])/g,
+	rucHeadersFunc = function( _, $1, $2 ) {
+		return $1 + $2.toUpperCase();
+	},
+	rurl = /^([\w\+\.\-]+:)\/\/([^\/?#:]*)(?::(\d+))?/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts;
+
+// #8138, IE may throw an exception when accessing
+// a field from document.location if document.domain has been set
+try {
+	ajaxLocation = document.location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() );
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for(; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+//Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for(; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = undefined;
+
+			// Otherwise, build a param string
+			} else if ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.bind( o, f );
+	};
+} );
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+} );
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function ( target, settings ) {
+		if ( !settings ) {
+			// Only one parameter, we extend ajaxSettings
+			settings = target;
+			target = jQuery.extend( true, jQuery.ajaxSettings, settings );
+		} else {
+			// target was provided, we extend into it
+			jQuery.extend( true, target, jQuery.ajaxSettings, settings );
+		}
+		// Flatten fields we don't want deep extended
+		for( var field in { context: 1, url: 1 } ) {
+			if ( field in settings ) {
+				target[ field ] = settings[ field ];
+			} else if( field in jQuery.ajaxSettings ) {
+				target[ field ] = jQuery.ajaxSettings[ field ];
+			}
+		}
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		crossDomain: null,
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": "*/*"
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery._Deferred(),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						requestHeaders[ name.toLowerCase().replace( rucHeaders, rucHeadersFunc ) ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, statusText, responses, headers ) {
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status ? 4 : 0;
+
+			var isSuccess,
+				success,
+				error,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = statusText;
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.done;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		if ( !s.crossDomain ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefiler, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			requestHeaders[ "Content-Type" ] = s.contentType;
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				requestHeaders[ "If-Modified-Since" ] = jQuery.lastModified[ ifModifiedKey ];
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				requestHeaders[ "If-None-Match" ] = jQuery.etag[ ifModifiedKey ];
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		requestHeaders.Accept = s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+			s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) :
+			s.accepts[ "*" ];
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( status < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					jQuery.error( e );
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = jQuery.ajaxSettings.traditional;
+		}
+
+		// If an array was passed in, assume that it is an array of form elements.
+		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+			// Serialize the form elements
+			jQuery.each( a, function() {
+				add( this.name, this.value );
+			} );
+
+		} else {
+			// If traditional, encode the "old" way (the way 1.3.2 or older
+			// did it), otherwise encode params recursively.
+			for ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	if ( jQuery.isArray( obj ) && obj.length ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && obj != null && typeof obj === "object" ) {
+		// If we see an array here, it is empty and should be treated as an empty
+		// object
+		if ( jQuery.isArray( obj ) || jQuery.isEmptyObject( obj ) ) {
+			add( prefix, "" );
+
+		// Serialize object item.
+		} else {
+			for ( var name in obj ) {
+				buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+			}
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for( key in s.converters ) {
+				if( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|()\?\?()/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var dataIsString = ( typeof s.data === "string" );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		originalSettings.jsonpCallback ||
+		originalSettings.jsonp != null ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				dataIsString && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2",
+			cleanUp = function() {
+				// Set callback back to previous value
+				window[ jsonpCallback ] = previous;
+				// Call if it was a function and we have a response
+				if ( responseContainer && jQuery.isFunction( previous ) ) {
+					window[ jsonpCallback ]( responseContainer[ 0 ] );
+				}
+			};
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( dataIsString ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Install cleanUp function
+		jqXHR.then( cleanUp, cleanUp );
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+} );
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+} );
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+} );
+
+
+
+
+var // #5280: next active xhr id and list of active xhrs' callbacks
+	xhrId = jQuery.now(),
+	xhrCallbacks,
+
+	// XHR used to determine supports properties
+	testXHR;
+
+// #5280: Internet Explorer will keep connections alive if we don't abort on unload
+function xhrOnUnloadAbort() {
+	jQuery( window ).unload(function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	});
+}
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Test if we can create an xhr object
+testXHR = jQuery.ajaxSettings.xhr();
+jQuery.support.ajax = !!testXHR;
+
+// Does this browser support crossDomain XHR requests
+jQuery.support.cors = testXHR && ( "withCredentials" in testXHR );
+
+// No need for the temporary xhr anymore
+testXHR = undefined;
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// Requested-With header
+					// Not set for crossDomain requests with no content
+					// (see why at http://trac.dojotoolkit.org/ticket/9486)
+					// Won't change header if already provided
+					if ( !( s.crossDomain && !s.hasContent ) && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									delete xhrCallbacks[ handle ];
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+									responses.text = xhr.responseText;
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						// Create the active xhrs callbacks list if needed
+						// and attach the unload handler
+						if ( !xhrCallbacks ) {
+							xhrCallbacks = {};
+							xhrOnUnloadAbort();
+						}
+						// Add to list of active xhrs callbacks
+						handle = xhrId++;
+						xhr.onreadystatechange = xhrCallbacks[ handle ] = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	];
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback);
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[i];
+				display = elem.style.display;
+
+				// Reset the inline display of this element to learn if it is
+				// being hidden by cascaded rules or not
+				if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+					display = elem.style.display = "";
+				}
+
+				// Set elements which have been overridden with display: none
+				// in a stylesheet to whatever the default browser style is
+				// for such an element
+				if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
+					jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[i];
+				display = elem.style.display;
+
+				if ( display === "" || display === "none" ) {
+					elem.style.display = jQuery._data(elem, "olddisplay") || "";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				var display = jQuery.css( this[i], "display" );
+
+				if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
+					jQuery._data( this[i], "olddisplay", display );
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				this[i].style.display = "none";
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed(speed, easing, callback);
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete );
+		}
+
+		return this[ optall.queue === false ? "each" : "queue" ](function() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			var opt = jQuery.extend({}, optall), p,
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				self = this;
+
+			for ( p in prop ) {
+				var name = jQuery.camelCase( p );
+
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+					p = name;
+				}
+
+				if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
+					return opt.complete.call(this);
+				}
+
+				if ( isElement && ( p === "height" || p === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height
+					// animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+						if ( !jQuery.support.inlineBlockNeedsLayout ) {
+							this.style.display = "inline-block";
+
+						} else {
+							var display = defaultDisplay(this.nodeName);
+
+							// inline-level elements accept inline-block;
+							// block-level elements need to be inline with layout
+							if ( display === "inline" ) {
+								this.style.display = "inline-block";
+
+							} else {
+								this.style.display = "inline";
+								this.style.zoom = 1;
+							}
+						}
+					}
+				}
+
+				if ( jQuery.isArray( prop[p] ) ) {
+					// Create (if needed) and add to specialEasing
+					(opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
+					prop[p] = prop[p][0];
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			opt.curAnim = jQuery.extend({}, prop);
+
+			jQuery.each( prop, function( name, val ) {
+				var e = new jQuery.fx( self, opt, name );
+
+				if ( rfxtypes.test(val) ) {
+					e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
+
+				} else {
+					var parts = rfxnum.exec(val),
+						start = e.cur();
+
+					if ( parts ) {
+						var end = parseFloat( parts[2] ),
+							unit = parts[3] || ( jQuery.cssNumber[ name ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( self, name, (end || 1) + unit);
+							start = ((end || 1) / e.cur()) * start;
+							jQuery.style( self, name, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			});
+
+			// For JS strict compliance
+			return true;
+		});
+	},
+
+	stop: function( clearQueue, gotoEnd ) {
+		var timers = jQuery.timers;
+
+		if ( clearQueue ) {
+			this.queue([]);
+		}
+
+		this.each(function() {
+			// go in reverse order so anything added to the queue during the loop is ignored
+			for ( var i = timers.length - 1; i >= 0; i-- ) {
+				if ( timers[i].elem === this ) {
+					if (gotoEnd) {
+						// force the next step to be the last
+						timers[i](true);
+					}
+
+					timers.splice(i, 1);
+				}
+			}
+		});
+
+		// start the next in the queue if the last step wasn't forced
+		if ( !gotoEnd ) {
+			this.dequeue();
+		}
+
+		return this;
+	}
+
+});
+
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show", 1),
+	slideUp: genFx("hide", 1),
+	slideToggle: genFx("toggle", 1),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.extend({
+	speed: function( speed, easing, fn ) {
+		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
+		};
+
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
+
+		// Queueing
+		opt.old = opt.complete;
+		opt.complete = function() {
+			if ( opt.queue !== false ) {
+				jQuery(this).dequeue();
+			}
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		if ( !options.orig ) {
+			options.orig = {};
+		}
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx;
+
+		this.startTime = jQuery.now();
+		this.start = from;
+		this.end = to;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+		this.now = this.start;
+		this.pos = this.state = 0;
+
+		function t( gotoEnd ) {
+			return self.step(gotoEnd);
+		}
+
+		t.elem = this.elem;
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval(fx.tick, fx.interval);
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any
+		// flash of content
+		this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom(this.cur(), 0);
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var t = jQuery.now(), done = true;
+
+		if ( gotoEnd || t >= this.options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			this.options.curAnim[ this.prop ] = true;
+
+			for ( var i in this.options.curAnim ) {
+				if ( this.options.curAnim[i] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( this.options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+					var elem = this.elem,
+						options = this.options;
+
+					jQuery.each( [ "", "X", "Y" ], function (index, value) {
+						elem.style[ "overflow" + value ] = options.overflow[index];
+					} );
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( this.options.hide ) {
+					jQuery(this.elem).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( this.options.hide || this.options.show ) {
+					for ( var p in this.options.curAnim ) {
+						jQuery.style( this.elem, p, this.options.orig[p] );
+					}
+				}
+
+				// Execute the complete function
+				this.options.complete.call( this.elem );
+			}
+
+			return false;
+
+		} else {
+			var n = t - this.startTime;
+			this.state = n / this.options.duration;
+
+			// Perform the easing function, defaults to swing
+			var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
+			var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
+			this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
+			this.now = this.start + ((this.end - this.start) * this.pos);
+
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		var timers = jQuery.timers;
+
+		for ( var i = 0; i < timers.length; i++ ) {
+			if ( !timers[i]() ) {
+				timers.splice(i--, 1);
+			}
+		}
+
+		if ( !timers.length ) {
+			jQuery.fx.stop();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+function defaultDisplay( nodeName ) {
+	if ( !elemdisplay[ nodeName ] ) {
+		var elem = jQuery("<" + nodeName + ">").appendTo("body"),
+			display = elem.css("display");
+
+		elem.remove();
+
+		if ( display === "none" || display === "" ) {
+			display = "block";
+		}
+
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0], box;
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		var doc = elem.ownerDocument,
+			docElem = doc.documentElement;
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow(doc),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = (win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop ),
+			scrollLeft = (win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft),
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0];
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		jQuery.offset.initialize();
+
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			doc = elem.ownerDocument,
+			docElem = doc.documentElement,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.offset = {
+	initialize: function() {
+		var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
+			html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+
+		jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
+
+		container.innerHTML = html;
+		body.insertBefore( container, body.firstChild );
+		innerDiv = container.firstChild;
+		checkDiv = innerDiv.firstChild;
+		td = innerDiv.nextSibling.firstChild.firstChild;
+
+		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
+
+		checkDiv.style.position = "fixed";
+		checkDiv.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
+		checkDiv.style.position = checkDiv.style.top = "";
+
+		innerDiv.style.overflow = "hidden";
+		innerDiv.style.position = "relative";
+
+		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
+
+		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
+
+		body.removeChild( container );
+		body = container = innerDiv = checkDiv = table = td = null;
+		jQuery.offset.initialize = jQuery.noop;
+	},
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		jQuery.offset.initialize();
+
+		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = (position === "absolute" && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1),
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is absolute
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+		}
+
+		curTop  = calculatePosition ? curPosition.top  : parseInt( curCSSTop,  10 ) || 0;
+		curLeft = calculatePosition ? curPosition.left : parseInt( curCSSLeft, 10 ) || 0;
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if (options.top != null) {
+			props.top = (options.top - curOffset.top) + curTop;
+		}
+		if (options.left != null) {
+			props.left = (options.left - curOffset.left) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+	position: function() {
+		if ( !this[0] ) {
+			return null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+	var method = "scroll" + name;
+
+	jQuery.fn[ method ] = function(val) {
+		var elem = this[0], win;
+
+		if ( !elem ) {
+			return null;
+		}
+
+		if ( val !== undefined ) {
+			// Set the scroll offset
+			return this.each(function() {
+				win = getWindow( this );
+
+				if ( win ) {
+					win.scrollTo(
+						!i ? val : jQuery(win).scrollLeft(),
+						i ? val : jQuery(win).scrollTop()
+					);
+
+				} else {
+					this[ method ] = val;
+				}
+			});
+		} else {
+			win = getWindow( elem );
+
+			// Return the scroll offset
+			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+				jQuery.support.boxModel && win.document.documentElement[ method ] ||
+					win.document.body[ method ] :
+				elem[ method ];
+		}
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+	var type = name.toLowerCase();
+
+	// innerHeight and innerWidth
+	jQuery.fn["inner" + name] = function() {
+		return this[0] ?
+			parseFloat( jQuery.css( this[0], type, "padding" ) ) :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn["outer" + name] = function( margin ) {
+		return this[0] ?
+			parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( size ) {
+		// Get window width or height
+		var elem = this[0];
+		if ( !elem ) {
+			return size == null ? null : this;
+		}
+
+		if ( jQuery.isFunction( size ) ) {
+			return this.each(function( i ) {
+				var self = jQuery( this );
+				self[ type ]( size.call( this, i, self[ type ]() ) );
+			});
+		}
+
+		if ( jQuery.isWindow( elem ) ) {
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+			var docElemProp = elem.document.documentElement[ "client" + name ];
+			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+				elem.document.body[ "client" + name ] || docElemProp;
+
+		// Get document width or height
+		} else if ( elem.nodeType === 9 ) {
+			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+			return Math.max(
+				elem.documentElement["client" + name],
+				elem.body["scroll" + name], elem.documentElement["scroll" + name],
+				elem.body["offset" + name], elem.documentElement["offset" + name]
+			);
+
+		// Get or set width or height on the element
+		} else if ( size === undefined ) {
+			var orig = jQuery.css( elem, type ),
+				ret = parseFloat( orig );
+
+			return jQuery.isNaN( ret ) ? orig : ret;
+
+		// Set the width or height on the element (default to pixels if value is unitless)
+		} else {
+			return this.css( type, typeof size === "string" ? size : size + "px" );
+		}
+	};
+
+});
+
+
+window.jQuery = window.$ = jQuery;
+})(window);
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.5/jquery.min.js b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.5/jquery.min.js
new file mode 100644
index 0000000..6437874
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.5/jquery.min.js
@@ -0,0 +1,16 @@
+/*!
+ * jQuery JavaScript Library v1.5.1
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Wed Feb 23 13:55:29 2011 -0500
+ */
+(function(a,b){function cg(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cd(a){if(!bZ[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";bZ[a]=c}return bZ[a]}function cc(a,b){var c={};d.each(cb.concat.apply([],cb.slice(0,b)),function(){c[this]=a});return c}function bY(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bX(){try{return new a.XMLHttpRequest}catch(b){}}function bW(){d(a).unload(function(){for(var a in bU)bU[a](0,1)})}function bQ(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error
 ("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bP(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bO(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bq.test(a)?e(a,f):bO(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bO(a+"["+f+"]",b[f],c,e)}function bN(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bH,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bN(a,c,d,e,l,g)))
 ;(k||!l)&&!g["*"]&&(l=bN(a,c,d,e,"*",g));return l}function bM(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bB),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bo(a,b,c){var e=b==="width"?bi:bj,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function ba(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function _(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function $(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c=
 =="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function Z(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function Y(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function O(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a
 ){return a.nodeType===1});if(J.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function N(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function F(a,b){return(a&&a!=="*"?a+".":"")+b.replace(r,"`").replace(s,"&")}function E(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,q=[],r=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(p,"")===a.type?r.push(g.selector):t.splice(i--,1);f=d(a.target).closest(r,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];
 (!e||e!==h)&&q.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=q.length;j<k;j++){f=q[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function C(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function w(){return!0}function v(){return!1}function g(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function f(a,c,f){if(f===b&&a.nodeType===1){f=a.getAttribute("data-"+c);if(typeof f==="string"){try{f=f==="true"?!0:f==="false"?!1:f==="null"?null:d.isNaN(f)?e.test(f)?d.parseJSON(f):f:parseFloat(f)}catch(g){}d.data(a,c,f)}else f=b}return f}var c=a.document,d=function(){function I(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(I,1);return}d.rea
 dy()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=navigator.userAgent,w,x=!1,y,z="then done fail isResolved isRejected promise".split(" "),A,B=Object.prototype.toString,C=Object.prototype.hasOwnProperty,D=Array.prototype.push,E=Array.prototype.slice,F=String.prototype.trim,G=Array.prototype.indexOf,H={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.e
 xec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.1",length:0,size:function(){return this.length},toArray:function(){return E.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var e=this.constructor();d.isArray(a)?D.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=th
 is.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),y.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(E.apply(this,arguments),"slice",E.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:D,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!=="object"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!
 1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.extend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;y.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=!0;if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",A,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",A),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&I()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a}
 ,isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):H[B.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!C.call(a,"constructor")&&!C.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||C.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(
 a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:F?function(a){return a==null?"":F.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?D.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)retu
 rn c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},_Deferred:function(){var a=[],b,c,e,f={done:funct
 ion(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){c=1;try{while(a[0])a.shift().apply(d,f)}catch(g){throw g}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(d.isFunction(this.promise)?this.promise():this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),e;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a){if(a==null){if(e)return e;e=a={}}var c=z.length;while(c--)a[z[c]]=b[z[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){var b=arguments.length,c=b<=1&&a&&d.isFunction(a.promise)?a:d.Deferred(),e=c.
 promise();if(b>1){var f=E.call(arguments,0),g=b,h=function(a){return function(b){f[a]=arguments.length>1?E.call(arguments,0):b,--g||c.resolveWith(e,f)}};while(b--)a=f[b],a&&d.isFunction(a.promise)?a.promise().then(h(b),c.reject):--g;g||c.resolveWith(e,f)}else c!==a&&c.resolve(a);return e},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),y=d._Deferred(),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){H["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.ve
 rsion=w.version),d.browser.webkit&&(d.browser.safari=!0),G&&(d.inArray=function(a,b){return G.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?A=function(){c.removeEventListener("DOMContentLoaded",A,!1),d.ready()}:c.attachEvent&&(A=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",A),d.ready())});return d}();(function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribut
 e("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e),b=e=f=null}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' n
 ame='radiotest' checked='checked'/>";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.
 createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function"),b=null;return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}})();var e=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!g(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events
 ;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,h=b.nodeType,i=h?d.cache:b,j=h?b[d.expando]:d.expando;if(!i[j])return;if(c){var k=e?i[j][f]:i[j];if(k){delete k[c];if(!g(k))return}}if(e){delete i[j][f];if(!g(i[j]))return}var l=i[j][f];d.support.deleteExpando||i!=a?delete i[j]:i[j]=null,l?(i[j]={},h||(i[j].toJSON=d.noop),i[j][f]=l):h&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var g=this[0].attributes,h;for(var i=0,j=g.length;i<j;i++)h=g[i].name,h.indexOf("data-")===0&&(h=h.substr(5),f(this[0],h,e[h]))}}return e}if(typeof a==="object")return this.each(function(){d
 .data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=f(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d.fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]
 !=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var h=/[\n\t\r]/g,i=/\s+/,j=/\r/g,k=/^(?:href|src|style)$/,l=/^(?:button|input)$/i,m=/^(?:button|input|object|select|textarea)$/i,n=/^a(?:rea)?$/i,o=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(this,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.at
 tr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(i);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",h=f.className;for(var j=0,k=b.length;j<k;j++)g.indexOf(" "+b[j]+" ")<0&&(h+=" "+b[j]);f.className=d.trim(h)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(i);for(var e=0,f=this.length;e<f;e++){var g=this[e];if(g.nodeType===1&&g.className)if(a){var j=(" "+g.className+" ").replace(h," ");for(var k=0,l=c.length;k<l;k++)j=j.replace(" "+c[k]+" "," ");g.className=d.trim(j)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d.isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,h=d
 (this),j=b,k=a.split(i);while(f=k[g++])j=e?j:!h.hasClass(f),h[j?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(h," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var k=i?f:0,l=i?f+1:h.length;k<l;k++){var m=h[k];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.parentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(i)return a;g.push(a)}}if(i&&!g.length&&h.length)return d(h[f]).val();return g}if(o.test(c.typ
 e)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(j,"")}return b}var n=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){n&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&o.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=k.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selecte
 dIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&l.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var o=a.getAttributeNode("tabIndex");return o&&o.specified?o.value:m.test(a.nodeName)||n.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var p=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return p===null?b:p}h&&(a[c]=e);return a[c]}});var p=/\.(.*)$/,q=/^(?:textarea|input|select)$/i,r=/\./g,s=/ /g,t=/[^\w\s.|`]/g,u=function(a){return a.replace(t,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElem
 ent)&&(c=a)}catch(h){}if(f===!1)f=v;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(){return typeof d!=="undefined"&&!d.event.triggered?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=v);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!
 t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),u).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete t[h]}if(d.isEmptyObject(t)){var w=s.handle;w&&(w.elem=null),delete s.events,delete s.handle,d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.exp
 ando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(p,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=!0,l[m]())}catch(q){}k&&(l["on"+m]=k),d.event.trig
 gered=!1}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta w
 hich".split(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,F(a.origType,a.selector),d.extend({},a,{handler:E,guid:a.hand
 ler.guid}))},remove:function(a){d.event.remove(this,F(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?w:v):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=w;var a=this.originalEvent;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=w;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImm
 ediatePropagation:function(){this.isImmediatePropagationStopped=w,this.stopPropagation()},isDefaultPrevented:v,isPropagationStopped:v,isImmediatePropagationStopped:v};var x=function(a){var b=a.relatedTarget;try{if(b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(e){}},y=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?y:x,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?y:x)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,b){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&d(b).closest("form").length&&C("submit",this,arguments)}),d.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.
 type;(c==="text"||c==="password")&&d(b).closest("form").length&&a.keyCode===13&&C("submit",this,arguments)});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var z,A=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},B=function B(a){var c=a.target,e,f;if(q.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=A(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:B,beforedeactivate:B,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&B.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCod
 e===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&B.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",A(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in z)d.event.add(this,c+".specialChange",z[c]);return q.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return q.test(this.nodeName)}},z=d.event.special.change.filters,z.focus=z.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function c(a){a=d.event.fix(a),a.type=b;return d.event.handle.call(this,a)}d.event.special[b]={setup:function(){this.addEventListener(a,c,!0)},teardown:function(){this.removeEventListener(a,c,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(
 a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.result}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},h
 over:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var D={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var o in a)n[c](o,e,a[o],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=p.exec(h),k="",j&&(k=j[0],h=h.replace(p,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(D[h]+k),h=h+k):h=(D[h]||h)+k;if(c==="live")for(var q=0,r=n.length;q<r;q++)d.event.add(n[q],"live."+F(h,m),{data:e,selector:m,handler:f,origType:h,origHandler:f,preType:l});else n.unbind("live."+F(h,m),f)}return this}}),d.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup err
 or".split(" "),function(a,b){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!=="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){e=e||[],d=d||c;var h=d;
 if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType=
 ==1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1
 ];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
 PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.t
 oLowerCase(),d=b,g=t),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]===
 "odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function
 (a){return/h\d/i.test(a.nodeName)},text:function(a){return"text"===a.getAttribute("type")},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.i
 nnerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];re
 turn d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocum
 entPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.fin
 d.ID=function(a,c,d){if(typeof c.getElementById!=="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelect
 orAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelecto
 r||a.webkitMatchesSelector||a.msMatchesSelector,d=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(e){d=!0}b&&(k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(d||!l.match.PSEUDO.test(c)&&!/!=/.test(c))return b.call(a,c)}catch(e){}return k(c,null,null,[a]).length>0})}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isX
 ML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};d.find=k,d.expr=k.selectors,d.expr[":"]=d.expr.filters,d.unique=k.uniqueSort,d.text=k.getText,d.isXMLDoc=k.isXML,d.contains=k.contains}();var G=/Until$/,H=/^(?:parents|prevUntil|prevAll)/,I=/,/,J=/^.[^:#\[\.,]*$/,K=Array.prototype.slice,L=d.expr.match.POS,M={children:!0,contents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){re
 turn this.pushStack(O(this,a,!1),"not",a)},filter:function(a){return this.pushStack(O(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=L.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=this[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),
 e=d.merge(this.get(),c);return this.pushStack(N(c[0])||N(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=K.call(arguments);G.test(a)||(
 e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!M[a]?d.unique(f):f,(this.length>1||I.test(e))&&H.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var P=/ jQuery\d+="(?:\d+|null)"/g,Q=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,S=/<([\w:]+)/,T=/<tbody/i,U=/<|&#?\w+;/,V=/<(?:script|object|embed|option|style)/i,W=/checked\s*(?:[^=]|=\s*.checked.)/i,X={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],th
 ead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};X.optgroup=X.option,X.tbody=X.tfoot=X.colgroup=X.caption=X.thead,X.th=X.td,d.support.htmlSerialize||(X._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(
 d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=d(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSib
 ling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(P,""):null;if(typeof a!=="string"||V.test(a)||!d.support.leadingWhitespace&&Q.test(a)||X[(S.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(R,"<$1></$2>");try{for
 (var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&W.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.leng
 th===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?Y(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,ba)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!V.test(a[0])&&(d.support.checkClone||!W.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}f
 or(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){$(a,e),f=_(a),g=_(e);for(h=0;f[h];++h)$(f[h],g[h])}if(b){Z(a,e);if(c){f=_(a),g=_(e);for(h=0;f[h];++h)Z(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||U.test(i)){if(typeof i==="string"){i=i.replace(R,"<$1></$2>");var j=(S.exec(i)||["",""])[1].toLowerCase(),k=X[j]||X._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=T.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNod
 es:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&Q.test(i)&&m.insertBefore(b.createTextNode(Q.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttr
 ibute&&j.removeAttribute(d.expando),delete e[c]}}}});var bb=/alpha\([^)]*\)/i,bc=/opacity=([^)]*)/,bd=/-([a-z])/ig,be=/([A-Z])/g,bf=/^-?\d+(?:px)?$/i,bg=/^-?\d/,bh={position:"absolute",visibility:"hidden",display:"block"},bi=["Left","Right"],bj=["Top","Bottom"],bk,bl,bm,bn=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bk(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeo
 f e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bk)return bk(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bd,bn)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bo(a,b,e):d.swap(a,bh,function(){f=bo(a,b,e)});if(f<=0){f=bk(a,b,b),f==="0px"&&bm&&(f=bm(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bf.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return bc.test((b&&a.currentStyle?a.currentStyle.filter:a.st
 yle.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bb.test(f)?f.replace(bb,e):c.filter+" "+e}}),c.defaultView&&c.defaultView.getComputedStyle&&(bl=function(a,c,e){var f,g,h;e=e.replace(be,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bm=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bf.test(d)&&bg.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bk=bl||bm,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliable
 HiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var bp=/%20/g,bq=/\[\]$/,br=/\r?\n/g,bs=/#.*$/,bt=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bu=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bv=/(?:^file|^widget|\-extension):$/,bw=/^(?:GET|HEAD)$/,bx=/^\/\//,by=/\?/,bz=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bA=/^(?:select|textarea)/i,bB=/\s+/,bC=/([?&])_=[^&]*/,bD=/(^|\-)([a-z])/g,bE=function(a,b,c){return b+c.toUpperCase()},bF=/^([\w\+\.\-]+:)\/\/([^\/?#:]*)(?::(\d+))?/,bG=d.fn.load,bH={},bI={},bJ,bK;try{bJ=c.location.href}catch(bL){bJ=c.createElement("a"),bJ.href="",bJ=bJ.href}bK=bF.exec(bJ.toLowerCase()),d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bG)return bG.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b)
 :typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?d("<div>").append(c.replace(bz,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bA.test(this.nodeName)||bu.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(br,"\r\n")}}):{name:b.name,value:c.replace(br,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFu
 nction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bJ,isLocal:bv.test(bK[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bM(bH),ajaxTransport:bM(bI),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",
 u.readyState=a?4:0;var q,t,v,w=l?bP(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bQ(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bD,bE)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r
 ===2){if(!n){n={};while(c=bt.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bs,"").replace(bx,bK[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bB),e.crossDomain||(q=bF.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bK[1]||q[2]!=bK[2]||(q[3]||(q[1]==="http:"?80:443))!=(bK[3]||(bK[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bN(bH,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!bw.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(by.test(e.url)?"&":"?")+e.d
 ata),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bC,"$1_="+w);e.url=x+(x===e.url?(by.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bN(bI,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=en
 codeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bO(g,a[g],c,f);return e.join("&").replace(bp,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bR=d.now(),bS=/(\=)\?(&|$)|()\?\?()/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bR++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bS.test(b.url)||f&&bS.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bS,l),b.url===j&&(f&&(k=k.replace(bS,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script js
 on"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var bT=d.now(),bU,bV;d.ajaxSettings
 .xhr=a.ActiveXObject?function(){return!this.isLocal&&bX()||bY()}:bX,bV=d.ajaxSettings.xhr(),d.support.ajax=!!bV,d.support.cors=bV&&"withCredentials"in bV,bV=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),(!a.crossDomain||a.hasContent)&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bU[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isL
 ocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bU||(bU={},bW()),h=bT++,g.onreadystatechange=bU[h]=c):c()},abort:function(){c&&c(0,1)}}}});var bZ={},b$=/^(?:toggle|show|hide)$/,b_=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,ca,cb=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(cc("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",cd(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cc("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"disp
 lay");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(cc("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.s
 tyle.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=cd(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialEasing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(b$.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=b_.exec(e),j=f.cur();if(i){var k=parseFloat(i[2]),l=i[3]||(d.cssNumber[c]?"":"px");l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:cc("show"
 ,1),slideUp:cc("hide",1),slideToggle:cc("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(
 this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!ca&&(ca=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in 
 this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(ca),ca=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:fun
 ction(a){d.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length});var ce=/^t(?:able|d|h)$/i,cf=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=cg(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.
 scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!ce.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),
 k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=parseFloat(d.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fi
 xed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),a=b=e=f=g=h=null,d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=e==="absolute"&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.usin
 g.call(a,k):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=cf.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!cf.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=cg(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=cg(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Widt
 h"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window);
\ No newline at end of file
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.7/jquery.js b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.7/jquery.js
new file mode 100644
index 0000000..8ccd0ea
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.7/jquery.js
@@ -0,0 +1,9266 @@
+/*!
+ * jQuery JavaScript Library v1.7.1
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Mon Nov 21 21:11:03 2011 -0500
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+	navigator = window.navigator,
+	location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// A simple way to check for HTML strings or ID strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Check if a string has a non-whitespace character in it
+	rnotwhite = /\S/,
+
+	// Used for trimming whitespace
+	trimLeft = /^\s+/,
+	trimRight = /\s+$/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+	// Useragent RegExp
+	rwebkit = /(webkit)[ \/]([\w.]+)/,
+	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+	rmsie = /(msie) ([\w.]+)/,
+	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+	// Matches dashed string for camelizing
+	rdashAlpha = /-([a-z]|[0-9])/ig,
+	rmsPrefix = /^-ms-/,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// Keep a UserAgent string for use with jQuery.browser
+	userAgent = navigator.userAgent,
+
+	// For matching the engine and version of the browser
+	browserMatch,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// The ready event handler
+	DOMContentLoaded,
+
+	// Save a reference to some core methods
+	toString = Object.prototype.toString,
+	hasOwn = Object.prototype.hasOwnProperty,
+	push = Array.prototype.push,
+	slice = Array.prototype.slice,
+	trim = String.prototype.trim,
+	indexOf = Array.prototype.indexOf,
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), or $(undefined)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// The body element only exists once, optimize finding it
+		if ( selector === "body" && !context && document.body ) {
+			this.context = document;
+			this[0] = document.body;
+			this.selector = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = quickExpr.exec( selector );
+			}
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = ( context ? context.ownerDocument || context : document );
+
+					// If a single string is passed in and it's a single tag
+					// just do a createElement and skip the rest
+					ret = rsingleTag.exec( selector );
+
+					if ( ret ) {
+						if ( jQuery.isPlainObject( context ) ) {
+							selector = [ document.createElement( ret[1] ) ];
+							jQuery.fn.attr.call( selector, context, true );
+
+						} else {
+							selector = [ doc.createElement( ret[1] ) ];
+						}
+
+					} else {
+						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+						selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
+					}
+
+					return jQuery.merge( this, selector );
+
+				// HANDLE: $("#id")
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || rootjQuery ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if ( selector.selector !== undefined ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.7.1",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return slice.call( this, 0 );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = this.constructor();
+
+		if ( jQuery.isArray( elems ) ) {
+			push.apply( ret, elems );
+
+		} else {
+			jQuery.merge( ret, elems );
+		}
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Attach the listeners
+		jQuery.bindReady();
+
+		// Add the callback
+		readyList.add( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		i = +i;
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ),
+			"slice", slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+		// Either a released hold or an DOMready/load event and not yet ready
+		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+			if ( !document.body ) {
+				return setTimeout( jQuery.ready, 1 );
+			}
+
+			// Remember that the DOM is ready
+			jQuery.isReady = true;
+
+			// If a normal DOM Ready event fired, decrement, and wait if need be
+			if ( wait !== true && --jQuery.readyWait > 0 ) {
+				return;
+			}
+
+			// If there are functions bound, to execute
+			readyList.fireWith( document, [ jQuery ] );
+
+			// Trigger any bound ready events
+			if ( jQuery.fn.trigger ) {
+				jQuery( document ).trigger( "ready" ).off( "ready" );
+			}
+		}
+	},
+
+	bindReady: function() {
+		if ( readyList ) {
+			return;
+		}
+
+		readyList = jQuery.Callbacks( "once memory" );
+
+		// Catch cases where $(document).ready() is called after the
+		// browser event has already occurred.
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Mozilla, Opera and webkit nightlies currently support this event
+		if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else if ( document.attachEvent ) {
+			// ensure firing before onload,
+			// maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var toplevel = false;
+
+			try {
+				toplevel = window.frameElement == null;
+			} catch(e) {}
+
+			if ( document.documentElement.doScroll && toplevel ) {
+				doScrollCheck();
+			}
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	// A crude way of determining if an object is a window
+	isWindow: function( obj ) {
+		return obj && typeof obj === "object" && "setInterval" in obj;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!hasOwn.call(obj, "constructor") &&
+				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		for ( var name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	parseJSON: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+			.replace( rvalidtokens, "]" )
+			.replace( rvalidbraces, "")) ) {
+
+			return ( new Function( "return " + data ) )();
+
+		}
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		var xml, tmp;
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && rnotwhite.test( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0,
+			length = object.length,
+			isObj = length === undefined || jQuery.isFunction( object );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.apply( object[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( object[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return object;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: trim ?
+		function( text ) {
+			return text == null ?
+				"" :
+				trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( array, results ) {
+		var ret = results || [];
+
+		if ( array != null ) {
+			// The window, strings (and functions) also have 'length'
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			var type = jQuery.type( array );
+
+			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+				push.call( ret, array );
+			} else {
+				jQuery.merge( ret, array );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array, i ) {
+		var len;
+
+		if ( array ) {
+			if ( indexOf ) {
+				return indexOf.call( array, elem, i );
+			}
+
+			len = array.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in array && array[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var i = first.length,
+			j = 0;
+
+		if ( typeof second.length === "number" ) {
+			for ( var l = second.length; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var ret = [], retVal;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value, key, ret = [],
+			i = 0,
+			length = elems.length,
+			// jquery objects are treated as arrays
+			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( key in elems ) {
+				value = callback( elems[ key ], key, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		if ( typeof context === "string" ) {
+			var tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		var args = slice.call( arguments, 2 ),
+			proxy = function() {
+				return fn.apply( context, args.concat( slice.call( arguments ) ) );
+			};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Mutifunctional method to get and set values to a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, key, value, exec, fn, pass ) {
+		var length = elems.length;
+
+		// Setting many attributes
+		if ( typeof key === "object" ) {
+			for ( var k in key ) {
+				jQuery.access( elems, k, key[k], exec, fn, value );
+			}
+			return elems;
+		}
+
+		// Setting one attribute
+		if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = !pass && exec && jQuery.isFunction(value);
+
+			for ( var i = 0; i < length; i++ ) {
+				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+			}
+
+			return elems;
+		}
+
+		// Getting an attribute
+		return length ? fn( elems[0], key ) : undefined;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	},
+
+	// Use of jQuery.browser is frowned upon.
+	// More details: http://docs.jquery.com/Utilities/jQuery.browser
+	uaMatch: function( ua ) {
+		ua = ua.toLowerCase();
+
+		var match = rwebkit.exec( ua ) ||
+			ropera.exec( ua ) ||
+			rmsie.exec( ua ) ||
+			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+			[];
+
+		return { browser: match[1] || "", version: match[2] || "0" };
+	},
+
+	sub: function() {
+		function jQuerySub( selector, context ) {
+			return new jQuerySub.fn.init( selector, context );
+		}
+		jQuery.extend( true, jQuerySub, this );
+		jQuerySub.superclass = this;
+		jQuerySub.fn = jQuerySub.prototype = this();
+		jQuerySub.fn.constructor = jQuerySub;
+		jQuerySub.sub = this.sub;
+		jQuerySub.fn.init = function init( selector, context ) {
+			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+				context = jQuerySub( context );
+			}
+
+			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+		};
+		jQuerySub.fn.init.prototype = jQuerySub.fn;
+		var rootjQuerySub = jQuerySub(document);
+		return jQuerySub;
+	},
+
+	browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+	jQuery.browser[ browserMatch.browser ] = true;
+	jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+	jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+	trimLeft = /^[\s\xA0]+/;
+	trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+	DOMContentLoaded = function() {
+		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+		jQuery.ready();
+	};
+
+} else if ( document.attachEvent ) {
+	DOMContentLoaded = function() {
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	};
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+	if ( jQuery.isReady ) {
+		return;
+	}
+
+	try {
+		// If IE is used, use the trick by Diego Perini
+		// http://javascript.nwbox.com/IEContentLoaded/
+		document.documentElement.doScroll("left");
+	} catch(e) {
+		setTimeout( doScrollCheck, 1 );
+		return;
+	}
+
+	// and execute any waiting functions
+	jQuery.ready();
+}
+
+return jQuery;
+
+})();
+
+
+// String to Object flags format cache
+var flagsCache = {};
+
+// Convert String-formatted flags into Object-formatted ones and store in cache
+function createFlags( flags ) {
+	var object = flagsCache[ flags ] = {},
+		i, length;
+	flags = flags.split( /\s+/ );
+	for ( i = 0, length = flags.length; i < length; i++ ) {
+		object[ flags[i] ] = true;
+	}
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	flags:	an optional list of space-separated flags that will change how
+ *			the callback list behaves
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible flags:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( flags ) {
+
+	// Convert flags from String-formatted to Object-formatted
+	// (we check in cache first)
+	flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+
+	var // Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = [],
+		// Last fire value (for non-forgettable lists)
+		memory,
+		// Flag to know if list is currently firing
+		firing,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// Add one or several callbacks to the list
+		add = function( args ) {
+			var i,
+				length,
+				elem,
+				type,
+				actual;
+			for ( i = 0, length = args.length; i < length; i++ ) {
+				elem = args[ i ];
+				type = jQuery.type( elem );
+				if ( type === "array" ) {
+					// Inspect recursively
+					add( elem );
+				} else if ( type === "function" ) {
+					// Add if not in unique mode and callback is not in
+					if ( !flags.unique || !self.has( elem ) ) {
+						list.push( elem );
+					}
+				}
+			}
+		},
+		// Fire callbacks
+		fire = function( context, args ) {
+			args = args || [];
+			memory = !flags.memory || [ context, args ];
+			firing = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
+					memory = true; // Mark as halted
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( !flags.once ) {
+					if ( stack && stack.length ) {
+						memory = stack.shift();
+						self.fireWith( memory[ 0 ], memory[ 1 ] );
+					}
+				} else if ( memory === true ) {
+					self.disable();
+				} else {
+					list = [];
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					var length = list.length;
+					add( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away, unless previous
+					// firing was halted (stopOnFalse)
+					} else if ( memory && memory !== true ) {
+						firingStart = length;
+						fire( memory[ 0 ], memory[ 1 ] );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					var args = arguments,
+						argIndex = 0,
+						argLength = args.length;
+					for ( ; argIndex < argLength ; argIndex++ ) {
+						for ( var i = 0; i < list.length; i++ ) {
+							if ( args[ argIndex ] === list[ i ] ) {
+								// Handle firingIndex and firingLength
+								if ( firing ) {
+									if ( i <= firingLength ) {
+										firingLength--;
+										if ( i <= firingIndex ) {
+											firingIndex--;
+										}
+									}
+								}
+								// Remove the element
+								list.splice( i--, 1 );
+								// If we have some unicity property then
+								// we only need to do this once
+								if ( flags.unique ) {
+									break;
+								}
+							}
+						}
+					}
+				}
+				return this;
+			},
+			// Control if a given callback is in the list
+			has: function( fn ) {
+				if ( list ) {
+					var i = 0,
+						length = list.length;
+					for ( ; i < length; i++ ) {
+						if ( fn === list[ i ] ) {
+							return true;
+						}
+					}
+				}
+				return false;
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory || memory === true ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( stack ) {
+					if ( firing ) {
+						if ( !flags.once ) {
+							stack.push( [ context, args ] );
+						}
+					} else if ( !( flags.once && memory ) ) {
+						fire( context, args );
+					}
+				}
+				return this;
+			},
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!memory;
+			}
+		};
+
+	return self;
+};
+
+
+
+
+var // Static reference to slice
+	sliceDeferred = [].slice;
+
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var doneList = jQuery.Callbacks( "once memory" ),
+			failList = jQuery.Callbacks( "once memory" ),
+			progressList = jQuery.Callbacks( "memory" ),
+			state = "pending",
+			lists = {
+				resolve: doneList,
+				reject: failList,
+				notify: progressList
+			},
+			promise = {
+				done: doneList.add,
+				fail: failList.add,
+				progress: progressList.add,
+
+				state: function() {
+					return state;
+				},
+
+				// Deprecated
+				isResolved: doneList.fired,
+				isRejected: failList.fired,
+
+				then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
+					deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
+					return this;
+				},
+				always: function() {
+					deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+					return this;
+				},
+				pipe: function( fnDone, fnFail, fnProgress ) {
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( {
+							done: [ fnDone, "resolve" ],
+							fail: [ fnFail, "reject" ],
+							progress: [ fnProgress, "notify" ]
+						}, function( handler, data ) {
+							var fn = data[ 0 ],
+								action = data[ 1 ],
+								returned;
+							if ( jQuery.isFunction( fn ) ) {
+								deferred[ handler ](function() {
+									returned = fn.apply( this, arguments );
+									if ( returned && jQuery.isFunction( returned.promise ) ) {
+										returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
+									} else {
+										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+									}
+								});
+							} else {
+								deferred[ handler ]( newDefer[ action ] );
+							}
+						});
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					if ( obj == null ) {
+						obj = promise;
+					} else {
+						for ( var key in promise ) {
+							obj[ key ] = promise[ key ];
+						}
+					}
+					return obj;
+				}
+			},
+			deferred = promise.promise({}),
+			key;
+
+		for ( key in lists ) {
+			deferred[ key ] = lists[ key ].fire;
+			deferred[ key + "With" ] = lists[ key ].fireWith;
+		}
+
+		// Handle state
+		deferred.done( function() {
+			state = "resolved";
+		}, failList.disable, progressList.lock ).fail( function() {
+			state = "rejected";
+		}, doneList.disable, progressList.lock );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( firstParam ) {
+		var args = sliceDeferred.call( arguments, 0 ),
+			i = 0,
+			length = args.length,
+			pValues = new Array( length ),
+			count = length,
+			pCount = length,
+			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+				firstParam :
+				jQuery.Deferred(),
+			promise = deferred.promise();
+		function resolveFunc( i ) {
+			return function( value ) {
+				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				if ( !( --count ) ) {
+					deferred.resolveWith( deferred, args );
+				}
+			};
+		}
+		function progressFunc( i ) {
+			return function( value ) {
+				pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				deferred.notifyWith( promise, pValues );
+			};
+		}
+		if ( length > 1 ) {
+			for ( ; i < length; i++ ) {
+				if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
+					args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
+				} else {
+					--count;
+				}
+			}
+			if ( !count ) {
+				deferred.resolveWith( deferred, args );
+			}
+		} else if ( deferred !== firstParam ) {
+			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+		}
+		return promise;
+	}
+});
+
+
+
+
+jQuery.support = (function() {
+
+	var support,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		marginDiv,
+		fragment,
+		tds,
+		events,
+		eventName,
+		i,
+		isSupported,
+		div = document.createElement( "div" ),
+		documentElement = document.documentElement;
+
+	// Preliminary tests
+	div.setAttribute("className", "t");
+	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+	all = div.getElementsByTagName( "*" );
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return {};
+	}
+
+	// First batch of supports tests
+	select = document.createElement( "select" );
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName( "input" )[ 0 ];
+
+	support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.55/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: ( input.value === "on" ),
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// Tests for enctype support on a form(#6743)
+		enctype: !!document.createElement("form").enctype,
+
+		// Makes sure cloning an html5 element does not cause problems
+		// Where outerHTML is undefined, this still works
+		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true
+	};
+
+	// Make sure checked status is properly cloned
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent( "onclick", function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent( "onclick" );
+	}
+
+	// Check if a radio maintains its value
+	// after being appended to the DOM
+	input = document.createElement("input");
+	input.value = "t";
+	input.setAttribute("type", "radio");
+	support.radioValue = input.value === "t";
+
+	input.setAttribute("checked", "checked");
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.lastChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	fragment.removeChild( input );
+	fragment.appendChild( div );
+
+	div.innerHTML = "";
+
+	// Check if div with explicit width and no margin-right incorrectly
+	// gets computed margin-right based on width of container. For more
+	// info see bug #3333
+	// Fails in WebKit before Feb 2011 nightlies
+	// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+	if ( window.getComputedStyle ) {
+		marginDiv = document.createElement( "div" );
+		marginDiv.style.width = "0";
+		marginDiv.style.marginRight = "0";
+		div.style.width = "2px";
+		div.appendChild( marginDiv );
+		support.reliableMarginRight =
+			( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+	}
+
+	// Technique from Juriy Zaytsev
+	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+	// We only care about the case where non-standard event systems
+	// are used, namely in IE. Short-circuiting here helps us to
+	// avoid an eval call (in setAttribute) which can cause CSP
+	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+	if ( div.attachEvent ) {
+		for( i in {
+			submit: 1,
+			change: 1,
+			focusin: 1
+		}) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	fragment.removeChild( div );
+
+	// Null elements to avoid leaks in IE
+	fragment = select = opt = marginDiv = div = input = null;
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, outer, inner, table, td, offsetSupport,
+			conMarginTop, ptlm, vb, style, html,
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		conMarginTop = 1;
+		ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";
+		vb = "visibility:hidden;border:0;";
+		style = "style='" + ptlm + "border:5px solid #000;padding:0;'";
+		html = "<div " + style + "><div></div></div>" +
+			"<table " + style + " cellpadding='0' cellspacing='0'>" +
+			"<tr><td></td></tr></table>";
+
+		container = document.createElement("div");
+		container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
+		body.insertBefore( container, body.firstChild );
+
+		// Construct the test element
+		div = document.createElement("div");
+		container.appendChild( div );
+
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		// (only IE 8 fails this test)
+		div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName( "td" );
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Check if empty table cells still have offsetWidth/Height
+		// (IE <= 8 fail this test)
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Figure out if the W3C box model works as expected
+		div.innerHTML = "";
+		div.style.width = div.style.paddingLeft = "1px";
+		jQuery.boxModel = support.boxModel = div.offsetWidth === 2;
+
+		if ( typeof div.style.zoom !== "undefined" ) {
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			// (IE < 8 does this)
+			div.style.display = "inline";
+			div.style.zoom = 1;
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "";
+			div.innerHTML = "<div style='width:4px;'></div>";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
+		}
+
+		div.style.cssText = ptlm + vb;
+		div.innerHTML = html;
+
+		outer = div.firstChild;
+		inner = outer.firstChild;
+		td = outer.nextSibling.firstChild.firstChild;
+
+		offsetSupport = {
+			doesNotAddBorder: ( inner.offsetTop !== 5 ),
+			doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
+		};
+
+		inner.style.position = "fixed";
+		inner.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
+		inner.style.position = inner.style.top = "";
+
+		outer.style.overflow = "hidden";
+		outer.style.position = "relative";
+
+		offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
+		offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
+
+		body.removeChild( container );
+		div  = container = null;
+
+		jQuery.extend( support, offsetSupport );
+	});
+
+	return support;
+})();
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	// Please use with caution
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var privateCache, thisCache, ret,
+			internalKey = jQuery.expando,
+			getByName = typeof name === "string",
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
+			isEvents = name === "events";
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ internalKey ] = id = ++jQuery.uuid;
+			} else {
+				id = internalKey;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// Avoids exposing jQuery metadata on plain JS objects when the object
+			// is serialized using JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ] = jQuery.extend( cache[ id ], name );
+			} else {
+				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+			}
+		}
+
+		privateCache = thisCache = cache[ id ];
+
+		// jQuery data() is stored in a separate object inside the object's internal data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data.
+		if ( !pvt ) {
+			if ( !thisCache.data ) {
+				thisCache.data = {};
+			}
+
+			thisCache = thisCache.data;
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// Users should not attempt to inspect the internal events object using jQuery.data,
+		// it is undocumented and subject to change. But does anyone listen? No.
+		if ( isEvents && !thisCache[ name ] ) {
+			return privateCache.events;
+		}
+
+		// Check for both converted-to-camel and non-converted data property names
+		// If a data property was specified
+		if ( getByName ) {
+
+			// First Try to find as-is property data
+			ret = thisCache[ name ];
+
+			// Test for null|undefined property data
+			if ( ret == null ) {
+
+				// Try to find the camelCased property
+				ret = thisCache[ jQuery.camelCase( name ) ];
+			}
+		} else {
+			ret = thisCache;
+		}
+
+		return ret;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, i, l,
+
+			// Reference to internal data cache key
+			internalKey = jQuery.expando,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+
+			// See jQuery.data for more information
+			id = isNode ? elem[ internalKey ] : internalKey;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+
+			thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+			if ( thisCache ) {
+
+				// Support array or space separated string names for data keys
+				if ( !jQuery.isArray( name ) ) {
+
+					// try the string as a key before any manipulation
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+
+						// split the camel cased version by spaces unless a key with the spaces exists
+						name = jQuery.camelCase( name );
+						if ( name in thisCache ) {
+							name = [ name ];
+						} else {
+							name = name.split( " " );
+						}
+					}
+				}
+
+				for ( i = 0, l = name.length; i < l; i++ ) {
+					delete thisCache[ name[i] ];
+				}
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( !pvt ) {
+			delete cache[ id ].data;
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject(cache[ id ]) ) {
+				return;
+			}
+		}
+
+		// Browsers that fail expando deletion also refuse to delete expandos on
+		// the window, but it will allow it on all other JS objects; other browsers
+		// don't care
+		// Ensure that `cache` is not a window object #10080
+		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+			delete cache[ id ];
+		} else {
+			cache[ id ] = null;
+		}
+
+		// We destroyed the cache and need to eliminate the expando on the node to avoid
+		// false lookups in the cache for entries that no longer exist
+		if ( isNode ) {
+			// IE does not allow us to delete expando properties from nodes,
+			// nor does it have a removeAttribute function on Document nodes;
+			// we must handle all of these cases
+			if ( jQuery.support.deleteExpando ) {
+				delete elem[ internalKey ];
+			} else if ( elem.removeAttribute ) {
+				elem.removeAttribute( internalKey );
+			} else {
+				elem[ internalKey ] = null;
+			}
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		if ( elem.nodeName ) {
+			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+			if ( match ) {
+				return !(match === true || elem.getAttribute("classid") !== match);
+			}
+		}
+
+		return true;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var parts, attr, name,
+			data = null;
+
+		if ( typeof key === "undefined" ) {
+			if ( this.length ) {
+				data = jQuery.data( this[0] );
+
+				if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
+					attr = this[0].attributes;
+					for ( var i = 0, l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( this[0], name, data[ name ] );
+						}
+					}
+					jQuery._data( this[0], "parsedAttrs", true );
+				}
+			}
+
+			return data;
+
+		} else if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		parts = key.split(".");
+		parts[1] = parts[1] ? "." + parts[1] : "";
+
+		if ( value === undefined ) {
+			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+			// Try to fetch any internally stored data first
+			if ( data === undefined && this.length ) {
+				data = jQuery.data( this[0], key );
+				data = dataAttr( this[0], key, data );
+			}
+
+			return data === undefined && parts[1] ?
+				this.data( parts[0] ) :
+				data;
+
+		} else {
+			return this.each(function() {
+				var self = jQuery( this ),
+					args = [ parts[0], value ];
+
+				self.triggerHandler( "setData" + parts[1] + "!", args );
+				jQuery.data( this, key, value );
+				self.triggerHandler( "changeData" + parts[1] + "!", args );
+			});
+		}
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+				data === "false" ? false :
+				data === "null" ? null :
+				jQuery.isNumeric( data ) ? parseFloat( data ) :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	for ( var name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+	var deferDataKey = type + "defer",
+		queueDataKey = type + "queue",
+		markDataKey = type + "mark",
+		defer = jQuery._data( elem, deferDataKey );
+	if ( defer &&
+		( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
+		( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
+		// Give room for hard-coded callbacks to fire first
+		// and eventually mark/queue something else on the element
+		setTimeout( function() {
+			if ( !jQuery._data( elem, queueDataKey ) &&
+				!jQuery._data( elem, markDataKey ) ) {
+				jQuery.removeData( elem, deferDataKey, true );
+				defer.fire();
+			}
+		}, 0 );
+	}
+}
+
+jQuery.extend({
+
+	_mark: function( elem, type ) {
+		if ( elem ) {
+			type = ( type || "fx" ) + "mark";
+			jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
+		}
+	},
+
+	_unmark: function( force, elem, type ) {
+		if ( force !== true ) {
+			type = elem;
+			elem = force;
+			force = false;
+		}
+		if ( elem ) {
+			type = type || "fx";
+			var key = type + "mark",
+				count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
+			if ( count ) {
+				jQuery._data( elem, key, count );
+			} else {
+				jQuery.removeData( elem, key, true );
+				handleQueueMarkDefer( elem, type, "mark" );
+			}
+		}
+	},
+
+	queue: function( elem, type, data ) {
+		var q;
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			q = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !q || jQuery.isArray(data) ) {
+					q = jQuery._data( elem, type, jQuery.makeArray(data) );
+				} else {
+					q.push( data );
+				}
+			}
+			return q || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift(),
+			hooks = {};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+		}
+
+		if ( fn ) {
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			jQuery._data( elem, type + ".run", hooks );
+			fn.call( elem, function() {
+				jQuery.dequeue( elem, type );
+			}, hooks );
+		}
+
+		if ( !queue.length ) {
+			jQuery.removeData( elem, type + "queue " + type + ".run", true );
+			handleQueueMarkDefer( elem, type, "queue" );
+		}
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+		}
+
+		if ( data === undefined ) {
+			return jQuery.queue( this[0], type );
+		}
+		return this.each(function() {
+			var queue = jQuery.queue( this, type, data );
+
+			if ( type === "fx" && queue[0] !== "inprogress" ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function( next, hooks ) {
+			var timeout = setTimeout( next, time );
+			hooks.stop = function() {
+				clearTimeout( timeout );
+			};
+		});
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, object ) {
+		if ( typeof type !== "string" ) {
+			object = type;
+			type = undefined;
+		}
+		type = type || "fx";
+		var defer = jQuery.Deferred(),
+			elements = this,
+			i = elements.length,
+			count = 1,
+			deferDataKey = type + "defer",
+			queueDataKey = type + "queue",
+			markDataKey = type + "mark",
+			tmp;
+		function resolve() {
+			if ( !( --count ) ) {
+				defer.resolveWith( elements, [ elements ] );
+			}
+		}
+		while( i-- ) {
+			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+					jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
+				count++;
+				tmp.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise();
+	}
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+	rspace = /\s+/,
+	rreturn = /\r/g,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea)?$/i,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute,
+	nodeHook, boolHook, fixSpecified;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.attr );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.prop );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classNames, i, l, elem,
+			setClass, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			classNames = value.split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className && classNames.length === 1 ) {
+						elem.className = value;
+
+					} else {
+						setClass = " " + elem.className + " ";
+
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classNames, i, l, elem, className, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( (value && typeof value === "string") || value === undefined ) {
+			classNames = ( value || "" ).split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 && elem.className ) {
+					if ( value ) {
+						className = (" " + elem.className + " ").replace( rclass, " " );
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							className = className.replace(" " + classNames[ c ] + " ", " ");
+						}
+						elem.className = jQuery.trim( className );
+
+					} else {
+						elem.className = "";
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.split( rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space seperated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
+
+				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ?
+					// handle most common string cases
+					ret.replace(rreturn, "") :
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var self = jQuery(this), val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map(val, function ( value ) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				// attributes.value is undefined in Blackberry 4.7 but
+				// uses .value. See #6932
+				var val = elem.attributes.value;
+				return !val || val.specified ? elem.value : elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, i, max, option,
+					index = elem.selectedIndex,
+					values = [],
+					options = elem.options,
+					one = elem.type === "select-one";
+
+				// Nothing was selected
+				if ( index < 0 ) {
+					return null;
+				}
+
+				// Loop through all the selected options
+				i = one ? index : 0;
+				max = one ? index + 1 : options.length;
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// Don't return options that are disabled or in a disabled optgroup
+					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+				if ( one && !values.length && options.length ) {
+					return jQuery( options[ index ] ).val();
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attrFn: {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true
+	},
+
+	attr: function( elem, name, value, pass ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( pass && name in jQuery.attrFn ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( notxml ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+
+			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, "" + value );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			ret = elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret === null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var propName, attrNames, name, l,
+			i = 0;
+
+		if ( value && elem.nodeType === 1 ) {
+			attrNames = value.toLowerCase().split( rspace );
+			l = attrNames.length;
+
+			for ( ; i < l; i++ ) {
+				name = attrNames[ i ];
+
+				if ( name ) {
+					propName = jQuery.propFix[ name ] || name;
+
+					// See #9699 for explanation of this approach (setting first, then removal)
+					jQuery.attr( elem, name, "" );
+					elem.removeAttribute( getSetAttribute ? name : propName );
+
+					// Set corresponding property to false for boolean attributes
+					if ( rboolean.test( name ) && propName in elem ) {
+						elem[ propName ] = false;
+					}
+				}
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				// We can't allow the type property to be changed (since it causes problems in IE)
+				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+					jQuery.error( "type property can't be changed" );
+				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to it's default in case type is set after value
+					// This is for element creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		},
+		// Use the value property for back compat
+		// Use the nodeHook for button elements in IE6/7 (#1954)
+		value: {
+			get: function( elem, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.get( elem, name );
+				}
+				return name in elem ?
+					elem.value :
+					null;
+			},
+			set: function( elem, value, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.set( elem, value, name );
+				}
+				// Does not return so that setAttribute is also used
+				elem.value = value;
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+
+	prop: function( elem, name, value ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return ( elem[ name ] = value );
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		// Align boolean attributes with corresponding properties
+		// Fall back to attribute presence where some booleans are not supported
+		var attrNode,
+			property = jQuery.prop( elem, name );
+		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		var propName;
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			// value is true since we know at this point it's type boolean and not false
+			// Set boolean attributes to the same name and set the DOM property
+			propName = jQuery.propFix[ name ] || name;
+			if ( propName in elem ) {
+				// Only set the IDL specifically if it already exists on the element
+				elem[ propName ] = true;
+			}
+
+			elem.setAttribute( name, name.toLowerCase() );
+		}
+		return name;
+	}
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	fixSpecified = {
+		name: true,
+		id: true
+	};
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret;
+			ret = elem.getAttributeNode( name );
+			return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
+				ret.nodeValue :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				ret = document.createAttribute( name );
+				elem.setAttributeNode( ret );
+			}
+			return ( ret.nodeValue = value + "" );
+		}
+	};
+
+	// Apply the nodeHook to tabindex
+	jQuery.attrHooks.tabindex.set = nodeHook.set;
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		get: nodeHook.get,
+		set: function( elem, value, name ) {
+			if ( value === "" ) {
+				value = "false";
+			}
+			nodeHook.set( elem, value, name );
+		}
+	};
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret === null ? undefined : ret;
+			}
+		});
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Normalize to lowercase since IE uppercases css property names
+			return elem.style.cssText.toLowerCase() || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = "" + value );
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	});
+});
+
+
+
+
+var rformElems = /^(?:textarea|input|select)$/i,
+	rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
+	rhoverHack = /\bhover(\.\S+)?\b/,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
+	quickParse = function( selector ) {
+		var quick = rquickIs.exec( selector );
+		if ( quick ) {
+			//   0  1    2   3
+			// [ _, tag, id, class ]
+			quick[1] = ( quick[1] || "" ).toLowerCase();
+			quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
+		}
+		return quick;
+	},
+	quickIs = function( elem, m ) {
+		var attrs = elem.attributes || {};
+		return (
+			(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
+			(!m[2] || (attrs.id || {}).value === m[2]) &&
+			(!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
+		);
+	},
+	hoverHack = function( events ) {
+		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+	};
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var elemData, eventHandle, events,
+			t, tns, type, namespaces, handleObj,
+			handleObjIn, quick, handlers, special;
+
+		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
+		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		events = elemData.events;
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+		eventHandle = elemData.handle;
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = function( e ) {
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = jQuery.trim( hoverHack(types) ).split( " " );
+		for ( t = 0; t < types.length; t++ ) {
+
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = tns[1];
+			namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend({
+				type: type,
+				origType: tns[1],
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				quick: quickParse( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			handlers = events[ type ];
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+			t, tns, type, origType, namespaces, origCount,
+			j, events, special, handle, eventType, handleObj;
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+		for ( t = 0; t < types.length; t++ ) {
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tns[1];
+			namespaces = tns[2];
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector? special.delegateType : special.bindType ) || type;
+			eventType = events[ type ] || [];
+			origCount = eventType.length;
+			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+
+			// Remove matching events
+			for ( j = 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					 ( !handler || handler.guid === handleObj.guid ) &&
+					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					eventType.splice( j--, 1 );
+
+					if ( handleObj.selector ) {
+						eventType.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( eventType.length === 0 && origCount !== eventType.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			handle = elemData.handle;
+			if ( handle ) {
+				handle.elem = null;
+			}
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery.removeData( elem, [ "events", "handle" ], true );
+		}
+	},
+
+	// Events that are safe to short-circuit if no handlers are attached.
+	// Native DOM events should not be added, they may have inline handlers.
+	customEvent: {
+		"getData": true,
+		"setData": true,
+		"changeData": true
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		// Don't do events on text and comment nodes
+		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+			return;
+		}
+
+		// Event object or event type
+		var type = event.type || event,
+			namespaces = [],
+			cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "!" ) >= 0 ) {
+			// Exclusive events trigger only for the exact event (no namespaces)
+			type = type.slice(0, -1);
+			exclusive = true;
+		}
+
+		if ( type.indexOf( "." ) >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+
+		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+			// No jQuery handlers for this event type, and it can't have inline handlers
+			return;
+		}
+
+		// Caller can pass in an Event, Object, or just an event type string
+		event = typeof event === "object" ?
+			// jQuery.Event object
+			event[ jQuery.expando ] ? event :
+			// Object literal
+			new jQuery.Event( type, event ) :
+			// Just the event type (string)
+			new jQuery.Event( type );
+
+		event.type = type;
+		event.isTrigger = true;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join( "." );
+		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+		// Handle a global trigger
+		if ( !elem ) {
+
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			cache = jQuery.cache;
+			for ( i in cache ) {
+				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+				}
+			}
+			return;
+		}
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data != null ? jQuery.makeArray( data ) : [];
+		data.unshift( event );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		eventPath = [[ elem, special.bindType || type ]];
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+			old = null;
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push([ cur, bubbleType ]);
+				old = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( old && old === elem.ownerDocument ) {
+				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+			}
+		}
+
+		// Fire handlers on the event path
+		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+			cur = eventPath[i][0];
+			event.type = eventPath[i][1];
+
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+			// Note that this is a bare JS function and not a jQuery handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
+				event.preventDefault();
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				// IE<9 dies on focus/blur to hidden element (#1486)
+				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					old = elem[ ontype ];
+
+					if ( old ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					elem[ type ]();
+					jQuery.event.triggered = undefined;
+
+					if ( old ) {
+						elem[ ontype ] = old;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event || window.event );
+
+		var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+			delegateCount = handlers.delegateCount,
+			args = [].slice.call( arguments, 0 ),
+			run_all = !event.exclusive && !event.namespace,
+			handlerQueue = [],
+			i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Determine handlers that should run if there are delegated events
+		// Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
+
+			// Pregenerate a single jQuery object for reuse with .is()
+			jqcur = jQuery(this);
+			jqcur.context = this.ownerDocument || this;
+
+			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+				selMatch = {};
+				matches = [];
+				jqcur[0] = cur;
+				for ( i = 0; i < delegateCount; i++ ) {
+					handleObj = handlers[ i ];
+					sel = handleObj.selector;
+
+					if ( selMatch[ sel ] === undefined ) {
+						selMatch[ sel ] = (
+							handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
+						);
+					}
+					if ( selMatch[ sel ] ) {
+						matches.push( handleObj );
+					}
+				}
+				if ( matches.length ) {
+					handlerQueue.push({ elem: cur, matches: matches });
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( handlers.length > delegateCount ) {
+			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+		}
+
+		// Run delegates first; they may want to stop propagation beneath us
+		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+			matched = handlerQueue[ i ];
+			event.currentTarget = matched.elem;
+
+			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+				handleObj = matched.matches[ j ];
+
+				// Triggered event must either 1) be non-exclusive and have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+	fixHooks: {},
+
+	keyHooks: {
+		props: "char charCode key keyCode".split(" "),
+		filter: function( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var eventDoc, doc, body,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop,
+			originalEvent = event,
+			fixHook = jQuery.event.fixHooks[ event.type ] || {},
+			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = jQuery.Event( originalEvent );
+
+		for ( i = copy.length; i; ) {
+			prop = copy[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Target should not be a text node (#504, Safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
+		if ( event.metaKey === undefined ) {
+			event.metaKey = event.ctrlKey;
+		}
+
+		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: jQuery.bindReady
+		},
+
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+
+		focus: {
+			delegateType: "focusin"
+		},
+		blur: {
+			delegateType: "focusout"
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// Piggyback on a donor event to simulate a different one.
+		// Fake originalEvent to avoid donor's stopPropagation, but if the
+		// simulated event prevents default then we do the same on the donor.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{ type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		if ( elem.detachEvent ) {
+			elem.detachEvent( "on" + type, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !(this instanceof jQuery.Event) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj,
+				selector = handleObj.selector,
+				ret;
+
+			// For mousenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !form._submit_attached ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						// If form was submitted by the user, bubble the event up the tree
+						if ( this.parentNode && !event.isTrigger ) {
+							jQuery.event.simulate( "submit", this.parentNode, event, true );
+						}
+					});
+					form._submit_attached = true;
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+							jQuery.event.simulate( "change", this, event, true );
+						}
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					elem._change_attached = true;
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0,
+			handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var origFn, type;
+
+		// Types can be a map of types/handlers
+		if ( typeof types === "object" ) {
+			// ( types-Object, selector, data )
+			if ( typeof selector !== "string" ) {
+				// ( types-Object, data )
+				data = selector;
+				selector = undefined;
+			}
+			for ( type in types ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		if ( data == null && fn == null ) {
+			// ( types, fn )
+			fn = selector;
+			data = selector = undefined;
+		} else if ( fn == null ) {
+			if ( typeof selector === "string" ) {
+				// ( types, selector, fn )
+				fn = data;
+				data = undefined;
+			} else {
+				// ( types, data, fn )
+				fn = data;
+				data = selector;
+				selector = undefined;
+			}
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		} else if ( !fn ) {
+			return this;
+		}
+
+		if ( one === 1 ) {
+			origFn = fn;
+			fn = function( event ) {
+				// Can use an empty set, since event contains the info
+				jQuery().off( event );
+				return origFn.apply( this, arguments );
+			};
+			// Use same guid so caller can remove using origFn
+			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+		}
+		return this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on.call( this, types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			var handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( var type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each(function() {
+			jQuery.event.remove( this, types, fn, selector );
+		});
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	live: function( types, data, fn ) {
+		jQuery( this.context ).on( types, this.selector, data, fn );
+		return this;
+	},
+	die: function( types, fn ) {
+		jQuery( this.context ).off( types, this.selector || "**", fn );
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			return jQuery.event.trigger( type, data, this[0], true );
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			guid = fn.guid || jQuery.guid++,
+			i = 0,
+			toggler = function( event ) {
+				// Figure out which function to execute
+				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+				// Make sure that clicks stop
+				event.preventDefault();
+
+				// and execute the function
+				return args[ lastToggle ].apply( this, arguments ) || false;
+			};
+
+		// link all the functions, so any of them can unbind this click handler
+		toggler.guid = guid;
+		while ( i < args.length ) {
+			args[ i++ ].guid = guid;
+		}
+
+		return this.click( toggler );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( jQuery.attrFn ) {
+		jQuery.attrFn[ name ] = true;
+	}
+
+	if ( rkeyEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+	}
+
+	if ( rmouseEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+	}
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+	expando = "sizcache" + (Math.random() + '').replace('.', ''),
+	done = 0,
+	toString = Object.prototype.toString,
+	hasDuplicate = false,
+	baseHasDuplicate = true,
+	rBackslash = /\\/g,
+	rReturn = /\r\n/g,
+	rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+	baseHasDuplicate = false;
+	return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+
+	var origContext = context;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+		return [];
+	}
+	
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var m, set, checkSet, extra, ret, cur, pop, i,
+		prune = true,
+		contextXML = Sizzle.isXML( context ),
+		parts = [],
+		soFar = selector;
+	
+	// Reset the position of the chunker regexp (start from head)
+	do {
+		chunker.exec( "" );
+		m = chunker.exec( soFar );
+
+		if ( m ) {
+			soFar = m[3];
+		
+			parts.push( m[1] );
+		
+			if ( m[2] ) {
+				extra = m[3];
+				break;
+			}
+		}
+	} while ( m );
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context, seed );
+
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] ) {
+					selector += parts.shift();
+				}
+				
+				set = posProcess( selector, set, seed );
+			}
+		}
+
+	} else {
+		// Take a shortcut and set the context if the root selector is an ID
+		// (but not if it'll be faster if the inner selector is an ID)
+		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+			ret = Sizzle.find( parts.shift(), context, contextXML );
+			context = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set )[0] :
+				ret.set[0];
+		}
+
+		if ( context ) {
+			ret = seed ?
+				{ expr: parts.pop(), set: makeArray(seed) } :
+				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+			set = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set ) :
+				ret.set;
+
+			if ( parts.length > 0 ) {
+				checkSet = makeArray( set );
+
+			} else {
+				prune = false;
+			}
+
+			while ( parts.length ) {
+				cur = parts.pop();
+				pop = cur;
+
+				if ( !Expr.relative[ cur ] ) {
+					cur = "";
+				} else {
+					pop = parts.pop();
+				}
+
+				if ( pop == null ) {
+					pop = context;
+				}
+
+				Expr.relative[ cur ]( checkSet, pop, contextXML );
+			}
+
+		} else {
+			checkSet = parts = [];
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		Sizzle.error( cur || selector );
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+
+		} else if ( context && context.nodeType === 1 ) {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+
+		} else {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, origContext, results, seed );
+		Sizzle.uniqueSort( results );
+	}
+
+	return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+	if ( sortOrder ) {
+		hasDuplicate = baseHasDuplicate;
+		results.sort( sortOrder );
+
+		if ( hasDuplicate ) {
+			for ( var i = 1; i < results.length; i++ ) {
+				if ( results[i] === results[ i - 1 ] ) {
+					results.splice( i--, 1 );
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+	return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+	return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+	var set, i, len, match, type, left;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( i = 0, len = Expr.order.length; i < len; i++ ) {
+		type = Expr.order[i];
+		
+		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+			left = match[1];
+			match.splice( 1, 1 );
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace( rBackslash, "" );
+				set = Expr.find[ type ]( match, context, isXML );
+
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( "*" ) :
+			[];
+	}
+
+	return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+	var match, anyFound,
+		type, found, item, filter, left,
+		i, pass,
+		old = expr,
+		result = [],
+		curLoop = set,
+		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+	while ( expr && set.length ) {
+		for ( type in Expr.filter ) {
+			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+				filter = Expr.filter[ type ];
+				left = match[1];
+
+				anyFound = false;
+
+				match.splice(1,1);
+
+				if ( left.substr( left.length - 1 ) === "\\" ) {
+					continue;
+				}
+
+				if ( curLoop === result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							pass = not ^ found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+
+								} else {
+									curLoop[i] = false;
+								}
+
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr === old ) {
+			if ( anyFound == null ) {
+				Sizzle.error( expr );
+
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Utility function for retreiving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+var getText = Sizzle.getText = function( elem ) {
+    var i, node,
+		nodeType = elem.nodeType,
+		ret = "";
+
+	if ( nodeType ) {
+		if ( nodeType === 1 || nodeType === 9 ) {
+			// Use textContent || innerText for elements
+			if ( typeof elem.textContent === 'string' ) {
+				return elem.textContent;
+			} else if ( typeof elem.innerText === 'string' ) {
+				// Replace IE's carriage returns
+				return elem.innerText.replace( rReturn, '' );
+			} else {
+				// Traverse it's children
+				for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
+					ret += getText( elem );
+				}
+			}
+		} else if ( nodeType === 3 || nodeType === 4 ) {
+			return elem.nodeValue;
+		}
+	} else {
+
+		// If no nodeType, this is expected to be an array
+		for ( i = 0; (node = elem[i]); i++ ) {
+			// Do not traverse comment nodes
+			if ( node.nodeType !== 8 ) {
+				ret += getText( node );
+			}
+		}
+	}
+	return ret;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+	},
+
+	leftMatch: {},
+
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+
+	attrHandle: {
+		href: function( elem ) {
+			return elem.getAttribute( "href" );
+		},
+		type: function( elem ) {
+			return elem.getAttribute( "type" );
+		}
+	},
+
+	relative: {
+		"+": function(checkSet, part){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !rNonWord.test( part ),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag ) {
+				part = part.toLowerCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+
+		">": function( checkSet, part ) {
+			var elem,
+				isPartStr = typeof part === "string",
+				i = 0,
+				l = checkSet.length;
+
+			if ( isPartStr && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+					}
+				}
+
+			} else {
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+
+		"": function(checkSet, part, isXML){
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+		},
+
+		"~": function( checkSet, part, isXML ) {
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+		}
+	},
+
+	find: {
+		ID: function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		},
+
+		NAME: function( match, context ) {
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [],
+					results = context.getElementsByName( match[1] );
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+
+		TAG: function( match, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( match[1] );
+			}
+		}
+	},
+	preFilter: {
+		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+			match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+						if ( !inplace ) {
+							result.push( elem );
+						}
+
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+
+		ID: function( match ) {
+			return match[1].replace( rBackslash, "" );
+		},
+
+		TAG: function( match, curLoop ) {
+			return match[1].replace( rBackslash, "" ).toLowerCase();
+		},
+
+		CHILD: function( match ) {
+			if ( match[1] === "nth" ) {
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				match[2] = match[2].replace(/^\+|\s*/g, '');
+
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+			else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+
+		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+			var name = match[1] = match[1].replace( rBackslash, "" );
+			
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			// Handle if an un-quoted value was used
+			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+
+		PSEUDO: function( match, curLoop, inplace, result, not ) {
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+
+					return false;
+				}
+
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+			
+			return match;
+		},
+
+		POS: function( match ) {
+			match.unshift( true );
+
+			return match;
+		}
+	},
+	
+	filters: {
+		enabled: function( elem ) {
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+
+		disabled: function( elem ) {
+			return elem.disabled === true;
+		},
+
+		checked: function( elem ) {
+			return elem.checked === true;
+		},
+		
+		selected: function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+			
+			return elem.selected === true;
+		},
+
+		parent: function( elem ) {
+			return !!elem.firstChild;
+		},
+
+		empty: function( elem ) {
+			return !elem.firstChild;
+		},
+
+		has: function( elem, i, match ) {
+			return !!Sizzle( match[3], elem ).length;
+		},
+
+		header: function( elem ) {
+			return (/h\d/i).test( elem.nodeName );
+		},
+
+		text: function( elem ) {
+			var attr = elem.getAttribute( "type" ), type = elem.type;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
+		},
+
+		radio: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+		},
+
+		checkbox: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+		},
+
+		file: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+		},
+
+		password: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+		},
+
+		submit: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "submit" === elem.type;
+		},
+
+		image: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+		},
+
+		reset: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "reset" === elem.type;
+		},
+
+		button: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && "button" === elem.type || name === "button";
+		},
+
+		input: function( elem ) {
+			return (/input|select|textarea|button/i).test( elem.nodeName );
+		},
+
+		focus: function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		}
+	},
+	setFilters: {
+		first: function( elem, i ) {
+			return i === 0;
+		},
+
+		last: function( elem, i, match, array ) {
+			return i === array.length - 1;
+		},
+
+		even: function( elem, i ) {
+			return i % 2 === 0;
+		},
+
+		odd: function( elem, i ) {
+			return i % 2 === 1;
+		},
+
+		lt: function( elem, i, match ) {
+			return i < match[3] - 0;
+		},
+
+		gt: function( elem, i, match ) {
+			return i > match[3] - 0;
+		},
+
+		nth: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		},
+
+		eq: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		}
+	},
+	filter: {
+		PSEUDO: function( elem, match, i, array ) {
+			var name = match[1],
+				filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var j = 0, l = not.length; j < l; j++ ) {
+					if ( not[j] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+
+			} else {
+				Sizzle.error( name );
+			}
+		},
+
+		CHILD: function( elem, match ) {
+			var first, last,
+				doneName, parent, cache,
+				count, diff,
+				type = match[1],
+				node = elem;
+
+			switch ( type ) {
+				case "only":
+				case "first":
+					while ( (node = node.previousSibling) )	 {
+						if ( node.nodeType === 1 ) { 
+							return false; 
+						}
+					}
+
+					if ( type === "first" ) { 
+						return true; 
+					}
+
+					node = elem;
+
+				case "last":
+					while ( (node = node.nextSibling) )	 {
+						if ( node.nodeType === 1 ) { 
+							return false; 
+						}
+					}
+
+					return true;
+
+				case "nth":
+					first = match[2];
+					last = match[3];
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+					
+					doneName = match[0];
+					parent = elem.parentNode;
+	
+					if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
+						count = 0;
+						
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						} 
+
+						parent[ expando ] = doneName;
+					}
+					
+					diff = elem.nodeIndex - last;
+
+					if ( first === 0 ) {
+						return diff === 0;
+
+					} else {
+						return ( diff % first === 0 && diff / first >= 0 );
+					}
+			}
+		},
+
+		ID: function( elem, match ) {
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+
+		TAG: function( elem, match ) {
+			return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
+		},
+		
+		CLASS: function( elem, match ) {
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+
+		ATTR: function( elem, match ) {
+			var name = match[1],
+				result = Sizzle.attr ?
+					Sizzle.attr( elem, name ) :
+					Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				!type && Sizzle.attr ?
+				result != null :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value !== check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+
+		POS: function( elem, match, i, array ) {
+			var name = match[2],
+				filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS,
+	fescape = function(all, num){
+		return "\\" + (num - 0 + 1);
+	};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+	array = Array.prototype.slice.call( array, 0 );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+	
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+	makeArray = function( array, results ) {
+		var i = 0,
+			ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+
+			} else {
+				for ( ; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+			return a.compareDocumentPosition ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+	};
+
+} else {
+	sortOrder = function( a, b ) {
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Fallback to using sourceIndex (in IE) if it's available on both nodes
+		} else if ( a.sourceIndex && b.sourceIndex ) {
+			return a.sourceIndex - b.sourceIndex;
+		}
+
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+	siblingCheck = function( a, b, ret ) {
+		if ( a === b ) {
+			return ret;
+		}
+
+		var cur = a.nextSibling;
+
+		while ( cur ) {
+			if ( cur === b ) {
+				return -1;
+			}
+
+			cur = cur.nextSibling;
+		}
+
+		return 1;
+	};
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("div"),
+		id = "script" + (new Date()).getTime(),
+		root = document.documentElement;
+
+	form.innerHTML = "<a name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( document.getElementById( id ) ) {
+		Expr.find.ID = function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+
+				return m ?
+					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+
+		Expr.filter.ID = function( elem, match ) {
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+
+	// release memory in IE
+	root = form = null;
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function( match, context ) {
+			var results = context.getElementsByTagName( match[1] );
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+
+		Expr.attrHandle.href = function( elem ) {
+			return elem.getAttribute( "href", 2 );
+		};
+	}
+
+	// release memory in IE
+	div = null;
+})();
+
+if ( document.querySelectorAll ) {
+	(function(){
+		var oldSizzle = Sizzle,
+			div = document.createElement("div"),
+			id = "__sizzle__";
+
+		div.innerHTML = "<p class='TEST'></p>";
+
+		// Safari can't handle uppercase or unicode characters when
+		// in quirks mode.
+		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+			return;
+		}
+	
+		Sizzle = function( query, context, extra, seed ) {
+			context = context || document;
+
+			// Only use querySelectorAll on non-XML documents
+			// (ID selectors don't work in non-HTML documents)
+			if ( !seed && !Sizzle.isXML(context) ) {
+				// See if we find a selector to speed up
+				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+				
+				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+					// Speed-up: Sizzle("TAG")
+					if ( match[1] ) {
+						return makeArray( context.getElementsByTagName( query ), extra );
+					
+					// Speed-up: Sizzle(".CLASS")
+					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+						return makeArray( context.getElementsByClassName( match[2] ), extra );
+					}
+				}
+				
+				if ( context.nodeType === 9 ) {
+					// Speed-up: Sizzle("body")
+					// The body element only exists once, optimize finding it
+					if ( query === "body" && context.body ) {
+						return makeArray( [ context.body ], extra );
+						
+					// Speed-up: Sizzle("#ID")
+					} else if ( match && match[3] ) {
+						var elem = context.getElementById( match[3] );
+
+						// Check parentNode to catch when Blackberry 4.6 returns
+						// nodes that are no longer in the document #6963
+						if ( elem && elem.parentNode ) {
+							// Handle the case where IE and Opera return items
+							// by name instead of ID
+							if ( elem.id === match[3] ) {
+								return makeArray( [ elem ], extra );
+							}
+							
+						} else {
+							return makeArray( [], extra );
+						}
+					}
+					
+					try {
+						return makeArray( context.querySelectorAll(query), extra );
+					} catch(qsaError) {}
+
+				// qSA works strangely on Element-rooted queries
+				// We can work around this by specifying an extra ID on the root
+				// and working up from there (Thanks to Andrew Dupont for the technique)
+				// IE 8 doesn't work on object elements
+				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					var oldContext = context,
+						old = context.getAttribute( "id" ),
+						nid = old || id,
+						hasParent = context.parentNode,
+						relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+					if ( !old ) {
+						context.setAttribute( "id", nid );
+					} else {
+						nid = nid.replace( /'/g, "\\$&" );
+					}
+					if ( relativeHierarchySelector && hasParent ) {
+						context = context.parentNode;
+					}
+
+					try {
+						if ( !relativeHierarchySelector || hasParent ) {
+							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+						}
+
+					} catch(pseudoError) {
+					} finally {
+						if ( !old ) {
+							oldContext.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+		
+			return oldSizzle(query, context, extra, seed);
+		};
+
+		for ( var prop in oldSizzle ) {
+			Sizzle[ prop ] = oldSizzle[ prop ];
+		}
+
+		// release memory in IE
+		div = null;
+	})();
+}
+
+(function(){
+	var html = document.documentElement,
+		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+	if ( matches ) {
+		// Check to see if it's possible to do matchesSelector
+		// on a disconnected node (IE 9 fails this)
+		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+			pseudoWorks = false;
+
+		try {
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( document.documentElement, "[test!='']:sizzle" );
+	
+		} catch( pseudoError ) {
+			pseudoWorks = true;
+		}
+
+		Sizzle.matchesSelector = function( node, expr ) {
+			// Make sure that attribute selectors are quoted
+			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+			if ( !Sizzle.isXML( node ) ) {
+				try { 
+					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+						var ret = matches.call( node, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || !disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9, so check for that
+								node.document && node.document.nodeType !== 11 ) {
+							return ret;
+						}
+					}
+				} catch(e) {}
+			}
+
+			return Sizzle(expr, null, null, [node]).length > 0;
+		};
+	}
+})();
+
+(function(){
+	var div = document.createElement("div");
+
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	// Also, make sure that getElementsByClassName actually exists
+	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+		return;
+	}
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 ) {
+		return;
+	}
+	
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function( match, context, isXML ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+
+	// release memory in IE
+	div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem[ expando ] = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName.toLowerCase() === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+			
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem[ expando ] = doneName;
+						elem.sizset = i;
+					}
+
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+if ( document.documentElement.contains ) {
+	Sizzle.contains = function( a, b ) {
+		return a !== b && (a.contains ? a.contains(b) : true);
+	};
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+	Sizzle.contains = function( a, b ) {
+		return !!(a.compareDocumentPosition(b) & 16);
+	};
+
+} else {
+	Sizzle.contains = function() {
+		return false;
+	};
+}
+
+Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833) 
+	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context, seed ) {
+	var match,
+		tmpSet = [],
+		later = "",
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet, seed );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+Sizzle.selectors.attrMap = {};
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+	// Note: This RegExp should be improved, or likely pulled from Sizzle
+	rmultiselector = /,/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	slice = Array.prototype.slice,
+	POS = jQuery.expr.match.POS,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var self = this,
+			i, l;
+
+		if ( typeof selector !== "string" ) {
+			return jQuery( selector ).filter(function() {
+				for ( i = 0, l = self.length; i < l; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			});
+		}
+
+		var ret = this.pushStack( "", "find", selector ),
+			length, n, r;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( n = length; n < ret.length; n++ ) {
+					for ( r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target );
+		return this.filter(function() {
+			for ( var i = 0, l = targets.length; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && ( 
+			typeof selector === "string" ?
+				// If this is a positional selector, check membership in the returned set
+				// so $("p:first").is("p:last") won't return true for a doc with two "p".
+				POS.test( selector ) ? 
+					jQuery( selector, this.context ).index( this[0] ) >= 0 :
+					jQuery.filter( selector, this ).length > 0 :
+				this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var ret = [], i, l, cur = this[0];
+		
+		// Array (deprecated as of jQuery 1.7)
+		if ( jQuery.isArray( selectors ) ) {
+			var level = 1;
+
+			while ( cur && cur.ownerDocument && cur !== context ) {
+				for ( i = 0; i < selectors.length; i++ ) {
+
+					if ( jQuery( cur ).is( selectors[ i ] ) ) {
+						ret.push({ selector: selectors[ i ], elem: cur, level: level });
+					}
+				}
+
+				cur = cur.parentNode;
+				level++;
+			}
+
+			return ret;
+		}
+
+		// String
+		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+
+				} else {
+					cur = cur.parentNode;
+					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+						break;
+					}
+				}
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	}
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return jQuery.nth( elem, 2, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return jQuery.nth( elem, 2, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( elem.parentNode.firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.makeArray( elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, slice.call( arguments ).join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	nth: function( cur, result, dir, elem ) {
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] ) {
+			if ( cur.nodeType === 1 && ++num === result ) {
+				break;
+			}
+		}
+
+		return cur;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return ( elem === qualifier ) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+	});
+}
+
+
+
+
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+	safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style)/i,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")", "i"),
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	},
+	safeFragment = createSafeFragment( document );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( text ) {
+		if ( jQuery.isFunction(text) ) {
+			return this.each(function(i) {
+				var self = jQuery( this );
+
+				self.text( text.call(this, i, self.text()) );
+			});
+		}
+
+		if ( typeof text !== "object" && text !== undefined ) {
+			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+		}
+
+		return jQuery.text( this );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each(function(i) {
+			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery.clean(arguments) );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		if ( value === undefined ) {
+			return this[0] && this[0].nodeType === 1 ?
+				this[0].innerHTML.replace(rinlinejQuery, "") :
+				null;
+
+		// See if we can take a shortcut and just use innerHTML
+		} else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+			value = value.replace(rxhtmlTag, "<$1></$2>");
+
+			try {
+				for ( var i = 0, l = this.length; i < l; i++ ) {
+					// Remove element nodes and prevent memory leaks
+					if ( this[i].nodeType === 1 ) {
+						jQuery.cleanData( this[i].getElementsByTagName("*") );
+						this[i].innerHTML = value;
+					}
+				}
+
+			// If using innerHTML throws an exception, use the fallback method
+			} catch(e) {
+				this.empty().append( value );
+			}
+
+		} else if ( jQuery.isFunction( value ) ) {
+			this.each(function(i){
+				var self = jQuery( this );
+
+				self.html( value.call(this, i, self.html()) );
+			});
+
+		} else {
+			this.empty().append( value );
+		}
+
+		return this;
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.length ?
+				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+				this;
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || ( l > 1 && i < lastIndex ) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, evalScript );
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults, doc,
+	first = args[ 0 ];
+
+	// nodes may contain either an explicit document object,
+	// a jQuery collection or context object.
+	// If nodes[0] contains a valid object to assign to doc
+	if ( nodes && nodes[0] ) {
+		doc = nodes[0].ownerDocument || nodes[0];
+	}
+
+	// Ensure that an attr object doesn't incorrectly stand in as a document object
+	// Chrome and Firefox seem to allow this to occur and will throw exception
+	// Fixes #8950
+	if ( !doc.createDocumentFragment ) {
+		doc = document;
+	}
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+	if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
+		first.charAt(0) === "<" && !rnocache.test( first ) &&
+		(jQuery.support.checkClone || !rchecked.test( first )) &&
+		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+		cacheable = true;
+
+		cacheresults = jQuery.fragments[ first ];
+		if ( cacheresults && cacheresults !== 1 ) {
+			fragment = cacheresults;
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = ( i > 0 ? this.clone(true) : this ).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( typeof elem.getElementsByTagName !== "undefined" ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( elem.type === "checkbox" || elem.type === "radio" ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+	var nodeName = ( elem.nodeName || "" ).toLowerCase();
+	if ( nodeName === "input" ) {
+		fixDefaultChecked( elem );
+	// Skip scripts, get other children
+	} else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
+		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+	}
+}
+
+// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
+function shimCloneNode( elem ) {
+	var div = document.createElement( "div" );
+	safeFragment.appendChild( div );
+
+	div.innerHTML = elem.outerHTML;
+	return div.firstChild;
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var srcElements,
+			destElements,
+			i,
+			// IE<=8 does not properly clone detached, unknown element nodes
+			clone = jQuery.support.html5Clone || !rnoshimcache.test( "<" + elem.nodeName ) ?
+				elem.cloneNode( true ) :
+				shimCloneNode( elem );
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					cloneFixAttributes( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var checkScriptType;
+
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		var ret = [], j;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Trim whitespace, otherwise indexOf won't work as expected
+					var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
+						wrap = wrapMap[ tag ] || wrapMap._default,
+						depth = wrap[0],
+						div = context.createElement("div");
+
+					// Append wrapper element to unknown element safe doc fragment
+					if ( context === document ) {
+						// Use the fragment we've already created for this document
+						safeFragment.appendChild( div );
+					} else {
+						// Use a fragment created with the owner document
+						createSafeFragment( context ).appendChild( div );
+					}
+
+					// Go to html and back, then peel off extra wrappers
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						var hasBody = rtbody.test(elem),
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+				}
+			}
+
+			// Resets defaultChecked for any radios and checkboxes
+			// about to be appended to the DOM in IE 6/7 (#8060)
+			var len;
+			if ( !jQuery.support.appendChecked ) {
+				if ( elem[0] && typeof (len = elem.length) === "number" ) {
+					for ( j = 0; j < len; j++ ) {
+						findInputs( elem[j] );
+					}
+				} else {
+					findInputs( elem );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			checkScriptType = function( elem ) {
+				return !elem.type || rscriptType.test( elem.type );
+			};
+			for ( i = 0; ret[i]; i++ ) {
+				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+				} else {
+					if ( ret[i].nodeType === 1 ) {
+						var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
+
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+					}
+					fragment.appendChild( ret[i] );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id,
+			cache = jQuery.cache,
+			special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						if ( special[ type ] ) {
+							jQuery.event.remove( elem, type );
+
+						// This is a shortcut to avoid jQuery.event.remove's overhead
+						} else {
+							jQuery.removeEvent( elem, type, data.handle );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+function evalScript( i, elem ) {
+	if ( elem.src ) {
+		jQuery.ajax({
+			url: elem.src,
+			async: false,
+			dataType: "script"
+		});
+	} else {
+		jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+	}
+
+	if ( elem.parentNode ) {
+		elem.parentNode.removeChild( elem );
+	}
+}
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	// fixed for IE9, see #8346
+	rupper = /([A-Z]|^ms)/g,
+	rnumpx = /^-?\d+(?:px)?$/i,
+	rnum = /^-?\d/,
+	rrelNum = /^([\-+])=([\-+.\de]+)/,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssWidth = [ "Left", "Right" ],
+	cssHeight = [ "Top", "Bottom" ],
+	curCSS,
+
+	getComputedStyle,
+	currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+	// Setting 'undefined' is a no-op
+	if ( arguments.length === 2 && value === undefined ) {
+		return this;
+	}
+
+	return jQuery.access( this, name, value, true, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	});
+};
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity", "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra ) {
+		var ret, hooks;
+
+		// Make sure that we're working with the right name
+		name = jQuery.camelCase( name );
+		hooks = jQuery.cssHooks[ name ];
+		name = jQuery.cssProps[ name ] || name;
+
+		// cssFloat needs a special treatment
+		if ( name === "cssFloat" ) {
+			name = "float";
+		}
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( var name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+	}
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			var val;
+
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					return getWH( elem, name, extra );
+				} else {
+					jQuery.swap( elem, cssShow, function() {
+						val = getWH( elem, name, extra );
+					});
+				}
+
+				return val;
+			}
+		},
+
+		set: function( elem, value ) {
+			if ( rnumpx.test( value ) ) {
+				// ignore negative width and height values #1599
+				value = parseFloat( value );
+
+				if ( value >= 0 ) {
+					return value + "px";
+				}
+
+			} else {
+				return value;
+			}
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( parseFloat( RegExp.$1 ) / 100 ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there there is no filter style applied in a css rule, we are done
+				if ( currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery(function() {
+	// This hook cannot be added until DOM ready because the support test
+	// for it is not run until after DOM ready
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				var ret;
+				jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						ret = curCSS( elem, "margin-right", "marginRight" );
+					} else {
+						ret = elem.style.marginRight;
+					}
+				});
+				return ret;
+			}
+		};
+	}
+});
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, name ) {
+		var ret, defaultView, computedStyle;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( (defaultView = elem.ownerDocument.defaultView) &&
+				(computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left, rsLeft, uncomputed,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret === null && style && (uncomputed = style[ name ]) ) {
+			ret = uncomputed;
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ( ret || 0 );
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+
+	// Start with offset property
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		which = name === "width" ? cssWidth : cssHeight,
+		i = 0,
+		len = which.length;
+
+	if ( val > 0 ) {
+		if ( extra !== "border" ) {
+			for ( ; i < len; i++ ) {
+				if ( !extra ) {
+					val -= parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
+				}
+				if ( extra === "margin" ) {
+					val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
+				} else {
+					val -= parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
+				}
+			}
+		}
+
+		return val + "px";
+	}
+
+	// Fall back to computed then uncomputed css if necessary
+	val = curCSS( elem, name, name );
+	if ( val < 0 || val == null ) {
+		val = elem.style[ name ] || 0;
+	}
+	// Normalize "", auto, and prepare for extra
+	val = parseFloat( val ) || 0;
+
+	// Add padding, border, margin
+	if ( extra ) {
+		for ( ; i < len; i++ ) {
+			val += parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
+			if ( extra !== "padding" ) {
+				val += parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
+			}
+			if ( extra === "margin" ) {
+				val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
+			}
+		}
+	}
+
+	return val + "px";
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts,
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for ( ; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = undefined;
+
+			// Otherwise, build a param string
+			} else if ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.on( o, f );
+	};
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		if ( settings ) {
+			// Building a settings object
+			ajaxExtend( target, jQuery.ajaxSettings );
+		} else {
+			// Extending ajaxSettings
+			settings = target;
+			target = jQuery.ajaxSettings;
+		}
+		ajaxExtend( target, settings );
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": allTypes
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			context: true,
+			url: true
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, nativeStatusText, responses, headers ) {
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			var isSuccess,
+				success,
+				error,
+				statusText = nativeStatusText,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = "" + ( nativeStatusText || statusText );
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.add;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for ( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefiler, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					throw e;
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = jQuery.ajaxSettings.traditional;
+		}
+
+		// If an array was passed in, assume that it is an array of form elements.
+		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+			// Serialize the form elements
+			jQuery.each( a, function() {
+				add( this.name, this.value );
+			});
+
+		} else {
+			// If traditional, encode the "old" way (the way 1.3.2 or older
+			// did it), otherwise encode params recursively.
+			for ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && obj != null && typeof obj === "object" ) {
+		// Serialize object item.
+		for ( var name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for ( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for ( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for ( key in s.converters ) {
+				if ( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if ( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for ( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
+		( typeof s.data === "string" );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				inspectData && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2";
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( inspectData ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Clean-up function
+		jqXHR.always(function() {
+			// Set callback back to previous value
+			window[ jsonpCallback ] = previous;
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( previous ) ) {
+				window[ jsonpCallback ]( responseContainer[ 0 ] );
+			}
+		});
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0,
+	xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+									responses.text = xhr.responseText;
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	iframe, iframeDoc,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	],
+	fxNow;
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback );
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					// Reset the inline display of this element to learn if it is
+					// being hidden by cascaded rules or not
+					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+						display = elem.style.display = "";
+					}
+
+					// Set elements which have been overridden with display: none
+					// in a stylesheet to whatever the default browser style is
+					// for such an element
+					if ( display === "" && jQuery.css(elem, "display") === "none" ) {
+						jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+					}
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					if ( display === "" || display === "none" ) {
+						elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
+					}
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			var elem, display,
+				i = 0,
+				j = this.length;
+
+			for ( ; i < j; i++ ) {
+				elem = this[i];
+				if ( elem.style ) {
+					display = jQuery.css( elem, "display" );
+
+					if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
+						jQuery._data( elem, "olddisplay", display );
+					}
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				if ( this[i].style ) {
+					this[i].style.display = "none";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed( speed, easing, callback );
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete, [ false ] );
+		}
+
+		// Do not change referenced properties as per-property easing will be lost
+		prop = jQuery.extend( {}, prop );
+
+		function doAnimation() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			if ( optall.queue === false ) {
+				jQuery._mark( this );
+			}
+
+			var opt = jQuery.extend( {}, optall ),
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				name, val, p, e,
+				parts, start, end, unit,
+				method;
+
+			// will store per property easing and be used to determine when an animation is complete
+			opt.animatedProperties = {};
+
+			for ( p in prop ) {
+
+				// property name normalization
+				name = jQuery.camelCase( p );
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+				}
+
+				val = prop[ name ];
+
+				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+				if ( jQuery.isArray( val ) ) {
+					opt.animatedProperties[ name ] = val[ 1 ];
+					val = prop[ name ] = val[ 0 ];
+				} else {
+					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+				}
+
+				if ( val === "hide" && hidden || val === "show" && !hidden ) {
+					return opt.complete.call( this );
+				}
+
+				if ( isElement && ( name === "height" || name === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+
+						// inline-level elements accept inline-block;
+						// block-level elements need to be inline with layout
+						if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
+							this.style.display = "inline-block";
+
+						} else {
+							this.style.zoom = 1;
+						}
+					}
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			for ( p in prop ) {
+				e = new jQuery.fx( this, opt, p );
+				val = prop[ p ];
+
+				if ( rfxtypes.test( val ) ) {
+
+					// Tracks whether to show or hide based on private
+					// data attached to the element
+					method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
+					if ( method ) {
+						jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
+						e[ method ]();
+					} else {
+						e[ val ]();
+					}
+
+				} else {
+					parts = rfxnum.exec( val );
+					start = e.cur();
+
+					if ( parts ) {
+						end = parseFloat( parts[2] );
+						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( this, p, (end || 1) + unit);
+							start = ( (end || 1) / e.cur() ) * start;
+							jQuery.style( this, p, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			}
+
+			// For JS strict compliance
+			return true;
+		}
+
+		return optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+
+	stop: function( type, clearQueue, gotoEnd ) {
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var index,
+				hadTimers = false,
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			// clear marker counters if we know they won't be
+			if ( !gotoEnd ) {
+				jQuery._unmark( true, this );
+			}
+
+			function stopQueue( elem, data, index ) {
+				var hooks = data[ index ];
+				jQuery.removeData( elem, index, true );
+				hooks.stop( gotoEnd );
+			}
+
+			if ( type == null ) {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
+						stopQueue( this, data, index );
+					}
+				}
+			} else if ( data[ index = type + ".run" ] && data[ index ].stop ){
+				stopQueue( this, data, index );
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					if ( gotoEnd ) {
+
+						// force the next step to be the last
+						timers[ index ]( true );
+					} else {
+						timers[ index ].saveState();
+					}
+					hadTimers = true;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// start the next in the queue if the last step wasn't forced
+			// timers currently will call their complete callbacks, which will dequeue
+			// but only if they were gotoEnd
+			if ( !( gotoEnd && hadTimers ) ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	}
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout( clearFxNow, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+	fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx( "show", 1 ),
+	slideUp: genFx( "hide", 1 ),
+	slideToggle: genFx( "toggle", 1 ),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.extend({
+	speed: function( speed, easing, fn ) {
+		var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+		};
+
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+		// normalize opt.queue - true/undefined/null -> "fx"
+		if ( opt.queue == null || opt.queue === true ) {
+			opt.queue = "fx";
+		}
+
+		// Queueing
+		opt.old = opt.complete;
+
+		opt.complete = function( noUnmark ) {
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+
+			if ( opt.queue ) {
+				jQuery.dequeue( this, opt.queue );
+			} else if ( noUnmark !== false ) {
+				jQuery._unmark( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		options.orig = options.orig || {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx;
+
+		this.startTime = fxNow || createFxNow();
+		this.end = to;
+		this.now = this.start = from;
+		this.pos = this.state = 0;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+
+		function t( gotoEnd ) {
+			return self.step( gotoEnd );
+		}
+
+		t.queue = this.options.queue;
+		t.elem = this.elem;
+		t.saveState = function() {
+			if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
+				jQuery._data( self.elem, "fxshow" + self.prop, self.start );
+			}
+		};
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval( fx.tick, fx.interval );
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
+
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any flash of content
+		if ( dataShow !== undefined ) {
+			// This show is picking up where a previous hide or show left off
+			this.custom( this.cur(), dataShow );
+		} else {
+			this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+		}
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom( this.cur(), 0 );
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var p, n, complete,
+			t = fxNow || createFxNow(),
+			done = true,
+			elem = this.elem,
+			options = this.options;
+
+		if ( gotoEnd || t >= options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			options.animatedProperties[ this.prop ] = true;
+
+			for ( p in options.animatedProperties ) {
+				if ( options.animatedProperties[ p ] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+					jQuery.each( [ "", "X", "Y" ], function( index, value ) {
+						elem.style[ "overflow" + value ] = options.overflow[ index ];
+					});
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( options.hide ) {
+					jQuery( elem ).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( options.hide || options.show ) {
+					for ( p in options.animatedProperties ) {
+						jQuery.style( elem, p, options.orig[ p ] );
+						jQuery.removeData( elem, "fxshow" + p, true );
+						// Toggle data is no longer needed
+						jQuery.removeData( elem, "toggle" + p, true );
+					}
+				}
+
+				// Execute the complete function
+				// in the event that the complete function throws an exception
+				// we must ensure it won't be called twice. #5684
+
+				complete = options.complete;
+				if ( complete ) {
+
+					options.complete = false;
+					complete.call( elem );
+				}
+			}
+
+			return false;
+
+		} else {
+			// classical easing cannot be used with an Infinity duration
+			if ( options.duration == Infinity ) {
+				this.now = t;
+			} else {
+				n = t - this.startTime;
+				this.state = n / options.duration;
+
+				// Perform the easing function, defaults to swing
+				this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
+				this.now = this.start + ( (this.end - this.start) * this.pos );
+			}
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		var timer,
+			timers = jQuery.timers,
+			i = 0;
+
+		for ( ; i < timers.length; i++ ) {
+			timer = timers[ i ];
+			// Checks the timer has not already been removed
+			if ( !timer() && timers[ i ] === timer ) {
+				timers.splice( i--, 1 );
+			}
+		}
+
+		if ( !timers.length ) {
+			jQuery.fx.stop();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+// Adds width/height step functions
+// Do not set anything below 0
+jQuery.each([ "width", "height" ], function( i, prop ) {
+	jQuery.fx.step[ prop ] = function( fx ) {
+		jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
+	};
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+	if ( !elemdisplay[ nodeName ] ) {
+
+		var body = document.body,
+			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+			display = elem.css( "display" );
+		elem.remove();
+
+		// If the simple way fails,
+		// get element's real default display by attaching it to a temp iframe
+		if ( display === "none" || display === "" ) {
+			// No iframe to use yet, so create it
+			if ( !iframe ) {
+				iframe = document.createElement( "iframe" );
+				iframe.frameBorder = iframe.width = iframe.height = 0;
+			}
+
+			body.appendChild( iframe );
+
+			// Create a cacheable copy of the iframe document on first call.
+			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+			// document to it; WebKit & Firefox won't allow reusing the iframe document.
+			if ( !iframeDoc || !iframe.createElement ) {
+				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+				iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
+				iframeDoc.close();
+			}
+
+			elem = iframeDoc.createElement( nodeName );
+
+			iframeDoc.body.appendChild( elem );
+
+			display = jQuery.css( elem, "display" );
+			body.removeChild( iframe );
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0], box;
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		var doc = elem.ownerDocument,
+			docElem = doc.documentElement;
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow(doc),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0];
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			doc = elem.ownerDocument,
+			docElem = doc.documentElement,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.offset = {
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+
+	position: function() {
+		if ( !this[0] ) {
+			return null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+	var method = "scroll" + name;
+
+	jQuery.fn[ method ] = function( val ) {
+		var elem, win;
+
+		if ( val === undefined ) {
+			elem = this[ 0 ];
+
+			if ( !elem ) {
+				return null;
+			}
+
+			win = getWindow( elem );
+
+			// Return the scroll offset
+			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+				jQuery.support.boxModel && win.document.documentElement[ method ] ||
+					win.document.body[ method ] :
+				elem[ method ];
+		}
+
+		// Set the scroll offset
+		return this.each(function() {
+			win = getWindow( this );
+
+			if ( win ) {
+				win.scrollTo(
+					!i ? val : jQuery( win ).scrollLeft(),
+					 i ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				this[ method ] = val;
+			}
+		});
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+	var type = name.toLowerCase();
+
+	// innerHeight and innerWidth
+	jQuery.fn[ "inner" + name ] = function() {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, "padding" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn[ "outer" + name ] = function( margin ) {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( size ) {
+		// Get window width or height
+		var elem = this[0];
+		if ( !elem ) {
+			return size == null ? null : this;
+		}
+
+		if ( jQuery.isFunction( size ) ) {
+			return this.each(function( i ) {
+				var self = jQuery( this );
+				self[ type ]( size.call( this, i, self[ type ]() ) );
+			});
+		}
+
+		if ( jQuery.isWindow( elem ) ) {
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+			var docElemProp = elem.document.documentElement[ "client" + name ],
+				body = elem.document.body;
+			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+				body && body[ "client" + name ] || docElemProp;
+
+		// Get document width or height
+		} else if ( elem.nodeType === 9 ) {
+			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+			return Math.max(
+				elem.documentElement["client" + name],
+				elem.body["scroll" + name], elem.documentElement["scroll" + name],
+				elem.body["offset" + name], elem.documentElement["offset" + name]
+			);
+
+		// Get or set width or height on the element
+		} else if ( size === undefined ) {
+			var orig = jQuery.css( elem, type ),
+				ret = parseFloat( orig );
+
+			return jQuery.isNumeric( ret ) ? ret : orig;
+
+		// Set the width or height on the element (default to pixels if value is unitless)
+		} else {
+			return this.css( type, typeof size === "string" ? size : size + "px" );
+		}
+	};
+
+});
+
+
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+	define( "jquery", [], function () { return jQuery; } );
+}
+
+
+
+})( window );
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.7/jquery.min.js b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.7/jquery.min.js
new file mode 100644
index 0000000..198b3ff
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.7/jquery.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l
 ,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="obj
 ect")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}
 d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.n
 odeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.crea
 teElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==
 ="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=A
 rray.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.re
 ady(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return
  this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once mem
 ory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:fu
 nction(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(
 i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d)
 ,f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(
 f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&
 (a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:
 b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notify
 With(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getE
 lementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocument
 Fragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;p
 osition:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="
 ",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c]
 ,i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("dat
 a-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},d
 equeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.dat
 a(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.
 className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.classNa
 me||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options
 ,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,
 c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:functio
 n(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""
 }},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}
 }}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:
 function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,
 r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=
 r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,m
 atches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){v
 ar e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:functio
 n(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStoppe
 d=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:funct
 ion(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return 
 z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object
 "){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover
 :function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizse
 t=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.p
 op(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i
 .length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")retu
 rn a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("
 type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){v
 ar c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace
 (j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:f
 unction(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]
 -0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(
 a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b
 ){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d
 ="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=nu
 ll}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("
 id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.d
 ocumentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){f
 or(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>
 -1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:f
 unction(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a}
 ,sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.
 colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(t
 his,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&
 &(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).
 detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){v
 ar e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.su
 pport.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test
 (k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando
 ),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f
 .css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opaci
 ty="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixel
 Left+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend(
 {load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}
 }).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,u
 rl:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:
 function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t
 =d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,
 t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.ur
 l,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatecha
 nge=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.
 data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="
 none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(
 this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&
 &(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=func
 tion(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.
 elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d
 ,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},spee
 ds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pag
 eYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="v
 isible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.ex
 tend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toL
 owerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.8/jquery.js b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.8/jquery.js
new file mode 100644
index 0000000..d4f3bb3
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.8/jquery.js
@@ -0,0 +1,9440 @@
+/*!
+ * jQuery JavaScript Library v1.8.2
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: Thu Sep 20 2012 21:13:05 GMT-0400 (Eastern Daylight Time)
+ */
+(function( window, undefined ) {
+var
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// Use the correct document accordingly with window argument (sandbox)
+	document = window.document,
+	location = window.location,
+	navigator = window.navigator,
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// Save a reference to some core methods
+	core_push = Array.prototype.push,
+	core_slice = Array.prototype.slice,
+	core_indexOf = Array.prototype.indexOf,
+	core_toString = Object.prototype.toString,
+	core_hasOwn = Object.prototype.hasOwnProperty,
+	core_trim = String.prototype.trim,
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Used for matching numbers
+	core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
+
+	// Used for detecting and trimming whitespace
+	core_rnotwhite = /\S/,
+	core_rspace = /\s+/,
+
+	// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
+
+	// Matches dashed string for camelizing
+	rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([\da-z])/gi,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// The ready event handler and self cleanup method
+	DOMContentLoaded = function() {
+		if ( document.addEventListener ) {
+			document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+			jQuery.ready();
+		} else if ( document.readyState === "complete" ) {
+			// we're here because readyState === "complete" in oldIE
+			// which is good enough for us to call the dom ready!
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	},
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = rquickExpr.exec( selector );
+			}
+
+			// Match html or make sure no context is specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = ( context && context.nodeType ? context.ownerDocument || context : document );
+
+					// scripts is true for back-compat
+					selector = jQuery.parseHTML( match[1], doc, true );
+					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+						this.attr.call( selector, context, true );
+					}
+
+					return jQuery.merge( this, selector );
+
+				// HANDLE: $(#id)
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || rootjQuery ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if ( selector.selector !== undefined ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.8.2",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return core_slice.call( this );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+
+		// Build a new jQuery matched element set
+		var ret = jQuery.merge( this.constructor(), elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Add the callback
+		jQuery.ready.promise().done( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		i = +i;
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( core_slice.apply( this, arguments ),
+			"slice", core_slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: core_push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( !document.body ) {
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Remember that the DOM is ready
+		jQuery.isReady = true;
+
+		// If a normal DOM Ready event fired, decrement, and wait if need be
+		if ( wait !== true && --jQuery.readyWait > 0 ) {
+			return;
+		}
+
+		// If there are functions bound, to execute
+		readyList.resolveWith( document, [ jQuery ] );
+
+		// Trigger any bound ready events
+		if ( jQuery.fn.trigger ) {
+			jQuery( document ).trigger("ready").off("ready");
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	isWindow: function( obj ) {
+		return obj != null && obj == obj.window;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ core_toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!core_hasOwn.call(obj, "constructor") &&
+				!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || core_hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	// data: string of html
+	// context (optional): If specified, the fragment will be created in this context, defaults to document
+	// scripts (optional): If true, will include scripts passed in the html string
+	parseHTML: function( data, context, scripts ) {
+		var parsed;
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		if ( typeof context === "boolean" ) {
+			scripts = context;
+			context = 0;
+		}
+		context = context || document;
+
+		// Single tag
+		if ( (parsed = rsingleTag.exec( data )) ) {
+			return [ context.createElement( parsed[1] ) ];
+		}
+
+		parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
+		return jQuery.merge( [],
+			(parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
+	},
+
+	parseJSON: function( data ) {
+		if ( !data || typeof data !== "string") {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+			.replace( rvalidtokens, "]" )
+			.replace( rvalidbraces, "")) ) {
+
+			return ( new Function( "return " + data ) )();
+
+		}
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		var xml, tmp;
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && core_rnotwhite.test( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+	},
+
+	// args is for internal usage only
+	each: function( obj, callback, args ) {
+		var name,
+			i = 0,
+			length = obj.length,
+			isObj = length === undefined || jQuery.isFunction( obj );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in obj ) {
+					if ( callback.apply( obj[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( obj[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in obj ) {
+					if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+		function( text ) {
+			return text == null ?
+				"" :
+				core_trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				( text + "" ).replace( rtrim, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var type,
+			ret = results || [];
+
+		if ( arr != null ) {
+			// The window, strings (and functions) also have 'length'
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			type = jQuery.type( arr );
+
+			if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
+				core_push.call( ret, arr );
+			} else {
+				jQuery.merge( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		var len;
+
+		if ( arr ) {
+			if ( core_indexOf ) {
+				return core_indexOf.call( arr, elem, i );
+			}
+
+			len = arr.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in arr && arr[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var l = second.length,
+			i = first.length,
+			j = 0;
+
+		if ( typeof l === "number" ) {
+			for ( ; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var retVal,
+			ret = [],
+			i = 0,
+			length = elems.length;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value, key,
+			ret = [],
+			i = 0,
+			length = elems.length,
+			// jquery objects are treated as arrays
+			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( key in elems ) {
+				value = callback( elems[ key ], key, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		var tmp, args, proxy;
+
+		if ( typeof context === "string" ) {
+			tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		args = core_slice.call( arguments, 2 );
+		proxy = function() {
+			return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
+		};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Multifunctional method to get and set values of a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
+		var exec,
+			bulk = key == null,
+			i = 0,
+			length = elems.length;
+
+		// Sets many values
+		if ( key && typeof key === "object" ) {
+			for ( i in key ) {
+				jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
+			}
+			chainable = 1;
+
+		// Sets one value
+		} else if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = pass === undefined && jQuery.isFunction( value );
+
+			if ( bulk ) {
+				// Bulk operations only iterate when executing function values
+				if ( exec ) {
+					exec = fn;
+					fn = function( elem, key, value ) {
+						return exec.call( jQuery( elem ), value );
+					};
+
+				// Otherwise they run against the entire set
+				} else {
+					fn.call( elems, value );
+					fn = null;
+				}
+			}
+
+			if ( fn ) {
+				for (; i < length; i++ ) {
+					fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+				}
+			}
+
+			chainable = 1;
+		}
+
+		return chainable ?
+			elems :
+
+			// Gets
+			bulk ?
+				fn.call( elems ) :
+				length ? fn( elems[0], key ) : emptyGet;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	}
+});
+
+jQuery.ready.promise = function( obj ) {
+	if ( !readyList ) {
+
+		readyList = jQuery.Deferred();
+
+		// Catch cases where $(document).ready() is called after the browser event has already occurred.
+		// we once tried to use readyState "interactive" here, but it caused issues like the one
+		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			setTimeout( jQuery.ready, 1 );
+
+		// Standards-based browsers support DOMContentLoaded
+		} else if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else {
+			// Ensure firing before onload, maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var top = false;
+
+			try {
+				top = window.frameElement == null && document.documentElement;
+			} catch(e) {}
+
+			if ( top && top.doScroll ) {
+				(function doScrollCheck() {
+					if ( !jQuery.isReady ) {
+
+						try {
+							// Use the trick by Diego Perini
+							// http://javascript.nwbox.com/IEContentLoaded/
+							top.doScroll("left");
+						} catch(e) {
+							return setTimeout( doScrollCheck, 50 );
+						}
+
+						// and execute any waiting functions
+						jQuery.ready();
+					}
+				})();
+			}
+		}
+	}
+	return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+	var object = optionsCache[ options ] = {};
+	jQuery.each( options.split( core_rspace ), function( _, flag ) {
+		object[ flag ] = true;
+	});
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	options: an optional list of space-separated options that will change how
+ *			the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+	// Convert options from String-formatted to Object-formatted if needed
+	// (we check in cache first)
+	options = typeof options === "string" ?
+		( optionsCache[ options ] || createOptions( options ) ) :
+		jQuery.extend( {}, options );
+
+	var // Last fire value (for non-forgettable lists)
+		memory,
+		// Flag to know if list was already fired
+		fired,
+		// Flag to know if list is currently firing
+		firing,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = !options.once && [],
+		// Fire callbacks
+		fire = function( data ) {
+			memory = options.memory && data;
+			fired = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			firing = true;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+					memory = false; // To prevent further calls using add
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( stack ) {
+					if ( stack.length ) {
+						fire( stack.shift() );
+					}
+				} else if ( memory ) {
+					list = [];
+				} else {
+					self.disable();
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					// First, we save the current length
+					var start = list.length;
+					(function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							var type = jQuery.type( arg );
+							if ( type === "function" && ( !options.unique || !self.has( arg ) ) ) {
+								list.push( arg );
+							} else if ( arg && arg.length && type !== "string" ) {
+								// Inspect recursively
+								add( arg );
+							}
+						});
+					})( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away
+					} else if ( memory ) {
+						firingStart = start;
+						fire( memory );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					jQuery.each( arguments, function( _, arg ) {
+						var index;
+						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+							list.splice( index, 1 );
+							// Handle firing indexes
+							if ( firing ) {
+								if ( index <= firingLength ) {
+									firingLength--;
+								}
+								if ( index <= firingIndex ) {
+									firingIndex--;
+								}
+							}
+						}
+					});
+				}
+				return this;
+			},
+			// Control if a given callback is in the list
+			has: function( fn ) {
+				return jQuery.inArray( fn, list ) > -1;
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				args = args || [];
+				args = [ context, args.slice ? args.slice() : args ];
+				if ( list && ( !fired || stack ) ) {
+					if ( firing ) {
+						stack.push( args );
+					} else {
+						fire( args );
+					}
+				}
+				return this;
+			},
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var tuples = [
+				// action, add listener, listener list, final state
+				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+				[ "notify", "progress", jQuery.Callbacks("memory") ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				then: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( tuples, function( i, tuple ) {
+							var action = tuple[ 0 ],
+								fn = fns[ i ];
+							// deferred[ done | fail | progress ] for forwarding actions to newDefer
+							deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
+								function() {
+									var returned = fn.apply( this, arguments );
+									if ( returned && jQuery.isFunction( returned.promise ) ) {
+										returned.promise()
+											.done( newDefer.resolve )
+											.fail( newDefer.reject )
+											.progress( newDefer.notify );
+									} else {
+										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+									}
+								} :
+								newDefer[ action ]
+							);
+						});
+						fns = null;
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					return obj != null ? jQuery.extend( obj, promise ) : promise;
+				}
+			},
+			deferred = {};
+
+		// Keep pipe for back-compat
+		promise.pipe = promise.then;
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 3 ];
+
+			// promise[ done | fail | progress ] = list.add
+			promise[ tuple[1] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add(function() {
+					// state = [ resolved | rejected ]
+					state = stateString;
+
+				// [ reject_list | resolve_list ].disable; progress_list.lock
+				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+			}
+
+			// deferred[ resolve | reject | notify ] = list.fire
+			deferred[ tuple[0] ] = list.fire;
+			deferred[ tuple[0] + "With" ] = list.fireWith;
+		});
+
+		// Make the deferred a promise
+		promise.promise( deferred );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( subordinate /* , ..., subordinateN */ ) {
+		var i = 0,
+			resolveValues = core_slice.call( arguments ),
+			length = resolveValues.length,
+
+			// the count of uncompleted subordinates
+			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+			// Update function for both resolve and progress values
+			updateFunc = function( i, contexts, values ) {
+				return function( value ) {
+					contexts[ i ] = this;
+					values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+					if( values === progressValues ) {
+						deferred.notifyWith( contexts, values );
+					} else if ( !( --remaining ) ) {
+						deferred.resolveWith( contexts, values );
+					}
+				};
+			},
+
+			progressValues, progressContexts, resolveContexts;
+
+		// add listeners to Deferred subordinates; treat others as resolved
+		if ( length > 1 ) {
+			progressValues = new Array( length );
+			progressContexts = new Array( length );
+			resolveContexts = new Array( length );
+			for ( ; i < length; i++ ) {
+				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+					resolveValues[ i ].promise()
+						.done( updateFunc( i, resolveContexts, resolveValues ) )
+						.fail( deferred.reject )
+						.progress( updateFunc( i, progressContexts, progressValues ) );
+				} else {
+					--remaining;
+				}
+			}
+		}
+
+		// if we're not waiting on anything, resolve the master
+		if ( !remaining ) {
+			deferred.resolveWith( resolveContexts, resolveValues );
+		}
+
+		return deferred.promise();
+	}
+});
+jQuery.support = (function() {
+
+	var support,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		fragment,
+		eventName,
+		i,
+		isSupported,
+		clickFn,
+		div = document.createElement("div");
+
+	// Preliminary tests
+	div.setAttribute( "className", "t" );
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+	all = div.getElementsByTagName("*");
+	a = div.getElementsByTagName("a")[ 0 ];
+	a.style.cssText = "top:1px;float:left;opacity:.5";
+
+	// Can't get basic test support
+	if ( !all || !all.length ) {
+		return {};
+	}
+
+	// First batch of supports tests
+	select = document.createElement("select");
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName("input")[ 0 ];
+
+	support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.5/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: ( input.value === "on" ),
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// Tests for enctype support on a form(#6743)
+		enctype: !!document.createElement("form").enctype,
+
+		// Makes sure cloning an html5 element does not cause problems
+		// Where outerHTML is undefined, this still works
+		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+		// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
+		boxModel: ( document.compatMode === "CSS1Compat" ),
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true,
+		boxSizingReliable: true,
+		pixelPosition: false
+	};
+
+	// Make sure checked status is properly cloned
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent( "onclick", clickFn = function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent("onclick");
+		div.detachEvent( "onclick", clickFn );
+	}
+
+	// Check if a radio maintains its value
+	// after being appended to the DOM
+	input = document.createElement("input");
+	input.value = "t";
+	input.setAttribute( "type", "radio" );
+	support.radioValue = input.value === "t";
+
+	input.setAttribute( "checked", "checked" );
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.lastChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	fragment.removeChild( input );
+	fragment.appendChild( div );
+
+	// Technique from Juriy Zaytsev
+	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+	// We only care about the case where non-standard event systems
+	// are used, namely in IE. Short-circuiting here helps us to
+	// avoid an eval call (in setAttribute) which can cause CSP
+	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+	if ( div.attachEvent ) {
+		for ( i in {
+			submit: true,
+			change: true,
+			focusin: true
+		}) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, div, tds, marginDiv,
+			divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		container = document.createElement("div");
+		container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
+		body.insertBefore( container, body.firstChild );
+
+		// Construct the test element
+		div = document.createElement("div");
+		container.appendChild( div );
+
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		// (only IE 8 fails this test)
+		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName("td");
+		tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Check if empty table cells still have offsetWidth/Height
+		// (IE <= 8 fail this test)
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Check box-sizing and margin behavior
+		div.innerHTML = "";
+		div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+		support.boxSizing = ( div.offsetWidth === 4 );
+		support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
+
+		// NOTE: To any future maintainer, we've window.getComputedStyle
+		// because jsdom on node.js will break without it.
+		if ( window.getComputedStyle ) {
+			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+			// Check if div with explicit width and no margin-right incorrectly
+			// gets computed margin-right based on width of container. For more
+			// info see bug #3333
+			// Fails in WebKit before Feb 2011 nightlies
+			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+			marginDiv = document.createElement("div");
+			marginDiv.style.cssText = div.style.cssText = divReset;
+			marginDiv.style.marginRight = marginDiv.style.width = "0";
+			div.style.width = "1px";
+			div.appendChild( marginDiv );
+			support.reliableMarginRight =
+				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+		}
+
+		if ( typeof div.style.zoom !== "undefined" ) {
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			// (IE < 8 does this)
+			div.innerHTML = "";
+			div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "block";
+			div.style.overflow = "visible";
+			div.innerHTML = "<div></div>";
+			div.firstChild.style.width = "5px";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+			container.style.zoom = 1;
+		}
+
+		// Null elements to avoid leaks in IE
+		body.removeChild( container );
+		container = div = tds = marginDiv = null;
+	});
+
+	// Null elements to avoid leaks in IE
+	fragment.removeChild( div );
+	all = a = select = opt = input = fragment = div = null;
+
+	return support;
+})();
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	deletedIds: [],
+
+	// Remove at next major release (1.9/2.0)
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, ret,
+			internalKey = jQuery.expando,
+			getByName = typeof name === "string",
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
+			} else {
+				id = internalKey;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// Avoids exposing jQuery metadata on plain JS objects when the object
+			// is serialized using JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ] = jQuery.extend( cache[ id ], name );
+			} else {
+				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+			}
+		}
+
+		thisCache = cache[ id ];
+
+		// jQuery data() is stored in a separate object inside the object's internal data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data.
+		if ( !pvt ) {
+			if ( !thisCache.data ) {
+				thisCache.data = {};
+			}
+
+			thisCache = thisCache.data;
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// Check for both converted-to-camel and non-converted data property names
+		// If a data property was specified
+		if ( getByName ) {
+
+			// First Try to find as-is property data
+			ret = thisCache[ name ];
+
+			// Test for null|undefined property data
+			if ( ret == null ) {
+
+				// Try to find the camelCased property
+				ret = thisCache[ jQuery.camelCase( name ) ];
+			}
+		} else {
+			ret = thisCache;
+		}
+
+		return ret;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, i, l,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+
+			thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+			if ( thisCache ) {
+
+				// Support array or space separated string names for data keys
+				if ( !jQuery.isArray( name ) ) {
+
+					// try the string as a key before any manipulation
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+
+						// split the camel cased version by spaces unless a key with the spaces exists
+						name = jQuery.camelCase( name );
+						if ( name in thisCache ) {
+							name = [ name ];
+						} else {
+							name = name.split(" ");
+						}
+					}
+				}
+
+				for ( i = 0, l = name.length; i < l; i++ ) {
+					delete thisCache[ name[i] ];
+				}
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( !pvt ) {
+			delete cache[ id ].data;
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject( cache[ id ] ) ) {
+				return;
+			}
+		}
+
+		// Destroy the cache
+		if ( isNode ) {
+			jQuery.cleanData( [ elem ], true );
+
+		// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+		} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+			delete cache[ id ];
+
+		// When all else fails, null
+		} else {
+			cache[ id ] = null;
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+		// nodes accept data unless otherwise specified; rejection can be conditional
+		return !noData || noData !== true && elem.getAttribute("classid") === noData;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var parts, part, attr, name, l,
+			elem = this[0],
+			i = 0,
+			data = null;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = jQuery.data( elem );
+
+				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+					attr = elem.attributes;
+					for ( l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( !name.indexOf( "data-" ) ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( elem, name, data[ name ] );
+						}
+					}
+					jQuery._data( elem, "parsedAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		parts = key.split( ".", 2 );
+		parts[1] = parts[1] ? "." + parts[1] : "";
+		part = parts[1] + "!";
+
+		return jQuery.access( this, function( value ) {
+
+			if ( value === undefined ) {
+				data = this.triggerHandler( "getData" + part, [ parts[0] ] );
+
+				// Try to fetch any internally stored data first
+				if ( data === undefined && elem ) {
+					data = jQuery.data( elem, key );
+					data = dataAttr( elem, key, data );
+				}
+
+				return data === undefined && parts[1] ?
+					this.data( parts[0] ) :
+					data;
+			}
+
+			parts[1] = value;
+			this.each(function() {
+				var self = jQuery( this );
+
+				self.triggerHandler( "setData" + part, parts );
+				jQuery.data( this, key, value );
+				self.triggerHandler( "changeData" + part, parts );
+			});
+		}, null, value, arguments.length > 1, null, false );
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+				data === "false" ? false :
+				data === "null" ? null :
+				// Only convert to a number if it doesn't change the string
+				+data + "" === data ? +data :
+				rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	var name;
+	for ( name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+jQuery.extend({
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || jQuery.isArray(data) ) {
+					queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+				} else {
+					queue.push( data );
+				}
+			}
+			return queue || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			startLength = queue.length,
+			fn = queue.shift(),
+			hooks = jQuery._queueHooks( elem, type ),
+			next = function() {
+				jQuery.dequeue( elem, type );
+			};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+			startLength--;
+		}
+
+		if ( fn ) {
+
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			// clear up the last queue stop function
+			delete hooks.stop;
+			fn.call( elem, next, hooks );
+		}
+
+		if ( !startLength && hooks ) {
+			hooks.empty.fire();
+		}
+	},
+
+	// not intended for public consumption - generates a queueHooks object, or returns the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+			empty: jQuery.Callbacks("once memory").add(function() {
+				jQuery.removeData( elem, type + "queue", true );
+				jQuery.removeData( elem, key, true );
+			})
+		});
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[0], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each(function() {
+				var queue = jQuery.queue( this, type, data );
+
+				// ensure a hooks for this queue
+				jQuery._queueHooks( this, type );
+
+				if ( type === "fx" && queue[0] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function( next, hooks ) {
+			var timeout = setTimeout( next, time );
+			hooks.stop = function() {
+				clearTimeout( timeout );
+			};
+		});
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, obj ) {
+		var tmp,
+			count = 1,
+			defer = jQuery.Deferred(),
+			elements = this,
+			i = this.length,
+			resolve = function() {
+				if ( !( --count ) ) {
+					defer.resolveWith( elements, [ elements ] );
+				}
+			};
+
+		if ( typeof type !== "string" ) {
+			obj = type;
+			type = undefined;
+		}
+		type = type || "fx";
+
+		while( i-- ) {
+			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+});
+var nodeHook, boolHook, fixSpecified,
+	rclass = /[\t\r\n]/g,
+	rreturn = /\r/g,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea|)$/i,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classNames, i, l, elem,
+			setClass, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			classNames = value.split( core_rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className && classNames.length === 1 ) {
+						elem.className = value;
+
+					} else {
+						setClass = " " + elem.className + " ";
+
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var removes, className, elem, c, cl, i, l;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call(this, j, this.className) );
+			});
+		}
+		if ( (value && typeof value === "string") || value === undefined ) {
+			removes = ( value || "" ).split( core_rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+				if ( elem.nodeType === 1 && elem.className ) {
+
+					className = (" " + elem.className + " ").replace( rclass, " " );
+
+					// loop over each item in the removal list
+					for ( c = 0, cl = removes.length; c < cl; c++ ) {
+						// Remove until there is nothing to remove,
+						while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) {
+							className = className.replace( " " + removes[ c ] + " " , " " );
+						}
+					}
+					elem.className = value ? jQuery.trim( className ) : "";
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.split( core_rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space separated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ?
+					// handle most common string cases
+					ret.replace(rreturn, "") :
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var val,
+				self = jQuery(this);
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map(val, function ( value ) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				// attributes.value is undefined in Blackberry 4.7 but
+				// uses .value. See #6932
+				var val = elem.attributes.value;
+				return !val || val.specified ? elem.value : elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, i, max, option,
+					index = elem.selectedIndex,
+					values = [],
+					options = elem.options,
+					one = elem.type === "select-one";
+
+				// Nothing was selected
+				if ( index < 0 ) {
+					return null;
+				}
+
+				// Loop through all the selected options
+				i = one ? index : 0;
+				max = one ? index + 1 : options.length;
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// Don't return options that are disabled or in a disabled optgroup
+					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+				if ( one && !values.length && options.length ) {
+					return jQuery( options[ index ] ).val();
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	// Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
+	attrFn: {},
+
+	attr: function( elem, name, value, pass ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( notxml ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+
+			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, value + "" );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			ret = elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret === null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var propName, attrNames, name, isBool,
+			i = 0;
+
+		if ( value && elem.nodeType === 1 ) {
+
+			attrNames = value.split( core_rspace );
+
+			for ( ; i < attrNames.length; i++ ) {
+				name = attrNames[ i ];
+
+				if ( name ) {
+					propName = jQuery.propFix[ name ] || name;
+					isBool = rboolean.test( name );
+
+					// See #9699 for explanation of this approach (setting first, then removal)
+					// Do not do this for boolean attributes (see #10870)
+					if ( !isBool ) {
+						jQuery.attr( elem, name, "" );
+					}
+					elem.removeAttribute( getSetAttribute ? name : propName );
+
+					// Set corresponding property to false for boolean attributes
+					if ( isBool && propName in elem ) {
+						elem[ propName ] = false;
+					}
+				}
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				// We can't allow the type property to be changed (since it causes problems in IE)
+				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+					jQuery.error( "type property can't be changed" );
+				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to it's default in case type is set after value
+					// This is for element creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		},
+		// Use the value property for back compat
+		// Use the nodeHook for button elements in IE6/7 (#1954)
+		value: {
+			get: function( elem, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.get( elem, name );
+				}
+				return name in elem ?
+					elem.value :
+					null;
+			},
+			set: function( elem, value, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.set( elem, value, name );
+				}
+				// Does not return so that setAttribute is also used
+				elem.value = value;
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+
+	prop: function( elem, name, value ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return ( elem[ name ] = value );
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		// Align boolean attributes with corresponding properties
+		// Fall back to attribute presence where some booleans are not supported
+		var attrNode,
+			property = jQuery.prop( elem, name );
+		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		var propName;
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			// value is true since we know at this point it's type boolean and not false
+			// Set boolean attributes to the same name and set the DOM property
+			propName = jQuery.propFix[ name ] || name;
+			if ( propName in elem ) {
+				// Only set the IDL specifically if it already exists on the element
+				elem[ propName ] = true;
+			}
+
+			elem.setAttribute( name, name.toLowerCase() );
+		}
+		return name;
+	}
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	fixSpecified = {
+		name: true,
+		id: true,
+		coords: true
+	};
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret;
+			ret = elem.getAttributeNode( name );
+			return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
+				ret.value :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				ret = document.createAttribute( name );
+				elem.setAttributeNode( ret );
+			}
+			return ( ret.value = value + "" );
+		}
+	};
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		get: nodeHook.get,
+		set: function( elem, value, name ) {
+			if ( value === "" ) {
+				value = "false";
+			}
+			nodeHook.set( elem, value, name );
+		}
+	};
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret === null ? undefined : ret;
+			}
+		});
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Normalize to lowercase since IE uppercases css property names
+			return elem.style.cssText.toLowerCase() || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = value + "" );
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	});
+});
+var rformElems = /^(?:textarea|input|select)$/i,
+	rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
+	rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	hoverHack = function( events ) {
+		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+	};
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var elemData, eventHandle, events,
+			t, tns, type, namespaces, handleObj,
+			handleObjIn, handlers, special;
+
+		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
+		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		events = elemData.events;
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+		eventHandle = elemData.handle;
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = function( e ) {
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = jQuery.trim( hoverHack(types) ).split( " " );
+		for ( t = 0; t < types.length; t++ ) {
+
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = tns[1];
+			namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend({
+				type: type,
+				origType: tns[1],
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			handlers = events[ type ];
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var t, tns, type, origType, namespaces, origCount,
+			j, events, special, eventType, handleObj,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+		for ( t = 0; t < types.length; t++ ) {
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tns[1];
+			namespaces = tns[2];
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector? special.delegateType : special.bindType ) || type;
+			eventType = events[ type ] || [];
+			origCount = eventType.length;
+			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+
+			// Remove matching events
+			for ( j = 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					 ( !handler || handler.guid === handleObj.guid ) &&
+					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					eventType.splice( j--, 1 );
+
+					if ( handleObj.selector ) {
+						eventType.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( eventType.length === 0 && origCount !== eventType.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			delete elemData.handle;
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery.removeData( elem, "events", true );
+		}
+	},
+
+	// Events that are safe to short-circuit if no handlers are attached.
+	// Native DOM events should not be added, they may have inline handlers.
+	customEvent: {
+		"getData": true,
+		"setData": true,
+		"changeData": true
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		// Don't do events on text and comment nodes
+		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+			return;
+		}
+
+		// Event object or event type
+		var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
+			type = event.type || event,
+			namespaces = [];
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "!" ) >= 0 ) {
+			// Exclusive events trigger only for the exact event (no namespaces)
+			type = type.slice(0, -1);
+			exclusive = true;
+		}
+
+		if ( type.indexOf( "." ) >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+
+		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+			// No jQuery handlers for this event type, and it can't have inline handlers
+			return;
+		}
+
+		// Caller can pass in an Event, Object, or just an event type string
+		event = typeof event === "object" ?
+			// jQuery.Event object
+			event[ jQuery.expando ] ? event :
+			// Object literal
+			new jQuery.Event( type, event ) :
+			// Just the event type (string)
+			new jQuery.Event( type );
+
+		event.type = type;
+		event.isTrigger = true;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join( "." );
+		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+		// Handle a global trigger
+		if ( !elem ) {
+
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			cache = jQuery.cache;
+			for ( i in cache ) {
+				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+				}
+			}
+			return;
+		}
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data != null ? jQuery.makeArray( data ) : [];
+		data.unshift( event );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		eventPath = [[ elem, special.bindType || type ]];
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+			for ( old = elem; cur; cur = cur.parentNode ) {
+				eventPath.push([ cur, bubbleType ]);
+				old = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( old === (elem.ownerDocument || document) ) {
+				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+			}
+		}
+
+		// Fire handlers on the event path
+		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+			cur = eventPath[i][0];
+			event.type = eventPath[i][1];
+
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+			// Note that this is a bare JS function and not a jQuery handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
+				event.preventDefault();
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				// IE<9 dies on focus/blur to hidden element (#1486)
+				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					old = elem[ ontype ];
+
+					if ( old ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					elem[ type ]();
+					jQuery.event.triggered = undefined;
+
+					if ( old ) {
+						elem[ ontype ] = old;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event || window.event );
+
+		var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
+			handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+			delegateCount = handlers.delegateCount,
+			args = core_slice.call( arguments ),
+			run_all = !event.exclusive && !event.namespace,
+			special = jQuery.event.special[ event.type ] || {},
+			handlerQueue = [];
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers that should run if there are delegated events
+		// Avoid non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && !(event.button && event.type === "click") ) {
+
+			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+
+				// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.disabled !== true || event.type !== "click" ) {
+					selMatch = {};
+					matches = [];
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+						sel = handleObj.selector;
+
+						if ( selMatch[ sel ] === undefined ) {
+							selMatch[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) >= 0 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( selMatch[ sel ] ) {
+							matches.push( handleObj );
+						}
+					}
+					if ( matches.length ) {
+						handlerQueue.push({ elem: cur, matches: matches });
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( handlers.length > delegateCount ) {
+			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+		}
+
+		// Run delegates first; they may want to stop propagation beneath us
+		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+			matched = handlerQueue[ i ];
+			event.currentTarget = matched.elem;
+
+			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+				handleObj = matched.matches[ j ];
+
+				// Triggered event must either 1) be non-exclusive and have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+	fixHooks: {},
+
+	keyHooks: {
+		props: "char charCode key keyCode".split(" "),
+		filter: function( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var eventDoc, doc, body,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop,
+			originalEvent = event,
+			fixHook = jQuery.event.fixHooks[ event.type ] || {},
+			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = jQuery.Event( originalEvent );
+
+		for ( i = copy.length; i; ) {
+			prop = copy[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Target should not be a text node (#504, Safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
+		event.metaKey = !!event.metaKey;
+
+		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	special: {
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+
+		focus: {
+			delegateType: "focusin"
+		},
+		blur: {
+			delegateType: "focusout"
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// Piggyback on a donor event to simulate a different one.
+		// Fake originalEvent to avoid donor's stopPropagation, but if the
+		// simulated event prevents default then we do the same on the donor.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{ type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		var name = "on" + type;
+
+		if ( elem.detachEvent ) {
+
+			// #8545, #7054, preventing memory leaks for custom events in IE6-8 –
+			// detachEvent needed property on element, by name of that event, to properly expose it to GC
+			if ( typeof elem[ name ] === "undefined" ) {
+				elem[ name ] = null;
+			}
+
+			elem.detachEvent( name, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !(this instanceof jQuery.Event) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var ret,
+				target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj,
+				selector = handleObj.selector;
+
+			// For mousenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !jQuery._data( form, "_submit_attached" ) ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submit_bubble = true;
+					});
+					jQuery._data( form, "_submit_attached", true );
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+
+		postDispatch: function( event ) {
+			// If form was submitted by the user, bubble the event up the tree
+			if ( event._submit_bubble ) {
+				delete event._submit_bubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event, true );
+				}
+			}
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+						}
+						// Allow triggered, simulated change events (#11500)
+						jQuery.event.simulate( "change", this, event, true );
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					jQuery._data( elem, "_change_attached", true );
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return !rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0,
+			handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var origFn, type;
+
+		// Types can be a map of types/handlers
+		if ( typeof types === "object" ) {
+			// ( types-Object, selector, data )
+			if ( typeof selector !== "string" ) { // && selector != null
+				// ( types-Object, data )
+				data = data || selector;
+				selector = undefined;
+			}
+			for ( type in types ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		if ( data == null && fn == null ) {
+			// ( types, fn )
+			fn = selector;
+			data = selector = undefined;
+		} else if ( fn == null ) {
+			if ( typeof selector === "string" ) {
+				// ( types, selector, fn )
+				fn = data;
+				data = undefined;
+			} else {
+				// ( types, data, fn )
+				fn = data;
+				data = selector;
+				selector = undefined;
+			}
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		} else if ( !fn ) {
+			return this;
+		}
+
+		if ( one === 1 ) {
+			origFn = fn;
+			fn = function( event ) {
+				// Can use an empty set, since event contains the info
+				jQuery().off( event );
+				return origFn.apply( this, arguments );
+			};
+			// Use same guid so caller can remove using origFn
+			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+		}
+		return this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on( types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		var handleObj, type;
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each(function() {
+			jQuery.event.remove( this, types, fn, selector );
+		});
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	live: function( types, data, fn ) {
+		jQuery( this.context ).on( types, this.selector, data, fn );
+		return this;
+	},
+	die: function( types, fn ) {
+		jQuery( this.context ).off( types, this.selector || "**", fn );
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			return jQuery.event.trigger( type, data, this[0], true );
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			guid = fn.guid || jQuery.guid++,
+			i = 0,
+			toggler = function( event ) {
+				// Figure out which function to execute
+				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+				// Make sure that clicks stop
+				event.preventDefault();
+
+				// and execute the function
+				return args[ lastToggle ].apply( this, arguments ) || false;
+			};
+
+		// link all the functions, so any of them can unbind this click handler
+		toggler.guid = guid;
+		while ( i < args.length ) {
+			args[ i++ ].guid = guid;
+		}
+
+		return this.click( toggler );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( rkeyEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+	}
+
+	if ( rmouseEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+	}
+});
+/*!
+ * Sizzle CSS Selector Engine
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://sizzlejs.com/
+ */
+(function( window, undefined ) {
+
+var cachedruns,
+	assertGetIdNotName,
+	Expr,
+	getText,
+	isXML,
+	contains,
+	compile,
+	sortOrder,
+	hasDuplicate,
+	outermostContext,
+
+	baseHasDuplicate = true,
+	strundefined = "undefined",
+
+	expando = ( "sizcache" + Math.random() ).replace( ".", "" ),
+
+	Token = String,
+	document = window.document,
+	docElem = document.documentElement,
+	dirruns = 0,
+	done = 0,
+	pop = [].pop,
+	push = [].push,
+	slice = [].slice,
+	// Use a stripped-down indexOf if a native one is unavailable
+	indexOf = [].indexOf || function( elem ) {
+		var i = 0,
+			len = this.length;
+		for ( ; i < len; i++ ) {
+			if ( this[i] === elem ) {
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	// Augment a function for special use by Sizzle
+	markFunction = function( fn, value ) {
+		fn[ expando ] = value == null || value;
+		return fn;
+	},
+
+	createCache = function() {
+		var cache = {},
+			keys = [];
+
+		return markFunction(function( key, value ) {
+			// Only keep the most recent entries
+			if ( keys.push( key ) > Expr.cacheLength ) {
+				delete cache[ keys.shift() ];
+			}
+
+			return (cache[ key ] = value);
+		}, cache );
+	},
+
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+
+	// Regex
+
+	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+	// http://www.w3.org/TR/css3-syntax/#characters
+	characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",
+
+	// Loosely modeled on CSS identifier characters
+	// An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
+	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+	identifier = characterEncoding.replace( "w", "w#" ),
+
+	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+	operators = "([*^$|!~]?=)",
+	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+		"*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
+
+	// Prefer arguments not in parens/brackets,
+	//   then attribute selectors and non-pseudos (denoted by :),
+	//   then anything else
+	// These preferences are here to reduce the number of selectors
+	//   needing tokenize in the PSEUDO preFilter
+	pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",
+
+	// For matchExpr.POS and matchExpr.needsContext
+	pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
+		"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
+	rpseudo = new RegExp( pseudos ),
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,
+
+	rnot = /^:not/,
+	rsibling = /[\x20\t\r\n\f]*[+~]/,
+	rendsWithNot = /:not\($/,
+
+	rheader = /h\d/i,
+	rinputs = /input|select|textarea|button/i,
+
+	rbackslash = /\\(?!\\)/g,
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
+		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+		"NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
+		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+		"ATTR": new RegExp( "^" + attributes ),
+		"PSEUDO": new RegExp( "^" + pseudos ),
+		"POS": new RegExp( pos, "i" ),
+		"CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace +
+			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+		// For use in libraries implementing .is()
+		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )
+	},
+
+	// Support
+
+	// Used for testing something on an element
+	assert = function( fn ) {
+		var div = document.createElement("div");
+
+		try {
+			return fn( div );
+		} catch (e) {
+			return false;
+		} finally {
+			// release memory in IE
+			div = null;
+		}
+	},
+
+	// Check if getElementsByTagName("*") returns only elements
+	assertTagNameNoComments = assert(function( div ) {
+		div.appendChild( document.createComment("") );
+		return !div.getElementsByTagName("*").length;
+	}),
+
+	// Check if getAttribute returns normalized href attributes
+	assertHrefNotNormalized = assert(function( div ) {
+		div.innerHTML = "<a href='#'></a>";
+		return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
+			div.firstChild.getAttribute("href") === "#";
+	}),
+
+	// Check if attributes should be retrieved by attribute nodes
+	assertAttributes = assert(function( div ) {
+		div.innerHTML = "<select></select>";
+		var type = typeof div.lastChild.getAttribute("multiple");
+		// IE8 returns a string for some attributes even when not present
+		return type !== "boolean" && type !== "string";
+	}),
+
+	// Check if getElementsByClassName can be trusted
+	assertUsableClassName = assert(function( div ) {
+		// Opera can't find a second classname (in 9.6)
+		div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
+		if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
+			return false;
+		}
+
+		// Safari 3.2 caches class attributes and doesn't catch changes
+		div.lastChild.className = "e";
+		return div.getElementsByClassName("e").length === 2;
+	}),
+
+	// Check if getElementById returns elements by name
+	// Check if getElementsByName privileges form controls or returns elements by ID
+	assertUsableName = assert(function( div ) {
+		// Inject content
+		div.id = expando + 0;
+		div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
+		docElem.insertBefore( div, docElem.firstChild );
+
+		// Test
+		var pass = document.getElementsByName &&
+			// buggy browsers will return fewer than the correct 2
+			document.getElementsByName( expando ).length === 2 +
+			// buggy browsers will return more than the correct 0
+			document.getElementsByName( expando + 0 ).length;
+		assertGetIdNotName = !document.getElementById( expando );
+
+		// Cleanup
+		docElem.removeChild( div );
+
+		return pass;
+	});
+
+// If slice is not available, provide a backup
+try {
+	slice.call( docElem.childNodes, 0 )[0].nodeType;
+} catch ( e ) {
+	slice = function( i ) {
+		var elem,
+			results = [];
+		for ( ; (elem = this[i]); i++ ) {
+			results.push( elem );
+		}
+		return results;
+	};
+}
+
+function Sizzle( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+	var match, elem, xml, m,
+		nodeType = context.nodeType;
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	if ( nodeType !== 1 && nodeType !== 9 ) {
+		return [];
+	}
+
+	xml = isXML( context );
+
+	if ( !xml && !seed ) {
+		if ( (match = rquickExpr.exec( selector )) ) {
+			// Speed-up: Sizzle("#ID")
+			if ( (m = match[1]) ) {
+				if ( nodeType === 9 ) {
+					elem = context.getElementById( m );
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE, Opera, and Webkit return items
+						// by name instead of ID
+						if ( elem.id === m ) {
+							results.push( elem );
+							return results;
+						}
+					} else {
+						return results;
+					}
+				} else {
+					// Context is not a document
+					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+						contains( context, elem ) && elem.id === m ) {
+						results.push( elem );
+						return results;
+					}
+				}
+
+			// Speed-up: Sizzle("TAG")
+			} else if ( match[2] ) {
+				push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
+				return results;
+
+			// Speed-up: Sizzle(".CLASS")
+			} else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {
+				push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
+				return results;
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed, xml );
+}
+
+Sizzle.matches = function( expr, elements ) {
+	return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+	return Sizzle( expr, null, null, [ elem ] ).length > 0;
+};
+
+// Returns a function to use in pseudos for input types
+function createInputPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return name === "input" && elem.type === type;
+	};
+}
+
+// Returns a function to use in pseudos for buttons
+function createButtonPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return (name === "input" || name === "button") && elem.type === type;
+	};
+}
+
+// Returns a function to use in pseudos for positionals
+function createPositionalPseudo( fn ) {
+	return markFunction(function( argument ) {
+		argument = +argument;
+		return markFunction(function( seed, matches ) {
+			var j,
+				matchIndexes = fn( [], seed.length, argument ),
+				i = matchIndexes.length;
+
+			// Match elements found at the specified indexes
+			while ( i-- ) {
+				if ( seed[ (j = matchIndexes[i]) ] ) {
+					seed[j] = !(matches[j] = seed[j]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+	var node,
+		ret = "",
+		i = 0,
+		nodeType = elem.nodeType;
+
+	if ( nodeType ) {
+		if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+			// Use textContent for elements
+			// innerText usage removed for consistency of new lines (see #11153)
+			if ( typeof elem.textContent === "string" ) {
+				return elem.textContent;
+			} else {
+				// Traverse its children
+				for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+					ret += getText( elem );
+				}
+			}
+		} else if ( nodeType === 3 || nodeType === 4 ) {
+			return elem.nodeValue;
+		}
+		// Do not include comment or processing instruction nodes
+	} else {
+
+		// If no nodeType, this is expected to be an array
+		for ( ; (node = elem[i]); i++ ) {
+			// Do not traverse comment nodes
+			ret += getText( node );
+		}
+	}
+	return ret;
+};
+
+isXML = Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833)
+	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+// Element contains another
+contains = Sizzle.contains = docElem.contains ?
+	function( a, b ) {
+		var adown = a.nodeType === 9 ? a.documentElement : a,
+			bup = b && b.parentNode;
+		return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );
+	} :
+	docElem.compareDocumentPosition ?
+	function( a, b ) {
+		return b && !!( a.compareDocumentPosition( b ) & 16 );
+	} :
+	function( a, b ) {
+		while ( (b = b.parentNode) ) {
+			if ( b === a ) {
+				return true;
+			}
+		}
+		return false;
+	};
+
+Sizzle.attr = function( elem, name ) {
+	var val,
+		xml = isXML( elem );
+
+	if ( !xml ) {
+		name = name.toLowerCase();
+	}
+	if ( (val = Expr.attrHandle[ name ]) ) {
+		return val( elem );
+	}
+	if ( xml || assertAttributes ) {
+		return elem.getAttribute( name );
+	}
+	val = elem.getAttributeNode( name );
+	return val ?
+		typeof elem[ name ] === "boolean" ?
+			elem[ name ] ? name : null :
+			val.specified ? val.value : null :
+		null;
+};
+
+Expr = Sizzle.selectors = {
+
+	// Can be adjusted by the user
+	cacheLength: 50,
+
+	createPseudo: markFunction,
+
+	match: matchExpr,
+
+	// IE6/7 return a modified href
+	attrHandle: assertHrefNotNormalized ?
+		{} :
+		{
+			"href": function( elem ) {
+				return elem.getAttribute( "href", 2 );
+			},
+			"type": function( elem ) {
+				return elem.getAttribute("type");
+			}
+		},
+
+	find: {
+		"ID": assertGetIdNotName ?
+			function( id, context, xml ) {
+				if ( typeof context.getElementById !== strundefined && !xml ) {
+					var m = context.getElementById( id );
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					return m && m.parentNode ? [m] : [];
+				}
+			} :
+			function( id, context, xml ) {
+				if ( typeof context.getElementById !== strundefined && !xml ) {
+					var m = context.getElementById( id );
+
+					return m ?
+						m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
+							[m] :
+							undefined :
+						[];
+				}
+			},
+
+		"TAG": assertTagNameNoComments ?
+			function( tag, context ) {
+				if ( typeof context.getElementsByTagName !== strundefined ) {
+					return context.getElementsByTagName( tag );
+				}
+			} :
+			function( tag, context ) {
+				var results = context.getElementsByTagName( tag );
+
+				// Filter out possible comments
+				if ( tag === "*" ) {
+					var elem,
+						tmp = [],
+						i = 0;
+
+					for ( ; (elem = results[i]); i++ ) {
+						if ( elem.nodeType === 1 ) {
+							tmp.push( elem );
+						}
+					}
+
+					return tmp;
+				}
+				return results;
+			},
+
+		"NAME": assertUsableName && function( tag, context ) {
+			if ( typeof context.getElementsByName !== strundefined ) {
+				return context.getElementsByName( name );
+			}
+		},
+
+		"CLASS": assertUsableClassName && function( className, context, xml ) {
+			if ( typeof context.getElementsByClassName !== strundefined && !xml ) {
+				return context.getElementsByClassName( className );
+			}
+		}
+	},
+
+	relative: {
+		">": { dir: "parentNode", first: true },
+		" ": { dir: "parentNode" },
+		"+": { dir: "previousSibling", first: true },
+		"~": { dir: "previousSibling" }
+	},
+
+	preFilter: {
+		"ATTR": function( match ) {
+			match[1] = match[1].replace( rbackslash, "" );
+
+			// Move the given value to match[3] whether quoted or unquoted
+			match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[3] = " " + match[3] + " ";
+			}
+
+			return match.slice( 0, 4 );
+		},
+
+		"CHILD": function( match ) {
+			/* matches from matchExpr["CHILD"]
+				1 type (only|nth|...)
+				2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+				3 xn-component of xn+y argument ([+-]?\d*n|)
+				4 sign of xn-component
+				5 x of xn-component
+				6 sign of y-component
+				7 y of y-component
+			*/
+			match[1] = match[1].toLowerCase();
+
+			if ( match[1] === "nth" ) {
+				// nth-child requires argument
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				// numeric x and y parameters for Expr.filter.CHILD
+				// remember that false/true cast respectively to 0/1
+				match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );
+				match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );
+
+			// other types prohibit arguments
+			} else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			return match;
+		},
+
+		"PSEUDO": function( match ) {
+			var unquoted, excess;
+			if ( matchExpr["CHILD"].test( match[0] ) ) {
+				return null;
+			}
+
+			if ( match[3] ) {
+				match[2] = match[3];
+			} else if ( (unquoted = match[4]) ) {
+				// Only check arguments that contain a pseudo
+				if ( rpseudo.test(unquoted) &&
+					// Get excess from tokenize (recursively)
+					(excess = tokenize( unquoted, true )) &&
+					// advance to the next closing parenthesis
+					(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+					// excess is a negative index
+					unquoted = unquoted.slice( 0, excess );
+					match[0] = match[0].slice( 0, excess );
+				}
+				match[2] = unquoted;
+			}
+
+			// Return only captures needed by the pseudo filter method (type and argument)
+			return match.slice( 0, 3 );
+		}
+	},
+
+	filter: {
+		"ID": assertGetIdNotName ?
+			function( id ) {
+				id = id.replace( rbackslash, "" );
+				return function( elem ) {
+					return elem.getAttribute("id") === id;
+				};
+			} :
+			function( id ) {
+				id = id.replace( rbackslash, "" );
+				return function( elem ) {
+					var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+					return node && node.value === id;
+				};
+			},
+
+		"TAG": function( nodeName ) {
+			if ( nodeName === "*" ) {
+				return function() { return true; };
+			}
+			nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();
+
+			return function( elem ) {
+				return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+			};
+		},
+
+		"CLASS": function( className ) {
+			var pattern = classCache[ expando ][ className ];
+			if ( !pattern ) {
+				pattern = classCache( className, new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)") );
+			}
+			return function( elem ) {
+				return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
+			};
+		},
+
+		"ATTR": function( name, operator, check ) {
+			return function( elem, context ) {
+				var result = Sizzle.attr( elem, name );
+
+				if ( result == null ) {
+					return operator === "!=";
+				}
+				if ( !operator ) {
+					return true;
+				}
+
+				result += "";
+
+				return operator === "=" ? result === check :
+					operator === "!=" ? result !== check :
+					operator === "^=" ? check && result.indexOf( check ) === 0 :
+					operator === "*=" ? check && result.indexOf( check ) > -1 :
+					operator === "$=" ? check && result.substr( result.length - check.length ) === check :
+					operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+					operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :
+					false;
+			};
+		},
+
+		"CHILD": function( type, argument, first, last ) {
+
+			if ( type === "nth" ) {
+				return function( elem ) {
+					var node, diff,
+						parent = elem.parentNode;
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+
+					if ( parent ) {
+						diff = 0;
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								diff++;
+								if ( elem === node ) {
+									break;
+								}
+							}
+						}
+					}
+
+					// Incorporate the offset (or cast to NaN), then check against cycle size
+					diff -= last;
+					return diff === first || ( diff % first === 0 && diff / first >= 0 );
+				};
+			}
+
+			return function( elem ) {
+				var node = elem;
+
+				switch ( type ) {
+					case "only":
+					case "first":
+						while ( (node = node.previousSibling) ) {
+							if ( node.nodeType === 1 ) {
+								return false;
+							}
+						}
+
+						if ( type === "first" ) {
+							return true;
+						}
+
+						node = elem;
+
+						/* falls through */
+					case "last":
+						while ( (node = node.nextSibling) ) {
+							if ( node.nodeType === 1 ) {
+								return false;
+							}
+						}
+
+						return true;
+				}
+			};
+		},
+
+		"PSEUDO": function( pseudo, argument ) {
+			// pseudo-class names are case-insensitive
+			// http://www.w3.org/TR/selectors/#pseudo-classes
+			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+			// Remember that setFilters inherits from pseudos
+			var args,
+				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+					Sizzle.error( "unsupported pseudo: " + pseudo );
+
+			// The user may use createPseudo to indicate that
+			// arguments are needed to create the filter function
+			// just as Sizzle does
+			if ( fn[ expando ] ) {
+				return fn( argument );
+			}
+
+			// But maintain support for old signatures
+			if ( fn.length > 1 ) {
+				args = [ pseudo, pseudo, "", argument ];
+				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+					markFunction(function( seed, matches ) {
+						var idx,
+							matched = fn( seed, argument ),
+							i = matched.length;
+						while ( i-- ) {
+							idx = indexOf.call( seed, matched[i] );
+							seed[ idx ] = !( matches[ idx ] = matched[i] );
+						}
+					}) :
+					function( elem ) {
+						return fn( elem, 0, args );
+					};
+			}
+
+			return fn;
+		}
+	},
+
+	pseudos: {
+		"not": markFunction(function( selector ) {
+			// Trim the selector passed to compile
+			// to avoid treating leading and trailing
+			// spaces as combinators
+			var input = [],
+				results = [],
+				matcher = compile( selector.replace( rtrim, "$1" ) );
+
+			return matcher[ expando ] ?
+				markFunction(function( seed, matches, context, xml ) {
+					var elem,
+						unmatched = matcher( seed, null, xml, [] ),
+						i = seed.length;
+
+					// Match elements unmatched by `matcher`
+					while ( i-- ) {
+						if ( (elem = unmatched[i]) ) {
+							seed[i] = !(matches[i] = elem);
+						}
+					}
+				}) :
+				function( elem, context, xml ) {
+					input[0] = elem;
+					matcher( input, null, xml, results );
+					return !results.pop();
+				};
+		}),
+
+		"has": markFunction(function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		}),
+
+		"contains": markFunction(function( text ) {
+			return function( elem ) {
+				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+			};
+		}),
+
+		"enabled": function( elem ) {
+			return elem.disabled === false;
+		},
+
+		"disabled": function( elem ) {
+			return elem.disabled === true;
+		},
+
+		"checked": function( elem ) {
+			// In CSS3, :checked should return both checked and selected elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			var nodeName = elem.nodeName.toLowerCase();
+			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+		},
+
+		"selected": function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		"parent": function( elem ) {
+			return !Expr.pseudos["empty"]( elem );
+		},
+
+		"empty": function( elem ) {
+			// http://www.w3.org/TR/selectors/#empty-pseudo
+			// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
+			//   not comment, processing instructions, or others
+			// Thanks to Diego Perini for the nodeName shortcut
+			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+			var nodeType;
+			elem = elem.firstChild;
+			while ( elem ) {
+				if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {
+					return false;
+				}
+				elem = elem.nextSibling;
+			}
+			return true;
+		},
+
+		"header": function( elem ) {
+			return rheader.test( elem.nodeName );
+		},
+
+		"text": function( elem ) {
+			var type, attr;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" &&
+				(type = elem.type) === "text" &&
+				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );
+		},
+
+		// Input types
+		"radio": createInputPseudo("radio"),
+		"checkbox": createInputPseudo("checkbox"),
+		"file": createInputPseudo("file"),
+		"password": createInputPseudo("password"),
+		"image": createInputPseudo("image"),
+
+		"submit": createButtonPseudo("submit"),
+		"reset": createButtonPseudo("reset"),
+
+		"button": function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && elem.type === "button" || name === "button";
+		},
+
+		"input": function( elem ) {
+			return rinputs.test( elem.nodeName );
+		},
+
+		"focus": function( elem ) {
+			var doc = elem.ownerDocument;
+			return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);
+		},
+
+		"active": function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		},
+
+		// Positional types
+		"first": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ 0 ];
+		}),
+
+		"last": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ length - 1 ];
+		}),
+
+		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ argument < 0 ? argument + length : argument ];
+		}),
+
+		"even": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			for ( var i = 0; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"odd": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			for ( var i = 1; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		})
+	}
+};
+
+function siblingCheck( a, b, ret ) {
+	if ( a === b ) {
+		return ret;
+	}
+
+	var cur = a.nextSibling;
+
+	while ( cur ) {
+		if ( cur === b ) {
+			return -1;
+		}
+
+		cur = cur.nextSibling;
+	}
+
+	return 1;
+}
+
+sortOrder = docElem.compareDocumentPosition ?
+	function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?
+			a.compareDocumentPosition :
+			a.compareDocumentPosition(b) & 4
+		) ? -1 : 1;
+	} :
+	function( a, b ) {
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Fallback to using sourceIndex (in IE) if it's available on both nodes
+		} else if ( a.sourceIndex && b.sourceIndex ) {
+			return a.sourceIndex - b.sourceIndex;
+		}
+
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+// Always assume the presence of duplicates if sort doesn't
+// pass them to our comparison function (as in Google Chrome).
+[0, 0].sort( sortOrder );
+baseHasDuplicate = !hasDuplicate;
+
+// Document sorting and removing duplicates
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		i = 1;
+
+	hasDuplicate = baseHasDuplicate;
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		for ( ; (elem = results[i]); i++ ) {
+			if ( elem === results[ i - 1 ] ) {
+				results.splice( i--, 1 );
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+function tokenize( selector, parseOnly ) {
+	var matched, match, tokens, type, soFar, groups, preFilters,
+		cached = tokenCache[ expando ][ selector ];
+
+	if ( cached ) {
+		return parseOnly ? 0 : cached.slice( 0 );
+	}
+
+	soFar = selector;
+	groups = [];
+	preFilters = Expr.preFilter;
+
+	while ( soFar ) {
+
+		// Comma and first run
+		if ( !matched || (match = rcomma.exec( soFar )) ) {
+			if ( match ) {
+				soFar = soFar.slice( match[0].length );
+			}
+			groups.push( tokens = [] );
+		}
+
+		matched = false;
+
+		// Combinators
+		if ( (match = rcombinators.exec( soFar )) ) {
+			tokens.push( matched = new Token( match.shift() ) );
+			soFar = soFar.slice( matched.length );
+
+			// Cast descendant combinators to space
+			matched.type = match[0].replace( rtrim, " " );
+		}
+
+		// Filters
+		for ( type in Expr.filter ) {
+			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+				// The last two arguments here are (context, xml) for backCompat
+				(match = preFilters[ type ]( match, document, true ))) ) {
+
+				tokens.push( matched = new Token( match.shift() ) );
+				soFar = soFar.slice( matched.length );
+				matched.type = type;
+				matched.matches = match;
+			}
+		}
+
+		if ( !matched ) {
+			break;
+		}
+	}
+
+	// Return the length of the invalid excess
+	// if we're just parsing
+	// Otherwise, throw an error or return tokens
+	return parseOnly ?
+		soFar.length :
+		soFar ?
+			Sizzle.error( selector ) :
+			// Cache the tokens
+			tokenCache( selector, groups ).slice( 0 );
+}
+
+function addCombinator( matcher, combinator, base ) {
+	var dir = combinator.dir,
+		checkNonElements = base && combinator.dir === "parentNode",
+		doneName = done++;
+
+	return combinator.first ?
+		// Check against closest ancestor/preceding element
+		function( elem, context, xml ) {
+			while ( (elem = elem[ dir ]) ) {
+				if ( checkNonElements || elem.nodeType === 1  ) {
+					return matcher( elem, context, xml );
+				}
+			}
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+			if ( !xml ) {
+				var cache,
+					dirkey = dirruns + " " + doneName + " ",
+					cachedkey = dirkey + cachedruns;
+				while ( (elem = elem[ dir ]) ) {
+					if ( checkNonElements || elem.nodeType === 1 ) {
+						if ( (cache = elem[ expando ]) === cachedkey ) {
+							return elem.sizset;
+						} else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {
+							if ( elem.sizset ) {
+								return elem;
+							}
+						} else {
+							elem[ expando ] = cachedkey;
+							if ( matcher( elem, context, xml ) ) {
+								elem.sizset = true;
+								return elem;
+							}
+							elem.sizset = false;
+						}
+					}
+				}
+			} else {
+				while ( (elem = elem[ dir ]) ) {
+					if ( checkNonElements || elem.nodeType === 1 ) {
+						if ( matcher( elem, context, xml ) ) {
+							return elem;
+						}
+					}
+				}
+			}
+		};
+}
+
+function elementMatcher( matchers ) {
+	return matchers.length > 1 ?
+		function( elem, context, xml ) {
+			var i = matchers.length;
+			while ( i-- ) {
+				if ( !matchers[i]( elem, context, xml ) ) {
+					return false;
+				}
+			}
+			return true;
+		} :
+		matchers[0];
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+	var elem,
+		newUnmatched = [],
+		i = 0,
+		len = unmatched.length,
+		mapped = map != null;
+
+	for ( ; i < len; i++ ) {
+		if ( (elem = unmatched[i]) ) {
+			if ( !filter || filter( elem, context, xml ) ) {
+				newUnmatched.push( elem );
+				if ( mapped ) {
+					map.push( i );
+				}
+			}
+		}
+	}
+
+	return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+	if ( postFilter && !postFilter[ expando ] ) {
+		postFilter = setMatcher( postFilter );
+	}
+	if ( postFinder && !postFinder[ expando ] ) {
+		postFinder = setMatcher( postFinder, postSelector );
+	}
+	return markFunction(function( seed, results, context, xml ) {
+		// Positional selectors apply to seed elements, so it is invalid to follow them with relative ones
+		if ( seed && postFinder ) {
+			return;
+		}
+
+		var i, elem, postFilterIn,
+			preMap = [],
+			postMap = [],
+			preexisting = results.length,
+
+			// Get initial elements from seed or context
+			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [], seed ),
+
+			// Prefilter to get matcher input, preserving a map for seed-results synchronization
+			matcherIn = preFilter && ( seed || !selector ) ?
+				condense( elems, preMap, preFilter, context, xml ) :
+				elems,
+
+			matcherOut = matcher ?
+				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+					// ...intermediate processing is necessary
+					[] :
+
+					// ...otherwise use results directly
+					results :
+				matcherIn;
+
+		// Find primary matches
+		if ( matcher ) {
+			matcher( matcherIn, matcherOut, context, xml );
+		}
+
+		// Apply postFilter
+		if ( postFilter ) {
+			postFilterIn = condense( matcherOut, postMap );
+			postFilter( postFilterIn, [], context, xml );
+
+			// Un-match failing elements by moving them back to matcherIn
+			i = postFilterIn.length;
+			while ( i-- ) {
+				if ( (elem = postFilterIn[i]) ) {
+					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+				}
+			}
+		}
+
+		// Keep seed and results synchronized
+		if ( seed ) {
+			// Ignore postFinder because it can't coexist with seed
+			i = preFilter && matcherOut.length;
+			while ( i-- ) {
+				if ( (elem = matcherOut[i]) ) {
+					seed[ preMap[i] ] = !(results[ preMap[i] ] = elem);
+				}
+			}
+		} else {
+			matcherOut = condense(
+				matcherOut === results ?
+					matcherOut.splice( preexisting, matcherOut.length ) :
+					matcherOut
+			);
+			if ( postFinder ) {
+				postFinder( null, results, matcherOut, xml );
+			} else {
+				push.apply( results, matcherOut );
+			}
+		}
+	});
+}
+
+function matcherFromTokens( tokens ) {
+	var checkContext, matcher, j,
+		len = tokens.length,
+		leadingRelative = Expr.relative[ tokens[0].type ],
+		implicitRelative = leadingRelative || Expr.relative[" "],
+		i = leadingRelative ? 1 : 0,
+
+		// The foundational matcher ensures that elements are reachable from top-level context(s)
+		matchContext = addCombinator( function( elem ) {
+			return elem === checkContext;
+		}, implicitRelative, true ),
+		matchAnyContext = addCombinator( function( elem ) {
+			return indexOf.call( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				(checkContext = context).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+		} ];
+
+	for ( ; i < len; i++ ) {
+		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
+		} else {
+			// The concatenated values are (context, xml) for backCompat
+			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+			// Return special upon seeing a positional matcher
+			if ( matcher[ expando ] ) {
+				// Find the next relative operator (if any) for proper handling
+				j = ++i;
+				for ( ; j < len; j++ ) {
+					if ( Expr.relative[ tokens[j].type ] ) {
+						break;
+					}
+				}
+				return setMatcher(
+					i > 1 && elementMatcher( matchers ),
+					i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),
+					matcher,
+					i < j && matcherFromTokens( tokens.slice( i, j ) ),
+					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+					j < len && tokens.join("")
+				);
+			}
+			matchers.push( matcher );
+		}
+	}
+
+	return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+	var bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, expandContext ) {
+			var elem, j, matcher,
+				setMatched = [],
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				outermost = expandContext != null,
+				contextBackup = outermostContext,
+				// We must always have either seed elements or context
+				elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+				// Nested matchers should use non-integer dirruns
+				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);
+
+			if ( outermost ) {
+				outermostContext = context !== document && context;
+				cachedruns = superMatcher.el;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			for ( ; (elem = elems[i]) != null; i++ ) {
+				if ( byElement && elem ) {
+					for ( j = 0; (matcher = elementMatchers[j]); j++ ) {
+						if ( matcher( elem, context, xml ) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+						cachedruns = ++superMatcher.el;
+					}
+				}
+
+				// Track unmatched elements for set filters
+				if ( bySet ) {
+					// They will have gone through all possible matchers
+					if ( (elem = !matcher && elem) ) {
+						matchedCount--;
+					}
+
+					// Lengthen the array for every element, matched or not
+					if ( seed ) {
+						unmatched.push( elem );
+					}
+				}
+			}
+
+			// Apply set filters to unmatched elements
+			matchedCount += i;
+			if ( bySet && i !== matchedCount ) {
+				for ( j = 0; (matcher = setMatchers[j]); j++ ) {
+					matcher( unmatched, setMatched, context, xml );
+				}
+
+				if ( seed ) {
+					// Reintegrate element matches to eliminate the need for sorting
+					if ( matchedCount > 0 ) {
+						while ( i-- ) {
+							if ( !(unmatched[i] || setMatched[i]) ) {
+								setMatched[i] = pop.call( results );
+							}
+						}
+					}
+
+					// Discard index placeholder values to get only actual matches
+					setMatched = condense( setMatched );
+				}
+
+				// Add matches to results
+				push.apply( results, setMatched );
+
+				// Seedless set matches succeeding multiple successful matchers stipulate sorting
+				if ( outermost && !seed && setMatched.length > 0 &&
+					( matchedCount + setMatchers.length ) > 1 ) {
+
+					Sizzle.uniqueSort( results );
+				}
+			}
+
+			// Override manipulation of globals by nested matchers
+			if ( outermost ) {
+				dirruns = dirrunsUnique;
+				outermostContext = contextBackup;
+			}
+
+			return unmatched;
+		};
+
+	superMatcher.el = 0;
+	return bySet ?
+		markFunction( superMatcher ) :
+		superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
+	var i,
+		setMatchers = [],
+		elementMatchers = [],
+		cached = compilerCache[ expando ][ selector ];
+
+	if ( !cached ) {
+		// Generate a function of recursive functions that can be used to check each element
+		if ( !group ) {
+			group = tokenize( selector );
+		}
+		i = group.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( group[i] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+	}
+	return cached;
+};
+
+function multipleContexts( selector, contexts, results, seed ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[i], results, seed );
+	}
+	return results;
+}
+
+function select( selector, context, results, seed, xml ) {
+	var i, tokens, token, type, find,
+		match = tokenize( selector ),
+		j = match.length;
+
+	if ( !seed ) {
+		// Try to minimize operations if there is only one group
+		if ( match.length === 1 ) {
+
+			// Take a shortcut and set the context if the root selector is an ID
+			tokens = match[0] = match[0].slice( 0 );
+			if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+					context.nodeType === 9 && !xml &&
+					Expr.relative[ tokens[1].type ] ) {
+
+				context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];
+				if ( !context ) {
+					return results;
+				}
+
+				selector = selector.slice( tokens.shift().length );
+			}
+
+			// Fetch a seed set for right-to-left matching
+			for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {
+				token = tokens[i];
+
+				// Abort if we hit a combinator
+				if ( Expr.relative[ (type = token.type) ] ) {
+					break;
+				}
+				if ( (find = Expr.find[ type ]) ) {
+					// Search, expanding context for leading sibling combinators
+					if ( (seed = find(
+						token.matches[0].replace( rbackslash, "" ),
+						rsibling.test( tokens[0].type ) && context.parentNode || context,
+						xml
+					)) ) {
+
+						// If seed is empty or no tokens remain, we can return early
+						tokens.splice( i, 1 );
+						selector = seed.length && tokens.join("");
+						if ( !selector ) {
+							push.apply( results, slice.call( seed, 0 ) );
+							return results;
+						}
+
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	// Compile and execute a filtering function
+	// Provide `match` to avoid retokenization if we modified the selector above
+	compile( selector, match )(
+		seed,
+		context,
+		xml,
+		results,
+		rsibling.test( selector )
+	);
+	return results;
+}
+
+if ( document.querySelectorAll ) {
+	(function() {
+		var disconnectedMatch,
+			oldSelect = select,
+			rescape = /'|\\/g,
+			rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
+
+			// qSa(:focus) reports false when true (Chrome 21),
+			// A support test would require too much code (would include document ready)
+			rbuggyQSA = [":focus"],
+
+			// matchesSelector(:focus) reports false when true (Chrome 21),
+			// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+			// A support test would require too much code (would include document ready)
+			// just skip matchesSelector for :active
+			rbuggyMatches = [ ":active", ":focus" ],
+			matches = docElem.matchesSelector ||
+				docElem.mozMatchesSelector ||
+				docElem.webkitMatchesSelector ||
+				docElem.oMatchesSelector ||
+				docElem.msMatchesSelector;
+
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert(function( div ) {
+			// Select is set to empty string on purpose
+			// This is to test IE's treatment of not explictly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// http://bugs.jquery.com/ticket/12359
+			div.innerHTML = "<select><option selected=''></option></select>";
+
+			// IE8 - Some boolean attributes are not treated correctly
+			if ( !div.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
+			}
+
+			// Webkit/Opera - :checked should return selected option elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			// IE8 throws error here (do not put tests after this one)
+			if ( !div.querySelectorAll(":checked").length ) {
+				rbuggyQSA.push(":checked");
+			}
+		});
+
+		assert(function( div ) {
+
+			// Opera 10-12/IE9 - ^= $= *= and empty values
+			// Should not select anything
+			div.innerHTML = "<p test=''></p>";
+			if ( div.querySelectorAll("[test^='']").length ) {
+				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
+			}
+
+			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+			// IE8 throws error here (do not put tests after this one)
+			div.innerHTML = "<input type='hidden'/>";
+			if ( !div.querySelectorAll(":enabled").length ) {
+				rbuggyQSA.push(":enabled", ":disabled");
+			}
+		});
+
+		// rbuggyQSA always contains :focus, so no need for a length check
+		rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") );
+
+		select = function( selector, context, results, seed, xml ) {
+			// Only use querySelectorAll when not filtering,
+			// when this is not xml,
+			// and when no QSA bugs apply
+			if ( !seed && !xml && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+				var groups, i,
+					old = true,
+					nid = expando,
+					newContext = context,
+					newSelector = context.nodeType === 9 && selector;
+
+				// qSA works strangely on Element-rooted queries
+				// We can work around this by specifying an extra ID on the root
+				// and working up from there (Thanks to Andrew Dupont for the technique)
+				// IE 8 doesn't work on object elements
+				if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					groups = tokenize( selector );
+
+					if ( (old = context.getAttribute("id")) ) {
+						nid = old.replace( rescape, "\\$&" );
+					} else {
+						context.setAttribute( "id", nid );
+					}
+					nid = "[id='" + nid + "'] ";
+
+					i = groups.length;
+					while ( i-- ) {
+						groups[i] = nid + groups[i].join("");
+					}
+					newContext = rsibling.test( selector ) && context.parentNode || context;
+					newSelector = groups.join(",");
+				}
+
+				if ( newSelector ) {
+					try {
+						push.apply( results, slice.call( newContext.querySelectorAll(
+							newSelector
+						), 0 ) );
+						return results;
+					} catch(qsaError) {
+					} finally {
+						if ( !old ) {
+							context.removeAttribute("id");
+						}
+					}
+				}
+			}
+
+			return oldSelect( selector, context, results, seed, xml );
+		};
+
+		if ( matches ) {
+			assert(function( div ) {
+				// Check to see if it's possible to do matchesSelector
+				// on a disconnected node (IE 9)
+				disconnectedMatch = matches.call( div, "div" );
+
+				// This should fail with an exception
+				// Gecko does not error, returns false instead
+				try {
+					matches.call( div, "[test!='']:sizzle" );
+					rbuggyMatches.push( "!=", pseudos );
+				} catch ( e ) {}
+			});
+
+			// rbuggyMatches always contains :active and :focus, so no need for a length check
+			rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );
+
+			Sizzle.matchesSelector = function( elem, expr ) {
+				// Make sure that attribute selectors are quoted
+				expr = expr.replace( rattributeQuotes, "='$1']" );
+
+				// rbuggyMatches always contains :active, so no need for an existence check
+				if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && (!rbuggyQSA || !rbuggyQSA.test( expr )) ) {
+					try {
+						var ret = matches.call( elem, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9
+								elem.document && elem.document.nodeType !== 11 ) {
+							return ret;
+						}
+					} catch(e) {}
+				}
+
+				return Sizzle( expr, null, null, [ elem ] ).length > 0;
+			};
+		}
+	})();
+}
+
+// Deprecated
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Back-compat
+function setFilters() {}
+Expr.filters = setFilters.prototype = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})( window );
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prev(?:Until|All))/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	rneedsContext = jQuery.expr.match.needsContext,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var i, l, length, n, r, ret,
+			self = this;
+
+		if ( typeof selector !== "string" ) {
+			return jQuery( selector ).filter(function() {
+				for ( i = 0, l = self.length; i < l; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			});
+		}
+
+		ret = this.pushStack( "", "find", selector );
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( n = length; n < ret.length; n++ ) {
+					for ( r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var i,
+			targets = jQuery( target, this ),
+			len = targets.length;
+
+		return this.filter(function() {
+			for ( i = 0; i < len; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && (
+			typeof selector === "string" ?
+				// If this is a positional/relative selector, check membership in the returned set
+				// so $("p:first").is("p:last") won't return true for a doc with two "p".
+				rneedsContext.test( selector ) ?
+					jQuery( selector, this.context ).index( this[0] ) >= 0 :
+					jQuery.filter( selector, this ).length > 0 :
+				this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			ret = [],
+			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( ; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+				}
+				cur = cur.parentNode;
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter(selector)
+		);
+	}
+});
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+function sibling( cur, dir ) {
+	do {
+		cur = cur[ dir ];
+	} while ( cur && cur.nodeType !== 1 );
+
+	return cur;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( this.length > 1 && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return ( elem === qualifier ) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+	});
+}
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+	safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style|link)/i,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+	rcheckableType = /^(?:checkbox|radio)$/,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	},
+	safeFragment = createSafeFragment( document ),
+	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+// unless wrapped in a div with non-breaking characters in front of it.
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "X<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( value ) {
+		return jQuery.access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+		}, null, value, arguments.length );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each(function(i) {
+			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( !isDisconnected( this[0] ) ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		}
+
+		if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
+		}
+	},
+
+	after: function() {
+		if ( !isDisconnected( this[0] ) ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		}
+
+		if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		var elem,
+			i = 0;
+
+		for ( ; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		var elem,
+			i = 0;
+
+		for ( ; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		return jQuery.access( this, function( value ) {
+			var elem = this[0] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined ) {
+				return elem.nodeType === 1 ?
+					elem.innerHTML.replace( rinlinejQuery, "" ) :
+					undefined;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+				value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+				try {
+					for (; i < l; i++ ) {
+						// Remove element nodes and prevent memory leaks
+						elem = this[i] || {};
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( elem.getElementsByTagName( "*" ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch(e) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function( value ) {
+		if ( !isDisconnected( this[0] ) ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		}
+
+		return this.length ?
+			this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+			this;
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+
+		// Flatten any nested arrays
+		args = [].concat.apply( [], args );
+
+		var results, first, fragment, iNoClone,
+			i = 0,
+			value = args[0],
+			scripts = [],
+			l = this.length;
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call( this, i, table ? self.html() : undefined );
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			results = jQuery.buildFragment( args, this, scripts );
+			fragment = results.fragment;
+			first = fragment.firstChild;
+
+			if ( fragment.childNodes.length === 1 ) {
+				fragment = first;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				// Use the original fragment for the last item instead of the first because it can end up
+				// being emptied incorrectly in certain situations (#8070).
+				// Fragments from the fragment cache must always be cloned and never used in place.
+				for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
+					callback.call(
+						table && jQuery.nodeName( this[i], "table" ) ?
+							findOrAppend( this[i], "tbody" ) :
+							this[i],
+						i === iNoClone ?
+							fragment :
+							jQuery.clone( fragment, true, true )
+					);
+				}
+			}
+
+			// Fix #11809: Avoid leaking memory
+			fragment = first = null;
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, function( i, elem ) {
+					if ( elem.src ) {
+						if ( jQuery.ajax ) {
+							jQuery.ajax({
+								url: elem.src,
+								type: "GET",
+								dataType: "script",
+								async: false,
+								global: false,
+								"throws": true
+							});
+						} else {
+							jQuery.error("no ajax");
+						}
+					} else {
+						jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
+					}
+
+					if ( elem.parentNode ) {
+						elem.parentNode.removeChild( elem );
+					}
+				});
+			}
+		}
+
+		return this;
+	}
+});
+
+function findOrAppend( elem, tag ) {
+	return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type, events[ type ][ i ] );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	if ( nodeName === "object" ) {
+		// IE6-10 improperly clones children of object elements using classid.
+		// IE10 throws NoModificationAllowedError if parent is null, #12132.
+		if ( dest.parentNode ) {
+			dest.outerHTML = src.outerHTML;
+		}
+
+		// This path appears unavoidable for IE9. When cloning an object
+		// element in IE9, the outerHTML strategy above is not sufficient.
+		// If the src has innerHTML and the destination does not,
+		// copy the src.innerHTML into the dest.innerHTML. #10324
+		if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
+			dest.innerHTML = src.innerHTML;
+		}
+
+	} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+
+		dest.defaultChecked = dest.checked = src.checked;
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+
+	// IE blanks contents when cloning scripts
+	} else if ( nodeName === "script" && dest.text !== src.text ) {
+		dest.text = src.text;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, context, scripts ) {
+	var fragment, cacheable, cachehit,
+		first = args[ 0 ];
+
+	// Set context from what may come in as undefined or a jQuery collection or a node
+	// Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
+	// also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
+	context = context || document;
+	context = !context.nodeType && context[0] || context;
+	context = context.ownerDocument || context;
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+	if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
+		first.charAt(0) === "<" && !rnocache.test( first ) &&
+		(jQuery.support.checkClone || !rchecked.test( first )) &&
+		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+		// Mark cacheable and look for a hit
+		cacheable = true;
+		fragment = jQuery.fragments[ first ];
+		cachehit = fragment !== undefined;
+	}
+
+	if ( !fragment ) {
+		fragment = context.createDocumentFragment();
+		jQuery.clean( args, context, fragment, scripts );
+
+		// Update the cache, but only store false
+		// unless this is a second parsing of the same content
+		if ( cacheable ) {
+			jQuery.fragments[ first ] = cachehit && fragment;
+		}
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			i = 0,
+			ret = [],
+			insert = jQuery( selector ),
+			l = insert.length,
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+		} else {
+			for ( ; i < l; i++ ) {
+				elems = ( i > 0 ? this.clone(true) : this ).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( typeof elem.getElementsByTagName !== "undefined" ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( rcheckableType.test( elem.type ) ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var srcElements,
+			destElements,
+			i,
+			clone;
+
+		if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+			clone = elem.cloneNode( true );
+
+		// IE<=8 does not properly clone detached, unknown element nodes
+		} else {
+			fragmentDiv.innerHTML = elem.outerHTML;
+			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+		}
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					cloneFixAttributes( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
+			safe = context === document && safeFragment,
+			ret = [];
+
+		// Ensure that context is a document
+		if ( !context || typeof context.createDocumentFragment === "undefined" ) {
+			context = document;
+		}
+
+		// Use the already-created safe fragment if context permits
+		for ( i = 0; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Ensure a safe container in which to render the html
+					safe = safe || createSafeFragment( context );
+					div = context.createElement("div");
+					safe.appendChild( div );
+
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Go to html and back, then peel off extra wrappers
+					tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
+					wrap = wrapMap[ tag ] || wrapMap._default;
+					depth = wrap[0];
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						hasBody = rtbody.test(elem);
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+
+					// Take out of fragment container (we need a fresh div each time)
+					div.parentNode.removeChild( div );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				jQuery.merge( ret, elem );
+			}
+		}
+
+		// Fix #11356: Clear elements from safeFragment
+		if ( div ) {
+			elem = div = safe = null;
+		}
+
+		// Reset defaultChecked for any radios and checkboxes
+		// about to be appended to the DOM in IE 6/7 (#8060)
+		if ( !jQuery.support.appendChecked ) {
+			for ( i = 0; (elem = ret[i]) != null; i++ ) {
+				if ( jQuery.nodeName( elem, "input" ) ) {
+					fixDefaultChecked( elem );
+				} else if ( typeof elem.getElementsByTagName !== "undefined" ) {
+					jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+				}
+			}
+		}
+
+		// Append elements to a provided document fragment
+		if ( fragment ) {
+			// Special handling of each script element
+			handleScript = function( elem ) {
+				// Check if we consider it executable
+				if ( !elem.type || rscriptType.test( elem.type ) ) {
+					// Detach the script and store it in the scripts array (if provided) or the fragment
+					// Return truthy to indicate that it has been handled
+					return scripts ?
+						scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+						fragment.appendChild( elem );
+				}
+			};
+
+			for ( i = 0; (elem = ret[i]) != null; i++ ) {
+				// Check if we're done after handling an executable script
+				if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+					// Append to fragment and handle embedded scripts
+					fragment.appendChild( elem );
+					if ( typeof elem.getElementsByTagName !== "undefined" ) {
+						// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+						jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
+
+						// Splice the scripts into ret after their former ancestor and advance our index beyond them
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+						i += jsTags.length;
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems, /* internal */ acceptData ) {
+		var data, id, elem, type,
+			i = 0,
+			internalKey = jQuery.expando,
+			cache = jQuery.cache,
+			deleteExpando = jQuery.support.deleteExpando,
+			special = jQuery.event.special;
+
+		for ( ; (elem = elems[i]) != null; i++ ) {
+
+			if ( acceptData || jQuery.acceptData( elem ) ) {
+
+				id = elem[ internalKey ];
+				data = id && cache[ id ];
+
+				if ( data ) {
+					if ( data.events ) {
+						for ( type in data.events ) {
+							if ( special[ type ] ) {
+								jQuery.event.remove( elem, type );
+
+							// This is a shortcut to avoid jQuery.event.remove's overhead
+							} else {
+								jQuery.removeEvent( elem, type, data.handle );
+							}
+						}
+					}
+
+					// Remove cache only if it was not already removed by jQuery.event.remove
+					if ( cache[ id ] ) {
+
+						delete cache[ id ];
+
+						// IE does not allow us to delete expando properties from nodes,
+						// nor does it have a removeAttribute function on Document nodes;
+						// we must handle all of these cases
+						if ( deleteExpando ) {
+							delete elem[ internalKey ];
+
+						} else if ( elem.removeAttribute ) {
+							elem.removeAttribute( internalKey );
+
+						} else {
+							elem[ internalKey ] = null;
+						}
+
+						jQuery.deletedIds.push( id );
+					}
+				}
+			}
+		}
+	}
+});
+// Limit scope pollution from any deprecated API
+(function() {
+
+var matched, browser;
+
+// Use of jQuery.browser is frowned upon.
+// More details: http://api.jquery.com/jQuery.browser
+// jQuery.uaMatch maintained for back-compat
+jQuery.uaMatch = function( ua ) {
+	ua = ua.toLowerCase();
+
+	var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+		/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+		/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+		/(msie) ([\w.]+)/.exec( ua ) ||
+		ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+		[];
+
+	return {
+		browser: match[ 1 ] || "",
+		version: match[ 2 ] || "0"
+	};
+};
+
+matched = jQuery.uaMatch( navigator.userAgent );
+browser = {};
+
+if ( matched.browser ) {
+	browser[ matched.browser ] = true;
+	browser.version = matched.version;
+}
+
+// Chrome is Webkit, but Webkit is also Safari.
+if ( browser.chrome ) {
+	browser.webkit = true;
+} else if ( browser.webkit ) {
+	browser.safari = true;
+}
+
+jQuery.browser = browser;
+
+jQuery.sub = function() {
+	function jQuerySub( selector, context ) {
+		return new jQuerySub.fn.init( selector, context );
+	}
+	jQuery.extend( true, jQuerySub, this );
+	jQuerySub.superclass = this;
+	jQuerySub.fn = jQuerySub.prototype = this();
+	jQuerySub.fn.constructor = jQuerySub;
+	jQuerySub.sub = this.sub;
+	jQuerySub.fn.init = function init( selector, context ) {
+		if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+			context = jQuerySub( context );
+		}
+
+		return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+	};
+	jQuerySub.fn.init.prototype = jQuerySub.fn;
+	var rootjQuerySub = jQuerySub(document);
+	return jQuerySub;
+};
+
+})();
+var curCSS, iframe, iframeDoc,
+	ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	rposition = /^(top|right|bottom|left)$/,
+	// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+	// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+	rmargin = /^margin/,
+	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+	rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
+	elemdisplay = {},
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: 0,
+		fontWeight: 400
+	},
+
+	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
+
+	eventsToggle = jQuery.fn.toggle;
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+	// shortcut for names that are not vendor prefixed
+	if ( name in style ) {
+		return name;
+	}
+
+	// check for vendor prefixed names
+	var capName = name.charAt(0).toUpperCase() + name.slice(1),
+		origName = name,
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in style ) {
+			return name;
+		}
+	}
+
+	return origName;
+}
+
+function isHidden( elem, el ) {
+	elem = el || elem;
+	return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
+
+function showHide( elements, show ) {
+	var elem, display,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		values[ index ] = jQuery._data( elem, "olddisplay" );
+		if ( show ) {
+			// Reset the inline display of this element to learn if it is
+			// being hidden by cascaded rules or not
+			if ( !values[ index ] && elem.style.display === "none" ) {
+				elem.style.display = "";
+			}
+
+			// Set elements which have been overridden with display: none
+			// in a stylesheet to whatever the default browser style is
+			// for such an element
+			if ( elem.style.display === "" && isHidden( elem ) ) {
+				values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+			}
+		} else {
+			display = curCSS( elem, "display" );
+
+			if ( !values[ index ] && display !== "none" ) {
+				jQuery._data( elem, "olddisplay", display );
+			}
+		}
+	}
+
+	// Set the display of most of the elements in a second loop
+	// to avoid the constant reflow
+	for ( index = 0; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+			elem.style.display = show ? values[ index ] || "" : "none";
+		}
+	}
+
+	return elements;
+}
+
+jQuery.fn.extend({
+	css: function( name, value ) {
+		return jQuery.access( this, function( elem, name, value ) {
+			return value !== undefined ?
+				jQuery.style( elem, name, value ) :
+				jQuery.css( elem, name );
+		}, name, value, arguments.length > 1 );
+	},
+	show: function() {
+		return showHide( this, true );
+	},
+	hide: function() {
+		return showHide( this );
+	},
+	toggle: function( state, fn2 ) {
+		var bool = typeof state === "boolean";
+
+		if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
+			return eventsToggle.apply( this, arguments );
+		}
+
+		return this.each(function() {
+			if ( bool ? state : isHidden( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, hooks,
+			origName = jQuery.camelCase( name ),
+			style = elem.style;
+
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, numeric, extra ) {
+		var val, num, hooks,
+			origName = jQuery.camelCase( name );
+
+		// Make sure that we're working with the right name
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks ) {
+			val = hooks.get( elem, true, extra );
+		}
+
+		// Otherwise, if a way to get the computed value exists, use that
+		if ( val === undefined ) {
+			val = curCSS( elem, name );
+		}
+
+		//convert "normal" to computed value
+		if ( val === "normal" && name in cssNormalTransform ) {
+			val = cssNormalTransform[ name ];
+		}
+
+		// Return, converting to number if forced or a qualifier was provided and val looks numeric
+		if ( numeric || extra !== undefined ) {
+			num = parseFloat( val );
+			return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
+		}
+		return val;
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var ret, name,
+			old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		ret = callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+
+		return ret;
+	}
+});
+
+// NOTE: To any future maintainer, we've window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+	curCSS = function( elem, name ) {
+		var ret, width, minWidth, maxWidth,
+			computed = window.getComputedStyle( elem, null ),
+			style = elem.style;
+
+		if ( computed ) {
+
+			ret = computed[ name ];
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+
+			// A tribute to the "awesome hack by Dean Edwards"
+			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+			// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+			// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+			if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+				width = style.width;
+				minWidth = style.minWidth;
+				maxWidth = style.maxWidth;
+
+				style.minWidth = style.maxWidth = style.width = ret;
+				ret = computed.width;
+
+				style.width = width;
+				style.minWidth = minWidth;
+				style.maxWidth = maxWidth;
+			}
+		}
+
+		return ret;
+	};
+} else if ( document.documentElement.currentStyle ) {
+	curCSS = function( elem, name ) {
+		var left, rsLeft,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret == null && style && style[ name ] ) {
+			ret = style[ name ];
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		// but not position css attributes, as those are proportional to the parent element instead
+		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ret;
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+	var matches = rnumsplit.exec( value );
+	return matches ?
+			Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+			value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
+	var i = extra === ( isBorderBox ? "border" : "content" ) ?
+		// If we already have the right measurement, avoid augmentation
+		4 :
+		// Otherwise initialize for horizontal or vertical properties
+		name === "width" ? 1 : 0,
+
+		val = 0;
+
+	for ( ; i < 4; i += 2 ) {
+		// both box models exclude margin, so add it if we want it
+		if ( extra === "margin" ) {
+			// we use jQuery.css instead of curCSS here
+			// because of the reliableMarginRight CSS hook!
+			val += jQuery.css( elem, extra + cssExpand[ i ], true );
+		}
+
+		// From this point on we use curCSS for maximum performance (relevant in animations)
+		if ( isBorderBox ) {
+			// border-box includes padding, so remove it if we want content
+			if ( extra === "content" ) {
+				val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+			}
+
+			// at this point, extra isn't border nor margin, so remove border
+			if ( extra !== "margin" ) {
+				val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+			}
+		} else {
+			// at this point, extra isn't content, so add padding
+			val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+
+			// at this point, extra isn't content nor padding, so add border
+			if ( extra !== "padding" ) {
+				val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+			}
+		}
+	}
+
+	return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with offset property, which is equivalent to the border-box value
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		valueIsBorderBox = true,
+		isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
+
+	// some non-html elements return undefined for offsetWidth, so check for null/undefined
+	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+	if ( val <= 0 || val == null ) {
+		// Fall back to computed then uncomputed css if necessary
+		val = curCSS( elem, name );
+		if ( val < 0 || val == null ) {
+			val = elem.style[ name ];
+		}
+
+		// Computed unit is not pixels. Stop here and return.
+		if ( rnumnonpx.test(val) ) {
+			return val;
+		}
+
+		// we need the check for style in case a browser which returns unreliable values
+		// for getComputedStyle silently falls back to the reliable elem.style
+		valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+
+		// Normalize "", auto, and prepare for extra
+		val = parseFloat( val ) || 0;
+	}
+
+	// use the active box-sizing model to add/subtract irrelevant styles
+	return ( val +
+		augmentWidthOrHeight(
+			elem,
+			name,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox
+		)
+	) + "px";
+}
+
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+	if ( elemdisplay[ nodeName ] ) {
+		return elemdisplay[ nodeName ];
+	}
+
+	var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
+		display = elem.css("display");
+	elem.remove();
+
+	// If the simple way fails,
+	// get element's real default display by attaching it to a temp iframe
+	if ( display === "none" || display === "" ) {
+		// Use the already-created iframe if possible
+		iframe = document.body.appendChild(
+			iframe || jQuery.extend( document.createElement("iframe"), {
+				frameBorder: 0,
+				width: 0,
+				height: 0
+			})
+		);
+
+		// Create a cacheable copy of the iframe document on first call.
+		// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+		// document to it; WebKit & Firefox won't allow reusing the iframe document.
+		if ( !iframeDoc || !iframe.createElement ) {
+			iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+			iframeDoc.write("<!doctype html><html><body>");
+			iframeDoc.close();
+		}
+
+		elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
+
+		display = curCSS( elem, "display" );
+		document.body.removeChild( iframe );
+	}
+
+	// Store the correct default display
+	elemdisplay[ nodeName ] = display;
+
+	return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+				// certain elements can have dimension info if we invisibly show them
+				// however, it must have a current display style that would benefit from this
+				if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
+					return jQuery.swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, name, extra );
+					});
+				} else {
+					return getWidthOrHeight( elem, name, extra );
+				}
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			return setPositiveNumber( elem, value, extra ?
+				augmentWidthOrHeight(
+					elem,
+					name,
+					extra,
+					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
+				) : 0
+			);
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+				style.removeAttribute ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there there is no filter style applied in a css rule, we are done
+				if ( currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				return jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						return curCSS( elem, "marginRight" );
+					}
+				});
+			}
+		};
+	}
+
+	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+	// getComputedStyle returns percent when specified for top/left/bottom/right
+	// rather than make the css module depend on the offset module, we just check for it here
+	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+		jQuery.each( [ "top", "left" ], function( i, prop ) {
+			jQuery.cssHooks[ prop ] = {
+				get: function( elem, computed ) {
+					if ( computed ) {
+						var ret = curCSS( elem, prop );
+						// if curCSS returns percentage, fallback to offset
+						return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
+					}
+				}
+			};
+		});
+	}
+
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i,
+
+				// assumes a single number if not a string
+				parts = typeof value === "string" ? value.split(" ") : [ value ],
+				expanded = {};
+
+			for ( i = 0; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+
+	if ( !rmargin.test( prefix ) ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+});
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	rselectTextarea = /^(?:select|textarea)/i;
+
+jQuery.fn.extend({
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+//Serialize an array of form elements or a set of
+//key/values into a query string
+jQuery.param = function( a, traditional ) {
+	var prefix,
+		s = [],
+		add = function( key, value ) {
+			// If value is a function, invoke it and return its value
+			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+		};
+
+	// Set traditional to true for jQuery <= 1.3.2 behavior.
+	if ( traditional === undefined ) {
+		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+	}
+
+	// If an array was passed in, assume that it is an array of form elements.
+	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+		// Serialize the form elements
+		jQuery.each( a, function() {
+			add( this.name, this.value );
+		});
+
+	} else {
+		// If traditional, encode the "old" way (the way 1.3.2 or older
+		// did it), otherwise encode params recursively.
+		for ( prefix in a ) {
+			buildParams( prefix, a[ prefix ], traditional, add );
+		}
+	}
+
+	// Return the resulting serialization
+	return s.join( "&" ).replace( r20, "+" );
+};
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+var
+	// Document location
+	ajaxLocParts,
+	ajaxLocation,
+
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rts = /([?&])_=[^&]*/,
+	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		var dataType, list, placeBefore,
+			dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
+			i = 0,
+			length = dataTypes.length;
+
+		if ( jQuery.isFunction( func ) ) {
+			// For each dataType in the dataTypeExpression
+			for ( ; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var selection,
+		list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters );
+
+	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+}
+
+jQuery.fn.load = function( url, params, callback ) {
+	if ( typeof url !== "string" && _load ) {
+		return _load.apply( this, arguments );
+	}
+
+	// Don't do a request if no elements are being requested
+	if ( !this.length ) {
+		return this;
+	}
+
+	var selector, type, response,
+		self = this,
+		off = url.indexOf(" ");
+
+	if ( off >= 0 ) {
+		selector = url.slice( off, url.length );
+		url = url.slice( 0, off );
+	}
+
+	// If it's a function
+	if ( jQuery.isFunction( params ) ) {
+
+		// We assume that it's the callback
+		callback = params;
+		params = undefined;
+
+	// Otherwise, build a param string
+	} else if ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// Request the remote document
+	jQuery.ajax({
+		url: url,
+
+		// if "type" variable is undefined, then "GET" method will be used
+		type: type,
+		dataType: "html",
+		data: params,
+		complete: function( jqXHR, status ) {
+			if ( callback ) {
+				self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+			}
+		}
+	}).done(function( responseText ) {
+
+		// Save response for use in complete callback
+		response = arguments;
+
+		// See if a selector was specified
+		self.html( selector ?
+
+			// Create a dummy div to hold the results
+			jQuery("<div>")
+
+				// inject the contents of the document in, removing the scripts
+				// to avoid any 'Permission Denied' errors in IE
+				.append( responseText.replace( rscript, "" ) )
+
+				// Locate the specified elements
+				.find( selector ) :
+
+			// If not, just inject the full result
+			responseText );
+
+	});
+
+	return this;
+};
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.on( o, f );
+	};
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		if ( settings ) {
+			// Building a settings object
+			ajaxExtend( target, jQuery.ajaxSettings );
+		} else {
+			// Extending ajaxSettings
+			settings = target;
+			target = jQuery.ajaxSettings;
+		}
+		ajaxExtend( target, settings );
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		throws: false,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": allTypes
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			context: true,
+			url: true
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // ifModified key
+			ifModifiedKey,
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// The jqXHR state
+			state = 0,
+			// Default abort message
+			strAbort = "canceled",
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || strAbort;
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, nativeStatusText, responses, headers ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			// Get response data
+			if ( responses ) {
+				response = ajaxHandleResponses( s, jqXHR, responses );
+			}
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					modified = jqXHR.getResponseHeader("Last-Modified");
+					if ( modified ) {
+						jQuery.lastModified[ ifModifiedKey ] = modified;
+					}
+					modified = jqXHR.getResponseHeader("Etag");
+					if ( modified ) {
+						jQuery.etag[ ifModifiedKey ] = modified;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					isSuccess = ajaxConvert( s, response );
+					statusText = isSuccess.state;
+					success = isSuccess.data;
+					error = isSuccess.error;
+					isSuccess = !error;
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.add;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for ( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.always( tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
+
+		// A cross-domain request is in order when we have a protocol:host:port mismatch
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() ) || false;
+			s.crossDomain = parts && ( parts.join(":") + ( parts[ 3 ] ? "" : parts[ 1 ] === "http:" ? 80 : 443 ) ) !==
+				( ajaxLocParts.join(":") + ( ajaxLocParts[ 3 ] ? "" : ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) );
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( state === 2 ) {
+			return jqXHR;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already and return
+				return jqXHR.abort();
+
+		}
+
+		// aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					throw e;
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var ct, type, finalDataType, firstDataType,
+		contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields;
+
+	// Fill responseXXX fields
+	for ( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	var conv, conv2, current, tmp,
+		// Work with a copy of dataTypes in case we need to modify it for conversion
+		dataTypes = s.dataTypes.slice(),
+		prev = dataTypes[ 0 ],
+		converters = {},
+		i = 0;
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	// Create converters map with lowercased keys
+	if ( dataTypes[ 1 ] ) {
+		for ( conv in s.converters ) {
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
+		}
+	}
+
+	// Convert to each sequential dataType, tolerating list modification
+	for ( ; (current = dataTypes[++i]); ) {
+
+		// There's only work to do if current dataType is non-auto
+		if ( current !== "*" ) {
+
+			// Convert response if prev dataType is non-auto and differs from current
+			if ( prev !== "*" && prev !== current ) {
+
+				// Seek a direct converter
+				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+				// If none found, seek a pair
+				if ( !conv ) {
+					for ( conv2 in converters ) {
+
+						// If conv2 outputs current
+						tmp = conv2.split(" ");
+						if ( tmp[ 1 ] === current ) {
+
+							// If prev can be converted to accepted input
+							conv = converters[ prev + " " + tmp[ 0 ] ] ||
+								converters[ "* " + tmp[ 0 ] ];
+							if ( conv ) {
+								// Condense equivalence converters
+								if ( conv === true ) {
+									conv = converters[ conv2 ];
+
+								// Otherwise, insert the intermediate dataType
+								} else if ( converters[ conv2 ] !== true ) {
+									current = tmp[ 0 ];
+									dataTypes.splice( i--, 0, current );
+								}
+
+								break;
+							}
+						}
+					}
+				}
+
+				// Apply converter (if not an equivalence)
+				if ( conv !== true ) {
+
+					// Unless errors are allowed to bubble, catch and return them
+					if ( conv && s["throws"] ) {
+						response = conv( response );
+					} else {
+						try {
+							response = conv( response );
+						} catch ( e ) {
+							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+						}
+					}
+				}
+			}
+
+			// Update prev for next iteration
+			prev = current;
+		}
+	}
+
+	return { state: "success", data: response };
+}
+var oldCallbacks = [],
+	rquestion = /\?/,
+	rjsonp = /(=)\?(?=&|$)|\?\?/,
+	nonce = jQuery.now();
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		data = s.data,
+		url = s.url,
+		hasCallback = s.jsonp !== false,
+		replaceInUrl = hasCallback && rjsonp.test( url ),
+		replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
+			!( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
+			rjsonp.test( data );
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+		overwritten = window[ callbackName ];
+
+		// Insert callback into url or form data
+		if ( replaceInUrl ) {
+			s.url = url.replace( rjsonp, "$1" + callbackName );
+		} else if ( replaceInData ) {
+			s.data = data.replace( rjsonp, "$1" + callbackName );
+		} else if ( hasCallback ) {
+			s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always(function() {
+			// Restore preexisting value
+			window[ callbackName ] = overwritten;
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+				// make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		});
+
+		// Delegate to script
+		return "script";
+	}
+});
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+var xhrCallbacks,
+	// #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var handle, i,
+						xhr = s.xhr();
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occurred
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+
+									// When requesting binary data, IE6-9 will throw an exception
+									// on any attempt to access responseText (#11426)
+									try {
+										responses.text = xhr.responseText;
+									} catch( _ ) {
+									}
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					if ( !s.async ) {
+						// if we're in sync mode we fire the callback
+						callback();
+					} else if ( xhr.readyState === 4 ) {
+						// (IE6 & IE7) if it's in cache and has been
+						// retrieved directly we need to fire the callback
+						setTimeout( callback, 0 );
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+var fxNow, timerId,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+	rrun = /queueHooks$/,
+	animationPrefilters = [ defaultPrefilter ],
+	tweeners = {
+		"*": [function( prop, value ) {
+			var end, unit,
+				tween = this.createTween( prop, value ),
+				parts = rfxnum.exec( value ),
+				target = tween.cur(),
+				start = +target || 0,
+				scale = 1,
+				maxIterations = 20;
+
+			if ( parts ) {
+				end = +parts[2];
+				unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+
+				// We need to compute starting value
+				if ( unit !== "px" && start ) {
+					// Iteratively approximate from a nonzero starting point
+					// Prefer the current property, because this process will be trivial if it uses the same units
+					// Fallback to end or a simple constant
+					start = jQuery.css( tween.elem, prop, true ) || end || 1;
+
+					do {
+						// If previous iteration zeroed out, double until we get *something*
+						// Use a string for doubling factor so we don't accidentally see scale as unchanged below
+						scale = scale || ".5";
+
+						// Adjust and apply
+						start = start / scale;
+						jQuery.style( tween.elem, prop, start + unit );
+
+					// Update scale, tolerating zero or NaN from tween.cur()
+					// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+					} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+				}
+
+				tween.unit = unit;
+				tween.start = start;
+				// If a +=/-= token was provided, we're doing a relative animation
+				tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
+			}
+			return tween;
+		}]
+	};
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout(function() {
+		fxNow = undefined;
+	}, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function createTweens( animation, props ) {
+	jQuery.each( props, function( prop, value ) {
+		var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+			index = 0,
+			length = collection.length;
+		for ( ; index < length; index++ ) {
+			if ( collection[ index ].call( animation, prop, value ) ) {
+
+				// we're done with this property
+				return;
+			}
+		}
+	});
+}
+
+function Animation( elem, properties, options ) {
+	var result,
+		index = 0,
+		tweenerIndex = 0,
+		length = animationPrefilters.length,
+		deferred = jQuery.Deferred().always( function() {
+			// don't match elem in the :animated selector
+			delete tick.elem;
+		}),
+		tick = function() {
+			var currentTime = fxNow || createFxNow(),
+				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+				percent = 1 - ( remaining / animation.duration || 0 ),
+				index = 0,
+				length = animation.tweens.length;
+
+			for ( ; index < length ; index++ ) {
+				animation.tweens[ index ].run( percent );
+			}
+
+			deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+			if ( percent < 1 && length ) {
+				return remaining;
+			} else {
+				deferred.resolveWith( elem, [ animation ] );
+				return false;
+			}
+		},
+		animation = deferred.promise({
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, { specialEasing: {} }, options ),
+			originalProperties: properties,
+			originalOptions: options,
+			startTime: fxNow || createFxNow(),
+			duration: options.duration,
+			tweens: [],
+			createTween: function( prop, end, easing ) {
+				var tween = jQuery.Tween( elem, animation.opts, prop, end,
+						animation.opts.specialEasing[ prop ] || animation.opts.easing );
+				animation.tweens.push( tween );
+				return tween;
+			},
+			stop: function( gotoEnd ) {
+				var index = 0,
+					// if we are going to the end, we want to run all the tweens
+					// otherwise we skip this part
+					length = gotoEnd ? animation.tweens.length : 0;
+
+				for ( ; index < length ; index++ ) {
+					animation.tweens[ index ].run( 1 );
+				}
+
+				// resolve when we played the last frame
+				// otherwise, reject
+				if ( gotoEnd ) {
+					deferred.resolveWith( elem, [ animation, gotoEnd ] );
+				} else {
+					deferred.rejectWith( elem, [ animation, gotoEnd ] );
+				}
+				return this;
+			}
+		}),
+		props = animation.props;
+
+	propFilter( props, animation.opts.specialEasing );
+
+	for ( ; index < length ; index++ ) {
+		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			return result;
+		}
+	}
+
+	createTweens( animation, props );
+
+	if ( jQuery.isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			anim: animation,
+			queue: animation.opts.queue,
+			elem: elem
+		})
+	);
+
+	// attach callbacks from options
+	return animation.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+	var index, name, easing, value, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = jQuery.camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( jQuery.isArray( value ) ) {
+			easing = value[ 1 ];
+			value = props[ index ] = value[ 0 ];
+		}
+
+		if ( index !== name ) {
+			props[ name ] = value;
+			delete props[ index ];
+		}
+
+		hooks = jQuery.cssHooks[ name ];
+		if ( hooks && "expand" in hooks ) {
+			value = hooks.expand( value );
+			delete props[ name ];
+
+			// not quite $.extend, this wont overwrite keys already present.
+			// also - reusing 'index' from above because we have the correct "name"
+			for ( index in value ) {
+				if ( !( index in props ) ) {
+					props[ index ] = value[ index ];
+					specialEasing[ index ] = easing;
+				}
+			}
+		} else {
+			specialEasing[ name ] = easing;
+		}
+	}
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweener: function( props, callback ) {
+		if ( jQuery.isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.split(" ");
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length ; index++ ) {
+			prop = props[ index ];
+			tweeners[ prop ] = tweeners[ prop ] || [];
+			tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			animationPrefilters.unshift( callback );
+		} else {
+			animationPrefilters.push( callback );
+		}
+	}
+});
+
+function defaultPrefilter( elem, props, opts ) {
+	var index, prop, value, length, dataShow, tween, hooks, oldfire,
+		anim = this,
+		style = elem.style,
+		orig = {},
+		handled = [],
+		hidden = elem.nodeType && isHidden( elem );
+
+	// handle queue: false promises
+	if ( !opts.queue ) {
+		hooks = jQuery._queueHooks( elem, "fx" );
+		if ( hooks.unqueued == null ) {
+			hooks.unqueued = 0;
+			oldfire = hooks.empty.fire;
+			hooks.empty.fire = function() {
+				if ( !hooks.unqueued ) {
+					oldfire();
+				}
+			};
+		}
+		hooks.unqueued++;
+
+		anim.always(function() {
+			// doing this makes sure that the complete handler will be called
+			// before this completes
+			anim.always(function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			});
+		});
+	}
+
+	// height/width overflow pass
+	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+		// Make sure that nothing sneaks out
+		// Record all 3 overflow attributes because IE does not
+		// change the overflow attribute when overflowX and
+		// overflowY are set to the same value
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Set display property to inline-block for height/width
+		// animations on inline elements that are having width/height animated
+		if ( jQuery.css( elem, "display" ) === "inline" &&
+				jQuery.css( elem, "float" ) === "none" ) {
+
+			// inline-level elements accept inline-block;
+			// block-level elements need to be inline with layout
+			if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+				style.display = "inline-block";
+
+			} else {
+				style.zoom = 1;
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		if ( !jQuery.support.shrinkWrapBlocks ) {
+			anim.done(function() {
+				style.overflow = opts.overflow[ 0 ];
+				style.overflowX = opts.overflow[ 1 ];
+				style.overflowY = opts.overflow[ 2 ];
+			});
+		}
+	}
+
+
+	// show/hide pass
+	for ( index in props ) {
+		value = props[ index ];
+		if ( rfxtypes.exec( value ) ) {
+			delete props[ index ];
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+				continue;
+			}
+			handled.push( index );
+		}
+	}
+
+	length = handled.length;
+	if ( length ) {
+		dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
+		if ( hidden ) {
+			jQuery( elem ).show();
+		} else {
+			anim.done(function() {
+				jQuery( elem ).hide();
+			});
+		}
+		anim.done(function() {
+			var prop;
+			jQuery.removeData( elem, "fxshow", true );
+			for ( prop in orig ) {
+				jQuery.style( elem, prop, orig[ prop ] );
+			}
+		});
+		for ( index = 0 ; index < length ; index++ ) {
+			prop = handled[ index ];
+			tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
+			orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
+
+			if ( !( prop in dataShow ) ) {
+				dataShow[ prop ] = tween.start;
+				if ( hidden ) {
+					tween.end = tween.start;
+					tween.start = prop === "width" || prop === "height" ? 1 : 0;
+				}
+			}
+		}
+	}
+}
+
+function Tween( elem, options, prop, end, easing ) {
+	return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+	constructor: Tween,
+	init: function( elem, options, prop, end, easing, unit ) {
+		this.elem = elem;
+		this.prop = prop;
+		this.easing = easing || "swing";
+		this.options = options;
+		this.start = this.now = this.cur();
+		this.end = end;
+		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+	},
+	cur: function() {
+		var hooks = Tween.propHooks[ this.prop ];
+
+		return hooks && hooks.get ?
+			hooks.get( this ) :
+			Tween.propHooks._default.get( this );
+	},
+	run: function( percent ) {
+		var eased,
+			hooks = Tween.propHooks[ this.prop ];
+
+		if ( this.options.duration ) {
+			this.pos = eased = jQuery.easing[ this.easing ](
+				percent, this.options.duration * percent, 0, 1, this.options.duration
+			);
+		} else {
+			this.pos = eased = percent;
+		}
+		this.now = ( this.end - this.start ) * eased + this.start;
+
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		if ( hooks && hooks.set ) {
+			hooks.set( this );
+		} else {
+			Tween.propHooks._default.set( this );
+		}
+		return this;
+	}
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+	_default: {
+		get: function( tween ) {
+			var result;
+
+			if ( tween.elem[ tween.prop ] != null &&
+				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+				return tween.elem[ tween.prop ];
+			}
+
+			// passing any value as a 4th parameter to .css will automatically
+			// attempt a parseFloat and fallback to a string if the parse fails
+			// so, simple values such as "10px" are parsed to Float.
+			// complex values such as "rotate(1rad)" are returned as is.
+			result = jQuery.css( tween.elem, tween.prop, false, "" );
+			// Empty strings, null, undefined and "auto" are converted to 0.
+			return !result || result === "auto" ? 0 : result;
+		},
+		set: function( tween ) {
+			// use step hook for back compat - use cssHook if its there - use .style if its
+			// available and use plain properties where available
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+			} else {
+				tween.elem[ tween.prop ] = tween.now;
+			}
+		}
+	}
+};
+
+// Remove in 2.0 - this supports IE8's panic based approach
+// to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+	set: function( tween ) {
+		if ( tween.elem.nodeType && tween.elem.parentNode ) {
+			tween.elem[ tween.prop ] = tween.now;
+		}
+	}
+};
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+	var cssFn = jQuery.fn[ name ];
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return speed == null || typeof speed === "boolean" ||
+			// special check for .toggle( handler, handler, ... )
+			( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
+			cssFn.apply( this, arguments ) :
+			this.animate( genFx( name, true ), speed, easing, callback );
+	};
+});
+
+jQuery.fn.extend({
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// show any hidden elements after setting opacity to 0
+		return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+			// animate to the value specified
+			.end().animate({ opacity: to }, speed, easing, callback );
+	},
+	animate: function( prop, speed, easing, callback ) {
+		var empty = jQuery.isEmptyObject( prop ),
+			optall = jQuery.speed( speed, easing, callback ),
+			doAnimation = function() {
+				// Operate on a copy of prop so per-property easing won't be lost
+				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+				// Empty animations resolve immediately
+				if ( empty ) {
+					anim.stop( true );
+				}
+			};
+
+		return empty || optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+	stop: function( type, clearQueue, gotoEnd ) {
+		var stopQueue = function( hooks ) {
+			var stop = hooks.stop;
+			delete hooks.stop;
+			stop( gotoEnd );
+		};
+
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var dequeue = true,
+				index = type != null && type + "queueHooks",
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			if ( index ) {
+				if ( data[ index ] && data[ index ].stop ) {
+					stopQueue( data[ index ] );
+				}
+			} else {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+						stopQueue( data[ index ] );
+					}
+				}
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					timers[ index ].anim.stop( gotoEnd );
+					dequeue = false;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// start the next in the queue if the last step wasn't forced
+			// timers currently will call their complete callbacks, which will dequeue
+			// but only if they were gotoEnd
+			if ( dequeue || !gotoEnd ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	}
+});
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		attrs = { height: type },
+		i = 0;
+
+	// if we include width, step value is 1 to do all cssExpand values,
+	// if we don't include width, step value is 2 to skip over Left and Right
+	includeWidth = includeWidth? 1 : 0;
+	for( ; i < 4 ; i += 2 - includeWidth ) {
+		which = cssExpand[ i ];
+		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+	}
+
+	if ( includeWidth ) {
+		attrs.opacity = attrs.width = type;
+	}
+
+	return attrs;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show"),
+	slideUp: genFx("hide"),
+	slideToggle: genFx("toggle"),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+		complete: fn || !fn && easing ||
+			jQuery.isFunction( speed ) && speed,
+		duration: speed,
+		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+	};
+
+	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+	// normalize opt.queue - true/undefined/null -> "fx"
+	if ( opt.queue == null || opt.queue === true ) {
+		opt.queue = "fx";
+	}
+
+	// Queueing
+	opt.old = opt.complete;
+
+	opt.complete = function() {
+		if ( jQuery.isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p*Math.PI ) / 2;
+	}
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+	var timer,
+		timers = jQuery.timers,
+		i = 0;
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+		// Checks the timer has not already been removed
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+};
+
+jQuery.fx.timer = function( timer ) {
+	if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
+		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+	}
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.stop = function() {
+	clearInterval( timerId );
+	timerId = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+	// Default speed
+	_default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+var rroot = /^(?:body|html)$/i;
+
+jQuery.fn.offset = function( options ) {
+	if ( arguments.length ) {
+		return options === undefined ?
+			this :
+			this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+	}
+
+	var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,
+		box = { top: 0, left: 0 },
+		elem = this[ 0 ],
+		doc = elem && elem.ownerDocument;
+
+	if ( !doc ) {
+		return;
+	}
+
+	if ( (body = doc.body) === elem ) {
+		return jQuery.offset.bodyOffset( elem );
+	}
+
+	docElem = doc.documentElement;
+
+	// Make sure it's not a disconnected DOM node
+	if ( !jQuery.contains( docElem, elem ) ) {
+		return box;
+	}
+
+	// If we don't have gBCR, just use 0,0 rather than error
+	// BlackBerry 5, iOS 3 (original iPhone)
+	if ( typeof elem.getBoundingClientRect !== "undefined" ) {
+		box = elem.getBoundingClientRect();
+	}
+	win = getWindow( doc );
+	clientTop  = docElem.clientTop  || body.clientTop  || 0;
+	clientLeft = docElem.clientLeft || body.clientLeft || 0;
+	scrollTop  = win.pageYOffset || docElem.scrollTop;
+	scrollLeft = win.pageXOffset || docElem.scrollLeft;
+	return {
+		top: box.top  + scrollTop  - clientTop,
+		left: box.left + scrollLeft - clientLeft
+	};
+};
+
+jQuery.offset = {
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+
+	position: function() {
+		if ( !this[0] ) {
+			return;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent || document.body;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+	var top = /Y/.test( prop );
+
+	jQuery.fn[ method ] = function( val ) {
+		return jQuery.access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? (prop in win) ? win[ prop ] :
+					win.document.documentElement[ method ] :
+					elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : jQuery( win ).scrollLeft(),
+					 top ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+		// margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return jQuery.access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( jQuery.isWindow( elem ) ) {
+					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+					// isn't a whole lot we can do. See pull request at this URL for discussion:
+					// https://github.com/jquery/jquery/pull/764
+					return elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, value, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable, null );
+		};
+	});
+});
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+	define( "jquery", [], function () { return jQuery; } );
+}
+
+})( window );
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.8/jquery.min.js b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.8/jquery.min.js
new file mode 100644
index 0000000..f65cf1d
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/1.8/jquery.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v1.8.2 jquery.com | jquery.org/license */
+(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.
 inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaul
 tValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bY(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bW.length;while(e--){b=bW[e]+c;if(b in a)return b}return d}function bZ(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function b$(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bZ(c)&&(e[f]=p._data(c,"olddisplay",cc(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}retu
 rn a}function b_(a,b,c){var d=bP.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function ca(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bV[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bV[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bV[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bV[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bV[e]+"Width"))||0));return f}function cb(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0||d==null){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bQ.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+ca(a,b,c||(f?"border":"content"),e)+"px"}function cc(a){if(bS[a])return bS[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,
 width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cA(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cv;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cA(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cA(a,c,d,e,"*",g)),h}function cB(a,c){va
 r d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((f[d]?a:e||(e={}))[d]=c[d]);e&&p.extend(!0,a,e)}function cC(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(f in k)f in d&&(c[k[f]]=d[f]);while(j[0]==="*")j.shift(),e===b&&(e=a.mimeType||c.getResponseHeader("content-type"));if(e)for(f in i)if(i[f]&&i[f].test(e)){j.unshift(f);break}if(j[0]in d)g=j[0];else{for(f in d){if(!j[0]||a.converters[f+" "+j[0]]){g=f;break}h||(h=f)}g=g||h}if(g)return g!==j[0]&&j.unshift(g),d[g]}function cD(a,b){var c,d,e,f,g=a.dataTypes.slice(),h=g[0],i={},j=0;a.dataFilter&&(b=a.dataFilter(b,a.dataType));if(g[1])for(c in a.converters)i[c.toLowerCase()]=a.converters[c];for(;e=g[++j];)if(e!=="*"){if(h!=="*"&&h!==e){c=i[h+" "+e]||i["* "+e];if(!c)for(d in i){f=d.split(" ");if(f[1]===e){c=i[h+" "+f[0]]||i["* "+f[0]];if(c){c===!0?c=i[d]:i[d]!==!0&&(e=f[0],g.splice(j--,0,e));break}}}if(c!==!0)if(c&&a["throws"])b=c(b);else try{b=c(b)}catch(k){return{state:"parsererror",error:c?k:"
 No conversion from "+h+" to "+e}}}h=e}return{state:"success",data:b}}function cL(){try{return new a.XMLHttpRequest}catch(b){}}function cM(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cU(){return setTimeout(function(){cN=b},0),cN=p.now()}function cV(a,b){p.each(b,function(b,c){var d=(cT[b]||[]).concat(cT["*"]),e=0,f=d.length;for(;e<f;e++)if(d[e].call(a,b,c))return})}function cW(a,b,c){var d,e=0,f=0,g=cS.length,h=p.Deferred().always(function(){delete i.elem}),i=function(){var b=cN||cU(),c=Math.max(0,j.startTime+j.duration-b),d=1-(c/j.duration||0),e=0,f=j.tweens.length;for(;e<f;e++)j.tweens[e].run(d);return h.notifyWith(a,[j,d,c]),d<1&&f?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:p.extend({},b),opts:p.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:cN||cU(),duration:c.duration,tweens:[],createTween:function(b,c,d){var e=p.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(e),e
 },stop:function(b){var c=0,d=b?j.tweens.length:0;for(;c<d;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;cX(k,j.opts.specialEasing);for(;e<g;e++){d=cS[e].call(j,a,k,j.opts);if(d)return d}return cV(j,k),p.isFunction(j.opts.start)&&j.opts.start.call(a,j),p.fx.timer(p.extend(i,{anim:j,queue:j.opts.queue,elem:a})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function cX(a,b){var c,d,e,f,g;for(c in a){d=p.camelCase(c),e=b[d],f=a[c],p.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=p.cssHooks[d];if(g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}}function cY(a,b,c){var d,e,f,g,h,i,j,k,l=this,m=a.style,n={},o=[],q=a.nodeType&&bZ(a);c.queue||(j=p._queueHooks(a,"fx"),j.unqueued==null&&(j.unqueued=0,k=j.empty.fire,j.empty.fire=function(){j.unqueued||k()}),j.unqueued++,l.always(function(){l.always(function(){j.unqueued--,p.
 queue(a,"fx").length||j.empty.fire()})})),a.nodeType===1&&("height"in b||"width"in b)&&(c.overflow=[m.overflow,m.overflowX,m.overflowY],p.css(a,"display")==="inline"&&p.css(a,"float")==="none"&&(!p.support.inlineBlockNeedsLayout||cc(a.nodeName)==="inline"?m.display="inline-block":m.zoom=1)),c.overflow&&(m.overflow="hidden",p.support.shrinkWrapBlocks||l.done(function(){m.overflow=c.overflow[0],m.overflowX=c.overflow[1],m.overflowY=c.overflow[2]}));for(d in b){f=b[d];if(cP.exec(f)){delete b[d];if(f===(q?"hide":"show"))continue;o.push(d)}}g=o.length;if(g){h=p._data(a,"fxshow")||p._data(a,"fxshow",{}),q?p(a).show():l.done(function(){p(a).hide()}),l.done(function(){var b;p.removeData(a,"fxshow",!0);for(b in n)p.style(a,b,n[b])});for(d=0;d<g;d++)e=o[d],i=l.createTween(e,q?h[e]:0),n[e]=h[e]||p.style(a,e),e in h||(h[e]=i.start,q&&(i.end=i.start,i.start=e==="width"||e==="height"?1:0))}}function cZ(a,b,c,d,e){return new cZ.prototype.init(a,b,c,d,e)}function c$(a,b){var c,d={height:a},
 e=0;b=b?1:0;for(;e<4;e+=2-b)c=bV[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function da(a){return p.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}var c,d,e=a.document,f=a.location,g=a.navigator,h=a.jQuery,i=a.$,j=Array.prototype.push,k=Array.prototype.slice,l=Array.prototype.indexOf,m=Object.prototype.toString,n=Object.prototype.hasOwnProperty,o=String.prototype.trim,p=function(a,b){return new p.fn.init(a,b,c)},q=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,r=/\S/,s=/\s+/,t=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,u=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEve
 nt("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[t
 his.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j
 ===i&&(h=this,--i);for(;i<j;i++)if((a=arguments[i])!=null)for(c in a){d=h[c],e=a[c];if(h===e)continue;k&&e&&(p.isPlainObject(e)||(f=p.isArray(e)))?(f?(f=!1,g=d&&p.isArray(d)?d:[]):g=d&&p.isPlainObject(d)?d:{},h[c]=p.extend(k,g,e)):e!==b&&(h[c]=e)}return h},p.extend({noConflict:function(b){return a.$===p&&(a.$=i),b&&a.jQuery===p&&(a.jQuery=h),p},isReady:!1,readyWait:1,holdReady:function(a){a?p.readyWait++:p.ready(!0)},ready:function(a){if(a===!0?--p.readyWait:p.isReady)return;if(!e.body)return setTimeout(p.ready,1);p.isReady=!0;if(a!==!0&&--p.readyWait>0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"|
 |a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d
 .loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f<g;)if(c.apply(a[f++],d)===!1)break}else if(h){for(e in a)if(c.call(a[e],e,a[e])===!1)break}else for(;f<g;)if(c.call(a[f],f,a[f++])===!1)break;return a},trim:o&&!o.call(" ")?function(a){return a==null?"":o.call(a)}:function(a){return a==null?"":(a+"").replace(t,"")},makeArray:function(a,b){var c,d=b||[];return a!=null&&(c=p.type(a),a.length==null||c==="string"||c==="function"||c==="regexp"||p.isWindow(a)?j.call(d,a):p.merge(d,a)),d},inArray:function(a,b,c){var d;
 if(b){if(l)return l.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if(typeof d=="number")for(;f<d;f++)a[e++]=c[f];else while(c[f]!==b)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;c=!!c;for(;f<g;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,c,d){var e,f,g=[],h=0,i=a.length,j=a instanceof p||i!==b&&typeof i=="number"&&(i>0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h<i;h++)e=c(a[h],h,d),e!=null&&(g[g.length]=e);else for(f in a)e=c(a[f],f,d),e!=null&&(g[g.length]=e);return g.concat.apply([],g)},guid:1,proxy:function(a,c){var d,e,f;return typeof c=="string"&&(d=a[c],c=a,a=d),p.isFunction(a)?(e=k.call(arguments,2),f=function(){return a.apply(c,e.concat(k.call(arguments)))},f.guid=a.guid=a.guid||p.guid++,f):b},access:function(a,c,d,e,f,g,h){var i,j=d==null,k=0,l=a.length;if(d&&typeof d=="object"){for(k in d)p.access(a,c,
 k,d[k],1,g,e);f=1}else if(e!==b){i=h===b&&p.isFunction(e),j&&(i?(i=c,c=function(a,b,c){return i.call(p(a),c)}):(c.call(a,e),c=null));if(c)for(;k<l;k++)c(a[k],d,i?e.call(a[k],k,c(a[k],d)):e,h);f=1}return f?a:j?c.call(a):l?c(a[0],d):g},now:function(){return(new Date).getTime()}}),p.ready.promise=function(b){if(!d){d=p.Deferred();if(e.readyState==="complete")setTimeout(p.ready,1);else if(e.addEventListener)e.addEventListener("DOMContentLoaded",D,!1),a.addEventListener("load",p.ready,!1);else{e.attachEvent("onreadystatechange",D),a.attachEvent("onload",p.ready);var c=!1;try{c=a.frameElement==null&&e.documentElement}catch(f){}c&&c.doScroll&&function g(){if(!p.isReady){try{c.doScroll("left")}catch(a){return setTimeout(g,50)}p.ready()}}()}}return d.promise(b)},p.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){E["[object "+b+"]"]=b.toLowerCase()}),c=p(e);var F={};p.Callbacks=function(a){a=typeof a=="string"?F[a]||G(a):p.extend({},a);var c,d,e,
 f,g,h,i=[],j=!a.once&&[],k=function(b){c=a.memory&&b,d=!0,h=f||0,f=0,g=i.length,e=!0;for(;i&&h<g;h++)if(i[h].apply(b[0],b[1])===!1&&a.stopOnFalse){c=!1;break}e=!1,i&&(j?j.length&&k(j.shift()):c?i=[]:l.disable())},l={add:function(){if(i){var b=i.length;(function d(b){p.each(b,function(b,c){var e=p.type(c);e==="function"&&(!a.unique||!l.has(c))?i.push(c):c&&c.length&&e!=="string"&&d(c)})})(arguments),e?g=i.length:c&&(f=b,k(c))}return this},remove:function(){return i&&p.each(arguments,function(a,b){var c;while((c=p.inArray(b,i,c))>-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!
 d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return a!=null?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promi
 se)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b<d;b++)c[b]&&p.isFunction(c[b].promise)?c[b].promise().done(g(b,j,c)).fail(f.reject).progress(g(b,i,h)):--e}return e||f.resolveWith(j,c),f.promise()}}),p.support=function(){var b,c,d,f,g,h,i,j,k,l,m,n=e.createElement("div");n.setAttribute("className","t"),n.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getA
 ttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked
 ","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetH
 eight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="<div></div>",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.remov
 eChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]
 :p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e<f;e++)delete d[b[e]];if(!(c?K:p.isEmptyObject)(d))return}}if(!c){delete h[i].data;if(!K(h[i]))return}g?p.cleanData([a],!0):p.support.deleteExpando||h!=h.window?delete h[i]:h[i]=null},_data:function(a,b,c){return p.data(a,b,c,!0)},acceptData:function(a){var b=a.nodeName&&p.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),p.fn.extend({data:function(a,c){var d,e,f,g,h,i=this[0],j=0,k=null;if(a===b){if(this.length){k=p.data(i);if(i.nodeType===1&&!p._data(i,"parsedAttrs")){f=i.attributes;for(h=f.length;j<h;j++)g=f[j].name,g.indexOf("data-")||(g=p.camelCase(g.substring(5)),J(i,g,k[g]));p._data(i,"parsedAttrs",!0)}}return k}return typeof a=="object"?this.each(function(){p.data(this,a)}):(d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!",p.access(this,function(c){if(c===b)return k=this.triggerHan
 dler("getData"+e,[d[0]]),k===b&&i&&(k=p.data(i,a),k=J(i,a,k)),k===b&&d[1]?this.data(d[0]):k;d[1]=c,this.each(function(){var b=p(this);b.triggerHandler("setData"+e,d),p.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&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 p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="strin
 g"&&(c=a,a="fx",d--),arguments.length<d?p.queue(this[0],a):c===b?this:this.each(function(){var b=p.queue(this,a,c);p._queueHooks(this,a),a==="fx"&&b[0]!=="inprogress"&&p.dequeue(this,a)})},dequeue:function(a){return this.each(function(){p.dequeue(this,a)})},delay:function(a,b){return a=p.fx?p.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=p.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};typeof a!="string"&&(c=a,a=b),a=a||"fx";while(h--)d=p._data(g[h],a+"queueHooks"),d&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var L,M,N,O=/[\t\r\n]/g,P=/\r/g,Q=/^(?:button|input)$/i,R=/^(?:button|input|object|select|textarea)$/i,S=/^a(?:rea|)$/i,T=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,U=p.support.getSetAttribute;p
 .fn.extend({attr:function(a,b){return p.access(this,p.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{f=" "+e.className+" ";for(g=0,h=b.length;g<h;g++)f.indexOf(" "+b[g]+" ")<0&&(f+=b[g]+" ");e.className=p.trim(f)}}}return this},removeClass:function(a){var c,d,e,f,g,h,i;if(p.isFunction(a))return this.each(function(b){p(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(s);for(h=0,i=this.length;h<i;h++){e=this[h]
 ;if(e.nodeType===1&&e.className){d=(" "+e.className+" ").replace(O," ");for(f=0,g=c.length;f<g;f++)while(d.indexOf(" "+c[f]+" ")>=0)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(O," ").indexOf(b)>=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],
 c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c<d;c++){e=h[c];if(e.selected&&(p.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!p.nodeName(e.parentNode,"optgroup"))){b=p(e).val();if(i)return b;g.push(b)}}return i&&!g.length&&h.length?p(h[f]).val():g},set:function(a,b){var c=p
 .makeArray(b);return p(a).find("option").each(function(){this.selected=p.inArray(p(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+""),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g<d.length;g++)e=d[g],e&&(c=p.propFix[e]||e,f=T.test(e),f||p.attr(a,e,""),a.removeAttribute(U?e:c),f&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(Q.test(a.nodeName)&&a.parentNode)p.error("type property can't be changed");else if(!p.support.radioValue&&b==="radio"&&p.nodeN
 ame(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}},value:{get:function(a,b){return L&&p.nodeName(a,"button")?L.get(a,b):b in a?a.value:null},set:function(a,b,c){if(L&&p.nodeName(a,"button"))return L.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(!a||h===3||h===8||h===2)return;return g=h!==1||!p.isXMLDoc(a),g&&(c=p.propFix[c]||c,f=p.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&(e=f.get(a,c))!==null?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):R.test(a.nodeName)||S.test(a.nodeName)&&a.href?0:b}}}}),M={get:function(a,c){var d,e=p.prop(a,c);return
  e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;return b===!1?p.removeAttr(a,c):(d=p.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase())),c}},U||(N={name:!0,id:!0,coords:!0},L=p.valHooks.button={get:function(a,c){var d;return d=a.getAttributeNode(c),d&&(N[c]?d.value!=="":d.specified)?d.value:b},set:function(a,b,c){var d=a.getAttributeNode(c);return d||(d=e.createAttribute(c),a.setAttributeNode(d)),d.value=b+""}},p.each(["width","height"],function(a,b){p.attrHooks[b]=p.extend(p.attrHooks[b],{set:function(a,c){if(c==="")return a.setAttribute(b,"auto"),c}})}),p.attrHooks.contenteditable={get:L.get,set:function(a,b,c){b===""&&(b="false"),L.set(a,b,c)}}),p.support.hrefNormalized||p.each(["href","src","width","height"],function(a,c){p.attrHooks[c]=p.extend(p.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),p.support.style||(p.attrHooks.style={get:function(a){return 
 a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=b+""}}),p.support.optSelected||(p.propHooks.selected=p.extend(p.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),p.support.enctype||(p.propFix.enctype="encoding"),p.support.checkOn||p.each(["radio","checkbox"],function(){p.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]=p.extend(p.valHooks[this],{set:function(a,b){if(p.isArray(b))return a.checked=p.inArray(p(a).val(),b)>=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c|
 |!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j<c.length;j++){k=W.exec(c[j])||[],l=k[1],m=(k[2]||"").split(".").sort(),r=p.event.special[l]||{},l=(f?r.delegateType:r.bindType)||l,r=p.event.special[l]||{},n=p.extend({type:l,origType:k[1],data:e,handler:d,guid:d.guid,selector:f,needsContext:f&&p.expr.match.needsContext.test(f),namespace:m.join(".")},o),q=i[l];if(!q){q=i[l]=[],q.delegateCount=0;if(!r.setup||r.setup.call(a,e,m,h)===!1)a.addEventListener?a.addEventListener(l,h,!1):a.attachEvent&&a.attachEvent("on"+l,h)}r.add&&(r.add.call(a,n),n.handler.guid||(n.handler.guid=d.guid)),f?q.splice(q.delegateCount++,0,n):q.push(n),p.event.global[l]=!0}a=null},global:{},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,q
 ,r=p.hasData(a)&&p._data(a);if(!r||!(m=r.events))return;b=p.trim(_(b||"")).split(" ");for(f=0;f<b.length;f++){g=W.exec(b[f])||[],h=i=g[1],j=g[2];if(!h){for(h in m)p.event.remove(a,h+b[f],c,d,!0);continue}n=p.event.special[h]||{},h=(d?n.delegateType:n.bindType)||h,o=m[h]||[],k=o.length,j=j?new RegExp("(^|\\.)"+j.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(l=0;l<o.length;l++)q=o[l],(e||i===q.origType)&&(!c||c.guid===q.guid)&&(!j||j.test(q.namespace))&&(!d||d===q.selector||d==="**"&&q.selector)&&(o.splice(l--,1),q.selector&&o.delegateCount--,n.remove&&n.remove.call(a,q));o.length===0&&k!==o.length&&((!n.teardown||n.teardown.call(a,j,r.handle)===!1)&&p.removeEvent(a,h,r.handle),delete m[h])}p.isEmptyObject(m)&&(delete r.handle,p.removeData(a,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,f,g){if(!f||f.nodeType!==3&&f.nodeType!==8){var h,i,j,k,l,m,n,o,q,r,s=c.type||c,t=[];if($.test(s+p.event.triggered))return;s.indexOf("!")>=
 0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j<q.length&&!c.isPropagationStopped();j++)k=q[j][0],c.type=q[j][1],o=(p._data(k,"events")||{})[c.type]&&p._data(k,"hand
 le"),o&&o.apply(k,d),o=m&&k[m],o&&p.acceptData(k)&&o.apply&&o.apply(k,d)===!1&&c.preventDefault();return c.type=s,!g&&!c.isDefaultPrevented()&&(!n._default||n._default.apply(f.ownerDocument,d)===!1)&&(s!=="click"||!p.nodeName(f,"a"))&&p.acceptData(f)&&m&&f[s]&&(s!=="focus"&&s!=="blur"||c.target.offsetWidth!==0)&&!p.isWindow(f)&&(l=f[m],l&&(f[m]=null),p.event.triggered=s,f[s](),p.event.triggered=b,l&&(f[m]=l)),c.result}return},dispatch:function(c){c=p.event.fix(c||a.event);var d,e,f,g,h,i,j,l,m,n,o=(p._data(this,"events")||{})[c.type]||[],q=o.delegateCount,r=k.call(arguments),s=!c.exclusive&&!c.namespace,t=p.event.special[c.type]||{},u=[];r[0]=c,c.delegateTarget=this;if(t.preDispatch&&t.preDispatch.call(this,c)===!1)return;if(q&&(!c.button||c.type!=="click"))for(f=c.target;f!=this;f=f.parentNode||this)if(f.disabled!==!0||c.type!=="click"){h={},j=[];for(d=0;d<q;d++)l=o[d],m=l.selector,h[m]===b&&(h[m]=l.needsContext?p(m,this).index(f)>=0:p.find(m,this,null,[f]).length),h[m]&&j.
 push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d<u.length&&!c.isPropagationStopped();d++){i=u[d],c.currentTarget=i.elem;for(e=0;e<i.matches.length&&!c.isImmediatePropagationStopped();e++){l=i.matches[e];if(s||!c.namespace&&!l.namespace||c.namespace_re&&c.namespace_re.test(l.namespace))c.data=l.data,c.handleObj=l,g=((p.event.special[l.origType]||{}).handle||l.handler).apply(i.elem,r),g!==b&&(c.result=g,g===!1&&(c.preventDefault(),c.stopPropagation()))}}return t.postDispatch&&t.postDispatch.call(this,c),c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX off
 setY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,f,g,h=c.button,i=c.fromElement;return a.pageX==null&&c.clientX!=null&&(d=a.target.ownerDocument||e,f=d.documentElement,g=d.body,a.pageX=c.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?c.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0),a}},fix:function(a){if(a[p.expando])return a;var b,c,d=a,f=p.event.fixHooks[a.type]||{},g=f.props?this.props.concat(f.props):this.props;a=p.Event(d);for(b=g.length;b;)c=g[--b],a[c]=d[c];return a.target||(a.target=d.srcElement||e),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,f.filter?f.filter(a,d):a},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){p.isWindow(this)&&(this
 .onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=p.extend(new p.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?p.event.trigger(e,null,b):p.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},p.event.handle=p.event.dispatch,p.removeEvent=e.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]=="undefined"&&(a[d]=null),a.detachEvent(d,c))},p.Event=function(a,b){if(this instanceof p.Event)a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?bb:ba):this.type=a,b&&p.extend(this,b),this.timeStamp=a&&a.timeStamp||p.now(),this[p.expando]=!0;else return new p.Event(a,b)},p.Event.prototype={preventDefault:function(){this.isDefaultPrevented=bb;var a=this.originalEvent;if(!a)return;a.prevent
 Default?a.preventDefault():a.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=bb;var a=this.originalEvent;if(!a)return;a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()},isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){p.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj,g=f.selector;if(!e||e!==d&&!p.contains(d,e))a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b;return c}}}),p.support.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=p.nodeName(c,"input")||p.nodeName(c,"button")?c.form:b;d&&!p._data(d,"_submit_attached")&&(p.event.add(d,"submit._submit",function(a){a.
 _submit_bubble=!0}),p._data(d,"_submit_attached",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&p.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),p.support.changeBubbles||(p.event.special.change={setup:function(){if(V.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,a,!0)});return!1}p.event.add(this,"beforeactivate._change",function(a){var b=a.target;V.test(b.nodeName)&&!p._data(b,"_change_attached")&&(p.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&p.event.simulate("change",this.parentNode,a,!0)}),p._data(b,"_chang
 e_attached",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),!V.test(this.nodeName)}}),p.support.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){p.event.simulate(b,a.target,p.event.fix(a),!0)};p.event.special[b]={setup:function(){c++===0&&e.addEventListener(a,d,!0)},teardown:function(){--c===0&&e.removeEventListener(a,d,!0)}}}),p.fn.extend({on:function(a,c,d,e,f){var g,h;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(h in a)this.on(h,c,d,a[h],f);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=ba;else if(!e)return this;return f===1&&(g=e,e=function(a){return p().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=p.guid++)),this.each(function(){p.event.add(this,a,e,d,c)})},one:fun
 ction(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,p(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if(typeof a=="object"){for(f in a)this.off(f,c,a[f]);return this}if(c===!1||typeof c=="function")d=c,c=b;return d===!1&&(d=ba),this.each(function(){p.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){return p(this.context).on(a,this.selector,b,c),this},die:function(a,b){return p(this.context).off(a,this.selector||"**",b),this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length===1?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){p.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return p.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=argum
 ents,c=a.guid||p.guid++,d=0,e=function(c){var e=(p._data(this,"lastToggle"+a.guid)||0)%d;return p._data(this,"lastToggle"+a.guid,e+1),c.preventDefault(),b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){p.fn[b]=function(a,c){return c==null&&(c=a,a=null),arguments.length>0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bc(a,b,c,d){c=c||[],b=b||r;var e,f,i,j,k=b.nodeType;if(!a||typeof a!="string")return c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)
 return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return bp(a.replace(L,"$1"),b,c,d,i)}function bd(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function be(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bf(a){return z(function(b){return b=+b,z(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 bg(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bh(a,b){var c,d,f,g,h,i,j,k=C[o][a];if(k)return b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exe
 c(h))f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L," ");for(g in e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return b?h.length:h?bc.error(a):C(a,i).slice(0)}function bi(a,b,d){var e=b.dir,f=d&&b.dir==="parentNode",g=u++;return b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return a(b,c,d)}:function(b,d,h){if(!h){var i,j=t+" "+g+" ",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return b.sizset;if(typeof i=="string"&&i.indexOf(j)===0){if(b.sizset)return b}else{b[o]=k;if(a(b,d,h))return b.sizset=!0,b;b.sizset=!1}}}else while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return b}}function bj(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 bk(a,b,c,d,e){var f,g=[],h=0,i=a.length,j=b!=null;for(;h<i;h++)if(f=a[h])if(!c||c(f,d,e))g.push(f),j&&b.push(h);return g}function bl(a,b,c,d,e,f){retur
 n d&&!d[o]&&(d=bl(d)),e&&!e[o]&&(e=bl(e,f)),z(function(f,g,h,i){if(f&&e)return;var j,k,l,m=[],n=[],o=g.length,p=f||bo(b||"*",h.nodeType?[h]:h,[],f),q=a&&(f||!b)?bk(p,m,a,h,i):p,r=c?e||(f?a:o||d)?[]:g:q;c&&c(q,r,h,i);if(d){l=bk(r,n),d(l,[],h,i),j=l.length;while(j--)if(k=l[j])r[n[j]]=!(q[n[j]]=k)}if(f){j=a&&r.length;while(j--)if(k=r[j])f[m[j]]=!(g[m[j]]=k)}else r=bk(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):w.apply(g,r)})}function bm(a){var b,c,d,f=a.length,g=e.relative[a[0].type],h=g||e.relative[" "],i=g?1:0,j=bi(function(a){return a===b},h,!0),k=bi(function(a){return y.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i<f;i++)if(c=e.relative[a[i].type])m=[bi(bj(m),c)];else{c=e.filter[a[i].type].apply(null,a[i].matches);if(c[o]){d=++i;for(;d<f;d++)if(e.relative[a[d].type])break;return bl(i>1&&bj(m),i>1&&a.slice(0,i-1).join("").replace(L,"$1"),c,i<d&&bm(a.slice(i,d)),d<f&&bm(a=a.slice(d)),d<f&&a.join(""))}m.push(c)}retur
 n bj(m)}function bn(a,b){var d=b.length>0,f=a.length>0,g=function(h,i,j,k,m){var n,o,p,q=[],s=0,u="0",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG("*",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return y&&(t=B,l=z),x};return g.el=0,d?z(g):g}function bo(a,b,c,d){var e=0,f=b.length;for(;e<f;e++)bc(a,b[e],c,d);return c}function bp(a,b,c,d,f){var g,h,j,k,l,m=bh(a),n=m.length;if(!d&&m.length===1){h=m[0]=m[0].slice(0);if(h.length>2&&(j=h[0]).type==="ID"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,""),b,f)[0];if(!b)return c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break
 ;if(l=e.find[k])if(d=l(j.matches[0].replace(V,""),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join("");if(!a)return w.apply(c,x.call(d,0)),c;break}}}return i(a,m)(d,b,f,c,R.test(a)),c}function bq(){}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var b=0,c=this.length;for(;b<c;b++)if(this[b]===a)return b;return-1},z=function(a,b){return a[o]=b==null||b,a},A=function(){var a={},b=[];return z(function(c,d){return b.push(c)>e.cacheLength&&delete a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",G=F.replace("w","w#"),H="([*^$|!~]?=)",I="\\["+E+"*("+F+")"+E+"*(?:"+H+E+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+G+")|)|)"+E+"*\\]",J=":("+F+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+I+")|[^:]|\\\\.)*|.*))\\)|)",K=":(even|odd|eq|gt|lt|nth|first|las
 t)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)",L=new RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),M=new RegExp("^"+E+"*,"+E+"*"),N=new RegExp("^"+E+"*([\\x20\\t\\r\\n\\f>+~])"+E+"*"),O=new RegExp(J),P=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,Q=/^:not/,R=/[\x20\t\r\n\f]*[+~]/,S=/:not\($/,T=/h\d/i,U=/input|select|textarea|button/i,V=/\\(?!\\)/g,W={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),NAME:new RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:new RegExp("^("+F.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+J),POS:new RegExp(K,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),needsContext:new RegExp("^"+E+"*[>+~]|"+K,"i")},X=function(a){var b=r.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return a.appendChild(r.createComment("")),!a.getElementsByTagName("*").length}),Z=X(function(a){return a.innerHT
 ML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),$=X(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),_=X(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML="<a name='"+o+"'></a><div name='"+o+"'></div>",s.insertBefore(a,s.firstChild);var b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}bc.matches=function(a,b){return bc(a,null,null,b)},bc.matchesSelector=function(a,b){return bc(b,null,null,[a]).length>0},f=bc.getText=
 function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=f(b);return c},g=bc.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},h=bc.contains=s.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var c,d=g(a);return d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return a.getAttribute("href",2
 )},type:function(a){return a.getAttribute("type")}},find:{ID:d?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:ba&&function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(V,""),a[3]=(a[4]||a[5]||"").replace(V
 ,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var b,c;if(W.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(")",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return a.slice(0,3)}},filter:{ID:d?function(a){return a=a.replace(V,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(V,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(V,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=B[o][a];return b||(b=B(a,new RegExp("(^|"+E+")"+a+"("+E+"|$)"))),function(a){return b.test(a.className||typ
 eof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return function(d,e){var f=bc.attr(d,a);return f==null?b==="!=":b?(f+="",b==="="?f===c:b==="!="?f!==c:b==="^="?c&&f.indexOf(c)===0:b==="*="?c&&f.indexOf(c)>-1:b==="$="?c&&f.substr(f.length-c.length)===c:b==="~="?(" "+f+" ").indexOf(c)>-1:b==="|="?f===c||f.substr(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d){return a==="nth"?function(a){var b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return e-=d,e===c||e%c===0&&e/c>=0}:function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error("unsupported pseudo: "+a);return d[o]?d(b):d.length>1?(c=[a,a,"",b],e.setFilters.hasOwnProperty(a.toLowerCa
 se())?z(function(a,c){var e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:z(function(a){var b=[],c=[],d=i(a.replace(L,"$1"));return d[o]?z(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return function(b){return bc(a,b).length>0}}),contains:z(function(a){return function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:funct
 ion(a){return T.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:bd("radio"),checkbox:bd("checkbox"),file:bd("file"),password:bd("password"),image:bd("image"),submit:be("submit"),reset:be("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return U.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var d=0;d<b;d+=2)a.push(d);return a}),odd:bf(function(a,b,c){for(var d=1;d<b;d+=2)a.push(d);return a}),lt:bf(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:bf(function(a,b,c){fo
 r(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},j=s.compareDocumentPosition?function(a,b){return a===b?(k=!0,0):(!a.compareDocumentPosition||!b.compareDocumentPosition?a.compareDocumentPosition:a.compareDocumentPosition(b)&4)?-1:1}:function(a,b){if(a===b)return k=!0,0;if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,h=b.parentNode,i=g;if(g===h)return bg(a,b);if(!g)return-1;if(!h)return 1;while(i)e.unshift(i),i=i.parentNode;i=h;while(i)f.unshift(i),i=i.parentNode;c=e.length,d=f.length;for(var j=0;j<c&&j<d;j++)if(e[j]!==f[j])return bg(e[j],f[j]);return j===c?bg(a,f[j],-1):bg(e[j],b,1)},[0,0].sort(j),m=!k,bc.uniqueSort=function(a){var b,c=1;k=m,a.sort(j);if(k)for(;b=a[c];c++)b===a[c-1]&&a.splice(c--,1);return a},bc.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},i=bc.compile=function(a,b){var c,d=[],e=[],f=D[o][a];if(!f){b||(b=bh(a)),c=b.length;while(c--)f=bm(b[c]),f[o]?d.push(f):e.push(f);f=D(a,
 bn(e,d))}return f},r.querySelectorAll&&function(){var a,b=bp,c=/'|\\/g,d=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,e=[":focus"],f=[":active",":focus"],h=s.matchesSelector||s.mozMatchesSelector||s.webkitMatchesSelector||s.oMatchesSelector||s.msMatchesSelector;X(function(a){a.innerHTML="<select><option selected=''></option></select>",a.querySelectorAll("[selected]").length||e.push("\\["+E+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),X(function(a){a.innerHTML="<p test=''></p>",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+E+"*(?:\"\"|'')"),a.innerHTML="<input type='hidden'/>",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=new RegExp(e.join("|")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){i=bh(a),(k=d.getAttribute("id"))?l=k.replace(c,"\\$&"):d.setAttrib
 ute("id",l),l="[id='"+l+"'] ",j=i.length;while(j--)i[j]=l+i[j].join("");m=R.test(a)&&d.parentNode||d,n=i.join(",")}if(n)try{return w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute("id")}}return b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,"div");try{h.call(b,"[test!='']:sizzle"),f.push("!=",J)}catch(c){}}),f=new RegExp(f.join("|")),bc.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return i}catch(j){}return bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[":"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend(
 {find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b<c;b++)if(p.contains(h[b],this))return!0});g=this.pushStack("","find",a);for(b=0,c=this.length;b<c;b++){d=g.length,p.find(a,this[b],g);if(b>0)for(e=d;e<g.length;e++)for(f=0;f<d;f++)if(g[f]===g[e]){g.splice(e--,1);break}}return g},has:function(a){var b,c=p(a,this),d=c.length;return this.filter(function(){for(b=0;b<d;b++)if(p.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(bj(this,a,!1),"not",a)},filter:function(a){return this.pushStack(bj(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?bf.test(a)?p(a,this.context).index(this[0])>=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d<e;d++){c=this[d];while(c&&c.ownerDocument&&c!==b&&c.nodeType!==11){if(g?g.index(c)>-1:p.find.matchesSelector(c,a)){f.push(c);brea
 k}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a
 ,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|f
 igcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/<tbody/i,br=/<|&#?\w+;/,bs=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,bu=new RegExp("<(?:"+bl+")[\\s/>]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,bz={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.ht
 mlSerialize||(bz._default=[1,"X<div>","</div>"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).
 end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){
 var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){return bh(this[0])?this.length?this.pushStack(p(p.isFunction(a)?a():a),"replaceWith",a):this:p.isFunction(a)?this.each(function(b){var c=p(this),d=c.html();c.replaceWith(a.call(this,b,d))}):(type
 of a!="string"&&(a=p(a).detach()),this.each(function(){var b=this.nextSibling,c=this.parentNode;p(this).remove(),b?p(b).before(a):p(c).append(a)}))},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=[].concat.apply([],a);var e,f,g,h,i=0,j=a[0],k=[],l=this.length;if(!p.support.checkClone&&l>1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i<l;i++)d.call(c&&p.nodeName(this[i],"table")?bC(this[i],"tbody"):this[i],i===h?g:p.clone(g,!0,!0))}g=f=null,k.length&&p.each(k,function(a,b){b.src?p.ajax?p.ajax({url:b.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):p.error("no ajax"):p.globalEval((b.text||b.textContent||b.innerHTML||"").replace(by,""
 )),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),p.buildFragment=function(a,c,d){var f,g,h,i=a[0];return c=c||e,c=!c.nodeType&&c[0]||c,c=c.ownerDocument||c,a.length===1&&typeof i=="string"&&i.length<512&&c===e&&i.charAt(0)==="<"&&!bt.test(i)&&(p.support.checkClone||!bw.test(i))&&(p.support.html5Clone||!bu.test(i))&&(g=!0,f=p.fragments[i],h=f!==b),f||(f=c.createDocumentFragment(),p.clean(a,c,f,d),g&&(p.fragments[i]=h&&f)),{fragment:f,cacheable:g}},p.fragments={},p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){p.fn[a]=function(c){var d,e=0,f=[],g=p(c),h=g.length,i=this.length===1&&this[0].parentNode;if((i==null||i&&i.nodeType===11&&i.childNodes.length===1)&&h===1)return g[b](this[0]),this;for(;e<h;e++)d=(e>0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu
 .test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1></$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]==="<table>"&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tb
 ody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(
 f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=
 ([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":
 p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getC
 omputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.curren
 tStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hid
 den(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b
 ():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{ck=f.href}catch(cy){ck=e.createElement("a"),ck.href="",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({u
 rl:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("<div>").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,htm
 l:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+"",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({
 },c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(":")+(i[3]?"":i[1]=
 =="http:"?80:443)!==cj.join(":")+(cj[3]?"":cj[1]==="http:"?80:443)),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);i
 f(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.tes
 t(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=
 c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.
 onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&h){h=p.css(e.elem,a,!0)||c||1;do i=i||".5",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFuncti
 on(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d<e;d++)c=a[d],cT[c]=cT[c]||[],cT[c].unshift(b)},prefilter:function(a,b){b?cS.unshift(a):cS.push(a)}}),p.Tween=cZ,cZ.prototype={constructor:cZ,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(p.cssNumber[c]?"":"px")},cur:function(){var a=cZ.propHooks[this.prop];return a&&a.get?a.get(this):cZ.propHooks._default.get(this)},run:function(a){var b,c=cZ.propHooks[this.prop];return this.options.duration?this.pos=b=p.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):cZ.propHooks._default.set(this),this}},cZ.prototype.init.prototype=cZ.prototype,cZ.propHooks={_default:{get:function(a){var b;return a.elem[a.prop]==null||!!a.elem.style&&a.elem.style[a.prop]!=null?(b=
 p.css(a.elem,a.prop,!1,""),!b||b==="auto"?0:b):a.elem[a.prop]},set:function(a){p.fx.step[a.prop]?p.fx.step[a.prop](a):a.elem.style&&(a.elem.style[p.cssProps[a.prop]]!=null||p.cssHooks[a.prop])?p.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},cZ.propHooks.scrollTop=cZ.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},p.each(["toggle","show","hide"],function(a,b){var c=p.fn[b];p.fn[b]=function(d,e,f){return d==null||typeof d=="boolean"||!a&&p.isFunction(d)&&p.isFunction(e)?c.apply(this,arguments):this.animate(c$(b,!0),d,e,f)}}),p.fn.extend({fadeTo:function(a,b,c,d){return this.filter(bZ).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=p.isEmptyObject(a),f=p.speed(b,c,d),g=function(){var b=cW(this,p.extend({},a),f);e&&b.stop(!0)};return e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return typeof a!="s
 tring"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=a!=null&&a+"queueHooks",f=p.timers,g=p._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cR.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem===this&&(a==null||f[c].queue===a)&&(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&p.dequeue(this,a)})}}),p.each({slideDown:c$("show"),slideUp:c$("hide"),slideToggle:c$("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){p.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),p.speed=function(a,b,c){var d=a&&typeof a=="object"?p.extend({},a):{complete:c||!c&&b||p.isFunction(a)&&a,duration:a,easing:c&&b||b&&!p.isFunction(b)&&b};d.duration=p.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in p.fx.speeds?p.fx.speeds[d.duration]:p.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";return d.old=d.complete,d.complete=function(){p.isFunction(d.old)&&d.old.call(
 this),d.queue&&p.dequeue(this,d.queue)},d},p.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},p.timers=[],p.fx=cZ.prototype.init,p.fx.tick=function(){var a,b=p.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||p.fx.stop()},p.fx.timer=function(a){a()&&p.timers.push(a)&&!cO&&(cO=setInterval(p.fx.tick,p.fx.interval))},p.fx.interval=13,p.fx.stop=function(){clearInterval(cO),cO=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fx.step={},p.expr&&p.expr.filters&&(p.expr.filters.animated=function(a){return p.grep(p.timers,function(b){return a===b.elem}).length});var c_=/^(?:body|html)$/i;p.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){p.offset.setOffset(this,a,b)});var c,d,e,f,g,h,i,j={top:0,left:0},k=this[0],l=k&&k.ownerDocument;if(!l)return;return(d=l.body)===k?p.offset.bodyOffset(k):(c=l.documentElement,p.contains(c,k)?(typeof k.getBoundingClientRect!="undefined"&&(j=k.get
 BoundingClientRect()),e=da(l),f=c.clientTop||d.clientTop||0,g=c.clientLeft||d.clientLeft||0,h=e.pageYOffset||c.scrollTop,i=e.pageXOffset||c.scrollLeft,{top:j.top+h-f,left:j.left+i-g}):j)},p.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;return p.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(p.css(a,"marginTop"))||0,c+=parseFloat(p.css(a,"marginLeft"))||0),{top:b,left:c}},setOffset:function(a,b,c){var d=p.css(a,"position");d==="static"&&(a.style.position="relative");var e=p(a),f=e.offset(),g=p.css(a,"top"),h=p.css(a,"left"),i=(d==="absolute"||d==="fixed")&&p.inArray("auto",[g,h])>-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{to
 p:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border"
 );return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window);
\ No newline at end of file
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/jquery.js b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/jquery.js
deleted file mode 100644
index ae0234d..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/jquery.js
+++ /dev/null
@@ -1,8374 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.5.2
- * http://jquery.com/
- *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Thu Mar 31 15:28:23 2011 -0400
- */
-(function( window, undefined ) {
-
-// Use the correct document accordingly with window argument (sandbox)
-var document = window.document;
-var jQuery = (function() {
-
-// Define a local copy of jQuery
-var jQuery = function( selector, context ) {
-		// The jQuery object is actually just the init constructor 'enhanced'
-		return new jQuery.fn.init( selector, context, rootjQuery );
-	},
-
-	// Map over jQuery in case of overwrite
-	_jQuery = window.jQuery,
-
-	// Map over the $ in case of overwrite
-	_$ = window.$,
-
-	// A central reference to the root jQuery(document)
-	rootjQuery,
-
-	// A simple way to check for HTML strings or ID strings
-	// (both of which we optimize for)
-	quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,
-
-	// Check if a string has a non-whitespace character in it
-	rnotwhite = /\S/,
-
-	// Used for trimming whitespace
-	trimLeft = /^\s+/,
-	trimRight = /\s+$/,
-
-	// Check for digits
-	rdigit = /\d/,
-
-	// Match a standalone tag
-	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
-
-	// JSON RegExp
-	rvalidchars = /^[\],:{}\s]*$/,
-	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
-	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
-	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-
-	// Useragent RegExp
-	rwebkit = /(webkit)[ \/]([\w.]+)/,
-	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
-	rmsie = /(msie) ([\w.]+)/,
-	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
-
-	// Keep a UserAgent string for use with jQuery.browser
-	userAgent = navigator.userAgent,
-
-	// For matching the engine and version of the browser
-	browserMatch,
-
-	// The deferred used on DOM ready
-	readyList,
-
-	// The ready event handler
-	DOMContentLoaded,
-
-	// Save a reference to some core methods
-	toString = Object.prototype.toString,
-	hasOwn = Object.prototype.hasOwnProperty,
-	push = Array.prototype.push,
-	slice = Array.prototype.slice,
-	trim = String.prototype.trim,
-	indexOf = Array.prototype.indexOf,
-
-	// [[Class]] -> type pairs
-	class2type = {};
-
-jQuery.fn = jQuery.prototype = {
-	constructor: jQuery,
-	init: function( selector, context, rootjQuery ) {
-		var match, elem, ret, doc;
-
-		// Handle $(""), $(null), or $(undefined)
-		if ( !selector ) {
-			return this;
-		}
-
-		// Handle $(DOMElement)
-		if ( selector.nodeType ) {
-			this.context = this[0] = selector;
-			this.length = 1;
-			return this;
-		}
-
-		// The body element only exists once, optimize finding it
-		if ( selector === "body" && !context && document.body ) {
-			this.context = document;
-			this[0] = document.body;
-			this.selector = "body";
-			this.length = 1;
-			return this;
-		}
-
-		// Handle HTML strings
-		if ( typeof selector === "string" ) {
-			// Are we dealing with HTML string or an ID?
-			match = quickExpr.exec( selector );
-
-			// Verify a match, and that no context was specified for #id
-			if ( match && (match[1] || !context) ) {
-
-				// HANDLE: $(html) -> $(array)
-				if ( match[1] ) {
-					context = context instanceof jQuery ? context[0] : context;
-					doc = (context ? context.ownerDocument || context : document);
-
-					// If a single string is passed in and it's a single tag
-					// just do a createElement and skip the rest
-					ret = rsingleTag.exec( selector );
-
-					if ( ret ) {
-						if ( jQuery.isPlainObject( context ) ) {
-							selector = [ document.createElement( ret[1] ) ];
-							jQuery.fn.attr.call( selector, context, true );
-
-						} else {
-							selector = [ doc.createElement( ret[1] ) ];
-						}
-
-					} else {
-						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
-						selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
-					}
-
-					return jQuery.merge( this, selector );
-
-				// HANDLE: $("#id")
-				} else {
-					elem = document.getElementById( match[2] );
-
-					// Check parentNode to catch when Blackberry 4.6 returns
-					// nodes that are no longer in the document #6963
-					if ( elem && elem.parentNode ) {
-						// Handle the case where IE and Opera return items
-						// by name instead of ID
-						if ( elem.id !== match[2] ) {
-							return rootjQuery.find( selector );
-						}
-
-						// Otherwise, we inject the element directly into the jQuery object
-						this.length = 1;
-						this[0] = elem;
-					}
-
-					this.context = document;
-					this.selector = selector;
-					return this;
-				}
-
-			// HANDLE: $(expr, $(...))
-			} else if ( !context || context.jquery ) {
-				return (context || rootjQuery).find( selector );
-
-			// HANDLE: $(expr, context)
-			// (which is just equivalent to: $(context).find(expr)
-			} else {
-				return this.constructor( context ).find( selector );
-			}
-
-		// HANDLE: $(function)
-		// Shortcut for document ready
-		} else if ( jQuery.isFunction( selector ) ) {
-			return rootjQuery.ready( selector );
-		}
-
-		if (selector.selector !== undefined) {
-			this.selector = selector.selector;
-			this.context = selector.context;
-		}
-
-		return jQuery.makeArray( selector, this );
-	},
-
-	// Start with an empty selector
-	selector: "",
-
-	// The current version of jQuery being used
-	jquery: "1.5.2",
-
-	// The default length of a jQuery object is 0
-	length: 0,
-
-	// The number of elements contained in the matched element set
-	size: function() {
-		return this.length;
-	},
-
-	toArray: function() {
-		return slice.call( this, 0 );
-	},
-
-	// Get the Nth element in the matched element set OR
-	// Get the whole matched element set as a clean array
-	get: function( num ) {
-		return num == null ?
-
-			// Return a 'clean' array
-			this.toArray() :
-
-			// Return just the object
-			( num < 0 ? this[ this.length + num ] : this[ num ] );
-	},
-
-	// Take an array of elements and push it onto the stack
-	// (returning the new matched element set)
-	pushStack: function( elems, name, selector ) {
-		// Build a new jQuery matched element set
-		var ret = this.constructor();
-
-		if ( jQuery.isArray( elems ) ) {
-			push.apply( ret, elems );
-
-		} else {
-			jQuery.merge( ret, elems );
-		}
-
-		// Add the old object onto the stack (as a reference)
-		ret.prevObject = this;
-
-		ret.context = this.context;
-
-		if ( name === "find" ) {
-			ret.selector = this.selector + (this.selector ? " " : "") + selector;
-		} else if ( name ) {
-			ret.selector = this.selector + "." + name + "(" + selector + ")";
-		}
-
-		// Return the newly-formed element set
-		return ret;
-	},
-
-	// Execute a callback for every element in the matched set.
-	// (You can seed the arguments with an array of args, but this is
-	// only used internally.)
-	each: function( callback, args ) {
-		return jQuery.each( this, callback, args );
-	},
-
-	ready: function( fn ) {
-		// Attach the listeners
-		jQuery.bindReady();
-
-		// Add the callback
-		readyList.done( fn );
-
-		return this;
-	},
-
-	eq: function( i ) {
-		return i === -1 ?
-			this.slice( i ) :
-			this.slice( i, +i + 1 );
-	},
-
-	first: function() {
-		return this.eq( 0 );
-	},
-
-	last: function() {
-		return this.eq( -1 );
-	},
-
-	slice: function() {
-		return this.pushStack( slice.apply( this, arguments ),
-			"slice", slice.call(arguments).join(",") );
-	},
-
-	map: function( callback ) {
-		return this.pushStack( jQuery.map(this, function( elem, i ) {
-			return callback.call( elem, i, elem );
-		}));
-	},
-
-	end: function() {
-		return this.prevObject || this.constructor(null);
-	},
-
-	// For internal use only.
-	// Behaves like an Array's method, not like a jQuery method.
-	push: push,
-	sort: [].sort,
-	splice: [].splice
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.extend = jQuery.fn.extend = function() {
-	var options, name, src, copy, copyIsArray, clone,
-		target = arguments[0] || {},
-		i = 1,
-		length = arguments.length,
-		deep = false;
-
-	// Handle a deep copy situation
-	if ( typeof target === "boolean" ) {
-		deep = target;
-		target = arguments[1] || {};
-		// skip the boolean and the target
-		i = 2;
-	}
-
-	// Handle case when target is a string or something (possible in deep copy)
-	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
-		target = {};
-	}
-
-	// extend jQuery itself if only one argument is passed
-	if ( length === i ) {
-		target = this;
-		--i;
-	}
-
-	for ( ; i < length; i++ ) {
-		// Only deal with non-null/undefined values
-		if ( (options = arguments[ i ]) != null ) {
-			// Extend the base object
-			for ( name in options ) {
-				src = target[ name ];
-				copy = options[ name ];
-
-				// Prevent never-ending loop
-				if ( target === copy ) {
-					continue;
-				}
-
-				// Recurse if we're merging plain objects or arrays
-				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
-					if ( copyIsArray ) {
-						copyIsArray = false;
-						clone = src && jQuery.isArray(src) ? src : [];
-
-					} else {
-						clone = src && jQuery.isPlainObject(src) ? src : {};
-					}
-
-					// Never move original objects, clone them
-					target[ name ] = jQuery.extend( deep, clone, copy );
-
-				// Don't bring in undefined values
-				} else if ( copy !== undefined ) {
-					target[ name ] = copy;
-				}
-			}
-		}
-	}
-
-	// Return the modified object
-	return target;
-};
-
-jQuery.extend({
-	noConflict: function( deep ) {
-		window.$ = _$;
-
-		if ( deep ) {
-			window.jQuery = _jQuery;
-		}
-
-		return jQuery;
-	},
-
-	// Is the DOM ready to be used? Set to true once it occurs.
-	isReady: false,
-
-	// A counter to track how many items to wait for before
-	// the ready event fires. See #6781
-	readyWait: 1,
-
-	// Handle when the DOM is ready
-	ready: function( wait ) {
-		// A third-party is pushing the ready event forwards
-		if ( wait === true ) {
-			jQuery.readyWait--;
-		}
-
-		// Make sure that the DOM is not already loaded
-		if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) {
-			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-			if ( !document.body ) {
-				return setTimeout( jQuery.ready, 1 );
-			}
-
-			// Remember that the DOM is ready
-			jQuery.isReady = true;
-
-			// If a normal DOM Ready event fired, decrement, and wait if need be
-			if ( wait !== true && --jQuery.readyWait > 0 ) {
-				return;
-			}
-
-			// If there are functions bound, to execute
-			readyList.resolveWith( document, [ jQuery ] );
-
-			// Trigger any bound ready events
-			if ( jQuery.fn.trigger ) {
-				jQuery( document ).trigger( "ready" ).unbind( "ready" );
-			}
-		}
-	},
-
-	bindReady: function() {
-		if ( readyList ) {
-			return;
-		}
-
-		readyList = jQuery._Deferred();
-
-		// Catch cases where $(document).ready() is called after the
-		// browser event has already occurred.
-		if ( document.readyState === "complete" ) {
-			// Handle it asynchronously to allow scripts the opportunity to delay ready
-			return setTimeout( jQuery.ready, 1 );
-		}
-
-		// Mozilla, Opera and webkit nightlies currently support this event
-		if ( document.addEventListener ) {
-			// Use the handy event callback
-			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-
-			// A fallback to window.onload, that will always work
-			window.addEventListener( "load", jQuery.ready, false );
-
-		// If IE event model is used
-		} else if ( document.attachEvent ) {
-			// ensure firing before onload,
-			// maybe late but safe also for iframes
-			document.attachEvent("onreadystatechange", DOMContentLoaded);
-
-			// A fallback to window.onload, that will always work
-			window.attachEvent( "onload", jQuery.ready );
-
-			// If IE and not a frame
-			// continually check to see if the document is ready
-			var toplevel = false;
-
-			try {
-				toplevel = window.frameElement == null;
-			} catch(e) {}
-
-			if ( document.documentElement.doScroll && toplevel ) {
-				doScrollCheck();
-			}
-		}
-	},
-
-	// See test/unit/core.js for details concerning isFunction.
-	// Since version 1.3, DOM methods and functions like alert
-	// aren't supported. They return false on IE (#2968).
-	isFunction: function( obj ) {
-		return jQuery.type(obj) === "function";
-	},
-
-	isArray: Array.isArray || function( obj ) {
-		return jQuery.type(obj) === "array";
-	},
-
-	// A crude way of determining if an object is a window
-	isWindow: function( obj ) {
-		return obj && typeof obj === "object" && "setInterval" in obj;
-	},
-
-	isNaN: function( obj ) {
-		return obj == null || !rdigit.test( obj ) || isNaN( obj );
-	},
-
-	type: function( obj ) {
-		return obj == null ?
-			String( obj ) :
-			class2type[ toString.call(obj) ] || "object";
-	},
-
-	isPlainObject: function( obj ) {
-		// Must be an Object.
-		// Because of IE, we also have to check the presence of the constructor property.
-		// Make sure that DOM nodes and window objects don't pass through, as well
-		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
-			return false;
-		}
-
-		// Not own constructor property must be Object
-		if ( obj.constructor &&
-			!hasOwn.call(obj, "constructor") &&
-			!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
-			return false;
-		}
-
-		// Own properties are enumerated firstly, so to speed up,
-		// if last one is own, then all properties are own.
-
-		var key;
-		for ( key in obj ) {}
-
-		return key === undefined || hasOwn.call( obj, key );
-	},
-
-	isEmptyObject: function( obj ) {
-		for ( var name in obj ) {
-			return false;
-		}
-		return true;
-	},
-
-	error: function( msg ) {
-		throw msg;
-	},
-
-	parseJSON: function( data ) {
-		if ( typeof data !== "string" || !data ) {
-			return null;
-		}
-
-		// Make sure leading/trailing whitespace is removed (IE can't handle it)
-		data = jQuery.trim( data );
-
-		// Make sure the incoming data is actual JSON
-		// Logic borrowed from http://json.org/json2.js
-		if ( rvalidchars.test(data.replace(rvalidescape, "@")
-			.replace(rvalidtokens, "]")
-			.replace(rvalidbraces, "")) ) {
-
-			// Try to use the native JSON parser first
-			return window.JSON && window.JSON.parse ?
-				window.JSON.parse( data ) :
-				(new Function("return " + data))();
-
-		} else {
-			jQuery.error( "Invalid JSON: " + data );
-		}
-	},
-
-	// Cross-browser xml parsing
-	// (xml & tmp used internally)
-	parseXML: function( data , xml , tmp ) {
-
-		if ( window.DOMParser ) { // Standard
-			tmp = new DOMParser();
-			xml = tmp.parseFromString( data , "text/xml" );
-		} else { // IE
-			xml = new ActiveXObject( "Microsoft.XMLDOM" );
-			xml.async = "false";
-			xml.loadXML( data );
-		}
-
-		tmp = xml.documentElement;
-
-		if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
-			jQuery.error( "Invalid XML: " + data );
-		}
-
-		return xml;
-	},
-
-	noop: function() {},
-
-	// Evalulates a script in a global context
-	globalEval: function( data ) {
-		if ( data && rnotwhite.test(data) ) {
-			// Inspired by code by Andrea Giammarchi
-			// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
-			var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement,
-				script = document.createElement( "script" );
-
-			if ( jQuery.support.scriptEval() ) {
-				script.appendChild( document.createTextNode( data ) );
-			} else {
-				script.text = data;
-			}
-
-			// Use insertBefore instead of appendChild to circumvent an IE6 bug.
-			// This arises when a base node is used (#2709).
-			head.insertBefore( script, head.firstChild );
-			head.removeChild( script );
-		}
-	},
-
-	nodeName: function( elem, name ) {
-		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
-	},
-
-	// args is for internal usage only
-	each: function( object, callback, args ) {
-		var name, i = 0,
-			length = object.length,
-			isObj = length === undefined || jQuery.isFunction(object);
-
-		if ( args ) {
-			if ( isObj ) {
-				for ( name in object ) {
-					if ( callback.apply( object[ name ], args ) === false ) {
-						break;
-					}
-				}
-			} else {
-				for ( ; i < length; ) {
-					if ( callback.apply( object[ i++ ], args ) === false ) {
-						break;
-					}
-				}
-			}
-
-		// A special, fast, case for the most common use of each
-		} else {
-			if ( isObj ) {
-				for ( name in object ) {
-					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
-						break;
-					}
-				}
-			} else {
-				for ( var value = object[0];
-					i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
-			}
-		}
-
-		return object;
-	},
-
-	// Use native String.trim function wherever possible
-	trim: trim ?
-		function( text ) {
-			return text == null ?
-				"" :
-				trim.call( text );
-		} :
-
-		// Otherwise use our own trimming functionality
-		function( text ) {
-			return text == null ?
-				"" :
-				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
-		},
-
-	// results is for internal usage only
-	makeArray: function( array, results ) {
-		var ret = results || [];
-
-		if ( array != null ) {
-			// The window, strings (and functions) also have 'length'
-			// The extra typeof function check is to prevent crashes
-			// in Safari 2 (See: #3039)
-			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
-			var type = jQuery.type(array);
-
-			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
-				push.call( ret, array );
-			} else {
-				jQuery.merge( ret, array );
-			}
-		}
-
-		return ret;
-	},
-
-	inArray: function( elem, array ) {
-		if ( array.indexOf ) {
-			return array.indexOf( elem );
-		}
-
-		for ( var i = 0, length = array.length; i < length; i++ ) {
-			if ( array[ i ] === elem ) {
-				return i;
-			}
-		}
-
-		return -1;
-	},
-
-	merge: function( first, second ) {
-		var i = first.length,
-			j = 0;
-
-		if ( typeof second.length === "number" ) {
-			for ( var l = second.length; j < l; j++ ) {
-				first[ i++ ] = second[ j ];
-			}
-
-		} else {
-			while ( second[j] !== undefined ) {
-				first[ i++ ] = second[ j++ ];
-			}
-		}
-
-		first.length = i;
-
-		return first;
-	},
-
-	grep: function( elems, callback, inv ) {
-		var ret = [], retVal;
-		inv = !!inv;
-
-		// Go through the array, only saving the items
-		// that pass the validator function
-		for ( var i = 0, length = elems.length; i < length; i++ ) {
-			retVal = !!callback( elems[ i ], i );
-			if ( inv !== retVal ) {
-				ret.push( elems[ i ] );
-			}
-		}
-
-		return ret;
-	},
-
-	// arg is for internal usage only
-	map: function( elems, callback, arg ) {
-		var ret = [], value;
-
-		// Go through the array, translating each of the items to their
-		// new value (or values).
-		for ( var i = 0, length = elems.length; i < length; i++ ) {
-			value = callback( elems[ i ], i, arg );
-
-			if ( value != null ) {
-				ret[ ret.length ] = value;
-			}
-		}
-
-		// Flatten any nested arrays
-		return ret.concat.apply( [], ret );
-	},
-
-	// A global GUID counter for objects
-	guid: 1,
-
-	proxy: function( fn, proxy, thisObject ) {
-		if ( arguments.length === 2 ) {
-			if ( typeof proxy === "string" ) {
-				thisObject = fn;
-				fn = thisObject[ proxy ];
-				proxy = undefined;
-
-			} else if ( proxy && !jQuery.isFunction( proxy ) ) {
-				thisObject = proxy;
-				proxy = undefined;
-			}
-		}
-
-		if ( !proxy && fn ) {
-			proxy = function() {
-				return fn.apply( thisObject || this, arguments );
-			};
-		}
-
-		// Set the guid of unique handler to the same of original handler, so it can be removed
-		if ( fn ) {
-			proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
-		}
-
-		// So proxy can be declared as an argument
-		return proxy;
-	},
-
-	// Mutifunctional method to get and set values to a collection
-	// The value/s can be optionally by executed if its a function
-	access: function( elems, key, value, exec, fn, pass ) {
-		var length = elems.length;
-
-		// Setting many attributes
-		if ( typeof key === "object" ) {
-			for ( var k in key ) {
-				jQuery.access( elems, k, key[k], exec, fn, value );
-			}
-			return elems;
-		}
-
-		// Setting one attribute
-		if ( value !== undefined ) {
-			// Optionally, function values get executed if exec is true
-			exec = !pass && exec && jQuery.isFunction(value);
-
-			for ( var i = 0; i < length; i++ ) {
-				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
-			}
-
-			return elems;
-		}
-
-		// Getting an attribute
-		return length ? fn( elems[0], key ) : undefined;
-	},
-
-	now: function() {
-		return (new Date()).getTime();
-	},
-
-	// Use of jQuery.browser is frowned upon.
-	// More details: http://docs.jquery.com/Utilities/jQuery.browser
-	uaMatch: function( ua ) {
-		ua = ua.toLowerCase();
-
-		var match = rwebkit.exec( ua ) ||
-			ropera.exec( ua ) ||
-			rmsie.exec( ua ) ||
-			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
-			[];
-
-		return { browser: match[1] || "", version: match[2] || "0" };
-	},
-
-	sub: function() {
-		function jQuerySubclass( selector, context ) {
-			return new jQuerySubclass.fn.init( selector, context );
-		}
-		jQuery.extend( true, jQuerySubclass, this );
-		jQuerySubclass.superclass = this;
-		jQuerySubclass.fn = jQuerySubclass.prototype = this();
-		jQuerySubclass.fn.constructor = jQuerySubclass;
-		jQuerySubclass.subclass = this.subclass;
-		jQuerySubclass.fn.init = function init( selector, context ) {
-			if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) {
-				context = jQuerySubclass(context);
-			}
-
-			return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
-		};
-		jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;
-		var rootjQuerySubclass = jQuerySubclass(document);
-		return jQuerySubclass;
-	},
-
-	browser: {}
-});
-
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
-	class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
-
-browserMatch = jQuery.uaMatch( userAgent );
-if ( browserMatch.browser ) {
-	jQuery.browser[ browserMatch.browser ] = true;
-	jQuery.browser.version = browserMatch.version;
-}
-
-// Deprecated, use jQuery.browser.webkit instead
-if ( jQuery.browser.webkit ) {
-	jQuery.browser.safari = true;
-}
-
-if ( indexOf ) {
-	jQuery.inArray = function( elem, array ) {
-		return indexOf.call( array, elem );
-	};
-}
-
-// IE doesn't match non-breaking spaces with \s
-if ( rnotwhite.test( "\xA0" ) ) {
-	trimLeft = /^[\s\xA0]+/;
-	trimRight = /[\s\xA0]+$/;
-}
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-
-// Cleanup functions for the document ready method
-if ( document.addEventListener ) {
-	DOMContentLoaded = function() {
-		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-		jQuery.ready();
-	};
-
-} else if ( document.attachEvent ) {
-	DOMContentLoaded = function() {
-		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-		if ( document.readyState === "complete" ) {
-			document.detachEvent( "onreadystatechange", DOMContentLoaded );
-			jQuery.ready();
-		}
-	};
-}
-
-// The DOM ready check for Internet Explorer
-function doScrollCheck() {
-	if ( jQuery.isReady ) {
-		return;
-	}
-
-	try {
-		// If IE is used, use the trick by Diego Perini
-		// http://javascript.nwbox.com/IEContentLoaded/
-		document.documentElement.doScroll("left");
-	} catch(e) {
-		setTimeout( doScrollCheck, 1 );
-		return;
-	}
-
-	// and execute any waiting functions
-	jQuery.ready();
-}
-
-// Expose jQuery to the global object
-return jQuery;
-
-})();
-
-
-var // Promise methods
-	promiseMethods = "then done fail isResolved isRejected promise".split( " " ),
-	// Static reference to slice
-	sliceDeferred = [].slice;
-
-jQuery.extend({
-	// Create a simple deferred (one callbacks list)
-	_Deferred: function() {
-		var // callbacks list
-			callbacks = [],
-			// stored [ context , args ]
-			fired,
-			// to avoid firing when already doing so
-			firing,
-			// flag to know if the deferred has been cancelled
-			cancelled,
-			// the deferred itself
-			deferred  = {
-
-				// done( f1, f2, ...)
-				done: function() {
-					if ( !cancelled ) {
-						var args = arguments,
-							i,
-							length,
-							elem,
-							type,
-							_fired;
-						if ( fired ) {
-							_fired = fired;
-							fired = 0;
-						}
-						for ( i = 0, length = args.length; i < length; i++ ) {
-							elem = args[ i ];
-							type = jQuery.type( elem );
-							if ( type === "array" ) {
-								deferred.done.apply( deferred, elem );
-							} else if ( type === "function" ) {
-								callbacks.push( elem );
-							}
-						}
-						if ( _fired ) {
-							deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
-						}
-					}
-					return this;
-				},
-
-				// resolve with given context and args
-				resolveWith: function( context, args ) {
-					if ( !cancelled && !fired && !firing ) {
-						// make sure args are available (#8421)
-						args = args || [];
-						firing = 1;
-						try {
-							while( callbacks[ 0 ] ) {
-								callbacks.shift().apply( context, args );
-							}
-						}
-						finally {
-							fired = [ context, args ];
-							firing = 0;
-						}
-					}
-					return this;
-				},
-
-				// resolve with this as context and given arguments
-				resolve: function() {
-					deferred.resolveWith( this, arguments );
-					return this;
-				},
-
-				// Has this deferred been resolved?
-				isResolved: function() {
-					return !!( firing || fired );
-				},
-
-				// Cancel
-				cancel: function() {
-					cancelled = 1;
-					callbacks = [];
-					return this;
-				}
-			};
-
-		return deferred;
-	},
-
-	// Full fledged deferred (two callbacks list)
-	Deferred: function( func ) {
-		var deferred = jQuery._Deferred(),
-			failDeferred = jQuery._Deferred(),
-			promise;
-		// Add errorDeferred methods, then and promise
-		jQuery.extend( deferred, {
-			then: function( doneCallbacks, failCallbacks ) {
-				deferred.done( doneCallbacks ).fail( failCallbacks );
-				return this;
-			},
-			fail: failDeferred.done,
-			rejectWith: failDeferred.resolveWith,
-			reject: failDeferred.resolve,
-			isRejected: failDeferred.isResolved,
-			// Get a promise for this deferred
-			// If obj is provided, the promise aspect is added to the object
-			promise: function( obj ) {
-				if ( obj == null ) {
-					if ( promise ) {
-						return promise;
-					}
-					promise = obj = {};
-				}
-				var i = promiseMethods.length;
-				while( i-- ) {
-					obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
-				}
-				return obj;
-			}
-		} );
-		// Make sure only one callback list will be used
-		deferred.done( failDeferred.cancel ).fail( deferred.cancel );
-		// Unexpose cancel
-		delete deferred.cancel;
-		// Call given func if any
-		if ( func ) {
-			func.call( deferred, deferred );
-		}
-		return deferred;
-	},
-
-	// Deferred helper
-	when: function( firstParam ) {
-		var args = arguments,
-			i = 0,
-			length = args.length,
-			count = length,
-			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
-				firstParam :
-				jQuery.Deferred();
-		function resolveFunc( i ) {
-			return function( value ) {
-				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
-				if ( !( --count ) ) {
-					// Strange bug in FF4:
-					// Values changed onto the arguments object sometimes end up as undefined values
-					// outside the $.when method. Cloning the object into a fresh array solves the issue
-					deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
-				}
-			};
-		}
-		if ( length > 1 ) {
-			for( ; i < length; i++ ) {
-				if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
-					args[ i ].promise().then( resolveFunc(i), deferred.reject );
-				} else {
-					--count;
-				}
-			}
-			if ( !count ) {
-				deferred.resolveWith( deferred, args );
-			}
-		} else if ( deferred !== firstParam ) {
-			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
-		}
-		return deferred.promise();
-	}
-});
-
-
-
-
-(function() {
-
-	jQuery.support = {};
-
-	var div = document.createElement("div");
-
-	div.style.display = "none";
-	div.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
-
-	var all = div.getElementsByTagName("*"),
-		a = div.getElementsByTagName("a")[0],
-		select = document.createElement("select"),
-		opt = select.appendChild( document.createElement("option") ),
-		input = div.getElementsByTagName("input")[0];
-
-	// Can't get basic test support
-	if ( !all || !all.length || !a ) {
-		return;
-	}
-
-	jQuery.support = {
-		// IE strips leading whitespace when .innerHTML is used
-		leadingWhitespace: div.firstChild.nodeType === 3,
-
-		// Make sure that tbody elements aren't automatically inserted
-		// IE will insert them into empty tables
-		tbody: !div.getElementsByTagName("tbody").length,
-
-		// Make sure that link elements get serialized correctly by innerHTML
-		// This requires a wrapper element in IE
-		htmlSerialize: !!div.getElementsByTagName("link").length,
-
-		// Get the style information from getAttribute
-		// (IE uses .cssText insted)
-		style: /red/.test( a.getAttribute("style") ),
-
-		// Make sure that URLs aren't manipulated
-		// (IE normalizes it by default)
-		hrefNormalized: a.getAttribute("href") === "/a",
-
-		// Make sure that element opacity exists
-		// (IE uses filter instead)
-		// Use a regex to work around a WebKit issue. See #5145
-		opacity: /^0.55$/.test( a.style.opacity ),
-
-		// Verify style float existence
-		// (IE uses styleFloat instead of cssFloat)
-		cssFloat: !!a.style.cssFloat,
-
-		// Make sure that if no value is specified for a checkbox
-		// that it defaults to "on".
-		// (WebKit defaults to "" instead)
-		checkOn: input.value === "on",
-
-		// Make sure that a selected-by-default option has a working selected property.
-		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
-		optSelected: opt.selected,
-
-		// Will be defined later
-		deleteExpando: true,
-		optDisabled: false,
-		checkClone: false,
-		noCloneEvent: true,
-		noCloneChecked: true,
-		boxModel: null,
-		inlineBlockNeedsLayout: false,
-		shrinkWrapBlocks: false,
-		reliableHiddenOffsets: true,
-		reliableMarginRight: true
-	};
-
-	input.checked = true;
-	jQuery.support.noCloneChecked = input.cloneNode( true ).checked;
-
-	// Make sure that the options inside disabled selects aren't marked as disabled
-	// (WebKit marks them as diabled)
-	select.disabled = true;
-	jQuery.support.optDisabled = !opt.disabled;
-
-	var _scriptEval = null;
-	jQuery.support.scriptEval = function() {
-		if ( _scriptEval === null ) {
-			var root = document.documentElement,
-				script = document.createElement("script"),
-				id = "script" + jQuery.now();
-
-			// Make sure that the execution of code works by injecting a script
-			// tag with appendChild/createTextNode
-			// (IE doesn't support this, fails, and uses .text instead)
-			try {
-				script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
-			} catch(e) {}
-
-			root.insertBefore( script, root.firstChild );
-
-			if ( window[ id ] ) {
-				_scriptEval = true;
-				delete window[ id ];
-			} else {
-				_scriptEval = false;
-			}
-
-			root.removeChild( script );
-		}
-
-		return _scriptEval;
-	};
-
-	// Test to see if it's possible to delete an expando from an element
-	// Fails in Internet Explorer
-	try {
-		delete div.test;
-
-	} catch(e) {
-		jQuery.support.deleteExpando = false;
-	}
-
-	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
-		div.attachEvent("onclick", function click() {
-			// Cloning a node shouldn't copy over any
-			// bound event handlers (IE does this)
-			jQuery.support.noCloneEvent = false;
-			div.detachEvent("onclick", click);
-		});
-		div.cloneNode(true).fireEvent("onclick");
-	}
-
-	div = document.createElement("div");
-	div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
-
-	var fragment = document.createDocumentFragment();
-	fragment.appendChild( div.firstChild );
-
-	// WebKit doesn't clone checked state correctly in fragments
-	jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
-
-	// Figure out if the W3C box model works as expected
-	// document.body must exist before we can do this
-	jQuery(function() {
-		var div = document.createElement("div"),
-			body = document.getElementsByTagName("body")[0];
-
-		// Frameset documents with no body should not run this code
-		if ( !body ) {
-			return;
-		}
-
-		div.style.width = div.style.paddingLeft = "1px";
-		body.appendChild( div );
-		jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
-
-		if ( "zoom" in div.style ) {
-			// Check if natively block-level elements act like inline-block
-			// elements when setting their display to 'inline' and giving
-			// them layout
-			// (IE < 8 does this)
-			div.style.display = "inline";
-			div.style.zoom = 1;
-			jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2;
-
-			// Check if elements with layout shrink-wrap their children
-			// (IE 6 does this)
-			div.style.display = "";
-			div.innerHTML = "<div style='width:4px;'></div>";
-			jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2;
-		}
-
-		div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
-		var tds = div.getElementsByTagName("td");
-
-		// Check if table cells still have offsetWidth/Height when they are set
-		// to display:none and there are still other visible table cells in a
-		// table row; if so, offsetWidth/Height are not reliable for use when
-		// determining if an element has been hidden directly using
-		// display:none (it is still safe to use offsets if a parent element is
-		// hidden; don safety goggles and see bug #4512 for more information).
-		// (only IE 8 fails this test)
-		jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0;
-
-		tds[0].style.display = "";
-		tds[1].style.display = "none";
-
-		// Check if empty table cells still have offsetWidth/Height
-		// (IE < 8 fail this test)
-		jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0;
-		div.innerHTML = "";
-
-		// Check if div with explicit width and no margin-right incorrectly
-		// gets computed margin-right based on width of container. For more
-		// info see bug #3333
-		// Fails in WebKit before Feb 2011 nightlies
-		// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-		if ( document.defaultView && document.defaultView.getComputedStyle ) {
-			div.style.width = "1px";
-			div.style.marginRight = "0";
-			jQuery.support.reliableMarginRight = ( parseInt(document.defaultView.getComputedStyle(div, null).marginRight, 10) || 0 ) === 0;
-		}
-
-		body.removeChild( div ).style.display = "none";
-		div = tds = null;
-	});
-
-	// Technique from Juriy Zaytsev
-	// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
-	var eventSupported = function( eventName ) {
-		var el = document.createElement("div");
-		eventName = "on" + eventName;
-
-		// We only care about the case where non-standard event systems
-		// are used, namely in IE. Short-circuiting here helps us to
-		// avoid an eval call (in setAttribute) which can cause CSP
-		// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
-		if ( !el.attachEvent ) {
-			return true;
-		}
-
-		var isSupported = (eventName in el);
-		if ( !isSupported ) {
-			el.setAttribute(eventName, "return;");
-			isSupported = typeof el[eventName] === "function";
-		}
-		return isSupported;
-	};
-
-	jQuery.support.submitBubbles = eventSupported("submit");
-	jQuery.support.changeBubbles = eventSupported("change");
-
-	// release memory in IE
-	div = all = a = null;
-})();
-
-
-
-var rbrace = /^(?:\{.*\}|\[.*\])$/;
-
-jQuery.extend({
-	cache: {},
-
-	// Please use with caution
-	uuid: 0,
-
-	// Unique for each copy of jQuery on the page
-	// Non-digits removed to match rinlinejQuery
-	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
-
-	// The following elements throw uncatchable exceptions if you
-	// attempt to add expando properties to them.
-	noData: {
-		"embed": true,
-		// Ban all objects except for Flash (which handle expandos)
-		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
-		"applet": true
-	},
-
-	hasData: function( elem ) {
-		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-
-		return !!elem && !isEmptyDataObject( elem );
-	},
-
-	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
-		if ( !jQuery.acceptData( elem ) ) {
-			return;
-		}
-
-		var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache,
-
-			// We have to handle DOM nodes and JS objects differently because IE6-7
-			// can't GC object references properly across the DOM-JS boundary
-			isNode = elem.nodeType,
-
-			// Only DOM nodes need the global jQuery cache; JS object data is
-			// attached directly to the object so GC can occur automatically
-			cache = isNode ? jQuery.cache : elem,
-
-			// Only defining an ID for JS objects if its cache already exists allows
-			// the code to shortcut on the same path as a DOM node with no cache
-			id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
-
-		// Avoid doing any more work than we need to when trying to get data on an
-		// object that has no data at all
-		if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) {
-			return;
-		}
-
-		if ( !id ) {
-			// Only DOM nodes need a new unique ID for each element since their data
-			// ends up in the global cache
-			if ( isNode ) {
-				elem[ jQuery.expando ] = id = ++jQuery.uuid;
-			} else {
-				id = jQuery.expando;
-			}
-		}
-
-		if ( !cache[ id ] ) {
-			cache[ id ] = {};
-
-			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
-			// metadata on plain JS objects when the object is serialized using
-			// JSON.stringify
-			if ( !isNode ) {
-				cache[ id ].toJSON = jQuery.noop;
-			}
-		}
-
-		// An object can be passed to jQuery.data instead of a key/value pair; this gets
-		// shallow copied over onto the existing cache
-		if ( typeof name === "object" || typeof name === "function" ) {
-			if ( pvt ) {
-				cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
-			} else {
-				cache[ id ] = jQuery.extend(cache[ id ], name);
-			}
-		}
-
-		thisCache = cache[ id ];
-
-		// Internal jQuery data is stored in a separate object inside the object's data
-		// cache in order to avoid key collisions between internal data and user-defined
-		// data
-		if ( pvt ) {
-			if ( !thisCache[ internalKey ] ) {
-				thisCache[ internalKey ] = {};
-			}
-
-			thisCache = thisCache[ internalKey ];
-		}
-
-		if ( data !== undefined ) {
-			thisCache[ name ] = data;
-		}
-
-		// TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
-		// not attempt to inspect the internal events object using jQuery.data, as this
-		// internal data object is undocumented and subject to change.
-		if ( name === "events" && !thisCache[name] ) {
-			return thisCache[ internalKey ] && thisCache[ internalKey ].events;
-		}
-
-		return getByName ? thisCache[ name ] : thisCache;
-	},
-
-	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
-		if ( !jQuery.acceptData( elem ) ) {
-			return;
-		}
-
-		var internalKey = jQuery.expando, isNode = elem.nodeType,
-
-			// See jQuery.data for more information
-			cache = isNode ? jQuery.cache : elem,
-
-			// See jQuery.data for more information
-			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
-		// If there is already no cache entry for this object, there is no
-		// purpose in continuing
-		if ( !cache[ id ] ) {
-			return;
-		}
-
-		if ( name ) {
-			var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
-
-			if ( thisCache ) {
-				delete thisCache[ name ];
-
-				// If there is no data left in the cache, we want to continue
-				// and let the cache object itself get destroyed
-				if ( !isEmptyDataObject(thisCache) ) {
-					return;
-				}
-			}
-		}
-
-		// See jQuery.data for more information
-		if ( pvt ) {
-			delete cache[ id ][ internalKey ];
-
-			// Don't destroy the parent cache unless the internal data object
-			// had been the only thing left in it
-			if ( !isEmptyDataObject(cache[ id ]) ) {
-				return;
-			}
-		}
-
-		var internalCache = cache[ id ][ internalKey ];
-
-		// Browsers that fail expando deletion also refuse to delete expandos on
-		// the window, but it will allow it on all other JS objects; other browsers
-		// don't care
-		if ( jQuery.support.deleteExpando || cache != window ) {
-			delete cache[ id ];
-		} else {
-			cache[ id ] = null;
-		}
-
-		// We destroyed the entire user cache at once because it's faster than
-		// iterating through each key, but we need to continue to persist internal
-		// data if it existed
-		if ( internalCache ) {
-			cache[ id ] = {};
-			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
-			// metadata on plain JS objects when the object is serialized using
-			// JSON.stringify
-			if ( !isNode ) {
-				cache[ id ].toJSON = jQuery.noop;
-			}
-
-			cache[ id ][ internalKey ] = internalCache;
-
-		// Otherwise, we need to eliminate the expando on the node to avoid
-		// false lookups in the cache for entries that no longer exist
-		} else if ( isNode ) {
-			// IE does not allow us to delete expando properties from nodes,
-			// nor does it have a removeAttribute function on Document nodes;
-			// we must handle all of these cases
-			if ( jQuery.support.deleteExpando ) {
-				delete elem[ jQuery.expando ];
-			} else if ( elem.removeAttribute ) {
-				elem.removeAttribute( jQuery.expando );
-			} else {
-				elem[ jQuery.expando ] = null;
-			}
-		}
-	},
-
-	// For internal use only.
-	_data: function( elem, name, data ) {
-		return jQuery.data( elem, name, data, true );
-	},
-
-	// A method for determining if a DOM node can handle the data expando
-	acceptData: function( elem ) {
-		if ( elem.nodeName ) {
-			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
-
-			if ( match ) {
-				return !(match === true || elem.getAttribute("classid") !== match);
-			}
-		}
-
-		return true;
-	}
-});
-
-jQuery.fn.extend({
-	data: function( key, value ) {
-		var data = null;
-
-		if ( typeof key === "undefined" ) {
-			if ( this.length ) {
-				data = jQuery.data( this[0] );
-
-				if ( this[0].nodeType === 1 ) {
-					var attr = this[0].attributes, name;
-					for ( var i = 0, l = attr.length; i < l; i++ ) {
-						name = attr[i].name;
-
-						if ( name.indexOf( "data-" ) === 0 ) {
-							name = name.substr( 5 );
-							dataAttr( this[0], name, data[ name ] );
-						}
-					}
-				}
-			}
-
-			return data;
-
-		} else if ( typeof key === "object" ) {
-			return this.each(function() {
-				jQuery.data( this, key );
-			});
-		}
-
-		var parts = key.split(".");
-		parts[1] = parts[1] ? "." + parts[1] : "";
-
-		if ( value === undefined ) {
-			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
-
-			// Try to fetch any internally stored data first
-			if ( data === undefined && this.length ) {
-				data = jQuery.data( this[0], key );
-				data = dataAttr( this[0], key, data );
-			}
-
-			return data === undefined && parts[1] ?
-				this.data( parts[0] ) :
-				data;
-
-		} else {
-			return this.each(function() {
-				var $this = jQuery( this ),
-					args = [ parts[0], value ];
-
-				$this.triggerHandler( "setData" + parts[1] + "!", args );
-				jQuery.data( this, key, value );
-				$this.triggerHandler( "changeData" + parts[1] + "!", args );
-			});
-		}
-	},
-
-	removeData: function( key ) {
-		return this.each(function() {
-			jQuery.removeData( this, key );
-		});
-	}
-});
-
-function dataAttr( elem, key, data ) {
-	// If nothing was found internally, try to fetch any
-	// data from the HTML5 data-* attribute
-	if ( data === undefined && elem.nodeType === 1 ) {
-		data = elem.getAttribute( "data-" + key );
-
-		if ( typeof data === "string" ) {
-			try {
-				data = data === "true" ? true :
-				data === "false" ? false :
-				data === "null" ? null :
-				!jQuery.isNaN( data ) ? parseFloat( data ) :
-					rbrace.test( data ) ? jQuery.parseJSON( data ) :
-					data;
-			} catch( e ) {}
-
-			// Make sure we set the data so it isn't changed later
-			jQuery.data( elem, key, data );
-
-		} else {
-			data = undefined;
-		}
-	}
-
-	return data;
-}
-
-// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
-// property to be considered empty objects; this property always exists in
-// order to make sure JSON.stringify does not expose internal metadata
-function isEmptyDataObject( obj ) {
-	for ( var name in obj ) {
-		if ( name !== "toJSON" ) {
-			return false;
-		}
-	}
-
-	return true;
-}
-
-
-
-
-jQuery.extend({
-	queue: function( elem, type, data ) {
-		if ( !elem ) {
-			return;
-		}
-
-		type = (type || "fx") + "queue";
-		var q = jQuery._data( elem, type );
-
-		// Speed up dequeue by getting out quickly if this is just a lookup
-		if ( !data ) {
-			return q || [];
-		}
-
-		if ( !q || jQuery.isArray(data) ) {
-			q = jQuery._data( elem, type, jQuery.makeArray(data) );
-
-		} else {
-			q.push( data );
-		}
-
-		return q;
-	},
-
-	dequeue: function( elem, type ) {
-		type = type || "fx";
-
-		var queue = jQuery.queue( elem, type ),
-			fn = queue.shift();
-
-		// If the fx queue is dequeued, always remove the progress sentinel
-		if ( fn === "inprogress" ) {
-			fn = queue.shift();
-		}
-
-		if ( fn ) {
-			// Add a progress sentinel to prevent the fx queue from being
-			// automatically dequeued
-			if ( type === "fx" ) {
-				queue.unshift("inprogress");
-			}
-
-			fn.call(elem, function() {
-				jQuery.dequeue(elem, type);
-			});
-		}
-
-		if ( !queue.length ) {
-			jQuery.removeData( elem, type + "queue", true );
-		}
-	}
-});
-
-jQuery.fn.extend({
-	queue: function( type, data ) {
-		if ( typeof type !== "string" ) {
-			data = type;
-			type = "fx";
-		}
-
-		if ( data === undefined ) {
-			return jQuery.queue( this[0], type );
-		}
-		return this.each(function( i ) {
-			var queue = jQuery.queue( this, type, data );
-
-			if ( type === "fx" && queue[0] !== "inprogress" ) {
-				jQuery.dequeue( this, type );
-			}
-		});
-	},
-	dequeue: function( type ) {
-		return this.each(function() {
-			jQuery.dequeue( this, type );
-		});
-	},
-
-	// Based off of the plugin by Clint Helfers, with permission.
-	// http://blindsignals.com/index.php/2009/07/jquery-delay/
-	delay: function( time, type ) {
-		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
-		type = type || "fx";
-
-		return this.queue( type, function() {
-			var elem = this;
-			setTimeout(function() {
-				jQuery.dequeue( elem, type );
-			}, time );
-		});
-	},
-
-	clearQueue: function( type ) {
-		return this.queue( type || "fx", [] );
-	}
-});
-
-
-
-
-var rclass = /[\n\t\r]/g,
-	rspaces = /\s+/,
-	rreturn = /\r/g,
-	rspecialurl = /^(?:href|src|style)$/,
-	rtype = /^(?:button|input)$/i,
-	rfocusable = /^(?:button|input|object|select|textarea)$/i,
-	rclickable = /^a(?:rea)?$/i,
-	rradiocheck = /^(?:radio|checkbox)$/i;
-
-jQuery.props = {
-	"for": "htmlFor",
-	"class": "className",
-	readonly: "readOnly",
-	maxlength: "maxLength",
-	cellspacing: "cellSpacing",
-	rowspan: "rowSpan",
-	colspan: "colSpan",
-	tabindex: "tabIndex",
-	usemap: "useMap",
-	frameborder: "frameBorder"
-};
-
-jQuery.fn.extend({
-	attr: function( name, value ) {
-		return jQuery.access( this, name, value, true, jQuery.attr );
-	},
-
-	removeAttr: function( name, fn ) {
-		return this.each(function(){
-			jQuery.attr( this, name, "" );
-			if ( this.nodeType === 1 ) {
-				this.removeAttribute( name );
-			}
-		});
-	},
-
-	addClass: function( value ) {
-		if ( jQuery.isFunction(value) ) {
-			return this.each(function(i) {
-				var self = jQuery(this);
-				self.addClass( value.call(this, i, self.attr("class")) );
-			});
-		}
-
-		if ( value && typeof value === "string" ) {
-			var classNames = (value || "").split( rspaces );
-
-			for ( var i = 0, l = this.length; i < l; i++ ) {
-				var elem = this[i];
-
-				if ( elem.nodeType === 1 ) {
-					if ( !elem.className ) {
-						elem.className = value;
-
-					} else {
-						var className = " " + elem.className + " ",
-							setClass = elem.className;
-
-						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
-							if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
-								setClass += " " + classNames[c];
-							}
-						}
-						elem.className = jQuery.trim( setClass );
-					}
-				}
-			}
-		}
-
-		return this;
-	},
-
-	removeClass: function( value ) {
-		if ( jQuery.isFunction(value) ) {
-			return this.each(function(i) {
-				var self = jQuery(this);
-				self.removeClass( value.call(this, i, self.attr("class")) );
-			});
-		}
-
-		if ( (value && typeof value === "string") || value === undefined ) {
-			var classNames = (value || "").split( rspaces );
-
-			for ( var i = 0, l = this.length; i < l; i++ ) {
-				var elem = this[i];
-
-				if ( elem.nodeType === 1 && elem.className ) {
-					if ( value ) {
-						var className = (" " + elem.className + " ").replace(rclass, " ");
-						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
-							className = className.replace(" " + classNames[c] + " ", " ");
-						}
-						elem.className = jQuery.trim( className );
-
-					} else {
-						elem.className = "";
-					}
-				}
-			}
-		}
-
-		return this;
-	},
-
-	toggleClass: function( value, stateVal ) {
-		var type = typeof value,
-			isBool = typeof stateVal === "boolean";
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each(function(i) {
-				var self = jQuery(this);
-				self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
-			});
-		}
-
-		return this.each(function() {
-			if ( type === "string" ) {
-				// toggle individual class names
-				var className,
-					i = 0,
-					self = jQuery( this ),
-					state = stateVal,
-					classNames = value.split( rspaces );
-
-				while ( (className = classNames[ i++ ]) ) {
-					// check each className given, space seperated list
-					state = isBool ? state : !self.hasClass( className );
-					self[ state ? "addClass" : "removeClass" ]( className );
-				}
-
-			} else if ( type === "undefined" || type === "boolean" ) {
-				if ( this.className ) {
-					// store className if set
-					jQuery._data( this, "__className__", this.className );
-				}
-
-				// toggle whole className
-				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
-			}
-		});
-	},
-
-	hasClass: function( selector ) {
-		var className = " " + selector + " ";
-		for ( var i = 0, l = this.length; i < l; i++ ) {
-			if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
-				return true;
-			}
-		}
-
-		return false;
-	},
-
-	val: function( value ) {
-		if ( !arguments.length ) {
-			var elem = this[0];
-
-			if ( elem ) {
-				if ( jQuery.nodeName( elem, "option" ) ) {
-					// attributes.value is undefined in Blackberry 4.7 but
-					// uses .value. See #6932
-					var val = elem.attributes.value;
-					return !val || val.specified ? elem.value : elem.text;
-				}
-
-				// We need to handle select boxes special
-				if ( jQuery.nodeName( elem, "select" ) ) {
-					var index = elem.selectedIndex,
-						values = [],
-						options = elem.options,
-						one = elem.type === "select-one";
-
-					// Nothing was selected
-					if ( index < 0 ) {
-						return null;
-					}
-
-					// Loop through all the selected options
-					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
-						var option = options[ i ];
-
-						// Don't return options that are disabled or in a disabled optgroup
-						if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
-								(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
-
-							// Get the specific value for the option
-							value = jQuery(option).val();
-
-							// We don't need an array for one selects
-							if ( one ) {
-								return value;
-							}
-
-							// Multi-Selects return an array
-							values.push( value );
-						}
-					}
-
-					// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
-					if ( one && !values.length && options.length ) {
-						return jQuery( options[ index ] ).val();
-					}
-
-					return values;
-				}
-
-				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
-				if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
-					return elem.getAttribute("value") === null ? "on" : elem.value;
-				}
-
-				// Everything else, we just grab the value
-				return (elem.value || "").replace(rreturn, "");
-
-			}
-
-			return undefined;
-		}
-
-		var isFunction = jQuery.isFunction(value);
-
-		return this.each(function(i) {
-			var self = jQuery(this), val = value;
-
-			if ( this.nodeType !== 1 ) {
-				return;
-			}
-
-			if ( isFunction ) {
-				val = value.call(this, i, self.val());
-			}
-
-			// Treat null/undefined as ""; convert numbers to string
-			if ( val == null ) {
-				val = "";
-			} else if ( typeof val === "number" ) {
-				val += "";
-			} else if ( jQuery.isArray(val) ) {
-				val = jQuery.map(val, function (value) {
-					return value == null ? "" : value + "";
-				});
-			}
-
-			if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
-				this.checked = jQuery.inArray( self.val(), val ) >= 0;
-
-			} else if ( jQuery.nodeName( this, "select" ) ) {
-				var values = jQuery.makeArray(val);
-
-				jQuery( "option", this ).each(function() {
-					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
-				});
-
-				if ( !values.length ) {
-					this.selectedIndex = -1;
-				}
-
-			} else {
-				this.value = val;
-			}
-		});
-	}
-});
-
-jQuery.extend({
-	attrFn: {
-		val: true,
-		css: true,
-		html: true,
-		text: true,
-		data: true,
-		width: true,
-		height: true,
-		offset: true
-	},
-
-	attr: function( elem, name, value, pass ) {
-		// don't get/set attributes on text, comment and attribute nodes
-		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || elem.nodeType === 2 ) {
-			return undefined;
-		}
-
-		if ( pass && name in jQuery.attrFn ) {
-			return jQuery(elem)[name](value);
-		}
-
-		var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
-			// Whether we are setting (or getting)
-			set = value !== undefined;
-
-		// Try to normalize/fix the name
-		name = notxml && jQuery.props[ name ] || name;
-
-		// Only do all the following if this is a node (faster for style)
-		if ( elem.nodeType === 1 ) {
-			// These attributes require special treatment
-			var special = rspecialurl.test( name );
-
-			// Safari mis-reports the default selected property of an option
-			// Accessing the parent's selectedIndex property fixes it
-			if ( name === "selected" && !jQuery.support.optSelected ) {
-				var parent = elem.parentNode;
-				if ( parent ) {
-					parent.selectedIndex;
-
-					// Make sure that it also works with optgroups, see #5701
-					if ( parent.parentNode ) {
-						parent.parentNode.selectedIndex;
-					}
-				}
-			}
-
-			// If applicable, access the attribute via the DOM 0 way
-			// 'in' checks fail in Blackberry 4.7 #6931
-			if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) {
-				if ( set ) {
-					// We can't allow the type property to be changed (since it causes problems in IE)
-					if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
-						jQuery.error( "type property can't be changed" );
-					}
-
-					if ( value === null ) {
-						if ( elem.nodeType === 1 ) {
-							elem.removeAttribute( name );
-						}
-
-					} else {
-						elem[ name ] = value;
-					}
-				}
-
-				// browsers index elements by id/name on forms, give priority to attributes.
-				if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
-					return elem.getAttributeNode( name ).nodeValue;
-				}
-
-				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
-				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-				if ( name === "tabIndex" ) {
-					var attributeNode = elem.getAttributeNode( "tabIndex" );
-
-					return attributeNode && attributeNode.specified ?
-						attributeNode.value :
-						rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
-							0 :
-							undefined;
-				}
-
-				return elem[ name ];
-			}
-
-			if ( !jQuery.support.style && notxml && name === "style" ) {
-				if ( set ) {
-					elem.style.cssText = "" + value;
-				}
-
-				return elem.style.cssText;
-			}
-
-			if ( set ) {
-				// convert the value to a string (all browsers do this but IE) see #1070
-				elem.setAttribute( name, "" + value );
-			}
-
-			// Ensure that missing attributes return undefined
-			// Blackberry 4.7 returns "" from getAttribute #6938
-			if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) {
-				return undefined;
-			}
-
-			var attr = !jQuery.support.hrefNormalized && notxml && special ?
-					// Some attributes require a special call on IE
-					elem.getAttribute( name, 2 ) :
-					elem.getAttribute( name );
-
-			// Non-existent attributes return null, we normalize to undefined
-			return attr === null ? undefined : attr;
-		}
-		// Handle everything which isn't a DOM element node
-		if ( set ) {
-			elem[ name ] = value;
-		}
-		return elem[ name ];
-	}
-});
-
-
-
-
-var rnamespaces = /\.(.*)$/,
-	rformElems = /^(?:textarea|input|select)$/i,
-	rperiod = /\./g,
-	rspace = / /g,
-	rescape = /[^\w\s.|`]/g,
-	fcleanup = function( nm ) {
-		return nm.replace(rescape, "\\$&");
-	};
-
-/*
- * A number of helper functions used for managing events.
- * Many of the ideas behind this code originated from
- * Dean Edwards' addEvent library.
- */
-jQuery.event = {
-
-	// Bind an event to an element
-	// Original by Dean Edwards
-	add: function( elem, types, handler, data ) {
-		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
-			return;
-		}
-
-		// TODO :: Use a try/catch until it's safe to pull this out (likely 1.6)
-		// Minor release fix for bug #8018
-		try {
-			// For whatever reason, IE has trouble passing the window object
-			// around, causing it to be cloned in the process
-			if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) {
-				elem = window;
-			}
-		}
-		catch ( e ) {}
-
-		if ( handler === false ) {
-			handler = returnFalse;
-		} else if ( !handler ) {
-			// Fixes bug #7229. Fix recommended by jdalton
-			return;
-		}
-
-		var handleObjIn, handleObj;
-
-		if ( handler.handler ) {
-			handleObjIn = handler;
-			handler = handleObjIn.handler;
-		}
-
-		// Make sure that the function being executed has a unique ID
-		if ( !handler.guid ) {
-			handler.guid = jQuery.guid++;
-		}
-
-		// Init the element's event structure
-		var elemData = jQuery._data( elem );
-
-		// If no elemData is found then we must be trying to bind to one of the
-		// banned noData elements
-		if ( !elemData ) {
-			return;
-		}
-
-		var events = elemData.events,
-			eventHandle = elemData.handle;
-
-		if ( !events ) {
-			elemData.events = events = {};
-		}
-
-		if ( !eventHandle ) {
-			elemData.handle = eventHandle = function( e ) {
-				// Handle the second event of a trigger and when
-				// an event is called after a page has unloaded
-				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
-					jQuery.event.handle.apply( eventHandle.elem, arguments ) :
-					undefined;
-			};
-		}
-
-		// Add elem as a property of the handle function
-		// This is to prevent a memory leak with non-native events in IE.
-		eventHandle.elem = elem;
-
-		// Handle multiple events separated by a space
-		// jQuery(...).bind("mouseover mouseout", fn);
-		types = types.split(" ");
-
-		var type, i = 0, namespaces;
-
-		while ( (type = types[ i++ ]) ) {
-			handleObj = handleObjIn ?
-				jQuery.extend({}, handleObjIn) :
-				{ handler: handler, data: data };
-
-			// Namespaced event handlers
-			if ( type.indexOf(".") > -1 ) {
-				namespaces = type.split(".");
-				type = namespaces.shift();
-				handleObj.namespace = namespaces.slice(0).sort().join(".");
-
-			} else {
-				namespaces = [];
-				handleObj.namespace = "";
-			}
-
-			handleObj.type = type;
-			if ( !handleObj.guid ) {
-				handleObj.guid = handler.guid;
-			}
-
-			// Get the current list of functions bound to this event
-			var handlers = events[ type ],
-				special = jQuery.event.special[ type ] || {};
-
-			// Init the event handler queue
-			if ( !handlers ) {
-				handlers = events[ type ] = [];
-
-				// Check for a special event handler
-				// Only use addEventListener/attachEvent if the special
-				// events handler returns false
-				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-					// Bind the global event handler to the element
-					if ( elem.addEventListener ) {
-						elem.addEventListener( type, eventHandle, false );
-
-					} else if ( elem.attachEvent ) {
-						elem.attachEvent( "on" + type, eventHandle );
-					}
-				}
-			}
-
-			if ( special.add ) {
-				special.add.call( elem, handleObj );
-
-				if ( !handleObj.handler.guid ) {
-					handleObj.handler.guid = handler.guid;
-				}
-			}
-
-			// Add the function to the element's handler list
-			handlers.push( handleObj );
-
-			// Keep track of which events have been used, for global triggering
-			jQuery.event.global[ type ] = true;
-		}
-
-		// Nullify elem to prevent memory leaks in IE
-		elem = null;
-	},
-
-	global: {},
-
-	// Detach an event or set of events from an element
-	remove: function( elem, types, handler, pos ) {
-		// don't do events on text and comment nodes
-		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
-			return;
-		}
-
-		if ( handler === false ) {
-			handler = returnFalse;
-		}
-
-		var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
-			elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
-			events = elemData && elemData.events;
-
-		if ( !elemData || !events ) {
-			return;
-		}
-
-		// types is actually an event object here
-		if ( types && types.type ) {
-			handler = types.handler;
-			types = types.type;
-		}
-
-		// Unbind all events for the element
-		if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
-			types = types || "";
-
-			for ( type in events ) {
-				jQuery.event.remove( elem, type + types );
-			}
-
-			return;
-		}
-
-		// Handle multiple events separated by a space
-		// jQuery(...).unbind("mouseover mouseout", fn);
-		types = types.split(" ");
-
-		while ( (type = types[ i++ ]) ) {
-			origType = type;
-			handleObj = null;
-			all = type.indexOf(".") < 0;
-			namespaces = [];
-
-			if ( !all ) {
-				// Namespaced event handlers
-				namespaces = type.split(".");
-				type = namespaces.shift();
-
-				namespace = new RegExp("(^|\\.)" +
-					jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
-			}
-
-			eventType = events[ type ];
-
-			if ( !eventType ) {
-				continue;
-			}
-
-			if ( !handler ) {
-				for ( j = 0; j < eventType.length; j++ ) {
-					handleObj = eventType[ j ];
-
-					if ( all || namespace.test( handleObj.namespace ) ) {
-						jQuery.event.remove( elem, origType, handleObj.handler, j );
-						eventType.splice( j--, 1 );
-					}
-				}
-
-				continue;
-			}
-
-			special = jQuery.event.special[ type ] || {};
-
-			for ( j = pos || 0; j < eventType.length; j++ ) {
-				handleObj = eventType[ j ];
-
-				if ( handler.guid === handleObj.guid ) {
-					// remove the given handler for the given type
-					if ( all || namespace.test( handleObj.namespace ) ) {
-						if ( pos == null ) {
-							eventType.splice( j--, 1 );
-						}
-
-						if ( special.remove ) {
-							special.remove.call( elem, handleObj );
-						}
-					}
-
-					if ( pos != null ) {
-						break;
-					}
-				}
-			}
-
-			// remove generic event handler if no more handlers exist
-			if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
-				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
-					jQuery.removeEvent( elem, type, elemData.handle );
-				}
-
-				ret = null;
-				delete events[ type ];
-			}
-		}
-
-		// Remove the expando if it's no longer used
-		if ( jQuery.isEmptyObject( events ) ) {
-			var handle = elemData.handle;
-			if ( handle ) {
-				handle.elem = null;
-			}
-
-			delete elemData.events;
-			delete elemData.handle;
-
-			if ( jQuery.isEmptyObject( elemData ) ) {
-				jQuery.removeData( elem, undefined, true );
-			}
-		}
-	},
-
-	// bubbling is internal
-	trigger: function( event, data, elem /*, bubbling */ ) {
-		// Event object or event type
-		var type = event.type || event,
-			bubbling = arguments[3];
-
-		if ( !bubbling ) {
-			event = typeof event === "object" ?
-				// jQuery.Event object
-				event[ jQuery.expando ] ? event :
-				// Object literal
-				jQuery.extend( jQuery.Event(type), event ) :
-				// Just the event type (string)
-				jQuery.Event(type);
-
-			if ( type.indexOf("!") >= 0 ) {
-				event.type = type = type.slice(0, -1);
-				event.exclusive = true;
-			}
-
-			// Handle a global trigger
-			if ( !elem ) {
-				// Don't bubble custom events when global (to avoid too much overhead)
-				event.stopPropagation();
-
-				// Only trigger if we've ever bound an event for it
-				if ( jQuery.event.global[ type ] ) {
-					// XXX This code smells terrible. event.js should not be directly
-					// inspecting the data cache
-					jQuery.each( jQuery.cache, function() {
-						// internalKey variable is just used to make it easier to find
-						// and potentially change this stuff later; currently it just
-						// points to jQuery.expando
-						var internalKey = jQuery.expando,
-							internalCache = this[ internalKey ];
-						if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
-							jQuery.event.trigger( event, data, internalCache.handle.elem );
-						}
-					});
-				}
-			}
-
-			// Handle triggering a single element
-
-			// don't do events on text and comment nodes
-			if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
-				return undefined;
-			}
-
-			// Clean up in case it is reused
-			event.result = undefined;
-			event.target = elem;
-
-			// Clone the incoming data, if any
-			data = jQuery.makeArray( data );
-			data.unshift( event );
-		}
-
-		event.currentTarget = elem;
-
-		// Trigger the event, it is assumed that "handle" is a function
-		var handle = jQuery._data( elem, "handle" );
-
-		if ( handle ) {
-			handle.apply( elem, data );
-		}
-
-		var parent = elem.parentNode || elem.ownerDocument;
-
-		// Trigger an inline bound script
-		try {
-			if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
-				if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
-					event.result = false;
-					event.preventDefault();
-				}
-			}
-
-		// prevent IE from throwing an error for some elements with some event types, see #3533
-		} catch (inlineError) {}
-
-		if ( !event.isPropagationStopped() && parent ) {
-			jQuery.event.trigger( event, data, parent, true );
-
-		} else if ( !event.isDefaultPrevented() ) {
-			var old,
-				target = event.target,
-				targetType = type.replace( rnamespaces, "" ),
-				isClick = jQuery.nodeName( target, "a" ) && targetType === "click",
-				special = jQuery.event.special[ targetType ] || {};
-
-			if ( (!special._default || special._default.call( elem, event ) === false) &&
-				!isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
-
-				try {
-					if ( target[ targetType ] ) {
-						// Make sure that we don't accidentally re-trigger the onFOO events
-						old = target[ "on" + targetType ];
-
-						if ( old ) {
-							target[ "on" + targetType ] = null;
-						}
-
-						jQuery.event.triggered = event.type;
-						target[ targetType ]();
-					}
-
-				// prevent IE from throwing an error for some elements with some event types, see #3533
-				} catch (triggerError) {}
-
-				if ( old ) {
-					target[ "on" + targetType ] = old;
-				}
-
-				jQuery.event.triggered = undefined;
-			}
-		}
-	},
-
-	handle: function( event ) {
-		var all, handlers, namespaces, namespace_re, events,
-			namespace_sort = [],
-			args = jQuery.makeArray( arguments );
-
-		event = args[0] = jQuery.event.fix( event || window.event );
-		event.currentTarget = this;
-
-		// Namespaced event handlers
-		all = event.type.indexOf(".") < 0 && !event.exclusive;
-
-		if ( !all ) {
-			namespaces = event.type.split(".");
-			event.type = namespaces.shift();
-			namespace_sort = namespaces.slice(0).sort();
-			namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)");
-		}
-
-		event.namespace = event.namespace || namespace_sort.join(".");
-
-		events = jQuery._data(this, "events");
-
-		handlers = (events || {})[ event.type ];
-
-		if ( events && handlers ) {
-			// Clone the handlers to prevent manipulation
-			handlers = handlers.slice(0);
-
-			for ( var j = 0, l = handlers.length; j < l; j++ ) {
-				var handleObj = handlers[ j ];
-
-				// Filter the functions by class
-				if ( all || namespace_re.test( handleObj.namespace ) ) {
-					// Pass in a reference to the handler function itself
-					// So that we can later remove it
-					event.handler = handleObj.handler;
-					event.data = handleObj.data;
-					event.handleObj = handleObj;
-
-					var ret = handleObj.handler.apply( this, args );
-
-					if ( ret !== undefined ) {
-						event.result = ret;
-						if ( ret === false ) {
-							event.preventDefault();
-							event.stopPropagation();
-						}
-					}
-
-					if ( event.isImmediatePropagationStopped() ) {
-						break;
-					}
-				}
-			}
-		}
-
-		return event.result;
-	},
-
-	props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
-
-	fix: function( event ) {
-		if ( event[ jQuery.expando ] ) {
-			return event;
-		}
-
-		// store a copy of the original event object
-		// and "clone" to set read-only properties
-		var originalEvent = event;
-		event = jQuery.Event( originalEvent );
-
-		for ( var i = this.props.length, prop; i; ) {
-			prop = this.props[ --i ];
-			event[ prop ] = originalEvent[ prop ];
-		}
-
-		// Fix target property, if necessary
-		if ( !event.target ) {
-			// Fixes #1925 where srcElement might not be defined either
-			event.target = event.srcElement || document;
-		}
-
-		// check if target is a textnode (safari)
-		if ( event.target.nodeType === 3 ) {
-			event.target = event.target.parentNode;
-		}
-
-		// Add relatedTarget, if necessary
-		if ( !event.relatedTarget && event.fromElement ) {
-			event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
-		}
-
-		// Calculate pageX/Y if missing and clientX/Y available
-		if ( event.pageX == null && event.clientX != null ) {
-			var doc = document.documentElement,
-				body = document.body;
-
-			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
-			event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
-		}
-
-		// Add which for key events
-		if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
-			event.which = event.charCode != null ? event.charCode : event.keyCode;
-		}
-
-		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
-		if ( !event.metaKey && event.ctrlKey ) {
-			event.metaKey = event.ctrlKey;
-		}
-
-		// Add which for click: 1 === left; 2 === middle; 3 === right
-		// Note: button is not normalized, so don't use it
-		if ( !event.which && event.button !== undefined ) {
-			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
-		}
-
-		return event;
-	},
-
-	// Deprecated, use jQuery.guid instead
-	guid: 1E8,
-
-	// Deprecated, use jQuery.proxy instead
-	proxy: jQuery.proxy,
-
-	special: {
-		ready: {
-			// Make sure the ready event is setup
-			setup: jQuery.bindReady,
-			teardown: jQuery.noop
-		},
-
-		live: {
-			add: function( handleObj ) {
-				jQuery.event.add( this,
-					liveConvert( handleObj.origType, handleObj.selector ),
-					jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
-			},
-
-			remove: function( handleObj ) {
-				jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
-			}
-		},
-
-		beforeunload: {
-			setup: function( data, namespaces, eventHandle ) {
-				// We only want to do this special case on windows
-				if ( jQuery.isWindow( this ) ) {
-					this.onbeforeunload = eventHandle;
-				}
-			},
-
-			teardown: function( namespaces, eventHandle ) {
-				if ( this.onbeforeunload === eventHandle ) {
-					this.onbeforeunload = null;
-				}
-			}
-		}
-	}
-};
-
-jQuery.removeEvent = document.removeEventListener ?
-	function( elem, type, handle ) {
-		if ( elem.removeEventListener ) {
-			elem.removeEventListener( type, handle, false );
-		}
-	} :
-	function( elem, type, handle ) {
-		if ( elem.detachEvent ) {
-			elem.detachEvent( "on" + type, handle );
-		}
-	};
-
-jQuery.Event = function( src ) {
-	// Allow instantiation without the 'new' keyword
-	if ( !this.preventDefault ) {
-		return new jQuery.Event( src );
-	}
-
-	// Event object
-	if ( src && src.type ) {
-		this.originalEvent = src;
-		this.type = src.type;
-
-		// Events bubbling up the document may have been marked as prevented
-		// by a handler lower down the tree; reflect the correct value.
-		this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
-			src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
-
-	// Event type
-	} else {
-		this.type = src;
-	}
-
-	// timeStamp is buggy for some events on Firefox(#3843)
-	// So we won't rely on the native value
-	this.timeStamp = jQuery.now();
-
-	// Mark it as fixed
-	this[ jQuery.expando ] = true;
-};
-
-function returnFalse() {
-	return false;
-}
-function returnTrue() {
-	return true;
-}
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
-	preventDefault: function() {
-		this.isDefaultPrevented = returnTrue;
-
-		var e = this.originalEvent;
-		if ( !e ) {
-			return;
-		}
-
-		// if preventDefault exists run it on the original event
-		if ( e.preventDefault ) {
-			e.preventDefault();
-
-		// otherwise set the returnValue property of the original event to false (IE)
-		} else {
-			e.returnValue = false;
-		}
-	},
-	stopPropagation: function() {
-		this.isPropagationStopped = returnTrue;
-
-		var e = this.originalEvent;
-		if ( !e ) {
-			return;
-		}
-		// if stopPropagation exists run it on the original event
-		if ( e.stopPropagation ) {
-			e.stopPropagation();
-		}
-		// otherwise set the cancelBubble property of the original event to true (IE)
-		e.cancelBubble = true;
-	},
-	stopImmediatePropagation: function() {
-		this.isImmediatePropagationStopped = returnTrue;
-		this.stopPropagation();
-	},
-	isDefaultPrevented: returnFalse,
-	isPropagationStopped: returnFalse,
-	isImmediatePropagationStopped: returnFalse
-};
-
-// Checks if an event happened on an element within another element
-// Used in jQuery.event.special.mouseenter and mouseleave handlers
-var withinElement = function( event ) {
-	// Check if mouse(over|out) are still within the same parent element
-	var parent = event.relatedTarget;
-
-	// Firefox sometimes assigns relatedTarget a XUL element
-	// which we cannot access the parentNode property of
-	try {
-
-		// Chrome does something similar, the parentNode property
-		// can be accessed but is null.
-		if ( parent && parent !== document && !parent.parentNode ) {
-			return;
-		}
-		// Traverse up the tree
-		while ( parent && parent !== this ) {
-			parent = parent.parentNode;
-		}
-
-		if ( parent !== this ) {
-			// set the correct event type
-			event.type = event.data;
-
-			// handle event if we actually just moused on to a non sub-element
-			jQuery.event.handle.apply( this, arguments );
-		}
-
-	// assuming we've left the element since we most likely mousedover a xul element
-	} catch(e) { }
-},
-
-// In case of event delegation, we only need to rename the event.type,
-// liveHandler will take care of the rest.
-delegate = function( event ) {
-	event.type = event.data;
-	jQuery.event.handle.apply( this, arguments );
-};
-
-// Create mouseenter and mouseleave events
-jQuery.each({
-	mouseenter: "mouseover",
-	mouseleave: "mouseout"
-}, function( orig, fix ) {
-	jQuery.event.special[ orig ] = {
-		setup: function( data ) {
-			jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
-		},
-		teardown: function( data ) {
-			jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
-		}
-	};
-});
-
-// submit delegation
-if ( !jQuery.support.submitBubbles ) {
-
-	jQuery.event.special.submit = {
-		setup: function( data, namespaces ) {
-			if ( this.nodeName && this.nodeName.toLowerCase() !== "form" ) {
-				jQuery.event.add(this, "click.specialSubmit", function( e ) {
-					var elem = e.target,
-						type = elem.type;
-
-					if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
-						trigger( "submit", this, arguments );
-					}
-				});
-
-				jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
-					var elem = e.target,
-						type = elem.type;
-
-					if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
-						trigger( "submit", this, arguments );
-					}
-				});
-
-			} else {
-				return false;
-			}
-		},
-
-		teardown: function( namespaces ) {
-			jQuery.event.remove( this, ".specialSubmit" );
-		}
-	};
-
-}
-
-// change delegation, happens here so we have bind.
-if ( !jQuery.support.changeBubbles ) {
-
-	var changeFilters,
-
-	getVal = function( elem ) {
-		var type = elem.type, val = elem.value;
-
-		if ( type === "radio" || type === "checkbox" ) {
-			val = elem.checked;
-
-		} else if ( type === "select-multiple" ) {
-			val = elem.selectedIndex > -1 ?
-				jQuery.map( elem.options, function( elem ) {
-					return elem.selected;
-				}).join("-") :
-				"";
-
-		} else if ( elem.nodeName.toLowerCase() === "select" ) {
-			val = elem.selectedIndex;
-		}
-
-		return val;
-	},
-
-	testChange = function testChange( e ) {
-		var elem = e.target, data, val;
-
-		if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
-			return;
-		}
-
-		data = jQuery._data( elem, "_change_data" );
-		val = getVal(elem);
-
-		// the current data will be also retrieved by beforeactivate
-		if ( e.type !== "focusout" || elem.type !== "radio" ) {
-			jQuery._data( elem, "_change_data", val );
-		}
-
-		if ( data === undefined || val === data ) {
-			return;
-		}
-
-		if ( data != null || val ) {
-			e.type = "change";
-			e.liveFired = undefined;
-			jQuery.event.trigger( e, arguments[1], elem );
-		}
-	};
-
-	jQuery.event.special.change = {
-		filters: {
-			focusout: testChange,
-
-			beforedeactivate: testChange,
-
-			click: function( e ) {
-				var elem = e.target, type = elem.type;
-
-				if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
-					testChange.call( this, e );
-				}
-			},
-
-			// Change has to be called before submit
-			// Keydown will be called before keypress, which is used in submit-event delegation
-			keydown: function( e ) {
-				var elem = e.target, type = elem.type;
-
-				if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
-					(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
-					type === "select-multiple" ) {
-					testChange.call( this, e );
-				}
-			},
-
-			// Beforeactivate happens also before the previous element is blurred
-			// with this event you can't trigger a change event, but you can store
-			// information
-			beforeactivate: function( e ) {
-				var elem = e.target;
-				jQuery._data( elem, "_change_data", getVal(elem) );
-			}
-		},
-
-		setup: function( data, namespaces ) {
-			if ( this.type === "file" ) {
-				return false;
-			}
-
-			for ( var type in changeFilters ) {
-				jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
-			}
-
-			return rformElems.test( this.nodeName );
-		},
-
-		teardown: function( namespaces ) {
-			jQuery.event.remove( this, ".specialChange" );
-
-			return rformElems.test( this.nodeName );
-		}
-	};
-
-	changeFilters = jQuery.event.special.change.filters;
-
-	// Handle when the input is .focus()'d
-	changeFilters.focus = changeFilters.beforeactivate;
-}
-
-function trigger( type, elem, args ) {
-	// Piggyback on a donor event to simulate a different one.
-	// Fake originalEvent to avoid donor's stopPropagation, but if the
-	// simulated event prevents default then we do the same on the donor.
-	// Don't pass args or remember liveFired; they apply to the donor event.
-	var event = jQuery.extend( {}, args[ 0 ] );
-	event.type = type;
-	event.originalEvent = {};
-	event.liveFired = undefined;
-	jQuery.event.handle.call( elem, event );
-	if ( event.isDefaultPrevented() ) {
-		args[ 0 ].preventDefault();
-	}
-}
-
-// Create "bubbling" focus and blur events
-if ( document.addEventListener ) {
-	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-	
-		// Attach a single capturing handler while someone wants focusin/focusout
-		var attaches = 0;
-		
-		jQuery.event.special[ fix ] = {
-			setup: function() {
-				if ( attaches++ === 0 ) {
-					document.addEventListener( orig, handler, true );
-				}
-			},
-			teardown: function() {
-				if ( --attaches === 0 ) {
-					document.removeEventListener( orig, handler, true );
-				}
-			}
-		};
-
-		function handler( donor ) {
-			// Donor event is always a native one; fix it and switch its type.
-			// Let focusin/out handler cancel the donor focus/blur event.
-			var e = jQuery.event.fix( donor );
-			e.type = fix;
-			e.originalEvent = {};
-			jQuery.event.trigger( e, null, e.target );
-			if ( e.isDefaultPrevented() ) {
-				donor.preventDefault();
-			}
-		}
-	});
-}
-
-jQuery.each(["bind", "one"], function( i, name ) {
-	jQuery.fn[ name ] = function( type, data, fn ) {
-		// Handle object literals
-		if ( typeof type === "object" ) {
-			for ( var key in type ) {
-				this[ name ](key, data, type[key], fn);
-			}
-			return this;
-		}
-
-		if ( jQuery.isFunction( data ) || data === false ) {
-			fn = data;
-			data = undefined;
-		}
-
-		var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
-			jQuery( this ).unbind( event, handler );
-			return fn.apply( this, arguments );
-		}) : fn;
-
-		if ( type === "unload" && name !== "one" ) {
-			this.one( type, data, fn );
-
-		} else {
-			for ( var i = 0, l = this.length; i < l; i++ ) {
-				jQuery.event.add( this[i], type, handler, data );
-			}
-		}
-
-		return this;
-	};
-});
-
-jQuery.fn.extend({
-	unbind: function( type, fn ) {
-		// Handle object literals
-		if ( typeof type === "object" && !type.preventDefault ) {
-			for ( var key in type ) {
-				this.unbind(key, type[key]);
-			}
-
-		} else {
-			for ( var i = 0, l = this.length; i < l; i++ ) {
-				jQuery.event.remove( this[i], type, fn );
-			}
-		}
-
-		return this;
-	},
-
-	delegate: function( selector, types, data, fn ) {
-		return this.live( types, data, fn, selector );
-	},
-
-	undelegate: function( selector, types, fn ) {
-		if ( arguments.length === 0 ) {
-				return this.unbind( "live" );
-
-		} else {
-			return this.die( types, null, fn, selector );
-		}
-	},
-
-	trigger: function( type, data ) {
-		return this.each(function() {
-			jQuery.event.trigger( type, data, this );
-		});
-	},
-
-	triggerHandler: function( type, data ) {
-		if ( this[0] ) {
-			var event = jQuery.Event( type );
-			event.preventDefault();
-			event.stopPropagation();
-			jQuery.event.trigger( event, data, this[0] );
-			return event.result;
-		}
-	},
-
-	toggle: function( fn ) {
-		// Save reference to arguments for access in closure
-		var args = arguments,
-			i = 1;
-
-		// link all the functions, so any of them can unbind this click handler
-		while ( i < args.length ) {
-			jQuery.proxy( fn, args[ i++ ] );
-		}
-
-		return this.click( jQuery.proxy( fn, function( event ) {
-			// Figure out which function to execute
-			var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
-			jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
-			// Make sure that clicks stop
-			event.preventDefault();
-
-			// and execute the function
-			return args[ lastToggle ].apply( this, arguments ) || false;
-		}));
-	},
-
-	hover: function( fnOver, fnOut ) {
-		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-	}
-});
-
-var liveMap = {
-	focus: "focusin",
-	blur: "focusout",
-	mouseenter: "mouseover",
-	mouseleave: "mouseout"
-};
-
-jQuery.each(["live", "die"], function( i, name ) {
-	jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
-		var type, i = 0, match, namespaces, preType,
-			selector = origSelector || this.selector,
-			context = origSelector ? this : jQuery( this.context );
-
-		if ( typeof types === "object" && !types.preventDefault ) {
-			for ( var key in types ) {
-				context[ name ]( key, data, types[key], selector );
-			}
-
-			return this;
-		}
-
-		if ( jQuery.isFunction( data ) ) {
-			fn = data;
-			data = undefined;
-		}
-
-		types = (types || "").split(" ");
-
-		while ( (type = types[ i++ ]) != null ) {
-			match = rnamespaces.exec( type );
-			namespaces = "";
-
-			if ( match )  {
-				namespaces = match[0];
-				type = type.replace( rnamespaces, "" );
-			}
-
-			if ( type === "hover" ) {
-				types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
-				continue;
-			}
-
-			preType = type;
-
-			if ( type === "focus" || type === "blur" ) {
-				types.push( liveMap[ type ] + namespaces );
-				type = type + namespaces;
-
-			} else {
-				type = (liveMap[ type ] || type) + namespaces;
-			}
-
-			if ( name === "live" ) {
-				// bind live handler
-				for ( var j = 0, l = context.length; j < l; j++ ) {
-					jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
-						{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
-				}
-
-			} else {
-				// unbind live handler
-				context.unbind( "live." + liveConvert( type, selector ), fn );
-			}
-		}
-
-		return this;
-	};
-});
-
-function liveHandler( event ) {
-	var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
-		elems = [],
-		selectors = [],
-		events = jQuery._data( this, "events" );
-
-	// Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
-	if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
-		return;
-	}
-
-	if ( event.namespace ) {
-		namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
-	}
-
-	event.liveFired = this;
-
-	var live = events.live.slice(0);
-
-	for ( j = 0; j < live.length; j++ ) {
-		handleObj = live[j];
-
-		if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
-			selectors.push( handleObj.selector );
-
-		} else {
-			live.splice( j--, 1 );
-		}
-	}
-
-	match = jQuery( event.target ).closest( selectors, event.currentTarget );
-
-	for ( i = 0, l = match.length; i < l; i++ ) {
-		close = match[i];
-
-		for ( j = 0; j < live.length; j++ ) {
-			handleObj = live[j];
-
-			if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
-				elem = close.elem;
-				related = null;
-
-				// Those two events require additional checking
-				if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
-					event.type = handleObj.preType;
-					related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
-				}
-
-				if ( !related || related !== elem ) {
-					elems.push({ elem: elem, handleObj: handleObj, level: close.level });
-				}
-			}
-		}
-	}
-
-	for ( i = 0, l = elems.length; i < l; i++ ) {
-		match = elems[i];
-
-		if ( maxLevel && match.level > maxLevel ) {
-			break;
-		}
-
-		event.currentTarget = match.elem;
-		event.data = match.handleObj.data;
-		event.handleObj = match.handleObj;
-
-		ret = match.handleObj.origHandler.apply( match.elem, arguments );
-
-		if ( ret === false || event.isPropagationStopped() ) {
-			maxLevel = match.level;
-
-			if ( ret === false ) {
-				stop = false;
-			}
-			if ( event.isImmediatePropagationStopped() ) {
-				break;
-			}
-		}
-	}
-
-	return stop;
-}
-
-function liveConvert( type, selector ) {
-	return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&");
-}
-
-jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
-	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-	"change select submit keydown keypress keyup error").split(" "), function( i, name ) {
-
-	// Handle event binding
-	jQuery.fn[ name ] = function( data, fn ) {
-		if ( fn == null ) {
-			fn = data;
-			data = null;
-		}
-
-		return arguments.length > 0 ?
-			this.bind( name, data, fn ) :
-			this.trigger( name );
-	};
-
-	if ( jQuery.attrFn ) {
-		jQuery.attrFn[ name ] = true;
-	}
-});
-
-
-/*!
- * Sizzle CSS Selector Engine
- *  Copyright 2011, The Dojo Foundation
- *  Released under the MIT, BSD, and GPL Licenses.
- *  More information: http://sizzlejs.com/
- */
-(function(){
-
-var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
-	done = 0,
-	toString = Object.prototype.toString,
-	hasDuplicate = false,
-	baseHasDuplicate = true,
-	rBackslash = /\\/g,
-	rNonWord = /\W/;
-
-// Here we check if the JavaScript engine is using some sort of
-// optimization where it does not always call our comparision
-// function. If that is the case, discard the hasDuplicate value.
-//   Thus far that includes Google Chrome.
-[0, 0].sort(function() {
-	baseHasDuplicate = false;
-	return 0;
-});
-
-var Sizzle = function( selector, context, results, seed ) {
-	results = results || [];
-	context = context || document;
-
-	var origContext = context;
-
-	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
-		return [];
-	}
-	
-	if ( !selector || typeof selector !== "string" ) {
-		return results;
-	}
-
-	var m, set, checkSet, extra, ret, cur, pop, i,
-		prune = true,
-		contextXML = Sizzle.isXML( context ),
-		parts = [],
-		soFar = selector;
-	
-	// Reset the position of the chunker regexp (start from head)
-	do {
-		chunker.exec( "" );
-		m = chunker.exec( soFar );
-
-		if ( m ) {
-			soFar = m[3];
-		
-			parts.push( m[1] );
-		
-			if ( m[2] ) {
-				extra = m[3];
-				break;
-			}
-		}
-	} while ( m );
-
-	if ( parts.length > 1 && origPOS.exec( selector ) ) {
-
-		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
-			set = posProcess( parts[0] + parts[1], context );
-
-		} else {
-			set = Expr.relative[ parts[0] ] ?
-				[ context ] :
-				Sizzle( parts.shift(), context );
-
-			while ( parts.length ) {
-				selector = parts.shift();
-
-				if ( Expr.relative[ selector ] ) {
-					selector += parts.shift();
-				}
-				
-				set = posProcess( selector, set );
-			}
-		}
-
-	} else {
-		// Take a shortcut and set the context if the root selector is an ID
-		// (but not if it'll be faster if the inner selector is an ID)
-		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
-				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
-
-			ret = Sizzle.find( parts.shift(), context, contextXML );
-			context = ret.expr ?
-				Sizzle.filter( ret.expr, ret.set )[0] :
-				ret.set[0];
-		}
-
-		if ( context ) {
-			ret = seed ?
-				{ expr: parts.pop(), set: makeArray(seed) } :
-				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
-
-			set = ret.expr ?
-				Sizzle.filter( ret.expr, ret.set ) :
-				ret.set;
-
-			if ( parts.length > 0 ) {
-				checkSet = makeArray( set );
-
-			} else {
-				prune = false;
-			}
-
-			while ( parts.length ) {
-				cur = parts.pop();
-				pop = cur;
-
-				if ( !Expr.relative[ cur ] ) {
-					cur = "";
-				} else {
-					pop = parts.pop();
-				}
-
-				if ( pop == null ) {
-					pop = context;
-				}
-
-				Expr.relative[ cur ]( checkSet, pop, contextXML );
-			}
-
-		} else {
-			checkSet = parts = [];
-		}
-	}
-
-	if ( !checkSet ) {
-		checkSet = set;
-	}
-
-	if ( !checkSet ) {
-		Sizzle.error( cur || selector );
-	}
-
-	if ( toString.call(checkSet) === "[object Array]" ) {
-		if ( !prune ) {
-			results.push.apply( results, checkSet );
-
-		} else if ( context && context.nodeType === 1 ) {
-			for ( i = 0; checkSet[i] != null; i++ ) {
-				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
-					results.push( set[i] );
-				}
-			}
-
-		} else {
-			for ( i = 0; checkSet[i] != null; i++ ) {
-				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
-					results.push( set[i] );
-				}
-			}
-		}
-
-	} else {
-		makeArray( checkSet, results );
-	}
-
-	if ( extra ) {
-		Sizzle( extra, origContext, results, seed );
-		Sizzle.uniqueSort( results );
-	}
-
-	return results;
-};
-
-Sizzle.uniqueSort = function( results ) {
-	if ( sortOrder ) {
-		hasDuplicate = baseHasDuplicate;
-		results.sort( sortOrder );
-
-		if ( hasDuplicate ) {
-			for ( var i = 1; i < results.length; i++ ) {
-				if ( results[i] === results[ i - 1 ] ) {
-					results.splice( i--, 1 );
-				}
-			}
-		}
-	}
-
-	return results;
-};
-
-Sizzle.matches = function( expr, set ) {
-	return Sizzle( expr, null, null, set );
-};
-
-Sizzle.matchesSelector = function( node, expr ) {
-	return Sizzle( expr, null, null, [node] ).length > 0;
-};
-
-Sizzle.find = function( expr, context, isXML ) {
-	var set;
-
-	if ( !expr ) {
-		return [];
-	}
-
-	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
-		var match,
-			type = Expr.order[i];
-		
-		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
-			var left = match[1];
-			match.splice( 1, 1 );
-
-			if ( left.substr( left.length - 1 ) !== "\\" ) {
-				match[1] = (match[1] || "").replace( rBackslash, "" );
-				set = Expr.find[ type ]( match, context, isXML );
-
-				if ( set != null ) {
-					expr = expr.replace( Expr.match[ type ], "" );
-					break;
-				}
-			}
-		}
-	}
-
-	if ( !set ) {
-		set = typeof context.getElementsByTagName !== "undefined" ?
-			context.getElementsByTagName( "*" ) :
-			[];
-	}
-
-	return { set: set, expr: expr };
-};
-
-Sizzle.filter = function( expr, set, inplace, not ) {
-	var match, anyFound,
-		old = expr,
-		result = [],
-		curLoop = set,
-		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
-
-	while ( expr && set.length ) {
-		for ( var type in Expr.filter ) {
-			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
-				var found, item,
-					filter = Expr.filter[ type ],
-					left = match[1];
-
-				anyFound = false;
-
-				match.splice(1,1);
-
-				if ( left.substr( left.length - 1 ) === "\\" ) {
-					continue;
-				}
-
-				if ( curLoop === result ) {
-					result = [];
-				}
-
-				if ( Expr.preFilter[ type ] ) {
-					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
-
-					if ( !match ) {
-						anyFound = found = true;
-
-					} else if ( match === true ) {
-						continue;
-					}
-				}
-
-				if ( match ) {
-					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
-						if ( item ) {
-							found = filter( item, match, i, curLoop );
-							var pass = not ^ !!found;
-
-							if ( inplace && found != null ) {
-								if ( pass ) {
-									anyFound = true;
-
-								} else {
-									curLoop[i] = false;
-								}
-
-							} else if ( pass ) {
-								result.push( item );
-								anyFound = true;
-							}
-						}
-					}
-				}
-
-				if ( found !== undefined ) {
-					if ( !inplace ) {
-						curLoop = result;
-					}
-
-					expr = expr.replace( Expr.match[ type ], "" );
-
-					if ( !anyFound ) {
-						return [];
-					}
-
-					break;
-				}
-			}
-		}
-
-		// Improper expression
-		if ( expr === old ) {
-			if ( anyFound == null ) {
-				Sizzle.error( expr );
-
-			} else {
-				break;
-			}
-		}
-
-		old = expr;
-	}
-
-	return curLoop;
-};
-
-Sizzle.error = function( msg ) {
-	throw "Syntax error, unrecognized expression: " + msg;
-};
-
-var Expr = Sizzle.selectors = {
-	order: [ "ID", "NAME", "TAG" ],
-
-	match: {
-		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
-		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
-		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
-		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
-		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
-		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
-		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
-		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
-	},
-
-	leftMatch: {},
-
-	attrMap: {
-		"class": "className",
-		"for": "htmlFor"
-	},
-
-	attrHandle: {
-		href: function( elem ) {
-			return elem.getAttribute( "href" );
-		},
-		type: function( elem ) {
-			return elem.getAttribute( "type" );
-		}
-	},
-
-	relative: {
-		"+": function(checkSet, part){
-			var isPartStr = typeof part === "string",
-				isTag = isPartStr && !rNonWord.test( part ),
-				isPartStrNotTag = isPartStr && !isTag;
-
-			if ( isTag ) {
-				part = part.toLowerCase();
-			}
-
-			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
-				if ( (elem = checkSet[i]) ) {
-					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
-
-					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
-						elem || false :
-						elem === part;
-				}
-			}
-
-			if ( isPartStrNotTag ) {
-				Sizzle.filter( part, checkSet, true );
-			}
-		},
-
-		">": function( checkSet, part ) {
-			var elem,
-				isPartStr = typeof part === "string",
-				i = 0,
-				l = checkSet.length;
-
-			if ( isPartStr && !rNonWord.test( part ) ) {
-				part = part.toLowerCase();
-
-				for ( ; i < l; i++ ) {
-					elem = checkSet[i];
-
-					if ( elem ) {
-						var parent = elem.parentNode;
-						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
-					}
-				}
-
-			} else {
-				for ( ; i < l; i++ ) {
-					elem = checkSet[i];
-
-					if ( elem ) {
-						checkSet[i] = isPartStr ?
-							elem.parentNode :
-							elem.parentNode === part;
-					}
-				}
-
-				if ( isPartStr ) {
-					Sizzle.filter( part, checkSet, true );
-				}
-			}
-		},
-
-		"": function(checkSet, part, isXML){
-			var nodeCheck,
-				doneName = done++,
-				checkFn = dirCheck;
-
-			if ( typeof part === "string" && !rNonWord.test( part ) ) {
-				part = part.toLowerCase();
-				nodeCheck = part;
-				checkFn = dirNodeCheck;
-			}
-
-			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
-		},
-
-		"~": function( checkSet, part, isXML ) {
-			var nodeCheck,
-				doneName = done++,
-				checkFn = dirCheck;
-
-			if ( typeof part === "string" && !rNonWord.test( part ) ) {
-				part = part.toLowerCase();
-				nodeCheck = part;
-				checkFn = dirNodeCheck;
-			}
-
-			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
-		}
-	},
-
-	find: {
-		ID: function( match, context, isXML ) {
-			if ( typeof context.getElementById !== "undefined" && !isXML ) {
-				var m = context.getElementById(match[1]);
-				// Check parentNode to catch when Blackberry 4.6 returns
-				// nodes that are no longer in the document #6963
-				return m && m.parentNode ? [m] : [];
-			}
-		},
-
-		NAME: function( match, context ) {
-			if ( typeof context.getElementsByName !== "undefined" ) {
-				var ret = [],
-					results = context.getElementsByName( match[1] );
-
-				for ( var i = 0, l = results.length; i < l; i++ ) {
-					if ( results[i].getAttribute("name") === match[1] ) {
-						ret.push( results[i] );
-					}
-				}
-
-				return ret.length === 0 ? null : ret;
-			}
-		},
-
-		TAG: function( match, context ) {
-			if ( typeof context.getElementsByTagName !== "undefined" ) {
-				return context.getElementsByTagName( match[1] );
-			}
-		}
-	},
-	preFilter: {
-		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
-			match = " " + match[1].replace( rBackslash, "" ) + " ";
-
-			if ( isXML ) {
-				return match;
-			}
-
-			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
-				if ( elem ) {
-					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
-						if ( !inplace ) {
-							result.push( elem );
-						}
-
-					} else if ( inplace ) {
-						curLoop[i] = false;
-					}
-				}
-			}
-
-			return false;
-		},
-
-		ID: function( match ) {
-			return match[1].replace( rBackslash, "" );
-		},
-
-		TAG: function( match, curLoop ) {
-			return match[1].replace( rBackslash, "" ).toLowerCase();
-		},
-
-		CHILD: function( match ) {
-			if ( match[1] === "nth" ) {
-				if ( !match[2] ) {
-					Sizzle.error( match[0] );
-				}
-
-				match[2] = match[2].replace(/^\+|\s*/g, '');
-
-				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
-				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
-					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
-					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
-
-				// calculate the numbers (first)n+(last) including if they are negative
-				match[2] = (test[1] + (test[2] || 1)) - 0;
-				match[3] = test[3] - 0;
-			}
-			else if ( match[2] ) {
-				Sizzle.error( match[0] );
-			}
-
-			// TODO: Move to normal caching system
-			match[0] = done++;
-
-			return match;
-		},
-
-		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
-			var name = match[1] = match[1].replace( rBackslash, "" );
-			
-			if ( !isXML && Expr.attrMap[name] ) {
-				match[1] = Expr.attrMap[name];
-			}
-
-			// Handle if an un-quoted value was used
-			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
-
-			if ( match[2] === "~=" ) {
-				match[4] = " " + match[4] + " ";
-			}
-
-			return match;
-		},
-
-		PSEUDO: function( match, curLoop, inplace, result, not ) {
-			if ( match[1] === "not" ) {
-				// If we're dealing with a complex expression, or a simple one
-				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
-					match[3] = Sizzle(match[3], null, null, curLoop);
-
-				} else {
-					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
-
-					if ( !inplace ) {
-						result.push.apply( result, ret );
-					}
-
-					return false;
-				}
-
-			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
-				return true;
-			}
-			
-			return match;
-		},
-
-		POS: function( match ) {
-			match.unshift( true );
-
-			return match;
-		}
-	},
-	
-	filters: {
-		enabled: function( elem ) {
-			return elem.disabled === false && elem.type !== "hidden";
-		},
-
-		disabled: function( elem ) {
-			return elem.disabled === true;
-		},
-
-		checked: function( elem ) {
-			return elem.checked === true;
-		},
-		
-		selected: function( elem ) {
-			// Accessing this property makes selected-by-default
-			// options in Safari work properly
-			if ( elem.parentNode ) {
-				elem.parentNode.selectedIndex;
-			}
-			
-			return elem.selected === true;
-		},
-
-		parent: function( elem ) {
-			return !!elem.firstChild;
-		},
-
-		empty: function( elem ) {
-			return !elem.firstChild;
-		},
-
-		has: function( elem, i, match ) {
-			return !!Sizzle( match[3], elem ).length;
-		},
-
-		header: function( elem ) {
-			return (/h\d/i).test( elem.nodeName );
-		},
-
-		text: function( elem ) {
-			var attr = elem.getAttribute( "type" ), type = elem.type;
-			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
-			// use getAttribute instead to test this case
-			return "text" === type && ( attr === type || attr === null );
-		},
-
-		radio: function( elem ) {
-			return "radio" === elem.type;
-		},
-
-		checkbox: function( elem ) {
-			return "checkbox" === elem.type;
-		},
-
-		file: function( elem ) {
-			return "file" === elem.type;
-		},
-		password: function( elem ) {
-			return "password" === elem.type;
-		},
-
-		submit: function( elem ) {
-			return "submit" === elem.type;
-		},
-
-		image: function( elem ) {
-			return "image" === elem.type;
-		},
-
-		reset: function( elem ) {
-			return "reset" === elem.type;
-		},
-
-		button: function( elem ) {
-			return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
-		},
-
-		input: function( elem ) {
-			return (/input|select|textarea|button/i).test( elem.nodeName );
-		}
-	},
-	setFilters: {
-		first: function( elem, i ) {
-			return i === 0;
-		},
-
-		last: function( elem, i, match, array ) {
-			return i === array.length - 1;
-		},
-
-		even: function( elem, i ) {
-			return i % 2 === 0;
-		},
-
-		odd: function( elem, i ) {
-			return i % 2 === 1;
-		},
-
-		lt: function( elem, i, match ) {
-			return i < match[3] - 0;
-		},
-
-		gt: function( elem, i, match ) {
-			return i > match[3] - 0;
-		},
-
-		nth: function( elem, i, match ) {
-			return match[3] - 0 === i;
-		},
-
-		eq: function( elem, i, match ) {
-			return match[3] - 0 === i;
-		}
-	},
-	filter: {
-		PSEUDO: function( elem, match, i, array ) {
-			var name = match[1],
-				filter = Expr.filters[ name ];
-
-			if ( filter ) {
-				return filter( elem, i, match, array );
-
-			} else if ( name === "contains" ) {
-				return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
-
-			} else if ( name === "not" ) {
-				var not = match[3];
-
-				for ( var j = 0, l = not.length; j < l; j++ ) {
-					if ( not[j] === elem ) {
-						return false;
-					}
-				}
-
-				return true;
-
-			} else {
-				Sizzle.error( name );
-			}
-		},
-
-		CHILD: function( elem, match ) {
-			var type = match[1],
-				node = elem;
-
-			switch ( type ) {
-				case "only":
-				case "first":
-					while ( (node = node.previousSibling) )	 {
-						if ( node.nodeType === 1 ) { 
-							return false; 
-						}
-					}
-
-					if ( type === "first" ) { 
-						return true; 
-					}
-
-					node = elem;
-
-				case "last":
-					while ( (node = node.nextSibling) )	 {
-						if ( node.nodeType === 1 ) { 
-							return false; 
-						}
-					}
-
-					return true;
-
-				case "nth":
-					var first = match[2],
-						last = match[3];
-
-					if ( first === 1 && last === 0 ) {
-						return true;
-					}
-					
-					var doneName = match[0],
-						parent = elem.parentNode;
-	
-					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
-						var count = 0;
-						
-						for ( node = parent.firstChild; node; node = node.nextSibling ) {
-							if ( node.nodeType === 1 ) {
-								node.nodeIndex = ++count;
-							}
-						} 
-
-						parent.sizcache = doneName;
-					}
-					
-					var diff = elem.nodeIndex - last;
-
-					if ( first === 0 ) {
-						return diff === 0;
-
-					} else {
-						return ( diff % first === 0 && diff / first >= 0 );
-					}
-			}
-		},
-
-		ID: function( elem, match ) {
-			return elem.nodeType === 1 && elem.getAttribute("id") === match;
-		},
-
-		TAG: function( elem, match ) {
-			return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
-		},
-		
-		CLASS: function( elem, match ) {
-			return (" " + (elem.className || elem.getAttribute("class")) + " ")
-				.indexOf( match ) > -1;
-		},
-
-		ATTR: function( elem, match ) {
-			var name = match[1],
-				result = Expr.attrHandle[ name ] ?
-					Expr.attrHandle[ name ]( elem ) :
-					elem[ name ] != null ?
-						elem[ name ] :
-						elem.getAttribute( name ),
-				value = result + "",
-				type = match[2],
-				check = match[4];
-
-			return result == null ?
-				type === "!=" :
-				type === "=" ?
-				value === check :
-				type === "*=" ?
-				value.indexOf(check) >= 0 :
-				type === "~=" ?
-				(" " + value + " ").indexOf(check) >= 0 :
-				!check ?
-				value && result !== false :
-				type === "!=" ?
-				value !== check :
-				type === "^=" ?
-				value.indexOf(check) === 0 :
-				type === "$=" ?
-				value.substr(value.length - check.length) === check :
-				type === "|=" ?
-				value === check || value.substr(0, check.length + 1) === check + "-" :
-				false;
-		},
-
-		POS: function( elem, match, i, array ) {
-			var name = match[2],
-				filter = Expr.setFilters[ name ];
-
-			if ( filter ) {
-				return filter( elem, i, match, array );
-			}
-		}
-	}
-};
-
-var origPOS = Expr.match.POS,
-	fescape = function(all, num){
-		return "\\" + (num - 0 + 1);
-	};
-
-for ( var type in Expr.match ) {
-	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
-	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
-}
-
-var makeArray = function( array, results ) {
-	array = Array.prototype.slice.call( array, 0 );
-
-	if ( results ) {
-		results.push.apply( results, array );
-		return results;
-	}
-	
-	return array;
-};
-
-// Perform a simple check to determine if the browser is capable of
-// converting a NodeList to an array using builtin methods.
-// Also verifies that the returned array holds DOM nodes
-// (which is not the case in the Blackberry browser)
-try {
-	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
-
-// Provide a fallback method if it does not work
-} catch( e ) {
-	makeArray = function( array, results ) {
-		var i = 0,
-			ret = results || [];
-
-		if ( toString.call(array) === "[object Array]" ) {
-			Array.prototype.push.apply( ret, array );
-
-		} else {
-			if ( typeof array.length === "number" ) {
-				for ( var l = array.length; i < l; i++ ) {
-					ret.push( array[i] );
-				}
-
-			} else {
-				for ( ; array[i]; i++ ) {
-					ret.push( array[i] );
-				}
-			}
-		}
-
-		return ret;
-	};
-}
-
-var sortOrder, siblingCheck;
-
-if ( document.documentElement.compareDocumentPosition ) {
-	sortOrder = function( a, b ) {
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-		}
-
-		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
-			return a.compareDocumentPosition ? -1 : 1;
-		}
-
-		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
-	};
-
-} else {
-	sortOrder = function( a, b ) {
-		var al, bl,
-			ap = [],
-			bp = [],
-			aup = a.parentNode,
-			bup = b.parentNode,
-			cur = aup;
-
-		// The nodes are identical, we can exit early
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-
-		// If the nodes are siblings (or identical) we can do a quick check
-		} else if ( aup === bup ) {
-			return siblingCheck( a, b );
-
-		// If no parents were found then the nodes are disconnected
-		} else if ( !aup ) {
-			return -1;
-
-		} else if ( !bup ) {
-			return 1;
-		}
-
-		// Otherwise they're somewhere else in the tree so we need
-		// to build up a full list of the parentNodes for comparison
-		while ( cur ) {
-			ap.unshift( cur );
-			cur = cur.parentNode;
-		}
-
-		cur = bup;
-
-		while ( cur ) {
-			bp.unshift( cur );
-			cur = cur.parentNode;
-		}
-
-		al = ap.length;
-		bl = bp.length;
-
-		// Start walking down the tree looking for a discrepancy
-		for ( var i = 0; i < al && i < bl; i++ ) {
-			if ( ap[i] !== bp[i] ) {
-				return siblingCheck( ap[i], bp[i] );
-			}
-		}
-
-		// We ended someplace up the tree so do a sibling check
-		return i === al ?
-			siblingCheck( a, bp[i], -1 ) :
-			siblingCheck( ap[i], b, 1 );
-	};
-
-	siblingCheck = function( a, b, ret ) {
-		if ( a === b ) {
-			return ret;
-		}
-
-		var cur = a.nextSibling;
-
-		while ( cur ) {
-			if ( cur === b ) {
-				return -1;
-			}
-
-			cur = cur.nextSibling;
-		}
-
-		return 1;
-	};
-}
-
-// Utility function for retreiving the text value of an array of DOM nodes
-Sizzle.getText = function( elems ) {
-	var ret = "", elem;
-
-	for ( var i = 0; elems[i]; i++ ) {
-		elem = elems[i];
-
-		// Get the text from text nodes and CDATA nodes
-		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
-			ret += elem.nodeValue;
-
-		// Traverse everything else, except comment nodes
-		} else if ( elem.nodeType !== 8 ) {
-			ret += Sizzle.getText( elem.childNodes );
-		}
-	}
-
-	return ret;
-};
-
-// Check to see if the browser returns elements by name when
-// querying by getElementById (and provide a workaround)
-(function(){
-	// We're going to inject a fake input element with a specified name
-	var form = document.createElement("div"),
-		id = "script" + (new Date()).getTime(),
-		root = document.documentElement;
-
-	form.innerHTML = "<a name='" + id + "'/>";
-
-	// Inject it into the root element, check its status, and remove it quickly
-	root.insertBefore( form, root.firstChild );
-
-	// The workaround has to do additional checks after a getElementById
-	// Which slows things down for other browsers (hence the branching)
-	if ( document.getElementById( id ) ) {
-		Expr.find.ID = function( match, context, isXML ) {
-			if ( typeof context.getElementById !== "undefined" && !isXML ) {
-				var m = context.getElementById(match[1]);
-
-				return m ?
-					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
-						[m] :
-						undefined :
-					[];
-			}
-		};
-
-		Expr.filter.ID = function( elem, match ) {
-			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
-
-			return elem.nodeType === 1 && node && node.nodeValue === match;
-		};
-	}
-
-	root.removeChild( form );
-
-	// release memory in IE
-	root = form = null;
-})();
-
-(function(){
-	// Check to see if the browser returns only elements
-	// when doing getElementsByTagName("*")
-
-	// Create a fake element
-	var div = document.createElement("div");
-	div.appendChild( document.createComment("") );
-
-	// Make sure no comments are found
-	if ( div.getElementsByTagName("*").length > 0 ) {
-		Expr.find.TAG = function( match, context ) {
-			var results = context.getElementsByTagName( match[1] );
-
-			// Filter out possible comments
-			if ( match[1] === "*" ) {
-				var tmp = [];
-
-				for ( var i = 0; results[i]; i++ ) {
-					if ( results[i].nodeType === 1 ) {
-						tmp.push( results[i] );
-					}
-				}
-
-				results = tmp;
-			}
-
-			return results;
-		};
-	}
-
-	// Check to see if an attribute returns normalized href attributes
-	div.innerHTML = "<a href='#'></a>";
-
-	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
-			div.firstChild.getAttribute("href") !== "#" ) {
-
-		Expr.attrHandle.href = function( elem ) {
-			return elem.getAttribute( "href", 2 );
-		};
-	}
-
-	// release memory in IE
-	div = null;
-})();
-
-if ( document.querySelectorAll ) {
-	(function(){
-		var oldSizzle = Sizzle,
-			div = document.createElement("div"),
-			id = "__sizzle__";
-
-		div.innerHTML = "<p class='TEST'></p>";
-
-		// Safari can't handle uppercase or unicode characters when
-		// in quirks mode.
-		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
-			return;
-		}
-	
-		Sizzle = function( query, context, extra, seed ) {
-			context = context || document;
-
-			// Only use querySelectorAll on non-XML documents
-			// (ID selectors don't work in non-HTML documents)
-			if ( !seed && !Sizzle.isXML(context) ) {
-				// See if we find a selector to speed up
-				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
-				
-				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
-					// Speed-up: Sizzle("TAG")
-					if ( match[1] ) {
-						return makeArray( context.getElementsByTagName( query ), extra );
-					
-					// Speed-up: Sizzle(".CLASS")
-					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
-						return makeArray( context.getElementsByClassName( match[2] ), extra );
-					}
-				}
-				
-				if ( context.nodeType === 9 ) {
-					// Speed-up: Sizzle("body")
-					// The body element only exists once, optimize finding it
-					if ( query === "body" && context.body ) {
-						return makeArray( [ context.body ], extra );
-						
-					// Speed-up: Sizzle("#ID")
-					} else if ( match && match[3] ) {
-						var elem = context.getElementById( match[3] );
-
-						// Check parentNode to catch when Blackberry 4.6 returns
-						// nodes that are no longer in the document #6963
-						if ( elem && elem.parentNode ) {
-							// Handle the case where IE and Opera return items
-							// by name instead of ID
-							if ( elem.id === match[3] ) {
-								return makeArray( [ elem ], extra );
-							}
-							
-						} else {
-							return makeArray( [], extra );
-						}
-					}
-					
-					try {
-						return makeArray( context.querySelectorAll(query), extra );
-					} catch(qsaError) {}
-
-				// qSA works strangely on Element-rooted queries
-				// We can work around this by specifying an extra ID on the root
-				// and working up from there (Thanks to Andrew Dupont for the technique)
-				// IE 8 doesn't work on object elements
-				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
-					var oldContext = context,
-						old = context.getAttribute( "id" ),
-						nid = old || id,
-						hasParent = context.parentNode,
-						relativeHierarchySelector = /^\s*[+~]/.test( query );
-
-					if ( !old ) {
-						context.setAttribute( "id", nid );
-					} else {
-						nid = nid.replace( /'/g, "\\$&" );
-					}
-					if ( relativeHierarchySelector && hasParent ) {
-						context = context.parentNode;
-					}
-
-					try {
-						if ( !relativeHierarchySelector || hasParent ) {
-							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
-						}
-
-					} catch(pseudoError) {
-					} finally {
-						if ( !old ) {
-							oldContext.removeAttribute( "id" );
-						}
-					}
-				}
-			}
-		
-			return oldSizzle(query, context, extra, seed);
-		};
-
-		for ( var prop in oldSizzle ) {
-			Sizzle[ prop ] = oldSizzle[ prop ];
-		}
-
-		// release memory in IE
-		div = null;
-	})();
-}
-
-(function(){
-	var html = document.documentElement,
-		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
-
-	if ( matches ) {
-		// Check to see if it's possible to do matchesSelector
-		// on a disconnected node (IE 9 fails this)
-		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
-			pseudoWorks = false;
-
-		try {
-			// This should fail with an exception
-			// Gecko does not error, returns false instead
-			matches.call( document.documentElement, "[test!='']:sizzle" );
-	
-		} catch( pseudoError ) {
-			pseudoWorks = true;
-		}
-
-		Sizzle.matchesSelector = function( node, expr ) {
-			// Make sure that attribute selectors are quoted
-			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
-
-			if ( !Sizzle.isXML( node ) ) {
-				try { 
-					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
-						var ret = matches.call( node, expr );
-
-						// IE 9's matchesSelector returns false on disconnected nodes
-						if ( ret || !disconnectedMatch ||
-								// As well, disconnected nodes are said to be in a document
-								// fragment in IE 9, so check for that
-								node.document && node.document.nodeType !== 11 ) {
-							return ret;
-						}
-					}
-				} catch(e) {}
-			}
-
-			return Sizzle(expr, null, null, [node]).length > 0;
-		};
-	}
-})();
-
-(function(){
-	var div = document.createElement("div");
-
-	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
-
-	// Opera can't find a second classname (in 9.6)
-	// Also, make sure that getElementsByClassName actually exists
-	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
-		return;
-	}
-
-	// Safari caches class attributes, doesn't catch changes (in 3.2)
-	div.lastChild.className = "e";
-
-	if ( div.getElementsByClassName("e").length === 1 ) {
-		return;
-	}
-	
-	Expr.order.splice(1, 0, "CLASS");
-	Expr.find.CLASS = function( match, context, isXML ) {
-		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
-			return context.getElementsByClassName(match[1]);
-		}
-	};
-
-	// release memory in IE
-	div = null;
-})();
-
-function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
-	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
-		var elem = checkSet[i];
-
-		if ( elem ) {
-			var match = false;
-
-			elem = elem[dir];
-
-			while ( elem ) {
-				if ( elem.sizcache === doneName ) {
-					match = checkSet[elem.sizset];
-					break;
-				}
-
-				if ( elem.nodeType === 1 && !isXML ){
-					elem.sizcache = doneName;
-					elem.sizset = i;
-				}
-
-				if ( elem.nodeName.toLowerCase() === cur ) {
-					match = elem;
-					break;
-				}
-
-				elem = elem[dir];
-			}
-
-			checkSet[i] = match;
-		}
-	}
-}
-
-function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
-	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
-		var elem = checkSet[i];
-
-		if ( elem ) {
-			var match = false;
-			
-			elem = elem[dir];
-
-			while ( elem ) {
-				if ( elem.sizcache === doneName ) {
-					match = checkSet[elem.sizset];
-					break;
-				}
-
-				if ( elem.nodeType === 1 ) {
-					if ( !isXML ) {
-						elem.sizcache = doneName;
-						elem.sizset = i;
-					}
-
-					if ( typeof cur !== "string" ) {
-						if ( elem === cur ) {
-							match = true;
-							break;
-						}
-
-					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
-						match = elem;
-						break;
-					}
-				}
-
-				elem = elem[dir];
-			}
-
-			checkSet[i] = match;
-		}
-	}
-}
-
-if ( document.documentElement.contains ) {
-	Sizzle.contains = function( a, b ) {
-		return a !== b && (a.contains ? a.contains(b) : true);
-	};
-
-} else if ( document.documentElement.compareDocumentPosition ) {
-	Sizzle.contains = function( a, b ) {
-		return !!(a.compareDocumentPosition(b) & 16);
-	};
-
-} else {
-	Sizzle.contains = function() {
-		return false;
-	};
-}
-
-Sizzle.isXML = function( elem ) {
-	// documentElement is verified for cases where it doesn't yet exist
-	// (such as loading iframes in IE - #4833) 
-	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
-
-	return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-var posProcess = function( selector, context ) {
-	var match,
-		tmpSet = [],
-		later = "",
-		root = context.nodeType ? [context] : context;
-
-	// Position selectors must be done after the filter
-	// And so must :not(positional) so we move all PSEUDOs to the end
-	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
-		later += match[0];
-		selector = selector.replace( Expr.match.PSEUDO, "" );
-	}
-
-	selector = Expr.relative[selector] ? selector + "*" : selector;
-
-	for ( var i = 0, l = root.length; i < l; i++ ) {
-		Sizzle( selector, root[i], tmpSet );
-	}
-
-	return Sizzle.filter( later, tmpSet );
-};
-
-// EXPOSE
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.filters;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-})();
-
-
-var runtil = /Until$/,
-	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
-	// Note: This RegExp should be improved, or likely pulled from Sizzle
-	rmultiselector = /,/,
-	isSimple = /^.[^:#\[\.,]*$/,
-	slice = Array.prototype.slice,
-	POS = jQuery.expr.match.POS,
-	// methods guaranteed to produce a unique set when starting from a unique set
-	guaranteedUnique = {
-		children: true,
-		contents: true,
-		next: true,
-		prev: true
-	};
-
-jQuery.fn.extend({
-	find: function( selector ) {
-		var ret = this.pushStack( "", "find", selector ),
-			length = 0;
-
-		for ( var i = 0, l = this.length; i < l; i++ ) {
-			length = ret.length;
-			jQuery.find( selector, this[i], ret );
-
-			if ( i > 0 ) {
-				// Make sure that the results are unique
-				for ( var n = length; n < ret.length; n++ ) {
-					for ( var r = 0; r < length; r++ ) {
-						if ( ret[r] === ret[n] ) {
-							ret.splice(n--, 1);
-							break;
-						}
-					}
-				}
-			}
-		}
-
-		return ret;
-	},
-
-	has: function( target ) {
-		var targets = jQuery( target );
-		return this.filter(function() {
-			for ( var i = 0, l = targets.length; i < l; i++ ) {
-				if ( jQuery.contains( this, targets[i] ) ) {
-					return true;
-				}
-			}
-		});
-	},
-
-	not: function( selector ) {
-		return this.pushStack( winnow(this, selector, false), "not", selector);
-	},
-
-	filter: function( selector ) {
-		return this.pushStack( winnow(this, selector, true), "filter", selector );
-	},
-
-	is: function( selector ) {
-		return !!selector && jQuery.filter( selector, this ).length > 0;
-	},
-
-	closest: function( selectors, context ) {
-		var ret = [], i, l, cur = this[0];
-
-		if ( jQuery.isArray( selectors ) ) {
-			var match, selector,
-				matches = {},
-				level = 1;
-
-			if ( cur && selectors.length ) {
-				for ( i = 0, l = selectors.length; i < l; i++ ) {
-					selector = selectors[i];
-
-					if ( !matches[selector] ) {
-						matches[selector] = jQuery.expr.match.POS.test( selector ) ?
-							jQuery( selector, context || this.context ) :
-							selector;
-					}
-				}
-
-				while ( cur && cur.ownerDocument && cur !== context ) {
-					for ( selector in matches ) {
-						match = matches[selector];
-
-						if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
-							ret.push({ selector: selector, elem: cur, level: level });
-						}
-					}
-
-					cur = cur.parentNode;
-					level++;
-				}
-			}
-
-			return ret;
-		}
-
-		var pos = POS.test( selectors ) ?
-			jQuery( selectors, context || this.context ) : null;
-
-		for ( i = 0, l = this.length; i < l; i++ ) {
-			cur = this[i];
-
-			while ( cur ) {
-				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
-					ret.push( cur );
-					break;
-
-				} else {
-					cur = cur.parentNode;
-					if ( !cur || !cur.ownerDocument || cur === context ) {
-						break;
-					}
-				}
-			}
-		}
-
-		ret = ret.length > 1 ? jQuery.unique(ret) : ret;
-
-		return this.pushStack( ret, "closest", selectors );
-	},
-
-	// Determine the position of an element within
-	// the matched set of elements
-	index: function( elem ) {
-		if ( !elem || typeof elem === "string" ) {
-			return jQuery.inArray( this[0],
-				// If it receives a string, the selector is used
-				// If it receives nothing, the siblings are used
-				elem ? jQuery( elem ) : this.parent().children() );
-		}
-		// Locate the position of the desired element
-		return jQuery.inArray(
-			// If it receives a jQuery object, the first element is used
-			elem.jquery ? elem[0] : elem, this );
-	},
-
-	add: function( selector, context ) {
-		var set = typeof selector === "string" ?
-				jQuery( selector, context ) :
-				jQuery.makeArray( selector ),
-			all = jQuery.merge( this.get(), set );
-
-		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
-			all :
-			jQuery.unique( all ) );
-	},
-
-	andSelf: function() {
-		return this.add( this.prevObject );
-	}
-});
-
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
-function isDisconnected( node ) {
-	return !node || !node.parentNode || node.parentNode.nodeType === 11;
-}
-
-jQuery.each({
-	parent: function( elem ) {
-		var parent = elem.parentNode;
-		return parent && parent.nodeType !== 11 ? parent : null;
-	},
-	parents: function( elem ) {
-		return jQuery.dir( elem, "parentNode" );
-	},
-	parentsUntil: function( elem, i, until ) {
-		return jQuery.dir( elem, "parentNode", until );
-	},
-	next: function( elem ) {
-		return jQuery.nth( elem, 2, "nextSibling" );
-	},
-	prev: function( elem ) {
-		return jQuery.nth( elem, 2, "previousSibling" );
-	},
-	nextAll: function( elem ) {
-		return jQuery.dir( elem, "nextSibling" );
-	},
-	prevAll: function( elem ) {
-		return jQuery.dir( elem, "previousSibling" );
-	},
-	nextUntil: function( elem, i, until ) {
-		return jQuery.dir( elem, "nextSibling", until );
-	},
-	prevUntil: function( elem, i, until ) {
-		return jQuery.dir( elem, "previousSibling", until );
-	},
-	siblings: function( elem ) {
-		return jQuery.sibling( elem.parentNode.firstChild, elem );
-	},
-	children: function( elem ) {
-		return jQuery.sibling( elem.firstChild );
-	},
-	contents: function( elem ) {
-		return jQuery.nodeName( elem, "iframe" ) ?
-			elem.contentDocument || elem.contentWindow.document :
-			jQuery.makeArray( elem.childNodes );
-	}
-}, function( name, fn ) {
-	jQuery.fn[ name ] = function( until, selector ) {
-		var ret = jQuery.map( this, fn, until ),
-			// The variable 'args' was introduced in
-			// https://github.com/jquery/jquery/commit/52a0238
-			// to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
-			// http://code.google.com/p/v8/issues/detail?id=1050
-			args = slice.call(arguments);
-
-		if ( !runtil.test( name ) ) {
-			selector = until;
-		}
-
-		if ( selector && typeof selector === "string" ) {
-			ret = jQuery.filter( selector, ret );
-		}
-
-		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
-
-		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
-			ret = ret.reverse();
-		}
-
-		return this.pushStack( ret, name, args.join(",") );
-	};
-});
-
-jQuery.extend({
-	filter: function( expr, elems, not ) {
-		if ( not ) {
-			expr = ":not(" + expr + ")";
-		}
-
-		return elems.length === 1 ?
-			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
-			jQuery.find.matches(expr, elems);
-	},
-
-	dir: function( elem, dir, until ) {
-		var matched = [],
-			cur = elem[ dir ];
-
-		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
-			if ( cur.nodeType === 1 ) {
-				matched.push( cur );
-			}
-			cur = cur[dir];
-		}
-		return matched;
-	},
-
-	nth: function( cur, result, dir, elem ) {
-		result = result || 1;
-		var num = 0;
-
-		for ( ; cur; cur = cur[dir] ) {
-			if ( cur.nodeType === 1 && ++num === result ) {
-				break;
-			}
-		}
-
-		return cur;
-	},
-
-	sibling: function( n, elem ) {
-		var r = [];
-
-		for ( ; n; n = n.nextSibling ) {
-			if ( n.nodeType === 1 && n !== elem ) {
-				r.push( n );
-			}
-		}
-
-		return r;
-	}
-});
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, keep ) {
-	if ( jQuery.isFunction( qualifier ) ) {
-		return jQuery.grep(elements, function( elem, i ) {
-			var retVal = !!qualifier.call( elem, i, elem );
-			return retVal === keep;
-		});
-
-	} else if ( qualifier.nodeType ) {
-		return jQuery.grep(elements, function( elem, i ) {
-			return (elem === qualifier) === keep;
-		});
-
-	} else if ( typeof qualifier === "string" ) {
-		var filtered = jQuery.grep(elements, function( elem ) {
-			return elem.nodeType === 1;
-		});
-
-		if ( isSimple.test( qualifier ) ) {
-			return jQuery.filter(qualifier, filtered, !keep);
-		} else {
-			qualifier = jQuery.filter( qualifier, filtered );
-		}
-	}
-
-	return jQuery.grep(elements, function( elem, i ) {
-		return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
-	});
-}
-
-
-
-
-var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
-	rleadingWhitespace = /^\s+/,
-	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
-	rtagName = /<([\w:]+)/,
-	rtbody = /<tbody/i,
-	rhtml = /<|&#?\w+;/,
-	rnocache = /<(?:script|object|embed|option|style)/i,
-	// checked="checked" or checked
-	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-	wrapMap = {
-		option: [ 1, "<select multiple='multiple'>", "</select>" ],
-		legend: [ 1, "<fieldset>", "</fieldset>" ],
-		thead: [ 1, "<table>", "</table>" ],
-		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
-		area: [ 1, "<map>", "</map>" ],
-		_default: [ 0, "", "" ]
-	};
-
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-// IE can't serialize <link> and <script> tags normally
-if ( !jQuery.support.htmlSerialize ) {
-	wrapMap._default = [ 1, "div<div>", "</div>" ];
-}
-
-jQuery.fn.extend({
-	text: function( text ) {
-		if ( jQuery.isFunction(text) ) {
-			return this.each(function(i) {
-				var self = jQuery( this );
-
-				self.text( text.call(this, i, self.text()) );
-			});
-		}
-
-		if ( typeof text !== "object" && text !== undefined ) {
-			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
-		}
-
-		return jQuery.text( this );
-	},
-
-	wrapAll: function( html ) {
-		if ( jQuery.isFunction( html ) ) {
-			return this.each(function(i) {
-				jQuery(this).wrapAll( html.call(this, i) );
-			});
-		}
-
-		if ( this[0] ) {
-			// The elements to wrap the target around
-			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
-
-			if ( this[0].parentNode ) {
-				wrap.insertBefore( this[0] );
-			}
-
-			wrap.map(function() {
-				var elem = this;
-
-				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
-					elem = elem.firstChild;
-				}
-
-				return elem;
-			}).append(this);
-		}
-
-		return this;
-	},
-
-	wrapInner: function( html ) {
-		if ( jQuery.isFunction( html ) ) {
-			return this.each(function(i) {
-				jQuery(this).wrapInner( html.call(this, i) );
-			});
-		}
-
-		return this.each(function() {
-			var self = jQuery( this ),
-				contents = self.contents();
-
-			if ( contents.length ) {
-				contents.wrapAll( html );
-
-			} else {
-				self.append( html );
-			}
-		});
-	},
-
-	wrap: function( html ) {
-		return this.each(function() {
-			jQuery( this ).wrapAll( html );
-		});
-	},
-
-	unwrap: function() {
-		return this.parent().each(function() {
-			if ( !jQuery.nodeName( this, "body" ) ) {
-				jQuery( this ).replaceWith( this.childNodes );
-			}
-		}).end();
-	},
-
-	append: function() {
-		return this.domManip(arguments, true, function( elem ) {
-			if ( this.nodeType === 1 ) {
-				this.appendChild( elem );
-			}
-		});
-	},
-
-	prepend: function() {
-		return this.domManip(arguments, true, function( elem ) {
-			if ( this.nodeType === 1 ) {
-				this.insertBefore( elem, this.firstChild );
-			}
-		});
-	},
-
-	before: function() {
-		if ( this[0] && this[0].parentNode ) {
-			return this.domManip(arguments, false, function( elem ) {
-				this.parentNode.insertBefore( elem, this );
-			});
-		} else if ( arguments.length ) {
-			var set = jQuery(arguments[0]);
-			set.push.apply( set, this.toArray() );
-			return this.pushStack( set, "before", arguments );
-		}
-	},
-
-	after: function() {
-		if ( this[0] && this[0].parentNode ) {
-			return this.domManip(arguments, false, function( elem ) {
-				this.parentNode.insertBefore( elem, this.nextSibling );
-			});
-		} else if ( arguments.length ) {
-			var set = this.pushStack( this, "after", arguments );
-			set.push.apply( set, jQuery(arguments[0]).toArray() );
-			return set;
-		}
-	},
-
-	// keepData is for internal use only--do not document
-	remove: function( selector, keepData ) {
-		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
-			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
-				if ( !keepData && elem.nodeType === 1 ) {
-					jQuery.cleanData( elem.getElementsByTagName("*") );
-					jQuery.cleanData( [ elem ] );
-				}
-
-				if ( elem.parentNode ) {
-					elem.parentNode.removeChild( elem );
-				}
-			}
-		}
-
-		return this;
-	},
-
-	empty: function() {
-		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
-			// Remove element nodes and prevent memory leaks
-			if ( elem.nodeType === 1 ) {
-				jQuery.cleanData( elem.getElementsByTagName("*") );
-			}
-
-			// Remove any remaining nodes
-			while ( elem.firstChild ) {
-				elem.removeChild( elem.firstChild );
-			}
-		}
-
-		return this;
-	},
-
-	clone: function( dataAndEvents, deepDataAndEvents ) {
-		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
-		return this.map( function () {
-			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-		});
-	},
-
-	html: function( value ) {
-		if ( value === undefined ) {
-			return this[0] && this[0].nodeType === 1 ?
-				this[0].innerHTML.replace(rinlinejQuery, "") :
-				null;
-
-		// See if we can take a shortcut and just use innerHTML
-		} else if ( typeof value === "string" && !rnocache.test( value ) &&
-			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
-			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
-
-			value = value.replace(rxhtmlTag, "<$1></$2>");
-
-			try {
-				for ( var i = 0, l = this.length; i < l; i++ ) {
-					// Remove element nodes and prevent memory leaks
-					if ( this[i].nodeType === 1 ) {
-						jQuery.cleanData( this[i].getElementsByTagName("*") );
-						this[i].innerHTML = value;
-					}
-				}
-
-			// If using innerHTML throws an exception, use the fallback method
-			} catch(e) {
-				this.empty().append( value );
-			}
-
-		} else if ( jQuery.isFunction( value ) ) {
-			this.each(function(i){
-				var self = jQuery( this );
-
-				self.html( value.call(this, i, self.html()) );
-			});
-
-		} else {
-			this.empty().append( value );
-		}
-
-		return this;
-	},
-
-	replaceWith: function( value ) {
-		if ( this[0] && this[0].parentNode ) {
-			// Make sure that the elements are removed from the DOM before they are inserted
-			// this can help fix replacing a parent with child elements
-			if ( jQuery.isFunction( value ) ) {
-				return this.each(function(i) {
-					var self = jQuery(this), old = self.html();
-					self.replaceWith( value.call( this, i, old ) );
-				});
-			}
-
-			if ( typeof value !== "string" ) {
-				value = jQuery( value ).detach();
-			}
-
-			return this.each(function() {
-				var next = this.nextSibling,
-					parent = this.parentNode;
-
-				jQuery( this ).remove();
-
-				if ( next ) {
-					jQuery(next).before( value );
-				} else {
-					jQuery(parent).append( value );
-				}
-			});
-		} else {
-			return this.length ?
-				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
-				this;
-		}
-	},
-
-	detach: function( selector ) {
-		return this.remove( selector, true );
-	},
-
-	domManip: function( args, table, callback ) {
-		var results, first, fragment, parent,
-			value = args[0],
-			scripts = [];
-
-		// We can't cloneNode fragments that contain checked, in WebKit
-		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
-			return this.each(function() {
-				jQuery(this).domManip( args, table, callback, true );
-			});
-		}
-
-		if ( jQuery.isFunction(value) ) {
-			return this.each(function(i) {
-				var self = jQuery(this);
-				args[0] = value.call(this, i, table ? self.html() : undefined);
-				self.domManip( args, table, callback );
-			});
-		}
-
-		if ( this[0] ) {
-			parent = value && value.parentNode;
-
-			// If we're in a fragment, just use that instead of building a new one
-			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
-				results = { fragment: parent };
-
-			} else {
-				results = jQuery.buildFragment( args, this, scripts );
-			}
-
-			fragment = results.fragment;
-
-			if ( fragment.childNodes.length === 1 ) {
-				first = fragment = fragment.firstChild;
-			} else {
-				first = fragment.firstChild;
-			}
-
-			if ( first ) {
-				table = table && jQuery.nodeName( first, "tr" );
-
-				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
-					callback.call(
-						table ?
-							root(this[i], first) :
-							this[i],
-						// Make sure that we do not leak memory by inadvertently discarding
-						// the original fragment (which might have attached data) instead of
-						// using it; in addition, use the original fragment object for the last
-						// item instead of first because it can end up being emptied incorrectly
-						// in certain situations (Bug #8070).
-						// Fragments from the fragment cache must always be cloned and never used
-						// in place.
-						results.cacheable || (l > 1 && i < lastIndex) ?
-							jQuery.clone( fragment, true, true ) :
-							fragment
-					);
-				}
-			}
-
-			if ( scripts.length ) {
-				jQuery.each( scripts, evalScript );
-			}
-		}
-
-		return this;
-	}
-});
-
-function root( elem, cur ) {
-	return jQuery.nodeName(elem, "table") ?
-		(elem.getElementsByTagName("tbody")[0] ||
-		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
-		elem;
-}
-
-function cloneCopyEvent( src, dest ) {
-
-	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
-		return;
-	}
-
-	var internalKey = jQuery.expando,
-		oldData = jQuery.data( src ),
-		curData = jQuery.data( dest, oldData );
-
-	// Switch to use the internal data object, if it exists, for the next
-	// stage of data copying
-	if ( (oldData = oldData[ internalKey ]) ) {
-		var events = oldData.events;
-				curData = curData[ internalKey ] = jQuery.extend({}, oldData);
-
-		if ( events ) {
-			delete curData.handle;
-			curData.events = {};
-
-			for ( var type in events ) {
-				for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
-					jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
-				}
-			}
-		}
-	}
-}
-
-function cloneFixAttributes(src, dest) {
-	// We do not need to do anything for non-Elements
-	if ( dest.nodeType !== 1 ) {
-		return;
-	}
-
-	var nodeName = dest.nodeName.toLowerCase();
-
-	// clearAttributes removes the attributes, which we don't want,
-	// but also removes the attachEvent events, which we *do* want
-	dest.clearAttributes();
-
-	// mergeAttributes, in contrast, only merges back on the
-	// original attributes, not the events
-	dest.mergeAttributes(src);
-
-	// IE6-8 fail to clone children inside object elements that use
-	// the proprietary classid attribute value (rather than the type
-	// attribute) to identify the type of content to display
-	if ( nodeName === "object" ) {
-		dest.outerHTML = src.outerHTML;
-
-	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
-		// IE6-8 fails to persist the checked state of a cloned checkbox
-		// or radio button. Worse, IE6-7 fail to give the cloned element
-		// a checked appearance if the defaultChecked value isn't also set
-		if ( src.checked ) {
-			dest.defaultChecked = dest.checked = src.checked;
-		}
-
-		// IE6-7 get confused and end up setting the value of a cloned
-		// checkbox/radio button to an empty string instead of "on"
-		if ( dest.value !== src.value ) {
-			dest.value = src.value;
-		}
-
-	// IE6-8 fails to return the selected option to the default selected
-	// state when cloning options
-	} else if ( nodeName === "option" ) {
-		dest.selected = src.defaultSelected;
-
-	// IE6-8 fails to set the defaultValue to the correct value when
-	// cloning other types of input fields
-	} else if ( nodeName === "input" || nodeName === "textarea" ) {
-		dest.defaultValue = src.defaultValue;
-	}
-
-	// Event data gets referenced instead of copied if the expando
-	// gets copied too
-	dest.removeAttribute( jQuery.expando );
-}
-
-jQuery.buildFragment = function( args, nodes, scripts ) {
-	var fragment, cacheable, cacheresults,
-		doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
-
-	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
-	// Cloning options loses the selected state, so don't cache them
-	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
-	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
-	if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
-		args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
-
-		cacheable = true;
-		cacheresults = jQuery.fragments[ args[0] ];
-		if ( cacheresults ) {
-			if ( cacheresults !== 1 ) {
-				fragment = cacheresults;
-			}
-		}
-	}
-
-	if ( !fragment ) {
-		fragment = doc.createDocumentFragment();
-		jQuery.clean( args, doc, fragment, scripts );
-	}
-
-	if ( cacheable ) {
-		jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
-	}
-
-	return { fragment: fragment, cacheable: cacheable };
-};
-
-jQuery.fragments = {};
-
-jQuery.each({
-	appendTo: "append",
-	prependTo: "prepend",
-	insertBefore: "before",
-	insertAfter: "after",
-	replaceAll: "replaceWith"
-}, function( name, original ) {
-	jQuery.fn[ name ] = function( selector ) {
-		var ret = [],
-			insert = jQuery( selector ),
-			parent = this.length === 1 && this[0].parentNode;
-
-		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
-			insert[ original ]( this[0] );
-			return this;
-
-		} else {
-			for ( var i = 0, l = insert.length; i < l; i++ ) {
-				var elems = (i > 0 ? this.clone(true) : this).get();
-				jQuery( insert[i] )[ original ]( elems );
-				ret = ret.concat( elems );
-			}
-
-			return this.pushStack( ret, name, insert.selector );
-		}
-	};
-});
-
-function getAll( elem ) {
-	if ( "getElementsByTagName" in elem ) {
-		return elem.getElementsByTagName( "*" );
-	
-	} else if ( "querySelectorAll" in elem ) {
-		return elem.querySelectorAll( "*" );
-
-	} else {
-		return [];
-	}
-}
-
-jQuery.extend({
-	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-		var clone = elem.cloneNode(true),
-				srcElements,
-				destElements,
-				i;
-
-		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
-				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
-			// IE copies events bound via attachEvent when using cloneNode.
-			// Calling detachEvent on the clone will also remove the events
-			// from the original. In order to get around this, we use some
-			// proprietary methods to clear the events. Thanks to MooTools
-			// guys for this hotness.
-
-			cloneFixAttributes( elem, clone );
-
-			// Using Sizzle here is crazy slow, so we use getElementsByTagName
-			// instead
-			srcElements = getAll( elem );
-			destElements = getAll( clone );
-
-			// Weird iteration because IE will replace the length property
-			// with an element if you are cloning the body and one of the
-			// elements on the page has a name or id of "length"
-			for ( i = 0; srcElements[i]; ++i ) {
-				cloneFixAttributes( srcElements[i], destElements[i] );
-			}
-		}
-
-		// Copy the events from the original to the clone
-		if ( dataAndEvents ) {
-			cloneCopyEvent( elem, clone );
-
-			if ( deepDataAndEvents ) {
-				srcElements = getAll( elem );
-				destElements = getAll( clone );
-
-				for ( i = 0; srcElements[i]; ++i ) {
-					cloneCopyEvent( srcElements[i], destElements[i] );
-				}
-			}
-		}
-
-		// Return the cloned set
-		return clone;
-},
-	clean: function( elems, context, fragment, scripts ) {
-		context = context || document;
-
-		// !context.createElement fails in IE with an error but returns typeof 'object'
-		if ( typeof context.createElement === "undefined" ) {
-			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
-		}
-
-		var ret = [];
-
-		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
-			if ( typeof elem === "number" ) {
-				elem += "";
-			}
-
-			if ( !elem ) {
-				continue;
-			}
-
-			// Convert html string into DOM nodes
-			if ( typeof elem === "string" && !rhtml.test( elem ) ) {
-				elem = context.createTextNode( elem );
-
-			} else if ( typeof elem === "string" ) {
-				// Fix "XHTML"-style tags in all browsers
-				elem = elem.replace(rxhtmlTag, "<$1></$2>");
-
-				// Trim whitespace, otherwise indexOf won't work as expected
-				var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
-					wrap = wrapMap[ tag ] || wrapMap._default,
-					depth = wrap[0],
-					div = context.createElement("div");
-
-				// Go to html and back, then peel off extra wrappers
-				div.innerHTML = wrap[1] + elem + wrap[2];
-
-				// Move to the right depth
-				while ( depth-- ) {
-					div = div.lastChild;
-				}
-
-				// Remove IE's autoinserted <tbody> from table fragments
-				if ( !jQuery.support.tbody ) {
-
-					// String was a <table>, *may* have spurious <tbody>
-					var hasBody = rtbody.test(elem),
-						tbody = tag === "table" && !hasBody ?
-							div.firstChild && div.firstChild.childNodes :
-
-							// String was a bare <thead> or <tfoot>
-							wrap[1] === "<table>" && !hasBody ?
-								div.childNodes :
-								[];
-
-					for ( var j = tbody.length - 1; j >= 0 ; --j ) {
-						if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
-							tbody[ j ].parentNode.removeChild( tbody[ j ] );
-						}
-					}
-
-				}
-
-				// IE completely kills leading whitespace when innerHTML is used
-				if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
-					div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
-				}
-
-				elem = div.childNodes;
-			}
-
-			if ( elem.nodeType ) {
-				ret.push( elem );
-			} else {
-				ret = jQuery.merge( ret, elem );
-			}
-		}
-
-		if ( fragment ) {
-			for ( i = 0; ret[i]; i++ ) {
-				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
-					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
-
-				} else {
-					if ( ret[i].nodeType === 1 ) {
-						ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
-					}
-					fragment.appendChild( ret[i] );
-				}
-			}
-		}
-
-		return ret;
-	},
-
-	cleanData: function( elems ) {
-		var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
-			deleteExpando = jQuery.support.deleteExpando;
-
-		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
-			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
-				continue;
-			}
-
-			id = elem[ jQuery.expando ];
-
-			if ( id ) {
-				data = cache[ id ] && cache[ id ][ internalKey ];
-
-				if ( data && data.events ) {
-					for ( var type in data.events ) {
-						if ( special[ type ] ) {
-							jQuery.event.remove( elem, type );
-
-						// This is a shortcut to avoid jQuery.event.remove's overhead
-						} else {
-							jQuery.removeEvent( elem, type, data.handle );
-						}
-					}
-
-					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
-					if ( data.handle ) {
-						data.handle.elem = null;
-					}
-				}
-
-				if ( deleteExpando ) {
-					delete elem[ jQuery.expando ];
-
-				} else if ( elem.removeAttribute ) {
-					elem.removeAttribute( jQuery.expando );
-				}
-
-				delete cache[ id ];
-			}
-		}
-	}
-});
-
-function evalScript( i, elem ) {
-	if ( elem.src ) {
-		jQuery.ajax({
-			url: elem.src,
-			async: false,
-			dataType: "script"
-		});
-	} else {
-		jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
-	}
-
-	if ( elem.parentNode ) {
-		elem.parentNode.removeChild( elem );
-	}
-}
-
-
-
-
-var ralpha = /alpha\([^)]*\)/i,
-	ropacity = /opacity=([^)]*)/,
-	rdashAlpha = /-([a-z])/ig,
-	// fixed for IE9, see #8346
-	rupper = /([A-Z]|^ms)/g,
-	rnumpx = /^-?\d+(?:px)?$/i,
-	rnum = /^-?\d/,
-
-	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-	cssWidth = [ "Left", "Right" ],
-	cssHeight = [ "Top", "Bottom" ],
-	curCSS,
-
-	getComputedStyle,
-	currentStyle,
-
-	fcamelCase = function( all, letter ) {
-		return letter.toUpperCase();
-	};
-
-jQuery.fn.css = function( name, value ) {
-	// Setting 'undefined' is a no-op
-	if ( arguments.length === 2 && value === undefined ) {
-		return this;
-	}
-
-	return jQuery.access( this, name, value, true, function( elem, name, value ) {
-		return value !== undefined ?
-			jQuery.style( elem, name, value ) :
-			jQuery.css( elem, name );
-	});
-};
-
-jQuery.extend({
-	// Add in style property hooks for overriding the default
-	// behavior of getting and setting a style property
-	cssHooks: {
-		opacity: {
-			get: function( elem, computed ) {
-				if ( computed ) {
-					// We should always get a number back from opacity
-					var ret = curCSS( elem, "opacity", "opacity" );
-					return ret === "" ? "1" : ret;
-
-				} else {
-					return elem.style.opacity;
-				}
-			}
-		}
-	},
-
-	// Exclude the following css properties to add px
-	cssNumber: {
-		"zIndex": true,
-		"fontWeight": true,
-		"opacity": true,
-		"zoom": true,
-		"lineHeight": true
-	},
-
-	// Add in properties whose names you wish to fix before
-	// setting or getting the value
-	cssProps: {
-		// normalize float css property
-		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
-	},
-
-	// Get and set the style property on a DOM Node
-	style: function( elem, name, value, extra ) {
-		// Don't set styles on text and comment nodes
-		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
-			return;
-		}
-
-		// Make sure that we're working with the right name
-		var ret, origName = jQuery.camelCase( name ),
-			style = elem.style, hooks = jQuery.cssHooks[ origName ];
-
-		name = jQuery.cssProps[ origName ] || origName;
-
-		// Check if we're setting a value
-		if ( value !== undefined ) {
-			// Make sure that NaN and null values aren't set. See: #7116
-			if ( typeof value === "number" && isNaN( value ) || value == null ) {
-				return;
-			}
-
-			// If a number was passed in, add 'px' to the (except for certain CSS properties)
-			if ( typeof value === "number" && !jQuery.cssNumber[ origName ] ) {
-				value += "px";
-			}
-
-			// If a hook was provided, use that value, otherwise just set the specified value
-			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
-				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
-				// Fixes bug #5509
-				try {
-					style[ name ] = value;
-				} catch(e) {}
-			}
-
-		} else {
-			// If a hook was provided get the non-computed value from there
-			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
-				return ret;
-			}
-
-			// Otherwise just get the value from the style object
-			return style[ name ];
-		}
-	},
-
-	css: function( elem, name, extra ) {
-		// Make sure that we're working with the right name
-		var ret, origName = jQuery.camelCase( name ),
-			hooks = jQuery.cssHooks[ origName ];
-
-		name = jQuery.cssProps[ origName ] || origName;
-
-		// If a hook was provided get the computed value from there
-		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
-			return ret;
-
-		// Otherwise, if a way to get the computed value exists, use that
-		} else if ( curCSS ) {
-			return curCSS( elem, name, origName );
-		}
-	},
-
-	// A method for quickly swapping in/out CSS properties to get correct calculations
-	swap: function( elem, options, callback ) {
-		var old = {};
-
-		// Remember the old values, and insert the new ones
-		for ( var name in options ) {
-			old[ name ] = elem.style[ name ];
-			elem.style[ name ] = options[ name ];
-		}
-
-		callback.call( elem );
-
-		// Revert the old values
-		for ( name in options ) {
-			elem.style[ name ] = old[ name ];
-		}
-	},
-
-	camelCase: function( string ) {
-		return string.replace( rdashAlpha, fcamelCase );
-	}
-});
-
-// DEPRECATED, Use jQuery.css() instead
-jQuery.curCSS = jQuery.css;
-
-jQuery.each(["height", "width"], function( i, name ) {
-	jQuery.cssHooks[ name ] = {
-		get: function( elem, computed, extra ) {
-			var val;
-
-			if ( computed ) {
-				if ( elem.offsetWidth !== 0 ) {
-					val = getWH( elem, name, extra );
-
-				} else {
-					jQuery.swap( elem, cssShow, function() {
-						val = getWH( elem, name, extra );
-					});
-				}
-
-				if ( val <= 0 ) {
-					val = curCSS( elem, name, name );
-
-					if ( val === "0px" && currentStyle ) {
-						val = currentStyle( elem, name, name );
-					}
-
-					if ( val != null ) {
-						// Should return "auto" instead of 0, use 0 for
-						// temporary backwards-compat
-						return val === "" || val === "auto" ? "0px" : val;
-					}
-				}
-
-				if ( val < 0 || val == null ) {
-					val = elem.style[ name ];
-
-					// Should return "auto" instead of 0, use 0 for
-					// temporary backwards-compat
-					return val === "" || val === "auto" ? "0px" : val;
-				}
-
-				return typeof val === "string" ? val : val + "px";
-			}
-		},
-
-		set: function( elem, value ) {
-			if ( rnumpx.test( value ) ) {
-				// ignore negative width and height values #1599
-				value = parseFloat(value);
-
-				if ( value >= 0 ) {
-					return value + "px";
-				}
-
-			} else {
-				return value;
-			}
-		}
-	};
-});
-
-if ( !jQuery.support.opacity ) {
-	jQuery.cssHooks.opacity = {
-		get: function( elem, computed ) {
-			// IE uses filters for opacity
-			return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ?
-				(parseFloat(RegExp.$1) / 100) + "" :
-				computed ? "1" : "";
-		},
-
-		set: function( elem, value ) {
-			var style = elem.style;
-
-			// IE has trouble with opacity if it does not have layout
-			// Force it by setting the zoom level
-			style.zoom = 1;
-
-			// Set the alpha filter to set the opacity
-			var opacity = jQuery.isNaN(value) ?
-				"" :
-				"alpha(opacity=" + value * 100 + ")",
-				filter = style.filter || "";
-
-			style.filter = ralpha.test(filter) ?
-				filter.replace(ralpha, opacity) :
-				style.filter + ' ' + opacity;
-		}
-	};
-}
-
-jQuery(function() {
-	// This hook cannot be added until DOM ready because the support test
-	// for it is not run until after DOM ready
-	if ( !jQuery.support.reliableMarginRight ) {
-		jQuery.cssHooks.marginRight = {
-			get: function( elem, computed ) {
-				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-				// Work around by temporarily setting element display to inline-block
-				var ret;
-				jQuery.swap( elem, { "display": "inline-block" }, function() {
-					if ( computed ) {
-						ret = curCSS( elem, "margin-right", "marginRight" );
-					} else {
-						ret = elem.style.marginRight;
-					}
-				});
-				return ret;
-			}
-		};
-	}
-});
-
-if ( document.defaultView && document.defaultView.getComputedStyle ) {
-	getComputedStyle = function( elem, newName, name ) {
-		var ret, defaultView, computedStyle;
-
-		name = name.replace( rupper, "-$1" ).toLowerCase();
-
-		if ( !(defaultView = elem.ownerDocument.defaultView) ) {
-			return undefined;
-		}
-
-		if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
-			ret = computedStyle.getPropertyValue( name );
-			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
-				ret = jQuery.style( elem, name );
-			}
-		}
-
-		return ret;
-	};
-}
-
-if ( document.documentElement.currentStyle ) {
-	currentStyle = function( elem, name ) {
-		var left,
-			ret = elem.currentStyle && elem.currentStyle[ name ],
-			rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
-			style = elem.style;
-
-		// From the awesome hack by Dean Edwards
-		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
-		// If we're not dealing with a regular pixel number
-		// but a number that has a weird ending, we need to convert it to pixels
-		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
-			// Remember the original values
-			left = style.left;
-
-			// Put in the new values to get a computed value out
-			if ( rsLeft ) {
-				elem.runtimeStyle.left = elem.currentStyle.left;
-			}
-			style.left = name === "fontSize" ? "1em" : (ret || 0);
-			ret = style.pixelLeft + "px";
-
-			// Revert the changed values
-			style.left = left;
-			if ( rsLeft ) {
-				elem.runtimeStyle.left = rsLeft;
-			}
-		}
-
-		return ret === "" ? "auto" : ret;
-	};
-}
-
-curCSS = getComputedStyle || currentStyle;
-
-function getWH( elem, name, extra ) {
-	var which = name === "width" ? cssWidth : cssHeight,
-		val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
-
-	if ( extra === "border" ) {
-		return val;
-	}
-
-	jQuery.each( which, function() {
-		if ( !extra ) {
-			val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0;
-		}
-
-		if ( extra === "margin" ) {
-			val += parseFloat(jQuery.css( elem, "margin" + this )) || 0;
-
-		} else {
-			val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0;
-		}
-	});
-
-	return val;
-}
-
-if ( jQuery.expr && jQuery.expr.filters ) {
-	jQuery.expr.filters.hidden = function( elem ) {
-		var width = elem.offsetWidth,
-			height = elem.offsetHeight;
-
-		return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
-	};
-
-	jQuery.expr.filters.visible = function( elem ) {
-		return !jQuery.expr.filters.hidden( elem );
-	};
-}
-
-
-
-
-var r20 = /%20/g,
-	rbracket = /\[\]$/,
-	rCRLF = /\r?\n/g,
-	rhash = /#.*$/,
-	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
-	rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
-	// #7653, #8125, #8152: local protocol detection
-	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|widget):$/,
-	rnoContent = /^(?:GET|HEAD)$/,
-	rprotocol = /^\/\//,
-	rquery = /\?/,
-	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
-	rselectTextarea = /^(?:select|textarea)/i,
-	rspacesAjax = /\s+/,
-	rts = /([?&])_=[^&]*/,
-	rucHeaders = /(^|\-)([a-z])/g,
-	rucHeadersFunc = function( _, $1, $2 ) {
-		return $1 + $2.toUpperCase();
-	},
-	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
-
-	// Keep a copy of the old load method
-	_load = jQuery.fn.load,
-
-	/* Prefilters
-	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
-	 * 2) These are called:
-	 *    - BEFORE asking for a transport
-	 *    - AFTER param serialization (s.data is a string if s.processData is true)
-	 * 3) key is the dataType
-	 * 4) the catchall symbol "*" can be used
-	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
-	 */
-	prefilters = {},
-
-	/* Transports bindings
-	 * 1) key is the dataType
-	 * 2) the catchall symbol "*" can be used
-	 * 3) selection will start with transport dataType and THEN go to "*" if needed
-	 */
-	transports = {},
-
-	// Document location
-	ajaxLocation,
-
-	// Document location segments
-	ajaxLocParts;
-
-// #8138, IE may throw an exception when accessing
-// a field from document.location if document.domain has been set
-try {
-	ajaxLocation = document.location.href;
-} catch( e ) {
-	// Use the href attribute of an A element
-	// since IE will modify it given document.location
-	ajaxLocation = document.createElement( "a" );
-	ajaxLocation.href = "";
-	ajaxLocation = ajaxLocation.href;
-}
-
-// Segment location into parts
-ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
-	// dataTypeExpression is optional and defaults to "*"
-	return function( dataTypeExpression, func ) {
-
-		if ( typeof dataTypeExpression !== "string" ) {
-			func = dataTypeExpression;
-			dataTypeExpression = "*";
-		}
-
-		if ( jQuery.isFunction( func ) ) {
-			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
-				i = 0,
-				length = dataTypes.length,
-				dataType,
-				list,
-				placeBefore;
-
-			// For each dataType in the dataTypeExpression
-			for(; i < length; i++ ) {
-				dataType = dataTypes[ i ];
-				// We control if we're asked to add before
-				// any existing element
-				placeBefore = /^\+/.test( dataType );
-				if ( placeBefore ) {
-					dataType = dataType.substr( 1 ) || "*";
-				}
-				list = structure[ dataType ] = structure[ dataType ] || [];
-				// then we add to the structure accordingly
-				list[ placeBefore ? "unshift" : "push" ]( func );
-			}
-		}
-	};
-}
-
-//Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
-		dataType /* internal */, inspected /* internal */ ) {
-
-	dataType = dataType || options.dataTypes[ 0 ];
-	inspected = inspected || {};
-
-	inspected[ dataType ] = true;
-
-	var list = structure[ dataType ],
-		i = 0,
-		length = list ? list.length : 0,
-		executeOnly = ( structure === prefilters ),
-		selection;
-
-	for(; i < length && ( executeOnly || !selection ); i++ ) {
-		selection = list[ i ]( options, originalOptions, jqXHR );
-		// If we got redirected to another dataType
-		// we try there if executing only and not done already
-		if ( typeof selection === "string" ) {
-			if ( !executeOnly || inspected[ selection ] ) {
-				selection = undefined;
-			} else {
-				options.dataTypes.unshift( selection );
-				selection = inspectPrefiltersOrTransports(
-						structure, options, originalOptions, jqXHR, selection, inspected );
-			}
-		}
-	}
-	// If we're only executing or nothing was selected
-	// we try the catchall dataType if not done already
-	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
-		selection = inspectPrefiltersOrTransports(
-				structure, options, originalOptions, jqXHR, "*", inspected );
-	}
-	// unnecessary when only executing (prefilters)
-	// but it'll be ignored by the caller in that case
-	return selection;
-}
-
-jQuery.fn.extend({
-	load: function( url, params, callback ) {
-		if ( typeof url !== "string" && _load ) {
-			return _load.apply( this, arguments );
-
-		// Don't do a request if no elements are being requested
-		} else if ( !this.length ) {
-			return this;
-		}
-
-		var off = url.indexOf( " " );
-		if ( off >= 0 ) {
-			var selector = url.slice( off, url.length );
-			url = url.slice( 0, off );
-		}
-
-		// Default to a GET request
-		var type = "GET";
-
-		// If the second parameter was provided
-		if ( params ) {
-			// If it's a function
-			if ( jQuery.isFunction( params ) ) {
-				// We assume that it's the callback
-				callback = params;
-				params = undefined;
-
-			// Otherwise, build a param string
-			} else if ( typeof params === "object" ) {
-				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
-				type = "POST";
-			}
-		}
-
-		var self = this;
-
-		// Request the remote document
-		jQuery.ajax({
-			url: url,
-			type: type,
-			dataType: "html",
-			data: params,
-			// Complete callback (responseText is used internally)
-			complete: function( jqXHR, status, responseText ) {
-				// Store the response as specified by the jqXHR object
-				responseText = jqXHR.responseText;
-				// If successful, inject the HTML into all the matched elements
-				if ( jqXHR.isResolved() ) {
-					// #4825: Get the actual response in case
-					// a dataFilter is present in ajaxSettings
-					jqXHR.done(function( r ) {
-						responseText = r;
-					});
-					// See if a selector was specified
-					self.html( selector ?
-						// Create a dummy div to hold the results
-						jQuery("<div>")
-							// inject the contents of the document in, removing the scripts
-							// to avoid any 'Permission Denied' errors in IE
-							.append(responseText.replace(rscript, ""))
-
-							// Locate the specified elements
-							.find(selector) :
-
-						// If not, just inject the full result
-						responseText );
-				}
-
-				if ( callback ) {
-					self.each( callback, [ responseText, status, jqXHR ] );
-				}
-			}
-		});
-
-		return this;
-	},
-
-	serialize: function() {
-		return jQuery.param( this.serializeArray() );
-	},
-
-	serializeArray: function() {
-		return this.map(function(){
-			return this.elements ? jQuery.makeArray( this.elements ) : this;
-		})
-		.filter(function(){
-			return this.name && !this.disabled &&
-				( this.checked || rselectTextarea.test( this.nodeName ) ||
-					rinput.test( this.type ) );
-		})
-		.map(function( i, elem ){
-			var val = jQuery( this ).val();
-
-			return val == null ?
-				null :
-				jQuery.isArray( val ) ?
-					jQuery.map( val, function( val, i ){
-						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-					}) :
-					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-		}).get();
-	}
-});
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
-	jQuery.fn[ o ] = function( f ){
-		return this.bind( o, f );
-	};
-} );
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
-	jQuery[ method ] = function( url, data, callback, type ) {
-		// shift arguments if data argument was omitted
-		if ( jQuery.isFunction( data ) ) {
-			type = type || callback;
-			callback = data;
-			data = undefined;
-		}
-
-		return jQuery.ajax({
-			type: method,
-			url: url,
-			data: data,
-			success: callback,
-			dataType: type
-		});
-	};
-} );
-
-jQuery.extend({
-
-	getScript: function( url, callback ) {
-		return jQuery.get( url, undefined, callback, "script" );
-	},
-
-	getJSON: function( url, data, callback ) {
-		return jQuery.get( url, data, callback, "json" );
-	},
-
-	// Creates a full fledged settings object into target
-	// with both ajaxSettings and settings fields.
-	// If target is omitted, writes into ajaxSettings.
-	ajaxSetup: function ( target, settings ) {
-		if ( !settings ) {
-			// Only one parameter, we extend ajaxSettings
-			settings = target;
-			target = jQuery.extend( true, jQuery.ajaxSettings, settings );
-		} else {
-			// target was provided, we extend into it
-			jQuery.extend( true, target, jQuery.ajaxSettings, settings );
-		}
-		// Flatten fields we don't want deep extended
-		for( var field in { context: 1, url: 1 } ) {
-			if ( field in settings ) {
-				target[ field ] = settings[ field ];
-			} else if( field in jQuery.ajaxSettings ) {
-				target[ field ] = jQuery.ajaxSettings[ field ];
-			}
-		}
-		return target;
-	},
-
-	ajaxSettings: {
-		url: ajaxLocation,
-		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
-		global: true,
-		type: "GET",
-		contentType: "application/x-www-form-urlencoded",
-		processData: true,
-		async: true,
-		/*
-		timeout: 0,
-		data: null,
-		dataType: null,
-		username: null,
-		password: null,
-		cache: null,
-		traditional: false,
-		headers: {},
-		*/
-
-		accepts: {
-			xml: "application/xml, text/xml",
-			html: "text/html",
-			text: "text/plain",
-			json: "application/json, text/javascript",
-			"*": "*/*"
-		},
-
-		contents: {
-			xml: /xml/,
-			html: /html/,
-			json: /json/
-		},
-
-		responseFields: {
-			xml: "responseXML",
-			text: "responseText"
-		},
-
-		// List of data converters
-		// 1) key format is "source_type destination_type" (a single space in-between)
-		// 2) the catchall symbol "*" can be used for source_type
-		converters: {
-
-			// Convert anything to text
-			"* text": window.String,
-
-			// Text to html (true = no transformation)
-			"text html": true,
-
-			// Evaluate text as a json expression
-			"text json": jQuery.parseJSON,
-
-			// Parse text as xml
-			"text xml": jQuery.parseXML
-		}
-	},
-
-	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
-	ajaxTransport: addToPrefiltersOrTransports( transports ),
-
-	// Main method
-	ajax: function( url, options ) {
-
-		// If url is an object, simulate pre-1.5 signature
-		if ( typeof url === "object" ) {
-			options = url;
-			url = undefined;
-		}
-
-		// Force options to be an object
-		options = options || {};
-
-		var // Create the final options object
-			s = jQuery.ajaxSetup( {}, options ),
-			// Callbacks context
-			callbackContext = s.context || s,
-			// Context for global events
-			// It's the callbackContext if one was provided in the options
-			// and if it's a DOM node or a jQuery collection
-			globalEventContext = callbackContext !== s &&
-				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
-						jQuery( callbackContext ) : jQuery.event,
-			// Deferreds
-			deferred = jQuery.Deferred(),
-			completeDeferred = jQuery._Deferred(),
-			// Status-dependent callbacks
-			statusCode = s.statusCode || {},
-			// ifModified key
-			ifModifiedKey,
-			// Headers (they are sent all at once)
-			requestHeaders = {},
-			// Response headers
-			responseHeadersString,
-			responseHeaders,
-			// transport
-			transport,
-			// timeout handle
-			timeoutTimer,
-			// Cross-domain detection vars
-			parts,
-			// The jqXHR state
-			state = 0,
-			// To know if global events are to be dispatched
-			fireGlobals,
-			// Loop variable
-			i,
-			// Fake xhr
-			jqXHR = {
-
-				readyState: 0,
-
-				// Caches the header
-				setRequestHeader: function( name, value ) {
-					if ( !state ) {
-						requestHeaders[ name.toLowerCase().replace( rucHeaders, rucHeadersFunc ) ] = value;
-					}
-					return this;
-				},
-
-				// Raw string
-				getAllResponseHeaders: function() {
-					return state === 2 ? responseHeadersString : null;
-				},
-
-				// Builds headers hashtable if needed
-				getResponseHeader: function( key ) {
-					var match;
-					if ( state === 2 ) {
-						if ( !responseHeaders ) {
-							responseHeaders = {};
-							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
-								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
-							}
-						}
-						match = responseHeaders[ key.toLowerCase() ];
-					}
-					return match === undefined ? null : match;
-				},
-
-				// Overrides response content-type header
-				overrideMimeType: function( type ) {
-					if ( !state ) {
-						s.mimeType = type;
-					}
-					return this;
-				},
-
-				// Cancel the request
-				abort: function( statusText ) {
-					statusText = statusText || "abort";
-					if ( transport ) {
-						transport.abort( statusText );
-					}
-					done( 0, statusText );
-					return this;
-				}
-			};
-
-		// Callback for when everything is done
-		// It is defined here because jslint complains if it is declared
-		// at the end of the function (which would be more logical and readable)
-		function done( status, statusText, responses, headers ) {
-
-			// Called once
-			if ( state === 2 ) {
-				return;
-			}
-
-			// State is "done" now
-			state = 2;
-
-			// Clear timeout if it exists
-			if ( timeoutTimer ) {
-				clearTimeout( timeoutTimer );
-			}
-
-			// Dereference transport for early garbage collection
-			// (no matter how long the jqXHR object will be used)
-			transport = undefined;
-
-			// Cache response headers
-			responseHeadersString = headers || "";
-
-			// Set readyState
-			jqXHR.readyState = status ? 4 : 0;
-
-			var isSuccess,
-				success,
-				error,
-				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
-				lastModified,
-				etag;
-
-			// If successful, handle type chaining
-			if ( status >= 200 && status < 300 || status === 304 ) {
-
-				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-				if ( s.ifModified ) {
-
-					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
-						jQuery.lastModified[ ifModifiedKey ] = lastModified;
-					}
-					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
-						jQuery.etag[ ifModifiedKey ] = etag;
-					}
-				}
-
-				// If not modified
-				if ( status === 304 ) {
-
-					statusText = "notmodified";
-					isSuccess = true;
-
-				// If we have data
-				} else {
-
-					try {
-						success = ajaxConvert( s, response );
-						statusText = "success";
-						isSuccess = true;
-					} catch(e) {
-						// We have a parsererror
-						statusText = "parsererror";
-						error = e;
-					}
-				}
-			} else {
-				// We extract error from statusText
-				// then normalize statusText and status for non-aborts
-				error = statusText;
-				if( !statusText || status ) {
-					statusText = "error";
-					if ( status < 0 ) {
-						status = 0;
-					}
-				}
-			}
-
-			// Set data for the fake xhr object
-			jqXHR.status = status;
-			jqXHR.statusText = statusText;
-
-			// Success/Error
-			if ( isSuccess ) {
-				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-			} else {
-				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-			}
-
-			// Status-dependent callbacks
-			jqXHR.statusCode( statusCode );
-			statusCode = undefined;
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
-						[ jqXHR, s, isSuccess ? success : error ] );
-			}
-
-			// Complete
-			completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] );
-				// Handle the global AJAX counter
-				if ( !( --jQuery.active ) ) {
-					jQuery.event.trigger( "ajaxStop" );
-				}
-			}
-		}
-
-		// Attach deferreds
-		deferred.promise( jqXHR );
-		jqXHR.success = jqXHR.done;
-		jqXHR.error = jqXHR.fail;
-		jqXHR.complete = completeDeferred.done;
-
-		// Status-dependent callbacks
-		jqXHR.statusCode = function( map ) {
-			if ( map ) {
-				var tmp;
-				if ( state < 2 ) {
-					for( tmp in map ) {
-						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
-					}
-				} else {
-					tmp = map[ jqXHR.status ];
-					jqXHR.then( tmp, tmp );
-				}
-			}
-			return this;
-		};
-
-		// Remove hash character (#7531: and string promotion)
-		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
-		// We also use the url parameter if available
-		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
-		// Extract dataTypes list
-		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
-
-		// Determine if a cross-domain request is in order
-		if ( s.crossDomain == null ) {
-			parts = rurl.exec( s.url.toLowerCase() );
-			s.crossDomain = !!( parts &&
-				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
-					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
-						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
-			);
-		}
-
-		// Convert data if not already a string
-		if ( s.data && s.processData && typeof s.data !== "string" ) {
-			s.data = jQuery.param( s.data, s.traditional );
-		}
-
-		// Apply prefilters
-		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
-		// If request was aborted inside a prefiler, stop there
-		if ( state === 2 ) {
-			return false;
-		}
-
-		// We can fire global events as of now if asked to
-		fireGlobals = s.global;
-
-		// Uppercase the type
-		s.type = s.type.toUpperCase();
-
-		// Determine if request has content
-		s.hasContent = !rnoContent.test( s.type );
-
-		// Watch for a new set of requests
-		if ( fireGlobals && jQuery.active++ === 0 ) {
-			jQuery.event.trigger( "ajaxStart" );
-		}
-
-		// More options handling for requests with no content
-		if ( !s.hasContent ) {
-
-			// If data is available, append data to url
-			if ( s.data ) {
-				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
-			}
-
-			// Get ifModifiedKey before adding the anti-cache parameter
-			ifModifiedKey = s.url;
-
-			// Add anti-cache in url if needed
-			if ( s.cache === false ) {
-
-				var ts = jQuery.now(),
-					// try replacing _= if it is there
-					ret = s.url.replace( rts, "$1_=" + ts );
-
-				// if nothing was replaced, add timestamp to the end
-				s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
-			}
-		}
-
-		// Set the correct header, if data is being sent
-		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-			requestHeaders[ "Content-Type" ] = s.contentType;
-		}
-
-		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-		if ( s.ifModified ) {
-			ifModifiedKey = ifModifiedKey || s.url;
-			if ( jQuery.lastModified[ ifModifiedKey ] ) {
-				requestHeaders[ "If-Modified-Since" ] = jQuery.lastModified[ ifModifiedKey ];
-			}
-			if ( jQuery.etag[ ifModifiedKey ] ) {
-				requestHeaders[ "If-None-Match" ] = jQuery.etag[ ifModifiedKey ];
-			}
-		}
-
-		// Set the Accepts header for the server, depending on the dataType
-		requestHeaders.Accept = s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
-			s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) :
-			s.accepts[ "*" ];
-
-		// Check for headers option
-		for ( i in s.headers ) {
-			jqXHR.setRequestHeader( i, s.headers[ i ] );
-		}
-
-		// Allow custom headers/mimetypes and early abort
-		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-				// Abort if not done already
-				jqXHR.abort();
-				return false;
-
-		}
-
-		// Install callbacks on deferreds
-		for ( i in { success: 1, error: 1, complete: 1 } ) {
-			jqXHR[ i ]( s[ i ] );
-		}
-
-		// Get transport
-		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
-		// If no transport, we auto-abort
-		if ( !transport ) {
-			done( -1, "No Transport" );
-		} else {
-			jqXHR.readyState = 1;
-			// Send global event
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
-			}
-			// Timeout
-			if ( s.async && s.timeout > 0 ) {
-				timeoutTimer = setTimeout( function(){
-					jqXHR.abort( "timeout" );
-				}, s.timeout );
-			}
-
-			try {
-				state = 1;
-				transport.send( requestHeaders, done );
-			} catch (e) {
-				// Propagate exception as error if not done
-				if ( status < 2 ) {
-					done( -1, e );
-				// Simply rethrow otherwise
-				} else {
-					jQuery.error( e );
-				}
-			}
-		}
-
-		return jqXHR;
-	},
-
-	// Serialize an array of form elements or a set of
-	// key/values into a query string
-	param: function( a, traditional ) {
-		var s = [],
-			add = function( key, value ) {
-				// If value is a function, invoke it and return its value
-				value = jQuery.isFunction( value ) ? value() : value;
-				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
-			};
-
-		// Set traditional to true for jQuery <= 1.3.2 behavior.
-		if ( traditional === undefined ) {
-			traditional = jQuery.ajaxSettings.traditional;
-		}
-
-		// If an array was passed in, assume that it is an array of form elements.
-		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-			// Serialize the form elements
-			jQuery.each( a, function() {
-				add( this.name, this.value );
-			} );
-
-		} else {
-			// If traditional, encode the "old" way (the way 1.3.2 or older
-			// did it), otherwise encode params recursively.
-			for ( var prefix in a ) {
-				buildParams( prefix, a[ prefix ], traditional, add );
-			}
-		}
-
-		// Return the resulting serialization
-		return s.join( "&" ).replace( r20, "+" );
-	}
-});
-
-function buildParams( prefix, obj, traditional, add ) {
-	if ( jQuery.isArray( obj ) && obj.length ) {
-		// Serialize array item.
-		jQuery.each( obj, function( i, v ) {
-			if ( traditional || rbracket.test( prefix ) ) {
-				// Treat each array item as a scalar.
-				add( prefix, v );
-
-			} else {
-				// If array item is non-scalar (array or object), encode its
-				// numeric index to resolve deserialization ambiguity issues.
-				// Note that rack (as of 1.0.0) can't currently deserialize
-				// nested arrays properly, and attempting to do so may cause
-				// a server error. Possible fixes are to modify rack's
-				// deserialization algorithm or to provide an option or flag
-				// to force array serialization to be shallow.
-				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
-			}
-		});
-
-	} else if ( !traditional && obj != null && typeof obj === "object" ) {
-		// If we see an array here, it is empty and should be treated as an empty
-		// object
-		if ( jQuery.isArray( obj ) || jQuery.isEmptyObject( obj ) ) {
-			add( prefix, "" );
-
-		// Serialize object item.
-		} else {
-			for ( var name in obj ) {
-				buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-			}
-		}
-
-	} else {
-		// Serialize scalar item.
-		add( prefix, obj );
-	}
-}
-
-// This is still on the jQuery object... for now
-// Want to move this to jQuery.ajax some day
-jQuery.extend({
-
-	// Counter for holding the number of active queries
-	active: 0,
-
-	// Last-Modified header cache for next request
-	lastModified: {},
-	etag: {}
-
-});
-
-/* Handles responses to an ajax request:
- * - sets all responseXXX fields accordingly
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
-
-	var contents = s.contents,
-		dataTypes = s.dataTypes,
-		responseFields = s.responseFields,
-		ct,
-		type,
-		finalDataType,
-		firstDataType;
-
-	// Fill responseXXX fields
-	for( type in responseFields ) {
-		if ( type in responses ) {
-			jqXHR[ responseFields[type] ] = responses[ type ];
-		}
-	}
-
-	// Remove auto dataType and get content-type in the process
-	while( dataTypes[ 0 ] === "*" ) {
-		dataTypes.shift();
-		if ( ct === undefined ) {
-			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
-		}
-	}
-
-	// Check if we're dealing with a known content-type
-	if ( ct ) {
-		for ( type in contents ) {
-			if ( contents[ type ] && contents[ type ].test( ct ) ) {
-				dataTypes.unshift( type );
-				break;
-			}
-		}
-	}
-
-	// Check to see if we have a response for the expected dataType
-	if ( dataTypes[ 0 ] in responses ) {
-		finalDataType = dataTypes[ 0 ];
-	} else {
-		// Try convertible dataTypes
-		for ( type in responses ) {
-			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
-				finalDataType = type;
-				break;
-			}
-			if ( !firstDataType ) {
-				firstDataType = type;
-			}
-		}
-		// Or just use first one
-		finalDataType = finalDataType || firstDataType;
-	}
-
-	// If we found a dataType
-	// We add the dataType to the list if needed
-	// and return the corresponding response
-	if ( finalDataType ) {
-		if ( finalDataType !== dataTypes[ 0 ] ) {
-			dataTypes.unshift( finalDataType );
-		}
-		return responses[ finalDataType ];
-	}
-}
-
-// Chain conversions given the request and the original response
-function ajaxConvert( s, response ) {
-
-	// Apply the dataFilter if provided
-	if ( s.dataFilter ) {
-		response = s.dataFilter( response, s.dataType );
-	}
-
-	var dataTypes = s.dataTypes,
-		converters = {},
-		i,
-		key,
-		length = dataTypes.length,
-		tmp,
-		// Current and previous dataTypes
-		current = dataTypes[ 0 ],
-		prev,
-		// Conversion expression
-		conversion,
-		// Conversion function
-		conv,
-		// Conversion functions (transitive conversion)
-		conv1,
-		conv2;
-
-	// For each dataType in the chain
-	for( i = 1; i < length; i++ ) {
-
-		// Create converters map
-		// with lowercased keys
-		if ( i === 1 ) {
-			for( key in s.converters ) {
-				if( typeof key === "string" ) {
-					converters[ key.toLowerCase() ] = s.converters[ key ];
-				}
-			}
-		}
-
-		// Get the dataTypes
-		prev = current;
-		current = dataTypes[ i ];
-
-		// If current is auto dataType, update it to prev
-		if( current === "*" ) {
-			current = prev;
-		// If no auto and dataTypes are actually different
-		} else if ( prev !== "*" && prev !== current ) {
-
-			// Get the converter
-			conversion = prev + " " + current;
-			conv = converters[ conversion ] || converters[ "* " + current ];
-
-			// If there is no direct converter, search transitively
-			if ( !conv ) {
-				conv2 = undefined;
-				for( conv1 in converters ) {
-					tmp = conv1.split( " " );
-					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
-						conv2 = converters[ tmp[1] + " " + current ];
-						if ( conv2 ) {
-							conv1 = converters[ conv1 ];
-							if ( conv1 === true ) {
-								conv = conv2;
-							} else if ( conv2 === true ) {
-								conv = conv1;
-							}
-							break;
-						}
-					}
-				}
-			}
-			// If we found no converter, dispatch an error
-			if ( !( conv || conv2 ) ) {
-				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
-			}
-			// If found converter is not an equivalence
-			if ( conv !== true ) {
-				// Convert with 1 or 2 converters accordingly
-				response = conv ? conv( response ) : conv2( conv1(response) );
-			}
-		}
-	}
-	return response;
-}
-
-
-
-
-var jsc = jQuery.now(),
-	jsre = /(\=)\?(&|$)|\?\?/i;
-
-// Default jsonp settings
-jQuery.ajaxSetup({
-	jsonp: "callback",
-	jsonpCallback: function() {
-		return jQuery.expando + "_" + ( jsc++ );
-	}
-});
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
-	var dataIsString = ( typeof s.data === "string" );
-
-	if ( s.dataTypes[ 0 ] === "jsonp" ||
-		originalSettings.jsonpCallback ||
-		originalSettings.jsonp != null ||
-		s.jsonp !== false && ( jsre.test( s.url ) ||
-				dataIsString && jsre.test( s.data ) ) ) {
-
-		var responseContainer,
-			jsonpCallback = s.jsonpCallback =
-				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
-			previous = window[ jsonpCallback ],
-			url = s.url,
-			data = s.data,
-			replace = "$1" + jsonpCallback + "$2",
-			cleanUp = function() {
-				// Set callback back to previous value
-				window[ jsonpCallback ] = previous;
-				// Call if it was a function and we have a response
-				if ( responseContainer && jQuery.isFunction( previous ) ) {
-					window[ jsonpCallback ]( responseContainer[ 0 ] );
-				}
-			};
-
-		if ( s.jsonp !== false ) {
-			url = url.replace( jsre, replace );
-			if ( s.url === url ) {
-				if ( dataIsString ) {
-					data = data.replace( jsre, replace );
-				}
-				if ( s.data === data ) {
-					// Add callback manually
-					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
-				}
-			}
-		}
-
-		s.url = url;
-		s.data = data;
-
-		// Install callback
-		window[ jsonpCallback ] = function( response ) {
-			responseContainer = [ response ];
-		};
-
-		// Install cleanUp function
-		jqXHR.then( cleanUp, cleanUp );
-
-		// Use data converter to retrieve json after script execution
-		s.converters["script json"] = function() {
-			if ( !responseContainer ) {
-				jQuery.error( jsonpCallback + " was not called" );
-			}
-			return responseContainer[ 0 ];
-		};
-
-		// force json dataType
-		s.dataTypes[ 0 ] = "json";
-
-		// Delegate to script
-		return "script";
-	}
-} );
-
-
-
-
-// Install script dataType
-jQuery.ajaxSetup({
-	accepts: {
-		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
-	},
-	contents: {
-		script: /javascript|ecmascript/
-	},
-	converters: {
-		"text script": function( text ) {
-			jQuery.globalEval( text );
-			return text;
-		}
-	}
-});
-
-// Handle cache's special case and global
-jQuery.ajaxPrefilter( "script", function( s ) {
-	if ( s.cache === undefined ) {
-		s.cache = false;
-	}
-	if ( s.crossDomain ) {
-		s.type = "GET";
-		s.global = false;
-	}
-} );
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function(s) {
-
-	// This transport only deals with cross domain requests
-	if ( s.crossDomain ) {
-
-		var script,
-			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
-
-		return {
-
-			send: function( _, callback ) {
-
-				script = document.createElement( "script" );
-
-				script.async = "async";
-
-				if ( s.scriptCharset ) {
-					script.charset = s.scriptCharset;
-				}
-
-				script.src = s.url;
-
-				// Attach handlers for all browsers
-				script.onload = script.onreadystatechange = function( _, isAbort ) {
-
-					if ( !script.readyState || /loaded|complete/.test( script.readyState ) ) {
-
-						// Handle memory leak in IE
-						script.onload = script.onreadystatechange = null;
-
-						// Remove the script
-						if ( head && script.parentNode ) {
-							head.removeChild( script );
-						}
-
-						// Dereference the script
-						script = undefined;
-
-						// Callback if not abort
-						if ( !isAbort ) {
-							callback( 200, "success" );
-						}
-					}
-				};
-				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
-				// This arises when a base node is used (#2709 and #4378).
-				head.insertBefore( script, head.firstChild );
-			},
-
-			abort: function() {
-				if ( script ) {
-					script.onload( 0, 1 );
-				}
-			}
-		};
-	}
-} );
-
-
-
-
-var // #5280: next active xhr id and list of active xhrs' callbacks
-	xhrId = jQuery.now(),
-	xhrCallbacks,
-
-	// XHR used to determine supports properties
-	testXHR;
-
-// #5280: Internet Explorer will keep connections alive if we don't abort on unload
-function xhrOnUnloadAbort() {
-	jQuery( window ).unload(function() {
-		// Abort all pending requests
-		for ( var key in xhrCallbacks ) {
-			xhrCallbacks[ key ]( 0, 1 );
-		}
-	});
-}
-
-// Functions to create xhrs
-function createStandardXHR() {
-	try {
-		return new window.XMLHttpRequest();
-	} catch( e ) {}
-}
-
-function createActiveXHR() {
-	try {
-		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
-	} catch( e ) {}
-}
-
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject ?
-	/* Microsoft failed to properly
-	 * implement the XMLHttpRequest in IE7 (can't request local files),
-	 * so we use the ActiveXObject when it is available
-	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
-	 * we need a fallback.
-	 */
-	function() {
-		return !this.isLocal && createStandardXHR() || createActiveXHR();
-	} :
-	// For all other browsers, use the standard XMLHttpRequest object
-	createStandardXHR;
-
-// Test if we can create an xhr object
-testXHR = jQuery.ajaxSettings.xhr();
-jQuery.support.ajax = !!testXHR;
-
-// Does this browser support crossDomain XHR requests
-jQuery.support.cors = testXHR && ( "withCredentials" in testXHR );
-
-// No need for the temporary xhr anymore
-testXHR = undefined;
-
-// Create transport if the browser can provide an xhr
-if ( jQuery.support.ajax ) {
-
-	jQuery.ajaxTransport(function( s ) {
-		// Cross domain only allowed if supported through XMLHttpRequest
-		if ( !s.crossDomain || jQuery.support.cors ) {
-
-			var callback;
-
-			return {
-				send: function( headers, complete ) {
-
-					// Get a new xhr
-					var xhr = s.xhr(),
-						handle,
-						i;
-
-					// Open the socket
-					// Passing null username, generates a login popup on Opera (#2865)
-					if ( s.username ) {
-						xhr.open( s.type, s.url, s.async, s.username, s.password );
-					} else {
-						xhr.open( s.type, s.url, s.async );
-					}
-
-					// Apply custom fields if provided
-					if ( s.xhrFields ) {
-						for ( i in s.xhrFields ) {
-							xhr[ i ] = s.xhrFields[ i ];
-						}
-					}
-
-					// Override mime type if needed
-					if ( s.mimeType && xhr.overrideMimeType ) {
-						xhr.overrideMimeType( s.mimeType );
-					}
-
-					// X-Requested-With header
-					// For cross-domain requests, seeing as conditions for a preflight are
-					// akin to a jigsaw puzzle, we simply never set it to be sure.
-					// (it can always be set on a per-request basis or even using ajaxSetup)
-					// For same-domain requests, won't change header if already provided.
-					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
-						headers[ "X-Requested-With" ] = "XMLHttpRequest";
-					}
-
-					// Need an extra try/catch for cross domain requests in Firefox 3
-					try {
-						for ( i in headers ) {
-							xhr.setRequestHeader( i, headers[ i ] );
-						}
-					} catch( _ ) {}
-
-					// Do send the request
-					// This may raise an exception which is actually
-					// handled in jQuery.ajax (so no try/catch here)
-					xhr.send( ( s.hasContent && s.data ) || null );
-
-					// Listener
-					callback = function( _, isAbort ) {
-
-						var status,
-							statusText,
-							responseHeaders,
-							responses,
-							xml;
-
-						// Firefox throws exceptions when accessing properties
-						// of an xhr when a network error occured
-						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
-						try {
-
-							// Was never called and is aborted or complete
-							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
-								// Only called once
-								callback = undefined;
-
-								// Do not keep as active anymore
-								if ( handle ) {
-									xhr.onreadystatechange = jQuery.noop;
-									delete xhrCallbacks[ handle ];
-								}
-
-								// If it's an abort
-								if ( isAbort ) {
-									// Abort it manually if needed
-									if ( xhr.readyState !== 4 ) {
-										xhr.abort();
-									}
-								} else {
-									status = xhr.status;
-									responseHeaders = xhr.getAllResponseHeaders();
-									responses = {};
-									xml = xhr.responseXML;
-
-									// Construct response list
-									if ( xml && xml.documentElement /* #4958 */ ) {
-										responses.xml = xml;
-									}
-									responses.text = xhr.responseText;
-
-									// Firefox throws an exception when accessing
-									// statusText for faulty cross-domain requests
-									try {
-										statusText = xhr.statusText;
-									} catch( e ) {
-										// We normalize with Webkit giving an empty statusText
-										statusText = "";
-									}
-
-									// Filter status for non standard behaviors
-
-									// If the request is local and we have data: assume a success
-									// (success with no data won't get notified, that's the best we
-									// can do given current implementations)
-									if ( !status && s.isLocal && !s.crossDomain ) {
-										status = responses.text ? 200 : 404;
-									// IE - #1450: sometimes returns 1223 when it should be 204
-									} else if ( status === 1223 ) {
-										status = 204;
-									}
-								}
-							}
-						} catch( firefoxAccessException ) {
-							if ( !isAbort ) {
-								complete( -1, firefoxAccessException );
-							}
-						}
-
-						// Call complete if needed
-						if ( responses ) {
-							complete( status, statusText, responses, responseHeaders );
-						}
-					};
-
-					// if we're in sync mode or it's in cache
-					// and has been retrieved directly (IE6 & IE7)
-					// we need to manually fire the callback
-					if ( !s.async || xhr.readyState === 4 ) {
-						callback();
-					} else {
-						// Create the active xhrs callbacks list if needed
-						// and attach the unload handler
-						if ( !xhrCallbacks ) {
-							xhrCallbacks = {};
-							xhrOnUnloadAbort();
-						}
-						// Add to list of active xhrs callbacks
-						handle = xhrId++;
-						xhr.onreadystatechange = xhrCallbacks[ handle ] = callback;
-					}
-				},
-
-				abort: function() {
-					if ( callback ) {
-						callback(0,1);
-					}
-				}
-			};
-		}
-	});
-}
-
-
-
-
-var elemdisplay = {},
-	rfxtypes = /^(?:toggle|show|hide)$/,
-	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
-	timerId,
-	fxAttrs = [
-		// height animations
-		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
-		// width animations
-		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
-		// opacity animations
-		[ "opacity" ]
-	];
-
-jQuery.fn.extend({
-	show: function( speed, easing, callback ) {
-		var elem, display;
-
-		if ( speed || speed === 0 ) {
-			return this.animate( genFx("show", 3), speed, easing, callback);
-
-		} else {
-			for ( var i = 0, j = this.length; i < j; i++ ) {
-				elem = this[i];
-				display = elem.style.display;
-
-				// Reset the inline display of this element to learn if it is
-				// being hidden by cascaded rules or not
-				if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
-					display = elem.style.display = "";
-				}
-
-				// Set elements which have been overridden with display: none
-				// in a stylesheet to whatever the default browser style is
-				// for such an element
-				if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
-					jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
-				}
-			}
-
-			// Set the display of most of the elements in a second loop
-			// to avoid the constant reflow
-			for ( i = 0; i < j; i++ ) {
-				elem = this[i];
-				display = elem.style.display;
-
-				if ( display === "" || display === "none" ) {
-					elem.style.display = jQuery._data(elem, "olddisplay") || "";
-				}
-			}
-
-			return this;
-		}
-	},
-
-	hide: function( speed, easing, callback ) {
-		if ( speed || speed === 0 ) {
-			return this.animate( genFx("hide", 3), speed, easing, callback);
-
-		} else {
-			for ( var i = 0, j = this.length; i < j; i++ ) {
-				var display = jQuery.css( this[i], "display" );
-
-				if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
-					jQuery._data( this[i], "olddisplay", display );
-				}
-			}
-
-			// Set the display of the elements in a second loop
-			// to avoid the constant reflow
-			for ( i = 0; i < j; i++ ) {
-				this[i].style.display = "none";
-			}
-
-			return this;
-		}
-	},
-
-	// Save the old toggle function
-	_toggle: jQuery.fn.toggle,
-
-	toggle: function( fn, fn2, callback ) {
-		var bool = typeof fn === "boolean";
-
-		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
-			this._toggle.apply( this, arguments );
-
-		} else if ( fn == null || bool ) {
-			this.each(function() {
-				var state = bool ? fn : jQuery(this).is(":hidden");
-				jQuery(this)[ state ? "show" : "hide" ]();
-			});
-
-		} else {
-			this.animate(genFx("toggle", 3), fn, fn2, callback);
-		}
-
-		return this;
-	},
-
-	fadeTo: function( speed, to, easing, callback ) {
-		return this.filter(":hidden").css("opacity", 0).show().end()
-					.animate({opacity: to}, speed, easing, callback);
-	},
-
-	animate: function( prop, speed, easing, callback ) {
-		var optall = jQuery.speed(speed, easing, callback);
-
-		if ( jQuery.isEmptyObject( prop ) ) {
-			return this.each( optall.complete );
-		}
-
-		return this[ optall.queue === false ? "each" : "queue" ](function() {
-			// XXX 'this' does not always have a nodeName when running the
-			// test suite
-
-			var opt = jQuery.extend({}, optall), p,
-				isElement = this.nodeType === 1,
-				hidden = isElement && jQuery(this).is(":hidden"),
-				self = this;
-
-			for ( p in prop ) {
-				var name = jQuery.camelCase( p );
-
-				if ( p !== name ) {
-					prop[ name ] = prop[ p ];
-					delete prop[ p ];
-					p = name;
-				}
-
-				if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
-					return opt.complete.call(this);
-				}
-
-				if ( isElement && ( p === "height" || p === "width" ) ) {
-					// Make sure that nothing sneaks out
-					// Record all 3 overflow attributes because IE does not
-					// change the overflow attribute when overflowX and
-					// overflowY are set to the same value
-					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
-
-					// Set display property to inline-block for height/width
-					// animations on inline elements that are having width/height
-					// animated
-					if ( jQuery.css( this, "display" ) === "inline" &&
-							jQuery.css( this, "float" ) === "none" ) {
-						if ( !jQuery.support.inlineBlockNeedsLayout ) {
-							this.style.display = "inline-block";
-
-						} else {
-							var display = defaultDisplay(this.nodeName);
-
-							// inline-level elements accept inline-block;
-							// block-level elements need to be inline with layout
-							if ( display === "inline" ) {
-								this.style.display = "inline-block";
-
-							} else {
-								this.style.display = "inline";
-								this.style.zoom = 1;
-							}
-						}
-					}
-				}
-
-				if ( jQuery.isArray( prop[p] ) ) {
-					// Create (if needed) and add to specialEasing
-					(opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
-					prop[p] = prop[p][0];
-				}
-			}
-
-			if ( opt.overflow != null ) {
-				this.style.overflow = "hidden";
-			}
-
-			opt.curAnim = jQuery.extend({}, prop);
-
-			jQuery.each( prop, function( name, val ) {
-				var e = new jQuery.fx( self, opt, name );
-
-				if ( rfxtypes.test(val) ) {
-					e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
-
-				} else {
-					var parts = rfxnum.exec(val),
-						start = e.cur();
-
-					if ( parts ) {
-						var end = parseFloat( parts[2] ),
-							unit = parts[3] || ( jQuery.cssNumber[ name ] ? "" : "px" );
-
-						// We need to compute starting value
-						if ( unit !== "px" ) {
-							jQuery.style( self, name, (end || 1) + unit);
-							start = ((end || 1) / e.cur()) * start;
-							jQuery.style( self, name, start + unit);
-						}
-
-						// If a +=/-= token was provided, we're doing a relative animation
-						if ( parts[1] ) {
-							end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
-						}
-
-						e.custom( start, end, unit );
-
-					} else {
-						e.custom( start, val, "" );
-					}
-				}
-			});
-
-			// For JS strict compliance
-			return true;
-		});
-	},
-
-	stop: function( clearQueue, gotoEnd ) {
-		var timers = jQuery.timers;
-
-		if ( clearQueue ) {
-			this.queue([]);
-		}
-
-		this.each(function() {
-			// go in reverse order so anything added to the queue during the loop is ignored
-			for ( var i = timers.length - 1; i >= 0; i-- ) {
-				if ( timers[i].elem === this ) {
-					if (gotoEnd) {
-						// force the next step to be the last
-						timers[i](true);
-					}
-
-					timers.splice(i, 1);
-				}
-			}
-		});
-
-		// start the next in the queue if the last step wasn't forced
-		if ( !gotoEnd ) {
-			this.dequeue();
-		}
-
-		return this;
-	}
-
-});
-
-function genFx( type, num ) {
-	var obj = {};
-
-	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
-		obj[ this ] = type;
-	});
-
-	return obj;
-}
-
-// Generate shortcuts for custom animations
-jQuery.each({
-	slideDown: genFx("show", 1),
-	slideUp: genFx("hide", 1),
-	slideToggle: genFx("toggle", 1),
-	fadeIn: { opacity: "show" },
-	fadeOut: { opacity: "hide" },
-	fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
-	jQuery.fn[ name ] = function( speed, easing, callback ) {
-		return this.animate( props, speed, easing, callback );
-	};
-});
-
-jQuery.extend({
-	speed: function( speed, easing, fn ) {
-		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
-			complete: fn || !fn && easing ||
-				jQuery.isFunction( speed ) && speed,
-			duration: speed,
-			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
-		};
-
-		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
-			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
-
-		// Queueing
-		opt.old = opt.complete;
-		opt.complete = function() {
-			if ( opt.queue !== false ) {
-				jQuery(this).dequeue();
-			}
-			if ( jQuery.isFunction( opt.old ) ) {
-				opt.old.call( this );
-			}
-		};
-
-		return opt;
-	},
-
-	easing: {
-		linear: function( p, n, firstNum, diff ) {
-			return firstNum + diff * p;
-		},
-		swing: function( p, n, firstNum, diff ) {
-			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
-		}
-	},
-
-	timers: [],
-
-	fx: function( elem, options, prop ) {
-		this.options = options;
-		this.elem = elem;
-		this.prop = prop;
-
-		if ( !options.orig ) {
-			options.orig = {};
-		}
-	}
-
-});
-
-jQuery.fx.prototype = {
-	// Simple function for setting a style value
-	update: function() {
-		if ( this.options.step ) {
-			this.options.step.call( this.elem, this.now, this );
-		}
-
-		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
-	},
-
-	// Get the current size
-	cur: function() {
-		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
-			return this.elem[ this.prop ];
-		}
-
-		var parsed,
-			r = jQuery.css( this.elem, this.prop );
-		// Empty strings, null, undefined and "auto" are converted to 0,
-		// complex values such as "rotate(1rad)" are returned as is,
-		// simple values such as "10px" are parsed to Float.
-		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
-	},
-
-	// Start an animation from one number to another
-	custom: function( from, to, unit ) {
-		var self = this,
-			fx = jQuery.fx;
-
-		this.startTime = jQuery.now();
-		this.start = from;
-		this.end = to;
-		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
-		this.now = this.start;
-		this.pos = this.state = 0;
-
-		function t( gotoEnd ) {
-			return self.step(gotoEnd);
-		}
-
-		t.elem = this.elem;
-
-		if ( t() && jQuery.timers.push(t) && !timerId ) {
-			timerId = setInterval(fx.tick, fx.interval);
-		}
-	},
-
-	// Simple 'show' function
-	show: function() {
-		// Remember where we started, so that we can go back to it later
-		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
-		this.options.show = true;
-
-		// Begin the animation
-		// Make sure that we start at a small width/height to avoid any
-		// flash of content
-		this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
-
-		// Start by showing the element
-		jQuery( this.elem ).show();
-	},
-
-	// Simple 'hide' function
-	hide: function() {
-		// Remember where we started, so that we can go back to it later
-		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
-		this.options.hide = true;
-
-		// Begin the animation
-		this.custom(this.cur(), 0);
-	},
-
-	// Each step of an animation
-	step: function( gotoEnd ) {
-		var t = jQuery.now(), done = true;
-
-		if ( gotoEnd || t >= this.options.duration + this.startTime ) {
-			this.now = this.end;
-			this.pos = this.state = 1;
-			this.update();
-
-			this.options.curAnim[ this.prop ] = true;
-
-			for ( var i in this.options.curAnim ) {
-				if ( this.options.curAnim[i] !== true ) {
-					done = false;
-				}
-			}
-
-			if ( done ) {
-				// Reset the overflow
-				if ( this.options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
-					var elem = this.elem,
-						options = this.options;
-
-					jQuery.each( [ "", "X", "Y" ], function (index, value) {
-						elem.style[ "overflow" + value ] = options.overflow[index];
-					} );
-				}
-
-				// Hide the element if the "hide" operation was done
-				if ( this.options.hide ) {
-					jQuery(this.elem).hide();
-				}
-
-				// Reset the properties, if the item has been hidden or shown
-				if ( this.options.hide || this.options.show ) {
-					for ( var p in this.options.curAnim ) {
-						jQuery.style( this.elem, p, this.options.orig[p] );
-					}
-				}
-
-				// Execute the complete function
-				this.options.complete.call( this.elem );
-			}
-
-			return false;
-
-		} else {
-			var n = t - this.startTime;
-			this.state = n / this.options.duration;
-
-			// Perform the easing function, defaults to swing
-			var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
-			var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
-			this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
-			this.now = this.start + ((this.end - this.start) * this.pos);
-
-			// Perform the next step of the animation
-			this.update();
-		}
-
-		return true;
-	}
-};
-
-jQuery.extend( jQuery.fx, {
-	tick: function() {
-		var timers = jQuery.timers;
-
-		for ( var i = 0; i < timers.length; i++ ) {
-			if ( !timers[i]() ) {
-				timers.splice(i--, 1);
-			}
-		}
-
-		if ( !timers.length ) {
-			jQuery.fx.stop();
-		}
-	},
-
-	interval: 13,
-
-	stop: function() {
-		clearInterval( timerId );
-		timerId = null;
-	},
-
-	speeds: {
-		slow: 600,
-		fast: 200,
-		// Default speed
-		_default: 400
-	},
-
-	step: {
-		opacity: function( fx ) {
-			jQuery.style( fx.elem, "opacity", fx.now );
-		},
-
-		_default: function( fx ) {
-			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
-				fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
-			} else {
-				fx.elem[ fx.prop ] = fx.now;
-			}
-		}
-	}
-});
-
-if ( jQuery.expr && jQuery.expr.filters ) {
-	jQuery.expr.filters.animated = function( elem ) {
-		return jQuery.grep(jQuery.timers, function( fn ) {
-			return elem === fn.elem;
-		}).length;
-	};
-}
-
-function defaultDisplay( nodeName ) {
-	if ( !elemdisplay[ nodeName ] ) {
-		var elem = jQuery("<" + nodeName + ">").appendTo("body"),
-			display = elem.css("display");
-
-		elem.remove();
-
-		if ( display === "none" || display === "" ) {
-			display = "block";
-		}
-
-		elemdisplay[ nodeName ] = display;
-	}
-
-	return elemdisplay[ nodeName ];
-}
-
-
-
-
-var rtable = /^t(?:able|d|h)$/i,
-	rroot = /^(?:body|html)$/i;
-
-if ( "getBoundingClientRect" in document.documentElement ) {
-	jQuery.fn.offset = function( options ) {
-		var elem = this[0], box;
-
-		if ( options ) {
-			return this.each(function( i ) {
-				jQuery.offset.setOffset( this, options, i );
-			});
-		}
-
-		if ( !elem || !elem.ownerDocument ) {
-			return null;
-		}
-
-		if ( elem === elem.ownerDocument.body ) {
-			return jQuery.offset.bodyOffset( elem );
-		}
-
-		try {
-			box = elem.getBoundingClientRect();
-		} catch(e) {}
-
-		var doc = elem.ownerDocument,
-			docElem = doc.documentElement;
-
-		// Make sure we're not dealing with a disconnected DOM node
-		if ( !box || !jQuery.contains( docElem, elem ) ) {
-			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
-		}
-
-		var body = doc.body,
-			win = getWindow(doc),
-			clientTop  = docElem.clientTop  || body.clientTop  || 0,
-			clientLeft = docElem.clientLeft || body.clientLeft || 0,
-			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
-			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
-			top  = box.top  + scrollTop  - clientTop,
-			left = box.left + scrollLeft - clientLeft;
-
-		return { top: top, left: left };
-	};
-
-} else {
-	jQuery.fn.offset = function( options ) {
-		var elem = this[0];
-
-		if ( options ) {
-			return this.each(function( i ) {
-				jQuery.offset.setOffset( this, options, i );
-			});
-		}
-
-		if ( !elem || !elem.ownerDocument ) {
-			return null;
-		}
-
-		if ( elem === elem.ownerDocument.body ) {
-			return jQuery.offset.bodyOffset( elem );
-		}
-
-		jQuery.offset.initialize();
-
-		var computedStyle,
-			offsetParent = elem.offsetParent,
-			prevOffsetParent = elem,
-			doc = elem.ownerDocument,
-			docElem = doc.documentElement,
-			body = doc.body,
-			defaultView = doc.defaultView,
-			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
-			top = elem.offsetTop,
-			left = elem.offsetLeft;
-
-		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
-			if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
-				break;
-			}
-
-			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
-			top  -= elem.scrollTop;
-			left -= elem.scrollLeft;
-
-			if ( elem === offsetParent ) {
-				top  += elem.offsetTop;
-				left += elem.offsetLeft;
-
-				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
-					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
-					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
-				}
-
-				prevOffsetParent = offsetParent;
-				offsetParent = elem.offsetParent;
-			}
-
-			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
-				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
-				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
-			}
-
-			prevComputedStyle = computedStyle;
-		}
-
-		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
-			top  += body.offsetTop;
-			left += body.offsetLeft;
-		}
-
-		if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
-			top  += Math.max( docElem.scrollTop, body.scrollTop );
-			left += Math.max( docElem.scrollLeft, body.scrollLeft );
-		}
-
-		return { top: top, left: left };
-	};
-}
-
-jQuery.offset = {
-	initialize: function() {
-		var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
-			html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
-
-		jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
-
-		container.innerHTML = html;
-		body.insertBefore( container, body.firstChild );
-		innerDiv = container.firstChild;
-		checkDiv = innerDiv.firstChild;
-		td = innerDiv.nextSibling.firstChild.firstChild;
-
-		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
-		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
-
-		checkDiv.style.position = "fixed";
-		checkDiv.style.top = "20px";
-
-		// safari subtracts parent border width here which is 5px
-		this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
-		checkDiv.style.position = checkDiv.style.top = "";
-
-		innerDiv.style.overflow = "hidden";
-		innerDiv.style.position = "relative";
-
-		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
-
-		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
-
-		body.removeChild( container );
-		jQuery.offset.initialize = jQuery.noop;
-	},
-
-	bodyOffset: function( body ) {
-		var top = body.offsetTop,
-			left = body.offsetLeft;
-
-		jQuery.offset.initialize();
-
-		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
-			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
-			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
-		}
-
-		return { top: top, left: left };
-	},
-
-	setOffset: function( elem, options, i ) {
-		var position = jQuery.css( elem, "position" );
-
-		// set position first, in-case top/left are set even on static elem
-		if ( position === "static" ) {
-			elem.style.position = "relative";
-		}
-
-		var curElem = jQuery( elem ),
-			curOffset = curElem.offset(),
-			curCSSTop = jQuery.css( elem, "top" ),
-			curCSSLeft = jQuery.css( elem, "left" ),
-			calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1,
-			props = {}, curPosition = {}, curTop, curLeft;
-
-		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
-		if ( calculatePosition ) {
-			curPosition = curElem.position();
-		}
-
-		curTop  = calculatePosition ? curPosition.top  : parseInt( curCSSTop,  10 ) || 0;
-		curLeft = calculatePosition ? curPosition.left : parseInt( curCSSLeft, 10 ) || 0;
-
-		if ( jQuery.isFunction( options ) ) {
-			options = options.call( elem, i, curOffset );
-		}
-
-		if (options.top != null) {
-			props.top = (options.top - curOffset.top) + curTop;
-		}
-		if (options.left != null) {
-			props.left = (options.left - curOffset.left) + curLeft;
-		}
-
-		if ( "using" in options ) {
-			options.using.call( elem, props );
-		} else {
-			curElem.css( props );
-		}
-	}
-};
-
-
-jQuery.fn.extend({
-	position: function() {
-		if ( !this[0] ) {
-			return null;
-		}
-
-		var elem = this[0],
-
-		// Get *real* offsetParent
-		offsetParent = this.offsetParent(),
-
-		// Get correct offsets
-		offset       = this.offset(),
-		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
-
-		// Subtract element margins
-		// note: when an element has margin: auto the offsetLeft and marginLeft
-		// are the same in Safari causing offset.left to incorrectly be 0
-		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
-		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
-
-		// Add offsetParent borders
-		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
-		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
-
-		// Subtract the two offsets
-		return {
-			top:  offset.top  - parentOffset.top,
-			left: offset.left - parentOffset.left
-		};
-	},
-
-	offsetParent: function() {
-		return this.map(function() {
-			var offsetParent = this.offsetParent || document.body;
-			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
-				offsetParent = offsetParent.offsetParent;
-			}
-			return offsetParent;
-		});
-	}
-});
-
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( ["Left", "Top"], function( i, name ) {
-	var method = "scroll" + name;
-
-	jQuery.fn[ method ] = function(val) {
-		var elem = this[0], win;
-
-		if ( !elem ) {
-			return null;
-		}
-
-		if ( val !== undefined ) {
-			// Set the scroll offset
-			return this.each(function() {
-				win = getWindow( this );
-
-				if ( win ) {
-					win.scrollTo(
-						!i ? val : jQuery(win).scrollLeft(),
-						i ? val : jQuery(win).scrollTop()
-					);
-
-				} else {
-					this[ method ] = val;
-				}
-			});
-		} else {
-			win = getWindow( elem );
-
-			// Return the scroll offset
-			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
-				jQuery.support.boxModel && win.document.documentElement[ method ] ||
-					win.document.body[ method ] :
-				elem[ method ];
-		}
-	};
-});
-
-function getWindow( elem ) {
-	return jQuery.isWindow( elem ) ?
-		elem :
-		elem.nodeType === 9 ?
-			elem.defaultView || elem.parentWindow :
-			false;
-}
-
-
-
-
-// Create innerHeight, innerWidth, outerHeight and outerWidth methods
-jQuery.each([ "Height", "Width" ], function( i, name ) {
-
-	var type = name.toLowerCase();
-
-	// innerHeight and innerWidth
-	jQuery.fn["inner" + name] = function() {
-		return this[0] ?
-			parseFloat( jQuery.css( this[0], type, "padding" ) ) :
-			null;
-	};
-
-	// outerHeight and outerWidth
-	jQuery.fn["outer" + name] = function( margin ) {
-		return this[0] ?
-			parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) :
-			null;
-	};
-
-	jQuery.fn[ type ] = function( size ) {
-		// Get window width or height
-		var elem = this[0];
-		if ( !elem ) {
-			return size == null ? null : this;
-		}
-
-		if ( jQuery.isFunction( size ) ) {
-			return this.each(function( i ) {
-				var self = jQuery( this );
-				self[ type ]( size.call( this, i, self[ type ]() ) );
-			});
-		}
-
-		if ( jQuery.isWindow( elem ) ) {
-			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
-			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
-			var docElemProp = elem.document.documentElement[ "client" + name ];
-			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
-				elem.document.body[ "client" + name ] || docElemProp;
-
-		// Get document width or height
-		} else if ( elem.nodeType === 9 ) {
-			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
-			return Math.max(
-				elem.documentElement["client" + name],
-				elem.body["scroll" + name], elem.documentElement["scroll" + name],
-				elem.body["offset" + name], elem.documentElement["offset" + name]
-			);
-
-		// Get or set width or height on the element
-		} else if ( size === undefined ) {
-			var orig = jQuery.css( elem, type ),
-				ret = parseFloat( orig );
-
-			return jQuery.isNaN( ret ) ? orig : ret;
-
-		// Set the width or height on the element (default to pixels if value is unitless)
-		} else {
-			return this.css( type, typeof size === "string" ? size : size + "px" );
-		}
-	};
-
-});
-
-
-window.jQuery = window.$ = jQuery;
-})(window);
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/jquery.min.js b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/jquery.min.js
deleted file mode 100644
index f78f96a..0000000
--- a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/jquery/jquery.min.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.5.2
- * http://jquery.com/
- *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Thu Mar 31 15:28:23 2011 -0400
- */
-(function(a,b){function ci(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cf(a){if(!b_[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";b_[a]=c}return b_[a]}function ce(a,b){var c={};d.each(cd.concat.apply([],cd.slice(0,b)),function(){c[this]=a});return c}function b$(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bZ(){try{return new a.XMLHttpRequest}catch(b){}}function bY(){d(a).unload(function(){for(var a in bW)bW[a](0,1)})}function bS(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error
 ("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bR(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bQ(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bs.test(a)?e(a,f):bQ(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bQ(a+"["+f+"]",b[f],c,e)}function bP(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bJ,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bP(a,c,d,e,l,g)))
 ;(k||!l)&&!g["*"]&&(l=bP(a,c,d,e,"*",g));return l}function bO(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bD),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bq(a,b,c){var e=b==="width"?bk:bl,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function bc(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function bb(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function ba(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(
 c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function _(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function $(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Q(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function
 (a){return a.nodeType===1});if(L.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function P(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function H(a,b){return(a&&a!=="*"?a+".":"")+b.replace(t,"`").replace(u,"&")}function G(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p=[],q=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(r,"")===a.type?q.push(g.selector):t.splice(i--,1);f=d(a.target).closest(q,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0
 ];(!e||e!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){f=p[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function E(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function y(){return!0}function x(){return!1}function i(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function h(a,c,e){if(e===b&&a.nodeType===1){e=a.getAttribute("data-"+c);if(typeof e==="string"){try{e=e==="true"?!0:e==="false"?!1:e==="null"?null:d.isNaN(e)?g.test(e)?d.parseJSON(e):e:parseFloat(e)}catch(f){}d.data(a,c,e)}else e=b}return e}var c=a.document,d=function(){function G(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(G,1);return}d.r
 eady()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=navigator.userAgent,w,x,y,z=Object.prototype.toString,A=Object.prototype.hasOwnProperty,B=Array.prototype.push,C=Array.prototype.slice,D=String.prototype.trim,E=Array.prototype.indexOf,F={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.c
 onstructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.2",length:0,size:function(){return this.length},toArray:function(){return C.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var e=this.constructor();d.isArray(a)?B.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.select
 or+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),x.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(C.apply(this,arguments),"slice",C.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:B,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!=="object"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.e
 xtend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;x.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=d._Deferred();if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",y,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",y),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&G()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN
 (a)},type:function(a){return a==null?String(a):F[z.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!A.call(a,"constructor")&&!A.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||A.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("
 head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:D?function(a){return a==null?"":D.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?B.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=
 0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<
 0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){F["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),E&&(d.inArray=function(a,b){return E.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?y=function(){c.removeEventListener("DOMContentLoaded",y,!1),d.ready()}:c.attachEvent&&(y=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",y),d.ready())});return d}(),e="then done fail isResolved isRejecte
 d promise".split(" "),f=[].slice;d.extend({_Deferred:function(){var a=[],b,c,e,f={done:function(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(d,f)}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),f;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a){if(a==null){if(f)return f;f=a={}}var c=e.length;while(c--)a[e[c]]=b[e[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a
 ]=arguments.length>1?f.call(arguments,0):c,--g||h.resolveWith(h,f.call(b,0))}}var b=arguments,c=0,e=b.length,g=e,h=e<=1&&a&&d.isFunction(a.promise)?a:d.Deferred();if(e>1){for(;c<e;c++)b[c]&&d.isFunction(b[c].promise)?b[c].promise().then(i(c),h.reject):--g;g||h.resolveWith(h,b)}else h!==a&&h.resolveWith(h,e?[a]:[]);return h.promise()}}),function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$
 /.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0,reliableMarginRight:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e)}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' name='radiotest' chec
 ked='checked'/>";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(a.style.width="1px",a.style.marginRight="0",d.su
 pport.reliableMarginRight=(parseInt(c.defaultView.getComputedStyle(a,null).marginRight,10)||0)===0),b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function");return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}}();var g=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!i(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||type
 of c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,g=b.nodeType,h=g?d.cache:b,j=g?b[d.expando]:d.expando;if(!h[j])return;if(c){var k=e?h[j][f]:h[j];if(k){delete k[c];if(!i(k))return}}if(e){delete h[j][f];if(!i(h[j]))return}var l=h[j][f];d.support.deleteExpando||h!=a?delete h[j]:h[j]=null,l?(h[j]={},g||(h[j].toJSON=d.noop),h[j][f]=l):g&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var f=this[0].attribut
 es,g;for(var i=0,j=f.length;i<j;i++)g=f[i].name,g.indexOf("data-")===0&&(g=g.substr(5),h(this[0],g,e[g]))}}return e}if(typeof a==="object")return this.each(function(){d.data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=h(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d
 .fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]!=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var j=/[\n\t\r]/g,k=/\s+/,l=/\r/g,m=/^(?:href|src|style)$/,n=/^(?:button|input)$/i,o=/^(?:button|input|object|select|textarea)$/i,p=/^a(?:rea)?$/i,q=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(t
 his,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(k);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",h=f.className;for(var i=0,j=b.length;i<j;i++)g.indexOf(" "+b[i]+" ")<0&&(h+=" "+b[i]);f.className=d.trim(h)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(k);for(var e=0,f=this.length;e<f;e++){var g=this[e];if(g.nodeType===1&&g.className)if(a){var h=(" "+g.className+" ").replace(j," ");for(var i=0,l=c.length;i<l;i++)h=h.replace(" "+c[i]+" "," ");g.className=d.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d
 .isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,h=d(this),i=b,j=a.split(k);while(f=j[g++])i=e?i:!h.hasClass(f),h[i?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(j," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var j=i?f:0,k=i?f+1:h.length;j<k;j++){var m=h[j];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.p
 arentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(i)return a;g.push(a)}}if(i&&!g.length&&h.length)return d(h[f]).val();return g}if(q.test(c.type)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(l,"")}return b}var n=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){n&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&q.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=
 a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=m.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&n.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var k=a.getAttributeNode("tabIndex");return k&&k.specified?k.value:o.test(a.nodeName)||p.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var l=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return l===null?b:l}h&&(a[c]=e);return a[c]}});var r=/\.(.*)$/,s=/^(?:textarea|input|select)$/i,t=/\./g,u=
 / /g,v=/[^\w\s.|`]/g,w=function(a){return a.replace(v,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=x;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(a){return typeof d!=="undefined"&&d.event.triggered!==a.type?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n
 ]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=x);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),w).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete t[h]}if(d.isEmptyObject(t)){var u=s.handle;u&&(u.e
 lem=null),delete s.events,delete s.handle,d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.expando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(r,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)
 ===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=a.type,l[m]())}catch(p){}k&&(l["on"+m]=k),d.event.triggered=b}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement h
 andler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);retu
 rn a},guid:1e8,proxy:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,H(a.origType,a.selector),d.extend({},a,{handler:G,guid:a.handler.guid}))},remove:function(a){d.event.remove(this,H(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?y:x):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=y;var a=this.originalEvent;a&&(a.preventDefault?a.preven
 tDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=y;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=y,this.stopPropagation()},isDefaultPrevented:x,isPropagationStopped:x,isImmediatePropagationStopped:x};var z=function(a){var b=a.relatedTarget;try{if(b&&b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(e){}},A=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?A:z,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?A:z)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,b){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){v
 ar b=a.target,c=b.type;(c==="submit"||c==="image")&&d(b).closest("form").length&&E("submit",this,arguments)}),d.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&d(b).closest("form").length&&a.keyCode===13&&E("submit",this,arguments)});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var B,C=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},D=function D(a){var c=a.target,e,f;if(s.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=C(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:D,beforedeactivat
 e:D,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&D.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&D.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",C(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in B)d.event.add(this,c+".specialChange",B[c]);return s.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return s.test(this.nodeName)}},B=d.event.special.change.filters,B.focus=B.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function f(a){var c=d.event.fix(a);c.type=b,c.originalEvent={},d.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var e=0;d.event.special[b]={setup:function(){e++===0&&c.addEventListener(a,f,!0)},teardown:functi
 on(){--e===0&&c.removeEventListener(a,f,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.res
 ult}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var F={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var o in a)n[c](o,e,a[o],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=r.exec(h),k="",j&&(k=j[0],h=h.replace(r,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(F[h]+k),h=h+k):h=(F[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)d.event.add(n[p],"live."+H(h,m),{data:e,selector:m,handler:f,origType:h
 ,origHandler:f,preType:l});else n.unbind("live."+H(h,m),f)}return this}}),d.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!=="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?
 :\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x
 .length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getEle
 mentsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.
 *?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=
 a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));
 return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},che
 cked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return"text"===c&&(b===c||b===null)},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:fu
 nction(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("i
 d")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c
 .documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var 
 d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!=="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firs
 tChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.repl
 ace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)retur
 n;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};d.find=k,d.expr=k.selectors,d.expr[":"]=d.expr.filters,d.unique=k.uniqueSort,d.text=k.getText,d.isXMLDoc=k.isXML,d.contains=k.contains}();var I=/Until$/,J=/^(?:parents|prevUntil|prevAll)/,K=/,/,L=/^.[^:#\[\.,]*$/,M=Array.prototype.slice,N=d.expr.match.POS,O={children:!0,con
 tents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(Q(this,a,!1),"not",a)},filter:function(a){return this.pushStack(Q(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=N.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=th
 is[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(P(c[0])||P(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSi
 bling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=M.call(arguments);I.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!O[a]?d.unique(f):f,(this.length>1||K.test(e))&&J.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];
 for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var R=/ jQuery\d+="(?:\d+|null)"/g,S=/^\s+/,T=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,U=/<([\w:]+)/,V=/<tbody/i,W=/<|&#?\w+;/,X=/<(?:script|object|embed|option|style)/i,Y=/checked\s*(?:[^=]|=\s*.checked.)/i,Z={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};Z.optgroup=Z.option,Z.tbody=Z.tfoot=Z.colgroup=Z.caption=Z.thead,Z.th=Z.td,d.support.htmlSerialize||(Z._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocum
 ent||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.
 firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=d(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.ma
 p(function(){return d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(R,""):null;if(typeof a!=="string"||X.test(a)||!d.support.leadingWhitespace&&S.test(a)||Z[(U.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(T,"<$1></$2>");try{for(var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.length?this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a):this},detach:func
 tion(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&Y.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?$(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,bc)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!X.test(a[0])&&(d.support.checkClone||!Y.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=
 h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}for(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){ba(a,e),f=bb(a),g=bb(e);for(h=0;f[h];++h)ba(f[h],g[h])}if(b){_(a,e);if(c){f=bb(a),g=bb(e);for(h=0;f[h];++h)_(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];fo
 r(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||W.test(i)){if(typeof i==="string"){i=i.replace(T,"<$1></$2>");var j=(U.exec(i)||["",""])[1].toLowerCase(),k=Z[j]||Z._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=V.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&S.test(i)&&m.insertBefore(b.createTextNode(S.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h
 ].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bd=/alpha\([^)]*\)/i,be=/opacity=([^)]*)/,bf=/-([a-z])/ig,bg=/([A-Z]|^ms)/g,bh=/^-?\d+(?:px)?$/i,bi=/^-?\d/,bj={position:"absolute",visibility:"hidden",display:"block"},bk=["Left","Right"],bl=["Top","Bottom"],bm,bn,bo,bp=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bm(a,"opacity","opacity");return 
 c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bm)return bm(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bf,bp)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bq(a,b,e):d.s
 wap(a,bj,function(){f=bq(a,b,e)});if(f<=0){f=bm(a,b,b),f==="0px"&&bo&&(f=bo(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bh.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return be.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bd.test(f)?f.replace(bd,e):c.filter+" "+e}}),d(function(){d.support.reliableMarginRight||(d.cssHooks.marginRight={get:function(a,b){var c;d.swap(a,{display:"inline-block"},function(){b?c=bm(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bn=function(a,c,e){var f,g,h;e=e.replace(bg,"-$1").toLowerCase();if(!(g=a.ownerD
 ocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bo=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bh.test(d)&&bi.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bm=bn||bo,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var br=/%20/g,bs=/\[\]$/,bt=/\r?\n/g,bu=/#.*$/,bv=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bw=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bx=/^(?:about|app|app\-s
 torage|.+\-extension|file|widget):$/,by=/^(?:GET|HEAD)$/,bz=/^\/\//,bA=/\?/,bB=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bC=/^(?:select|textarea)/i,bD=/\s+/,bE=/([?&])_=[^&]*/,bF=/(^|\-)([a-z])/g,bG=function(a,b,c){return b+c.toUpperCase()},bH=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bI=d.fn.load,bJ={},bK={},bL,bM;try{bL=c.location.href}catch(bN){bL=c.createElement("a"),bL.href="",bL=bL.href}bM=bH.exec(bL.toLowerCase())||[],d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bI)return bI.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?d("<div>").append(c.replace(bB,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},s
 erialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bC.test(this.nodeName)||bw.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(bt,"\r\n")}}):{name:b.name,value:c.replace(bt,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var
  c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bL,isLocal:bx.test(bM[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bO(bJ),ajaxTransport:bO(bK),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bR(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bS(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;i
 f(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bF,bG)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bv.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=
 function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bu,"").replace(bz,bM[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bD),e.crossDomain==null&&(q=bH.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bM[1]||q[2]!=bM[2]||(q[3]||(q[1]==="http:"?80:443))!=(bM[3]||(bM[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bP(bJ,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!by.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(bA.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bE,"$1_="+w);e.url=x+(x===e.url?(bA.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModifie
 d[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bP(bK,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bQ(g,a[g],c,f);return e.join("&").replace(br,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bT
 =d.now(),bU=/(\=)\?(&|$)|\?\?/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bT++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bU.test(b.url)||f&&bU.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bU,l),b.url===j&&(f&&(k=k.replace(bU,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.g
 lobalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var bV=d.now(),bW,bX;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bZ()||b$()}:bZ,bX=d.ajaxSettings.xhr(),d.support.ajax=!!bX,d.support.cors=bX&&"withCredentials"in bX,bX=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(
 a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),!a.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bW[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bW||(bW={},bY()),h=bV++,g.onreadystatechange=bW[h]=c):c()},abort:function(){c&&c(0,1)}}}});var b_={},ca=/^(?:toggle|show|hide)$/,cb=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cc,cd=[["height","marginTop","margin
 Bottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(ce("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",cf(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ce("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"display");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(
 this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(ce("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=cf(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialE
 asing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(ca.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=cb.exec(e),j=f.cur();if(i){var k=parseFloat(i[2]),l=i[3]||(d.cssNumber[c]?"":"px");l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:ce("show",1),slideUp:ce("hide",1),slideToggle:ce("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,durat
 ion:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.un
 it=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!cc&&(cc=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in th
 is.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(cc),cc=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){d.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return 
 a===b.elem}).length});var cg=/^t(?:able|d|h)$/i,ch=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=ci(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,
 h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!cg.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=par
 seFloat(d.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),d.offset.initialize=
 d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=(e==="absolute"||e==="fixed")&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=ch.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.
 left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!ch.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=ci(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=ci(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.eac
 h(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window);
\ No newline at end of file
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/misc/1.7/states.js b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/misc/1.7/states.js
new file mode 100644
index 0000000..d934372
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/misc/1.7/states.js
@@ -0,0 +1,423 @@
+(function ($) {
+
+/**
+ * The base States namespace.
+ *
+ * Having the local states variable allows us to use the States namespace
+ * without having to always declare "Drupal.states".
+ */
+var states = Drupal.states = {
+  // An array of functions that should be postponed.
+  postponed: []
+};
+
+/**
+ * Attaches the states.
+ */
+Drupal.behaviors.states = {
+  attach: function (context, settings) {
+    for (var selector in settings.states) {
+      for (var state in settings.states[selector]) {
+        new states.Dependent({
+          element: $(selector),
+          state: states.State.sanitize(state),
+          dependees: settings.states[selector][state]
+        });
+      }
+    }
+
+    // Execute all postponed functions now.
+    while (states.postponed.length) {
+      (states.postponed.shift())();
+    }
+  }
+};
+
+/**
+ * Object representing an element that depends on other elements.
+ *
+ * @param args
+ *   Object with the following keys (all of which are required):
+ *   - element: A jQuery object of the dependent element
+ *   - state: A State object describing the state that is dependent
+ *   - dependees: An object with dependency specifications. Lists all elements
+ *     that this element depends on.
+ */
+states.Dependent = function (args) {
+  $.extend(this, { values: {}, oldValue: undefined }, args);
+
+  for (var selector in this.dependees) {
+    this.initializeDependee(selector, this.dependees[selector]);
+  }
+};
+
+/**
+ * Comparison functions for comparing the value of an element with the
+ * specification from the dependency settings. If the object type can't be
+ * found in this list, the === operator is used by default.
+ */
+states.Dependent.comparisons = {
+  'RegExp': function (reference, value) {
+    return reference.test(value);
+  },
+  'Function': function (reference, value) {
+    // The "reference" variable is a comparison function.
+    return reference(value);
+  },
+  'Number': function (reference, value) {
+    // If "reference" is a number and "value" is a string, then cast reference
+    // as a string before applying the strict comparison in compare(). Otherwise
+    // numeric keys in the form's #states array fail to match string values
+    // returned from jQuery's val().
+    return (value.constructor.name === 'String') ? compare(String(reference), value) : compare(reference, value);
+  }
+};
+
+states.Dependent.prototype = {
+  /**
+   * Initializes one of the elements this dependent depends on.
+   *
+   * @param selector
+   *   The CSS selector describing the dependee.
+   * @param dependeeStates
+   *   The list of states that have to be monitored for tracking the
+   *   dependee's compliance status.
+   */
+  initializeDependee: function (selector, dependeeStates) {
+    var self = this;
+
+    // Cache for the states of this dependee.
+    self.values[selector] = {};
+
+    $.each(dependeeStates, function (state, value) {
+      state = states.State.sanitize(state);
+
+      // Initialize the value of this state.
+      self.values[selector][state.pristine] = undefined;
+
+      // Monitor state changes of the specified state for this dependee.
+      $(selector).bind('state:' + state, function (e) {
+        var complies = self.compare(value, e.value);
+        self.update(selector, state, complies);
+      });
+
+      // Make sure the event we just bound ourselves to is actually fired.
+      new states.Trigger({ selector: selector, state: state });
+    });
+  },
+
+  /**
+   * Compares a value with a reference value.
+   *
+   * @param reference
+   *   The value used for reference.
+   * @param value
+   *   The value to compare with the reference value.
+   * @return
+   *   true, undefined or false.
+   */
+  compare: function (reference, value) {
+    if (reference.constructor.name in states.Dependent.comparisons) {
+      // Use a custom compare function for certain reference value types.
+      return states.Dependent.comparisons[reference.constructor.name](reference, value);
+    }
+    else {
+      // Do a plain comparison otherwise.
+      return compare(reference, value);
+    }
+  },
+
+  /**
+   * Update the value of a dependee's state.
+   *
+   * @param selector
+   *   CSS selector describing the dependee.
+   * @param state
+   *   A State object describing the dependee's updated state.
+   * @param value
+   *   The new value for the dependee's updated state.
+   */
+  update: function (selector, state, value) {
+    // Only act when the 'new' value is actually new.
+    if (value !== this.values[selector][state.pristine]) {
+      this.values[selector][state.pristine] = value;
+      this.reevaluate();
+    }
+  },
+
+  /**
+   * Triggers change events in case a state changed.
+   */
+  reevaluate: function () {
+    var value = undefined;
+
+    // Merge all individual values to find out whether this dependee complies.
+    for (var selector in this.values) {
+      for (var state in this.values[selector]) {
+        state = states.State.sanitize(state);
+        var complies = this.values[selector][state.pristine];
+        value = ternary(value, invert(complies, state.invert));
+      }
+    }
+
+    // Only invoke a state change event when the value actually changed.
+    if (value !== this.oldValue) {
+      // Store the new value so that we can compare later whether the value
+      // actually changed.
+      this.oldValue = value;
+
+      // Normalize the value to match the normalized state name.
+      value = invert(value, this.state.invert);
+
+      // By adding "trigger: true", we ensure that state changes don't go into
+      // infinite loops.
+      this.element.trigger({ type: 'state:' + this.state, value: value, trigger: true });
+    }
+  }
+};
+
+states.Trigger = function (args) {
+  $.extend(this, args);
+
+  if (this.state in states.Trigger.states) {
+    this.element = $(this.selector);
+
+    // Only call the trigger initializer when it wasn't yet attached to this
+    // element. Otherwise we'd end up with duplicate events.
+    if (!this.element.data('trigger:' + this.state)) {
+      this.initialize();
+    }
+  }
+};
+
+states.Trigger.prototype = {
+  initialize: function () {
+    var self = this;
+    var trigger = states.Trigger.states[this.state];
+
+    if (typeof trigger == 'function') {
+      // We have a custom trigger initialization function.
+      trigger.call(window, this.element);
+    }
+    else {
+      $.each(trigger, function (event, valueFn) {
+        self.defaultTrigger(event, valueFn);
+      });
+    }
+
+    // Mark this trigger as initialized for this element.
+    this.element.data('trigger:' + this.state, true);
+  },
+
+  defaultTrigger: function (event, valueFn) {
+    var self = this;
+    var oldValue = valueFn.call(this.element);
+
+    // Attach the event callback.
+    this.element.bind(event, function (e) {
+      var value = valueFn.call(self.element, e);
+      // Only trigger the event if the value has actually changed.
+      if (oldValue !== value) {
+        self.element.trigger({ type: 'state:' + self.state, value: value, oldValue: oldValue });
+        oldValue = value;
+      }
+    });
+
+    states.postponed.push(function () {
+      // Trigger the event once for initialization purposes.
+      self.element.trigger({ type: 'state:' + self.state, value: oldValue, oldValue: undefined });
+    });
+  }
+};
+
+/**
+ * This list of states contains functions that are used to monitor the state
+ * of an element. Whenever an element depends on the state of another element,
+ * one of these trigger functions is added to the dependee so that the
+ * dependent element can be updated.
+ */
+states.Trigger.states = {
+  // 'empty' describes the state to be monitored
+  empty: {
+    // 'keyup' is the (native DOM) event that we watch for.
+    'keyup': function () {
+      // The function associated to that trigger returns the new value for the
+      // state.
+      return this.val() == '';
+    }
+  },
+
+  checked: {
+    'change': function () {
+      return this.prop('checked');
+    }
+  },
+
+  // For radio buttons, only return the value if the radio button is selected.
+  value: {
+    'keyup': function () {
+      // Radio buttons share the same :input[name="key"] selector.
+      if (this.length > 1) {
+        // Initial checked value of radios is undefined, so we return false.
+        return this.filter(':checked').val() || false;
+      }
+      return this.val();
+    },
+    'change': function () {
+      // Radio buttons share the same :input[name="key"] selector.
+      if (this.length > 1) {
+        // Initial checked value of radios is undefined, so we return false.
+        return this.filter(':checked').val() || false;
+      }
+      return this.val();
+    }
+  },
+
+  collapsed: {
+    'collapsed': function(e) {
+      return (e !== undefined && 'value' in e) ? e.value : this.is('.collapsed');
+    }
+  }
+};
+
+
+/**
+ * A state object is used for describing the state and performing aliasing.
+ */
+states.State = function(state) {
+  // We may need the original unresolved name later.
+  this.pristine = this.name = state;
+
+  // Normalize the state name.
+  while (true) {
+    // Iteratively remove exclamation marks and invert the value.
+    while (this.name.charAt(0) == '!') {
+      this.name = this.name.substring(1);
+      this.invert = !this.invert;
+    }
+
+    // Replace the state with its normalized name.
+    if (this.name in states.State.aliases) {
+      this.name = states.State.aliases[this.name];
+    }
+    else {
+      break;
+    }
+  }
+};
+
+/**
+ * Create a new State object by sanitizing the passed value.
+ */
+states.State.sanitize = function (state) {
+  if (state instanceof states.State) {
+    return state;
+  }
+  else {
+    return new states.State(state);
+  }
+};
+
+/**
+ * This list of aliases is used to normalize states and associates negated names
+ * with their respective inverse state.
+ */
+states.State.aliases = {
+  'enabled': '!disabled',
+  'invisible': '!visible',
+  'invalid': '!valid',
+  'untouched': '!touched',
+  'optional': '!required',
+  'filled': '!empty',
+  'unchecked': '!checked',
+  'irrelevant': '!relevant',
+  'expanded': '!collapsed',
+  'readwrite': '!readonly'
+};
+
+states.State.prototype = {
+  invert: false,
+
+  /**
+   * Ensures that just using the state object returns the name.
+   */
+  toString: function() {
+    return this.name;
+  }
+};
+
+/**
+ * Global state change handlers. These are bound to "document" to cover all
+ * elements whose state changes. Events sent to elements within the page
+ * bubble up to these handlers. We use this system so that themes and modules
+ * can override these state change handlers for particular parts of a page.
+ */
+{
+  $(document).bind('state:disabled', function(e) {
+    // Only act when this change was triggered by a dependency and not by the
+    // element monitoring itself.
+    if (e.trigger) {
+      $(e.target)
+        .attr('disabled', e.value)
+        .filter('.form-element')
+          .closest('.form-item, .form-submit, .form-wrapper')[e.value ? 'addClass' : 'removeClass']('form-disabled');
+
+      // Note: WebKit nightlies don't reflect that change correctly.
+      // See https://bugs.webkit.org/show_bug.cgi?id=23789
+    }
+  });
+
+  $(document).bind('state:required', function(e) {
+    if (e.trigger) {
+      if (e.value) {
+        $(e.target).closest('.form-item, .form-wrapper').find('label').append('<span class="form-required">*</span>');
+      }
+      else {
+        $(e.target).closest('.form-item, .form-wrapper').find('label .form-required').remove();
+      }
+    }
+  });
+
+  $(document).bind('state:visible', function(e) {
+    if (e.trigger) {
+      $(e.target).closest('.form-item, .form-submit, .form-wrapper')[e.value ? 'show' : 'hide']();
+    }
+  });
+
+  $(document).bind('state:checked', function(e) {
+    if (e.trigger) {
+      $(e.target).prop('checked', e.value);
+    }
+  });
+
+  $(document).bind('state:collapsed', function(e) {
+    if (e.trigger) {
+      if ($(e.target).is('.collapsed') !== e.value) {
+        $('> legend a', e.target).click();
+      }
+    }
+  });
+}
+
+/**
+ * These are helper functions implementing addition "operators" and don't
+ * implement any logic that is particular to states.
+ */
+{
+  // Bitwise AND with a third undefined state.
+  function ternary (a, b) {
+    return a === undefined ? b : (b === undefined ? a : a && b);
+  };
+
+  // Inverts a (if it's not undefined) when invert is true.
+  function invert (a, invert) {
+    return (invert && a !== undefined) ? !a : a;
+  };
+
+  // Compares two values while ignoring undefined values.
+  function compare (a, b) {
+    return (a === b) ? (a === undefined ? a : true) : (a === undefined || b === undefined);
+  }
+}
+
+})(jQuery);
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/misc/jquery.form.js b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/misc/jquery.form.js
index ea128ac..3ad71f8 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/misc/jquery.form.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/misc/jquery.form.js
@@ -1,6 +1,6 @@
-/*
+/*!
  * jQuery Form Plugin
- * version: 2.67 (12-MAR-2011)
+ * version: 2.69 (06-APR-2011)
  * @requires jQuery v1.3.2 or later
  *
  * Examples and documentation at: http://malsup.com/jquery/form/
@@ -8,4 +8,808 @@
  *   http://www.opensource.org/licenses/mit-license.php
  *   http://www.gnu.org/licenses/gpl.html
  */
-(function(a){function b(){if(a.fn.ajaxSubmit.debug){var b="[jquery.form] "+Array.prototype.join.call(arguments,"");window.console&&window.console.log?window.console.log(b):window.opera&&window.opera.postError&&window.opera.postError(b)}}a.fn.ajaxSubmit=function(c){function r(){function t(){if(!j.aborted){var c=i.contentWindow?i.contentWindow.document:i.contentDocument?i.contentDocument:i.document;if(!c||c.location.href==e.iframeSrc)return;i.detachEvent?i.detachEvent("onload",t):i.removeEventListener("load",t,!1);var d=!0;try{if(m)throw"timeout";var f=e.dataType=="xml"||c.XMLDocument||a.isXMLDoc(c);b("isXml="+f);if(!f&&window.opera&&(c.body==null||c.body.innerHTML==""))if(--s){b("requeing onLoad callback, DOM not available"),setTimeout(t,250);return}j.responseText=c.body?c.body.innerHTML:c.documentElement?c.documentElement.innerHTML:null,j.responseXML=c.XMLDocument?c.XMLDocument:c,j.getResponseHeader=function(a){var b={"content-type":e.dataType};return b[a]};var g=/(json|scri
 pt)/.test(e.dataType);if(g||e.textarea){var l=c.getElementsByTagName("textarea")[0];if(l)j.responseText=l.value;else if(g){var n=c.getElementsByTagName("pre")[0],o=c.getElementsByTagName("body")[0];n?j.responseText=n.textContent:o&&(j.responseText=o.innerHTML)}}else e.dataType=="xml"&&!j.responseXML&&j.responseText!=null&&(j.responseXML=u(j.responseText));q=w(j,e.dataType,e)}catch(p){b("error caught:",p),d=!1,j.error=p,e.error&&e.error.call(e.context,j,"error",p),k&&a.event.trigger("ajaxError",[j,e,p])}j.aborted&&(b("upload aborted"),d=!1),d&&(e.success&&e.success.call(e.context,q,"success",j),k&&a.event.trigger("ajaxSuccess",[j,e])),k&&a.event.trigger("ajaxComplete",[j,e]),k&&!--a.active&&a.event.trigger("ajaxStop"),e.complete&&e.complete.call(e.context,j,d?"success":"error"),setTimeout(function(){h.removeData("form-plugin-onload"),h.remove(),j.responseXML=null},100)}}function p(){var b=l.attr("target"),c=l.attr("action");d.setAttribute("target",f),d.getAttribute("method")!
 ="POST"&&d.setAttribute("method","POST"),d.getAttribute("action")!=e.url&&d.setAttribute("action",e.url),e.skipEncodingOverride||l.attr({encoding:"multipart/form-data",enctype:"multipart/form-data"}),e.timeout&&setTimeout(function(){m=!0,t()},e.timeout);var g=[];try{if(e.extraData)for(var j in e.extraData)g.push(a('<input type="hidden" name="'+j+'" value="'+e.extraData[j]+'" />').appendTo(d)[0]);h.appendTo("body"),i.attachEvent?i.attachEvent("onload",t):i.addEventListener("load",t,!1),d.submit()}finally{d.setAttribute("action",c),b?d.setAttribute("target",b):l.removeAttr("target"),a(g).remove()}}var d=l[0];if(a(":input[name=submit],:input[id=submit]",d).length)alert('Error: Form elements must not have name or id of "submit".');else{var e=a.extend(!0,{},a.ajaxSettings,c);e.context=e.context||e;var f="jqFormIO"+(new Date).getTime(),g="_"+f,h=a('<iframe id="'+f+'" name="'+f+'" src="'+e.iframeSrc+'" />'),i=h[0];h.css({position:"absolute",top:"-1000px",left:"-1000px"});var j={abo
 rted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(){b("aborting upload...");var c="aborted";this.aborted=1,h.attr("src",e.iframeSrc),j.error=c,e.error&&e.error.call(e.context,j,"error",c),k&&a.event.trigger("ajaxError",[j,e,c]),e.complete&&e.complete.call(e.context,j,"error")}},k=e.global;k&&!(a.active++)&&a.event.trigger("ajaxStart"),k&&a.event.trigger("ajaxSend",[j,e]);if(e.beforeSend&&e.beforeSend.call(e.context,j,e)===!1){e.global&&a.active--;return}if(j.aborted)return;var m=0,n=d.clk;if(n){var o=n.name;o&&!n.disabled&&(e.extraData=e.extraData||{},e.extraData[o]=n.value,n.type=="image"&&(e.extraData[o+".x"]=d.clk_x,e.extraData[o+".y"]=d.clk_y))}e.forceSync?p():setTimeout(p,10);var q,r,s=50,u=a.parseXML||function(a,b){window.ActiveXObject?(b=new ActiveXObject("Microsoft.XMLDOM"),b.async="false",b.loadXML(a)):b=(new DOMParser).parseFromString(a,"
 text/xml");return b&&b.documentElement&&b.documentElement.nodeName!="parsererror"?b:null},v=a.parseJSON||function(a){return window.eval("("+a+")")},w=function(b,c,d){var e=b.getResponseHeader("content-type")||"",f=c==="xml"||!c&&e.indexOf("xml")>=0,g=f?b.responseXML:b.responseText;f&&g.documentElement.nodeName==="parsererror"&&(a.error&&a.error("parsererror")),d&&d.dataFilter&&(g=d.dataFilter(g,c)),typeof g==="string"&&(c==="json"||!c&&e.indexOf("json")>=0?g=v(g):(c==="script"||!c&&e.indexOf("javascript")>=0)&&a.globalEval(g));return g}}}if(!this.length){b("ajaxSubmit: skipping submit process - no element selected");return this}typeof c=="function"&&(c={success:c});var d=this.attr("action"),e=typeof d==="string"?a.trim(d):"";e&&(e=(e.match(/^([^#]+)/)||[])[1]),e=e||window.location.href||"",c=a.extend(!0,{url:e,type:this[0].getAttribute("method")||"GET",iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},c);var f={};this.trigger("form-pre-seri
 alize",[this,c,f]);if(f.veto){b("ajaxSubmit: submit vetoed via form-pre-serialize trigger");return this}if(c.beforeSerialize&&c.beforeSerialize(this,c)===!1){b("ajaxSubmit: submit aborted via beforeSerialize callback");return this}var g,h,i=this.formToArray(c.semantic);if(c.data){c.extraData=c.data;for(g in c.data)if(c.data[g]instanceof Array)for(var j in c.data[g])i.push({name:g,value:c.data[g][j]});else h=c.data[g],h=a.isFunction(h)?h():h,i.push({name:g,value:h})}if(c.beforeSubmit&&c.beforeSubmit(i,this,c)===!1){b("ajaxSubmit: submit aborted via beforeSubmit callback");return this}this.trigger("form-submit-validate",[i,this,c,f]);if(f.veto){b("ajaxSubmit: submit vetoed via form-submit-validate trigger");return this}var k=a.param(i);c.type.toUpperCase()=="GET"?(c.url+=(c.url.indexOf("?")>=0?"&":"?")+k,c.data=null):c.data=k;var l=this,m=[];c.resetForm&&m.push(function(){l.resetForm()}),c.clearForm&&m.push(function(){l.clearForm()});if(!c.dataType&&c.target){var n=c.success||
 function(){};m.push(function(b){var d=c.replaceTarget?"replaceWith":"html";a(c.target)[d](b).each(n,arguments)})}else c.success&&m.push(c.success);c.success=function(a,b,d){var e=c.context||c;for(var f=0,g=m.length;f<g;f++)m[f].apply(e,[a,b,d||l,l])};var o=a("input:file",this).length>0,p="multipart/form-data",q=l.attr("enctype")==p||l.attr("encoding")==p;c.iframe!==!1&&(o||c.iframe||q)?c.closeKeepAlive?a.get(c.closeKeepAlive,r):r():a.ajax(c),this.trigger("form-submit-notify",[this,c]);return this},a.fn.ajaxForm=function(c){if(this.length===0){var d={s:this.selector,c:this.context};if(!a.isReady&&d.s){b("DOM not ready, queuing ajaxForm"),a(function(){a(d.s,d.c).ajaxForm(c)});return this}b("terminating; zero elements found by selector"+(a.isReady?"":" (DOM not ready)"));return this}return this.ajaxFormUnbind().bind("submit.form-plugin",function(b){b.isDefaultPrevented()||(b.preventDefault(),a(this).ajaxSubmit(c))}).bind("click.form-plugin",function(b){var c=b.target,d=a(c);if(
 !d.is(":submit,input:image")){var e=d.closest(":submit");if(e.length==0)return;c=e[0]}var f=this;f.clk=c;if(c.type=="image")if(b.offsetX!=undefined)f.clk_x=b.offsetX,f.clk_y=b.offsetY;else if(typeof a.fn.offset=="function"){var g=d.offset();f.clk_x=b.pageX-g.left,f.clk_y=b.pageY-g.top}else f.clk_x=b.pageX-c.offsetLeft,f.clk_y=b.pageY-c.offsetTop;setTimeout(function(){f.clk=f.clk_x=f.clk_y=null},100)})},a.fn.ajaxFormUnbind=function(){return this.unbind("submit.form-plugin click.form-plugin")},a.fn.formToArray=function(b){var c=[];if(this.length===0)return c;var d=this[0],e=b?d.getElementsByTagName("*"):d.elements;if(!e)return c;var f,g,h,i,j,k,l;for(f=0,k=e.length;f<k;f++){j=e[f],h=j.name;if(!h)continue;if(b&&d.clk&&j.type=="image"){!j.disabled&&d.clk==j&&(c.push({name:h,value:a(j).val()}),c.push({name:h+".x",value:d.clk_x},{name:h+".y",value:d.clk_y}));continue}i=a.fieldValue(j,!0);if(i&&i.constructor==Array)for(g=0,l=i.length;g<l;g++)c.push({name:h,value:i[g]});else i!==nul
 l&&typeof i!="undefined"&&c.push({name:h,value:i})}if(!b&&d.clk){var m=a(d.clk),n=m[0];h=n.name,h&&!n.disabled&&n.type=="image"&&(c.push({name:h,value:m.val()}),c.push({name:h+".x",value:d.clk_x},{name:h+".y",value:d.clk_y}))}return c},a.fn.formSerialize=function(b){return a.param(this.formToArray(b))},a.fn.fieldSerialize=function(b){var c=[];this.each(function(){var d=this.name;if(d){var e=a.fieldValue(this,b);if(e&&e.constructor==Array)for(var f=0,g=e.length;f<g;f++)c.push({name:d,value:e[f]});else e!==null&&typeof e!="undefined"&&c.push({name:this.name,value:e})}});return a.param(c)},a.fn.fieldValue=function(b){for(var c=[],d=0,e=this.length;d<e;d++){var f=this[d],g=a.fieldValue(f,b);if(g===null||typeof g=="undefined"||g.constructor==Array&&!g.length)continue;g.constructor==Array?a.merge(c,g):c.push(g)}return c},a.fieldValue=function(b,c){var d=b.name,e=b.type,f=b.tagName.toLowerCase();c===undefined&&(c=!0);if(c&&(!d||b.disabled||e=="reset"||e=="button"||(e=="checkbox"||e
 =="radio")&&!b.checked||(e=="submit"||e=="image")&&b.form&&b.form.clk!=b||f=="select"&&b.selectedIndex==-1))return null;if(f=="select"){var g=b.selectedIndex;if(g<0)return null;var h=[],i=b.options,j=e=="select-one",k=j?g+1:i.length;for(var l=j?g:0;l<k;l++){var m=i[l];if(m.selected){var n=m.value;n||(n=m.attributes&&m.attributes.value&&!m.attributes.value.specified?m.text:m.value);if(j)return n;h.push(n)}}return h}return a(b).val()},a.fn.clearForm=function(){return this.each(function(){a("input,select,textarea",this).clearFields()})},a.fn.clearFields=a.fn.clearInputs=function(){return this.each(function(){var a=this.type,b=this.tagName.toLowerCase();a=="text"||a=="password"||b=="textarea"?this.value="":a=="checkbox"||a=="radio"?this.checked=!1:b=="select"&&(this.selectedIndex=-1)})},a.fn.resetForm=function(){return this.each(function(){(typeof this.reset=="function"||typeof this.reset=="object"&&!this.reset.nodeType)&&this.reset()})},a.fn.enable=function(a){a===undefined&&(a
 =!0);return this.each(function(){this.disabled=!a})},a.fn.selected=function(b){b===undefined&&(b=!0);return this.each(function(){var c=this.type;if(c=="checkbox"||c=="radio")this.checked=b;else if(this.tagName.toLowerCase()=="option"){var d=a(this).parent("select");b&&d[0]&&d[0].type=="select-one"&&d.find("option").selected(!1),this.selected=b}})}})(jQuery)
\ No newline at end of file
+;(function($) {
+
+/*
+	Usage Note:
+	-----------
+	Do not use both ajaxSubmit and ajaxForm on the same form.  These
+	functions are intended to be exclusive.  Use ajaxSubmit if you want
+	to bind your own submit handler to the form.  For example,
+
+	$(document).ready(function() {
+		$('#myForm').bind('submit', function(e) {
+			e.preventDefault(); // <-- important
+			$(this).ajaxSubmit({
+				target: '#output'
+			});
+		});
+	});
+
+	Use ajaxForm when you want the plugin to manage all the event binding
+	for you.  For example,
+
+	$(document).ready(function() {
+		$('#myForm').ajaxForm({
+			target: '#output'
+		});
+	});
+
+	When using ajaxForm, the ajaxSubmit function will be invoked for you
+	at the appropriate time.
+*/
+
+/**
+ * ajaxSubmit() provides a mechanism for immediately submitting
+ * an HTML form using AJAX.
+ */
+$.fn.ajaxSubmit = function(options) {
+	// fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
+	if (!this.length) {
+		log('ajaxSubmit: skipping submit process - no element selected');
+		return this;
+	}
+
+	if (typeof options == 'function') {
+		options = { success: options };
+	}
+
+	var action = this.attr('action');
+	var url = (typeof action === 'string') ? $.trim(action) : '';
+	if (url) {
+		// clean url (don't include hash vaue)
+		url = (url.match(/^([^#]+)/)||[])[1];
+	}
+	url = url || window.location.href || '';
+
+	options = $.extend(true, {
+		url:  url,
+		success: $.ajaxSettings.success,
+		type: this[0].getAttribute('method') || 'GET', // IE7 massage (see issue 57)
+		iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
+	}, options);
+
+	// hook for manipulating the form data before it is extracted;
+	// convenient for use with rich editors like tinyMCE or FCKEditor
+	var veto = {};
+	this.trigger('form-pre-serialize', [this, options, veto]);
+	if (veto.veto) {
+		log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
+		return this;
+	}
+
+	// provide opportunity to alter form data before it is serialized
+	if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
+		log('ajaxSubmit: submit aborted via beforeSerialize callback');
+		return this;
+	}
+
+	var n,v,a = this.formToArray(options.semantic);
+	if (options.data) {
+		options.extraData = options.data;
+		for (n in options.data) {
+			if(options.data[n] instanceof Array) {
+				for (var k in options.data[n]) {
+					a.push( { name: n, value: options.data[n][k] } );
+				}
+			}
+			else {
+				v = options.data[n];
+				v = $.isFunction(v) ? v() : v; // if value is fn, invoke it
+				a.push( { name: n, value: v } );
+			}
+		}
+	}
+
+	// give pre-submit callback an opportunity to abort the submit
+	if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
+		log('ajaxSubmit: submit aborted via beforeSubmit callback');
+		return this;
+	}
+
+	// fire vetoable 'validate' event
+	this.trigger('form-submit-validate', [a, this, options, veto]);
+	if (veto.veto) {
+		log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
+		return this;
+	}
+
+	var q = $.param(a);
+
+	if (options.type.toUpperCase() == 'GET') {
+		options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
+		options.data = null;  // data is null for 'get'
+	}
+	else {
+		options.data = q; // data is the query string for 'post'
+	}
+
+	var $form = this, callbacks = [];
+	if (options.resetForm) {
+		callbacks.push(function() { $form.resetForm(); });
+	}
+	if (options.clearForm) {
+		callbacks.push(function() { $form.clearForm(); });
+	}
+
+	// perform a load on the target only if dataType is not provided
+	if (!options.dataType && options.target) {
+		var oldSuccess = options.success || function(){};
+		callbacks.push(function(data) {
+			var fn = options.replaceTarget ? 'replaceWith' : 'html';
+			$(options.target)[fn](data).each(oldSuccess, arguments);
+		});
+	}
+	else if (options.success) {
+		callbacks.push(options.success);
+	}
+
+	options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
+		var context = options.context || options;   // jQuery 1.4+ supports scope context 
+		for (var i=0, max=callbacks.length; i < max; i++) {
+			callbacks[i].apply(context, [data, status, xhr || $form, $form]);
+		}
+	};
+
+	// are there files to upload?
+	var fileInputs = $('input:file', this).length > 0;
+	var mp = 'multipart/form-data';
+	var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
+
+	// options.iframe allows user to force iframe mode
+	// 06-NOV-09: now defaulting to iframe mode if file input is detected
+   if (options.iframe !== false && (fileInputs || options.iframe || multipart)) {
+	   // hack to fix Safari hang (thanks to Tim Molendijk for this)
+	   // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
+	   if (options.closeKeepAlive) {
+		   $.get(options.closeKeepAlive, fileUpload);
+		}
+	   else {
+		   fileUpload();
+		}
+   }
+   else {
+		$.ajax(options);
+   }
+
+	// fire 'notify' event
+	this.trigger('form-submit-notify', [this, options]);
+	return this;
+
+
+	// private function for handling file uploads (hat tip to YAHOO!)
+	function fileUpload() {
+		var form = $form[0];
+
+		if ($(':input[name=submit],:input[id=submit]', form).length) {
+			// if there is an input with a name or id of 'submit' then we won't be
+			// able to invoke the submit fn on the form (at least not x-browser)
+			alert('Error: Form elements must not have name or id of "submit".');
+			return;
+		}
+		
+		var s = $.extend(true, {}, $.ajaxSettings, options);
+		s.context = s.context || s;
+		var id = 'jqFormIO' + (new Date().getTime()), fn = '_'+id;
+		var $io = $('<iframe id="' + id + '" name="' + id + '" src="'+ s.iframeSrc +'" />');
+		var io = $io[0];
+
+		$io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
+
+		var xhr = { // mock object
+			aborted: 0,
+			responseText: null,
+			responseXML: null,
+			status: 0,
+			statusText: 'n/a',
+			getAllResponseHeaders: function() {},
+			getResponseHeader: function() {},
+			setRequestHeader: function() {},
+			abort: function() {
+				log('aborting upload...');
+				var e = 'aborted';
+				this.aborted = 1;
+				$io.attr('src', s.iframeSrc); // abort op in progress
+				xhr.error = e;
+				s.error && s.error.call(s.context, xhr, 'error', e);
+				g && $.event.trigger("ajaxError", [xhr, s, e]);
+				s.complete && s.complete.call(s.context, xhr, 'error');
+			}
+		};
+
+		var g = s.global;
+		// trigger ajax global events so that activity/block indicators work like normal
+		if (g && ! $.active++) {
+			$.event.trigger("ajaxStart");
+		}
+		if (g) {
+			$.event.trigger("ajaxSend", [xhr, s]);
+		}
+
+		if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
+			if (s.global) { 
+				$.active--;
+			}
+			return;
+		}
+		if (xhr.aborted) {
+			return;
+		}
+
+		var timedOut = 0;
+
+		// add submitting element to data if we know it
+		var sub = form.clk;
+		if (sub) {
+			var n = sub.name;
+			if (n && !sub.disabled) {
+				s.extraData = s.extraData || {};
+				s.extraData[n] = sub.value;
+				if (sub.type == "image") {
+					s.extraData[n+'.x'] = form.clk_x;
+					s.extraData[n+'.y'] = form.clk_y;
+				}
+			}
+		}
+
+		// take a breath so that pending repaints get some cpu time before the upload starts
+		function doSubmit() {
+			// make sure form attrs are set
+			var t = $form.attr('target'), a = $form.attr('action');
+
+			// update form attrs in IE friendly way
+			form.setAttribute('target',id);
+			if (form.getAttribute('method') != 'POST') {
+				form.setAttribute('method', 'POST');
+			}
+			if (form.getAttribute('action') != s.url) {
+				form.setAttribute('action', s.url);
+			}
+
+			// ie borks in some cases when setting encoding
+			if (! s.skipEncodingOverride) {
+				$form.attr({
+					encoding: 'multipart/form-data',
+					enctype:  'multipart/form-data'
+				});
+			}
+
+			// support timout
+			if (s.timeout) {
+				setTimeout(function() { timedOut = true; cb(); }, s.timeout);
+			}
+
+			// add "extra" data to form if provided in options
+			var extraInputs = [];
+			try {
+				if (s.extraData) {
+					for (var n in s.extraData) {
+						extraInputs.push(
+							$('<input type="hidden" name="'+n+'" value="'+s.extraData[n]+'" />')
+								.appendTo(form)[0]);
+					}
+				}
+
+				// add iframe to doc and submit the form
+				$io.appendTo('body');
+                io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
+				form.submit();
+			}
+			finally {
+				// reset attrs and remove "extra" input elements
+				form.setAttribute('action',a);
+				if(t) {
+					form.setAttribute('target', t);
+				} else {
+					$form.removeAttr('target');
+				}
+				$(extraInputs).remove();
+			}
+		}
+
+		if (s.forceSync) {
+			doSubmit();
+		}
+		else {
+			setTimeout(doSubmit, 10); // this lets dom updates render
+		}
+	
+		var data, doc, domCheckCount = 50;
+
+		function cb() {
+			if (xhr.aborted) {
+				return;
+			}
+			
+			var doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
+			if (!doc || doc.location.href == s.iframeSrc) {
+				// response not received yet
+				if (!timedOut)
+					return;
+			}
+            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
+
+			var ok = true;
+			try {
+				if (timedOut) {
+					throw 'timeout';
+				}
+
+				var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
+				log('isXml='+isXml);
+				if (!isXml && window.opera && (doc.body == null || doc.body.innerHTML == '')) {
+					if (--domCheckCount) {
+						// in some browsers (Opera) the iframe DOM is not always traversable when
+						// the onload callback fires, so we loop a bit to accommodate
+						log('requeing onLoad callback, DOM not available');
+						setTimeout(cb, 250);
+						return;
+					}
+					// let this fall through because server response could be an empty document
+					//log('Could not access iframe DOM after mutiple tries.');
+					//throw 'DOMException: not available';
+				}
+
+				//log('response detected');
+				xhr.responseText = doc.body ? doc.body.innerHTML : doc.documentElement ? doc.documentElement.innerHTML : null; 
+				xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
+				xhr.getResponseHeader = function(header){
+					var headers = {'content-type': s.dataType};
+					return headers[header];
+				};
+
+				var scr = /(json|script)/.test(s.dataType);
+				if (scr || s.textarea) {
+					// see if user embedded response in textarea
+					var ta = doc.getElementsByTagName('textarea')[0];
+					if (ta) {
+						xhr.responseText = ta.value;
+					}
+					else if (scr) {
+						// account for browsers injecting pre around json response
+						var pre = doc.getElementsByTagName('pre')[0];
+						var b = doc.getElementsByTagName('body')[0];
+						if (pre) {
+							xhr.responseText = pre.textContent;
+						}
+						else if (b) {
+							xhr.responseText = b.innerHTML;
+						}
+					}			  
+				}
+				else if (s.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
+					xhr.responseXML = toXml(xhr.responseText);
+				}
+				
+				data = httpData(xhr, s.dataType, s);
+			}
+			catch(e){
+				log('error caught:',e);
+				ok = false;
+				xhr.error = e;
+				s.error && s.error.call(s.context, xhr, 'error', e);
+				g && $.event.trigger("ajaxError", [xhr, s, e]);
+			}
+			
+			if (xhr.aborted) {
+				log('upload aborted');
+				ok = false;
+			}
+
+			// ordering of these callbacks/triggers is odd, but that's how $.ajax does it
+			if (ok) {
+				s.success && s.success.call(s.context, data, 'success', xhr);
+				g && $.event.trigger("ajaxSuccess", [xhr, s]);
+			}
+			
+			g && $.event.trigger("ajaxComplete", [xhr, s]);
+
+			if (g && ! --$.active) {
+				$.event.trigger("ajaxStop");
+			}
+			
+			s.complete && s.complete.call(s.context, xhr, ok ? 'success' : 'error');
+
+			// clean up
+			setTimeout(function() {
+				$io.removeData('form-plugin-onload');
+				$io.remove();
+				xhr.responseXML = null;
+			}, 100);
+		}
+
+		var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
+			if (window.ActiveXObject) {
+				doc = new ActiveXObject('Microsoft.XMLDOM');
+				doc.async = 'false';
+				doc.loadXML(s);
+			}
+			else {
+				doc = (new DOMParser()).parseFromString(s, 'text/xml');
+			}
+			return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
+		};
+		var parseJSON = $.parseJSON || function(s) {
+			return window['eval']('(' + s + ')');
+		};
+		
+		var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
+			var ct = xhr.getResponseHeader('content-type') || '',
+				xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
+				data = xml ? xhr.responseXML : xhr.responseText;
+
+			if (xml && data.documentElement.nodeName === 'parsererror') {
+				$.error && $.error('parsererror');
+			}
+			if (s && s.dataFilter) {
+				data = s.dataFilter(data, type);
+			}
+			if (typeof data === 'string') {
+				if (type === 'json' || !type && ct.indexOf('json') >= 0) {
+					data = parseJSON(data);
+				} else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
+					$.globalEval(data);
+				}
+			}
+			return data;
+		};
+	}
+};
+
+/**
+ * ajaxForm() provides a mechanism for fully automating form submission.
+ *
+ * The advantages of using this method instead of ajaxSubmit() are:
+ *
+ * 1: This method will include coordinates for <input type="image" /> elements (if the element
+ *	is used to submit the form).
+ * 2. This method will include the submit element's name/value data (for the element that was
+ *	used to submit the form).
+ * 3. This method binds the submit() method to the form for you.
+ *
+ * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
+ * passes the options argument along after properly binding events for submit elements and
+ * the form itself.
+ */
+$.fn.ajaxForm = function(options) {
+	// in jQuery 1.3+ we can fix mistakes with the ready state
+	if (this.length === 0) {
+		var o = { s: this.selector, c: this.context };
+		if (!$.isReady && o.s) {
+			log('DOM not ready, queuing ajaxForm');
+			$(function() {
+				$(o.s,o.c).ajaxForm(options);
+			});
+			return this;
+		}
+		// is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
+		log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
+		return this;
+	}
+	
+	return this.ajaxFormUnbind().bind('submit.form-plugin', function(e) {
+		if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
+			e.preventDefault();
+			$(this).ajaxSubmit(options);
+		}
+	}).bind('click.form-plugin', function(e) {
+		var target = e.target;
+		var $el = $(target);
+		if (!($el.is(":submit,input:image"))) {
+			// is this a child element of the submit el?  (ex: a span within a button)
+			var t = $el.closest(':submit');
+			if (t.length == 0) {
+				return;
+			}
+			target = t[0];
+		}
+		var form = this;
+		form.clk = target;
+		if (target.type == 'image') {
+			if (e.offsetX != undefined) {
+				form.clk_x = e.offsetX;
+				form.clk_y = e.offsetY;
+			} else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
+				var offset = $el.offset();
+				form.clk_x = e.pageX - offset.left;
+				form.clk_y = e.pageY - offset.top;
+			} else {
+				form.clk_x = e.pageX - target.offsetLeft;
+				form.clk_y = e.pageY - target.offsetTop;
+			}
+		}
+		// clear form vars
+		setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
+	});
+};
+
+// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
+$.fn.ajaxFormUnbind = function() {
+	return this.unbind('submit.form-plugin click.form-plugin');
+};
+
+/**
+ * formToArray() gathers form element data into an array of objects that can
+ * be passed to any of the following ajax functions: $.get, $.post, or load.
+ * Each object in the array has both a 'name' and 'value' property.  An example of
+ * an array for a simple login form might be:
+ *
+ * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
+ *
+ * It is this array that is passed to pre-submit callback functions provided to the
+ * ajaxSubmit() and ajaxForm() methods.
+ */
+$.fn.formToArray = function(semantic) {
+	var a = [];
+	if (this.length === 0) {
+		return a;
+	}
+
+	var form = this[0];
+	var els = semantic ? form.getElementsByTagName('*') : form.elements;
+	if (!els) {
+		return a;
+	}
+	
+	var i,j,n,v,el,max,jmax;
+	for(i=0, max=els.length; i < max; i++) {
+		el = els[i];
+		n = el.name;
+		if (!n) {
+			continue;
+		}
+
+		if (semantic && form.clk && el.type == "image") {
+			// handle image inputs on the fly when semantic == true
+			if(!el.disabled && form.clk == el) {
+				a.push({name: n, value: $(el).val()});
+				a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+			}
+			continue;
+		}
+
+		v = $.fieldValue(el, true);
+		if (v && v.constructor == Array) {
+			for(j=0, jmax=v.length; j < jmax; j++) {
+				a.push({name: n, value: v[j]});
+			}
+		}
+		else if (v !== null && typeof v != 'undefined') {
+			a.push({name: n, value: v});
+		}
+	}
+
+	if (!semantic && form.clk) {
+		// input type=='image' are not found in elements array! handle it here
+		var $input = $(form.clk), input = $input[0];
+		n = input.name;
+		if (n && !input.disabled && input.type == 'image') {
+			a.push({name: n, value: $input.val()});
+			a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+		}
+	}
+	return a;
+};
+
+/**
+ * Serializes form data into a 'submittable' string. This method will return a string
+ * in the format: name1=value1&name2=value2
+ */
+$.fn.formSerialize = function(semantic) {
+	//hand off to jQuery.param for proper encoding
+	return $.param(this.formToArray(semantic));
+};
+
+/**
+ * Serializes all field elements in the jQuery object into a query string.
+ * This method will return a string in the format: name1=value1&name2=value2
+ */
+$.fn.fieldSerialize = function(successful) {
+	var a = [];
+	this.each(function() {
+		var n = this.name;
+		if (!n) {
+			return;
+		}
+		var v = $.fieldValue(this, successful);
+		if (v && v.constructor == Array) {
+			for (var i=0,max=v.length; i < max; i++) {
+				a.push({name: n, value: v[i]});
+			}
+		}
+		else if (v !== null && typeof v != 'undefined') {
+			a.push({name: this.name, value: v});
+		}
+	});
+	//hand off to jQuery.param for proper encoding
+	return $.param(a);
+};
+
+/**
+ * Returns the value(s) of the element in the matched set.  For example, consider the following form:
+ *
+ *  <form><fieldset>
+ *	  <input name="A" type="text" />
+ *	  <input name="A" type="text" />
+ *	  <input name="B" type="checkbox" value="B1" />
+ *	  <input name="B" type="checkbox" value="B2"/>
+ *	  <input name="C" type="radio" value="C1" />
+ *	  <input name="C" type="radio" value="C2" />
+ *  </fieldset></form>
+ *
+ *  var v = $(':text').fieldValue();
+ *  // if no values are entered into the text inputs
+ *  v == ['','']
+ *  // if values entered into the text inputs are 'foo' and 'bar'
+ *  v == ['foo','bar']
+ *
+ *  var v = $(':checkbox').fieldValue();
+ *  // if neither checkbox is checked
+ *  v === undefined
+ *  // if both checkboxes are checked
+ *  v == ['B1', 'B2']
+ *
+ *  var v = $(':radio').fieldValue();
+ *  // if neither radio is checked
+ *  v === undefined
+ *  // if first radio is checked
+ *  v == ['C1']
+ *
+ * The successful argument controls whether or not the field element must be 'successful'
+ * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
+ * The default value of the successful argument is true.  If this value is false the value(s)
+ * for each element is returned.
+ *
+ * Note: This method *always* returns an array.  If no valid value can be determined the
+ *	   array will be empty, otherwise it will contain one or more values.
+ */
+$.fn.fieldValue = function(successful) {
+	for (var val=[], i=0, max=this.length; i < max; i++) {
+		var el = this[i];
+		var v = $.fieldValue(el, successful);
+		if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
+			continue;
+		}
+		v.constructor == Array ? $.merge(val, v) : val.push(v);
+	}
+	return val;
+};
+
+/**
+ * Returns the value of the field element.
+ */
+$.fieldValue = function(el, successful) {
+	var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
+	if (successful === undefined) {
+		successful = true;
+	}
+
+	if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
+		(t == 'checkbox' || t == 'radio') && !el.checked ||
+		(t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
+		tag == 'select' && el.selectedIndex == -1)) {
+			return null;
+	}
+
+	if (tag == 'select') {
+		var index = el.selectedIndex;
+		if (index < 0) {
+			return null;
+		}
+		var a = [], ops = el.options;
+		var one = (t == 'select-one');
+		var max = (one ? index+1 : ops.length);
+		for(var i=(one ? index : 0); i < max; i++) {
+			var op = ops[i];
+			if (op.selected) {
+				var v = op.value;
+				if (!v) { // extra pain for IE...
+					v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
+				}
+				if (one) {
+					return v;
+				}
+				a.push(v);
+			}
+		}
+		return a;
+	}
+	return $(el).val();
+};
+
+/**
+ * Clears the form data.  Takes the following actions on the form's input fields:
+ *  - input text fields will have their 'value' property set to the empty string
+ *  - select elements will have their 'selectedIndex' property set to -1
+ *  - checkbox and radio inputs will have their 'checked' property set to false
+ *  - inputs of type submit, button, reset, and hidden will *not* be effected
+ *  - button elements will *not* be effected
+ */
+$.fn.clearForm = function() {
+	return this.each(function() {
+		$('input,select,textarea', this).clearFields();
+	});
+};
+
+/**
+ * Clears the selected form elements.
+ */
+$.fn.clearFields = $.fn.clearInputs = function() {
+	return this.each(function() {
+		var t = this.type, tag = this.tagName.toLowerCase();
+		if (t == 'text' || t == 'password' || tag == 'textarea') {
+			this.value = '';
+		}
+		else if (t == 'checkbox' || t == 'radio') {
+			this.checked = false;
+		}
+		else if (tag == 'select') {
+			this.selectedIndex = -1;
+		}
+	});
+};
+
+/**
+ * Resets the form data.  Causes all form elements to be reset to their original value.
+ */
+$.fn.resetForm = function() {
+	return this.each(function() {
+		// guard against an input with the name of 'reset'
+		// note that IE reports the reset function as an 'object'
+		if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
+			this.reset();
+		}
+	});
+};
+
+/**
+ * Enables or disables any matching elements.
+ */
+$.fn.enable = function(b) {
+	if (b === undefined) {
+		b = true;
+	}
+	return this.each(function() {
+		this.disabled = !b;
+	});
+};
+
+/**
+ * Checks/unchecks any matching checkboxes or radio buttons and
+ * selects/deselects and matching option elements.
+ */
+$.fn.selected = function(select) {
+	if (select === undefined) {
+		select = true;
+	}
+	return this.each(function() {
+		var t = this.type;
+		if (t == 'checkbox' || t == 'radio') {
+			this.checked = select;
+		}
+		else if (this.tagName.toLowerCase() == 'option') {
+			var $sel = $(this).parent('select');
+			if (select && $sel[0] && $sel[0].type == 'select-one') {
+				// deselect all other options
+				$sel.find('option').selected(false);
+			}
+			this.selected = select;
+		}
+	});
+};
+
+// helper fn for console logging
+// set $.fn.ajaxSubmit.debug to true to enable debug logging
+function log() {
+	if ($.fn.ajaxSubmit.debug) {
+		var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
+		if (window.console && window.console.log) {
+			window.console.log(msg);
+		}
+		else if (window.opera && window.opera.postError) {
+			window.opera.postError(msg);
+		}
+	}
+};
+
+})(jQuery);
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/misc/jquery.form.min.js b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/misc/jquery.form.min.js
new file mode 100644
index 0000000..27b3e53
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/jquery_update/replace/misc/jquery.form.min.js
@@ -0,0 +1,11 @@
+/*!
+ * jQuery Form Plugin
+ * version: 2.69 (06-APR-2011)
+ * @requires jQuery v1.3.2 or later
+ *
+ * Examples and documentation at: http://malsup.com/jquery/form/
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ */
+(function(a){function b(){if(a.fn.ajaxSubmit.debug){var b="[jquery.form] "+Array.prototype.join.call(arguments,"");window.console&&window.console.log?window.console.log(b):window.opera&&window.opera.postError&&window.opera.postError(b)}}a.fn.ajaxSubmit=function(c){function r(){function t(){if(!j.aborted){var c=i.contentWindow?i.contentWindow.document:i.contentDocument?i.contentDocument:i.document;if(!c||c.location.href==e.iframeSrc)if(!m)return;i.detachEvent?i.detachEvent("onload",t):i.removeEventListener("load",t,!1);var d=!0;try{if(m)throw"timeout";var f=e.dataType=="xml"||c.XMLDocument||a.isXMLDoc(c);b("isXml="+f);if(!f&&window.opera&&(c.body==null||c.body.innerHTML=="")&&--s){b("requeing onLoad callback, DOM not available"),setTimeout(t,250);return}j.responseText=c.body?c.body.innerHTML:c.documentElement?c.documentElement.innerHTML:null,j.responseXML=c.XMLDocument?c.XMLDocument:c,j.getResponseHeader=function(a){var b={"content-type":e.dataType};return b[a]};var g=/(json|
 script)/.test(e.dataType);if(g||e.textarea){var l=c.getElementsByTagName("textarea")[0];if(l)j.responseText=l.value;else if(g){var n=c.getElementsByTagName("pre")[0],o=c.getElementsByTagName("body")[0];n?j.responseText=n.textContent:o&&(j.responseText=o.innerHTML)}}else e.dataType=="xml"&&!j.responseXML&&j.responseText!=null&&(j.responseXML=u(j.responseText));q=w(j,e.dataType,e)}catch(p){b("error caught:",p),d=!1,j.error=p,e.error&&e.error.call(e.context,j,"error",p),k&&a.event.trigger("ajaxError",[j,e,p])}j.aborted&&(b("upload aborted"),d=!1),d&&(e.success&&e.success.call(e.context,q,"success",j),k&&a.event.trigger("ajaxSuccess",[j,e])),k&&a.event.trigger("ajaxComplete",[j,e]),k&&!--a.active&&a.event.trigger("ajaxStop"),e.complete&&e.complete.call(e.context,j,d?"success":"error"),setTimeout(function(){h.removeData("form-plugin-onload"),h.remove(),j.responseXML=null},100)}}function p(){var b=l.attr("target"),c=l.attr("action");d.setAttribute("target",f),d.getAttribute("metho
 d")!="POST"&&d.setAttribute("method","POST"),d.getAttribute("action")!=e.url&&d.setAttribute("action",e.url),e.skipEncodingOverride||l.attr({encoding:"multipart/form-data",enctype:"multipart/form-data"}),e.timeout&&setTimeout(function(){m=!0,t()},e.timeout);var g=[];try{if(e.extraData)for(var j in e.extraData)g.push(a('<input type="hidden" name="'+j+'" value="'+e.extraData[j]+'" />').appendTo(d)[0]);h.appendTo("body"),i.attachEvent?i.attachEvent("onload",t):i.addEventListener("load",t,!1),d.submit()}finally{d.setAttribute("action",c),b?d.setAttribute("target",b):l.removeAttr("target"),a(g).remove()}}var d=l[0];if(a(":input[name=submit],:input[id=submit]",d).length)alert('Error: Form elements must not have name or id of "submit".');else{var e=a.extend(!0,{},a.ajaxSettings,c);e.context=e.context||e;var f="jqFormIO"+(new Date).getTime(),g="_"+f,h=a('<iframe id="'+f+'" name="'+f+'" src="'+e.iframeSrc+'" />'),i=h[0];h.css({position:"absolute",top:"-1000px",left:"-1000px"});var j=
 {aborted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(){b("aborting upload...");var c="aborted";this.aborted=1,h.attr("src",e.iframeSrc),j.error=c,e.error&&e.error.call(e.context,j,"error",c),k&&a.event.trigger("ajaxError",[j,e,c]),e.complete&&e.complete.call(e.context,j,"error")}},k=e.global;k&&!(a.active++)&&a.event.trigger("ajaxStart"),k&&a.event.trigger("ajaxSend",[j,e]);if(e.beforeSend&&e.beforeSend.call(e.context,j,e)===!1){e.global&&a.active--;return}if(j.aborted)return;var m=0,n=d.clk;if(n){var o=n.name;o&&!n.disabled&&(e.extraData=e.extraData||{},e.extraData[o]=n.value,n.type=="image"&&(e.extraData[o+".x"]=d.clk_x,e.extraData[o+".y"]=d.clk_y))}e.forceSync?p():setTimeout(p,10);var q,r,s=50,u=a.parseXML||function(a,b){window.ActiveXObject?(b=new ActiveXObject("Microsoft.XMLDOM"),b.async="false",b.loadXML(a)):b=(new DOMParser).parseFromString
 (a,"text/xml");return b&&b.documentElement&&b.documentElement.nodeName!="parsererror"?b:null},v=a.parseJSON||function(a){return window.eval("("+a+")")},w=function(b,c,d){var e=b.getResponseHeader("content-type")||"",f=c==="xml"||!c&&e.indexOf("xml")>=0,g=f?b.responseXML:b.responseText;f&&g.documentElement.nodeName==="parsererror"&&a.error&&a.error("parsererror"),d&&d.dataFilter&&(g=d.dataFilter(g,c)),typeof g=="string"&&(c==="json"||!c&&e.indexOf("json")>=0?g=v(g):(c==="script"||!c&&e.indexOf("javascript")>=0)&&a.globalEval(g));return g}}}if(!this.length){b("ajaxSubmit: skipping submit process - no element selected");return this}typeof c=="function"&&(c={success:c});var d=this.attr("action"),e=typeof d=="string"?a.trim(d):"";e&&(e=(e.match(/^([^#]+)/)||[])[1]),e=e||window.location.href||"",c=a.extend(!0,{url:e,success:a.ajaxSettings.success,type:this[0].getAttribute("method")||"GET",iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},c);var f
 ={};this.trigger("form-pre-serialize",[this,c,f]);if(f.veto){b("ajaxSubmit: submit vetoed via form-pre-serialize trigger");return this}if(c.beforeSerialize&&c.beforeSerialize(this,c)===!1){b("ajaxSubmit: submit aborted via beforeSerialize callback");return this}var g,h,i=this.formToArray(c.semantic);if(c.data){c.extraData=c.data;for(g in c.data)if(c.data[g]instanceof Array)for(var j in c.data[g])i.push({name:g,value:c.data[g][j]});else h=c.data[g],h=a.isFunction(h)?h():h,i.push({name:g,value:h})}if(c.beforeSubmit&&c.beforeSubmit(i,this,c)===!1){b("ajaxSubmit: submit aborted via beforeSubmit callback");return this}this.trigger("form-submit-validate",[i,this,c,f]);if(f.veto){b("ajaxSubmit: submit vetoed via form-submit-validate trigger");return this}var k=a.param(i);c.type.toUpperCase()=="GET"?(c.url+=(c.url.indexOf("?")>=0?"&":"?")+k,c.data=null):c.data=k;var l=this,m=[];c.resetForm&&m.push(function(){l.resetForm()}),c.clearForm&&m.push(function(){l.clearForm()});if(!c.dataTy
 pe&&c.target){var n=c.success||function(){};m.push(function(b){var d=c.replaceTarget?"replaceWith":"html";a(c.target)[d](b).each(n,arguments)})}else c.success&&m.push(c.success);c.success=function(a,b,d){var e=c.context||c;for(var f=0,g=m.length;f<g;f++)m[f].apply(e,[a,b,d||l,l])};var o=a("input:file",this).length>0,p="multipart/form-data",q=l.attr("enctype")==p||l.attr("encoding")==p;c.iframe!==!1&&(o||c.iframe||q)?c.closeKeepAlive?a.get(c.closeKeepAlive,r):r():a.ajax(c),this.trigger("form-submit-notify",[this,c]);return this},a.fn.ajaxForm=function(c){if(this.length===0){var d={s:this.selector,c:this.context};if(!a.isReady&&d.s){b("DOM not ready, queuing ajaxForm"),a(function(){a(d.s,d.c).ajaxForm(c)});return this}b("terminating; zero elements found by selector"+(a.isReady?"":" (DOM not ready)"));return this}return this.ajaxFormUnbind().bind("submit.form-plugin",function(b){b.isDefaultPrevented()||(b.preventDefault(),a(this).ajaxSubmit(c))}).bind("click.form-plugin",functi
 on(b){var c=b.target,d=a(c);if(!d.is(":submit,input:image")){var e=d.closest(":submit");if(e.length==0)return;c=e[0]}var f=this;f.clk=c;if(c.type=="image")if(b.offsetX!=undefined)f.clk_x=b.offsetX,f.clk_y=b.offsetY;else if(typeof a.fn.offset=="function"){var g=d.offset();f.clk_x=b.pageX-g.left,f.clk_y=b.pageY-g.top}else f.clk_x=b.pageX-c.offsetLeft,f.clk_y=b.pageY-c.offsetTop;setTimeout(function(){f.clk=f.clk_x=f.clk_y=null},100)})},a.fn.ajaxFormUnbind=function(){return this.unbind("submit.form-plugin click.form-plugin")},a.fn.formToArray=function(b){var c=[];if(this.length===0)return c;var d=this[0],e=b?d.getElementsByTagName("*"):d.elements;if(!e)return c;var f,g,h,i,j,k,l;for(f=0,k=e.length;f<k;f++){j=e[f],h=j.name;if(!h)continue;if(b&&d.clk&&j.type=="image"){!j.disabled&&d.clk==j&&(c.push({name:h,value:a(j).val()}),c.push({name:h+".x",value:d.clk_x},{name:h+".y",value:d.clk_y}));continue}i=a.fieldValue(j,!0);if(i&&i.constructor==Array)for(g=0,l=i.length;g<l;g++)c.push({n
 ame:h,value:i[g]});else i!==null&&typeof i!="undefined"&&c.push({name:h,value:i})}if(!b&&d.clk){var m=a(d.clk),n=m[0];h=n.name,h&&!n.disabled&&n.type=="image"&&(c.push({name:h,value:m.val()}),c.push({name:h+".x",value:d.clk_x},{name:h+".y",value:d.clk_y}))}return c},a.fn.formSerialize=function(b){return a.param(this.formToArray(b))},a.fn.fieldSerialize=function(b){var c=[];this.each(function(){var d=this.name;if(!!d){var e=a.fieldValue(this,b);if(e&&e.constructor==Array)for(var f=0,g=e.length;f<g;f++)c.push({name:d,value:e[f]});else e!==null&&typeof e!="undefined"&&c.push({name:this.name,value:e})}});return a.param(c)},a.fn.fieldValue=function(b){for(var c=[],d=0,e=this.length;d<e;d++){var f=this[d],g=a.fieldValue(f,b);if(g===null||typeof g=="undefined"||g.constructor==Array&&!g.length)continue;g.constructor==Array?a.merge(c,g):c.push(g)}return c},a.fieldValue=function(b,c){var d=b.name,e=b.type,f=b.tagName.toLowerCase();c===undefined&&(c=!0);if(c&&(!d||b.disabled||e=="reset
 "||e=="button"||(e=="checkbox"||e=="radio")&&!b.checked||(e=="submit"||e=="image")&&b.form&&b.form.clk!=b||f=="select"&&b.selectedIndex==-1))return null;if(f=="select"){var g=b.selectedIndex;if(g<0)return null;var h=[],i=b.options,j=e=="select-one",k=j?g+1:i.length;for(var l=j?g:0;l<k;l++){var m=i[l];if(m.selected){var n=m.value;n||(n=m.attributes&&m.attributes.value&&!m.attributes.value.specified?m.text:m.value);if(j)return n;h.push(n)}}return h}return a(b).val()},a.fn.clearForm=function(){return this.each(function(){a("input,select,textarea",this).clearFields()})},a.fn.clearFields=a.fn.clearInputs=function(){return this.each(function(){var a=this.type,b=this.tagName.toLowerCase();a=="text"||a=="password"||b=="textarea"?this.value="":a=="checkbox"||a=="radio"?this.checked=!1:b=="select"&&(this.selectedIndex=-1)})},a.fn.resetForm=function(){return this.each(function(){(typeof this.reset=="function"||typeof this.reset=="object"&&!this.reset.nodeType)&&this.reset()})},a.fn.ena
 ble=function(a){a===undefined&&(a=!0);return this.each(function(){this.disabled=!a})},a.fn.selected=function(b){b===undefined&&(b=!0);return this.each(function(){var c=this.type;if(c=="checkbox"||c=="radio")this.checked=b;else if(this.tagName.toLowerCase()=="option"){var d=a(this).parent("select");b&&d[0]&&d[0].type=="select-one"&&d.find("option").selected(!1),this.selected=b}})}})(jQuery)
\ No newline at end of file
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/CHANGELOG.txt b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/CHANGELOG.txt
index 875e188..4fc26bb 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/CHANGELOG.txt
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/CHANGELOG.txt
@@ -1,3 +1,50 @@
+linkchecker 7.x-dev, nightly
+----------------------------
+
+* Code style review and fixes (minor level)
+* No need to check comment/block enable variables in auto update.
+* Issue #1901018 by hass: ERROR - __clone method called on non-object.
+* Issue #1901014 by hass: ERROR - Cannot use object of type stdClass as array.
+* Code style: indent secondary line of comment one space
+* #1891900: Uninstall of variable 'linkchecker_check_connections_max' failed.
+* Use #empty in empty table.
+* #1882602: Compatible with Drupal <7.15
+* #1850210 followup: _linkchecker_unpublish_nodes() may run out of memory by loading all nodes at once.
+* #1719174: Editing node throws "Undefined property" stdClass::$nid in hook_node_prepare().
+* #1879316: Support Workbench Moderation workflow (forward revisons handling)
+* Fixed a test to use LANGUAGE_NONE constant.
+* #1880652: Refactor _linkchecker_parse_fields() and _linkchecker_replace_fields() to be less expensive, see #1040790 for more details.
+* #1875602: Check URL fragment identifiers in content
+* Minor code style fixes
+
+linkchecker 7.x-1.0, December 24, 2012
+--------------------------------------
+
+* Fixed some typos.
+* #1850210: Autorepair may run out of memory by loading all nodes/comments at once.
+* #1210606: Limited argument length in entity_load() and other functions.
+* Upgraded outdated HTTP user agents.
+* #380052: Add support with non-blocking parallel link checking.
+* #1867460: Prevent save on automatic updates, if content has not changed.
+* #1804842 follow up: Exit if all node types are disabled
+* #1450672: Cron task does not impersonate to admin user on automatic content updates.
+* Remove documentation leftover from readme about a setting not available.
+* #1727552: Notice: Undefined property: stdClass::$language in linkchecker_parse_fields(). Core follow up of #1495648: Introduce entity language support
+* Notice: Undefined variable: is_https in _linkchecker_extract_links()
+* #1804842: Lots of warnings when comment/block modules are not installed
+* Set full HTML format in block test
+* Added interface tests to verify drupal_set_message()
+* #1857620: hook_form_alter() fails on BASE_FORM_ID 'comment_form'
+* #1811908: Allow extracting protocol relative url's
+* #1831630: Array being presented to Status report page
+* #1441574: Port D6 access bypass bugfixes to D7.
+* #1678812: Notice: Undefined property: stdClass::$module in _linkchecker_add_block_custom_links()
+* #1678812: Refactored blocks extraction/replacement
+* #1678812: Added linkchecker_block_custom_block_get() for a more consistent block_custom object.
+* #1586022: linkchecker generating bad User-Agent string
+* Status code 500 on HEAD/GET does not increase fail_count
+* #1524732: Notice on blocks save / Blocks body cannot exists
+
 linkchecker 7.x-1.0-beta1, February 15, 2012
 --------------------------------------------
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/README.txt b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/README.txt
index 8bd0cd9..ecfdc66 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/README.txt
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/README.txt
@@ -28,17 +28,7 @@ Required:
    reported as broken and cannot verified as they should be.
 
    To make sure it always works - it's required to configure the $base_url in
-   the sites settings.php with your public sites URL. Better save than sorry!
-
-
-Advanced configuration
-
-1. Link checker by default checks 100 links per cron run. This setting can be
-   overriden via settings.php. Add the below line to check 200 links per cron
-   run. You can lower or higher the limit for your needs if the machine can or
-   cannot handle the default number of link checks.
-
-   $conf['linkchecker_check_links_max'] = 200;
+   the sites settings.php with your public sites URL. Better safe than sorry!
 
 
 Known issues:
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.admin.inc b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.admin.inc
index e6f07e5..14b82cd 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.admin.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.admin.inc
@@ -5,6 +5,9 @@
  * Administrative page callbacks for the linkchecker module.
  */
 
+/**
+ * Implements hook_admin_settings_form().
+ */
 function linkchecker_admin_settings_form($form_state) {
 
   $form['settings'] = array(
@@ -22,8 +25,8 @@ function linkchecker_admin_settings_form($form_state) {
     '#description' => t('Enable link checking for the selected content type(s).'),
   );
 
-  $comment_dependencies = '<div class="admin-dependencies">';
-  $comment_dependencies .= t('Depends on: !dependencies', array('!dependencies' => (module_exists('comment') ? t('@module (<span class="admin-enabled">enabled</span>)', array('@module' => 'Comment')) : t('@module (<span class="admin-disabled">disabled</span>)', array('@module' => 'Comment')))));
+  $comment_dependencies = '<div class="admin-requirements">';
+  $comment_dependencies .= t('Requires: !module-list', array('!module-list' => (module_exists('comment') ? t('@module (<span class="admin-enabled">enabled</span>)', array('@module' => 'Comment')) : t('@module (<span class="admin-disabled">disabled</span>)', array('@module' => 'Comment')))));
   $comment_dependencies .= '</div>';
 
   $form['settings']['linkchecker_scan_comments'] = array(
@@ -34,8 +37,8 @@ function linkchecker_admin_settings_form($form_state) {
     '#disabled' => module_exists('comment') ? FALSE : TRUE,
   );
 
-  $block_custom_dependencies = '<div class="admin-dependencies">';
-  $block_custom_dependencies .= t('Depends on: !dependencies', array('!dependencies' => (module_exists('block') ? t('@module (<span class="admin-enabled">enabled</span>)', array('@module' => 'Block')) : t('@module (<span class="admin-disabled">disabled</span>)', array('@module' => 'Block')))));
+  $block_custom_dependencies = '<div class="admin-requirements">';
+  $block_custom_dependencies .= t('Requires: !module-list', array('!module-list' => (module_exists('block') ? t('@module (<span class="admin-enabled">enabled</span>)', array('@module' => 'Block')) : t('@module (<span class="admin-disabled">disabled</span>)', array('@module' => 'Block')))));
   $block_custom_dependencies .= '</div>';
 
   $form['settings']['linkchecker_scan_blocks'] = array(
@@ -121,15 +124,40 @@ function linkchecker_admin_settings_form($form_state) {
     '#title' => t('Filters disabled for link extraction'),
     '#default_value' => variable_get('linkchecker_filter_blacklist', explode('|', LINKCHECKER_DEFAULT_FILTER_BLACKLIST)),
     '#options' => $filter_options,
-    '#description' => t('If a filter has been enabled for an input format it runs first and afterwards the link extraction. This helps the link checker module to find all links normally created by custom filters (e.g. Markdown filter, Bbcode). All filters used as an inline references (e.g. Weblink filter <code>[link: id]</code>) to other content and filters only wasting processing time (e.g. Line break converter) should be disabled. This setting does not have any effect on how content is shown on a page. This feature optimizes the internal link extraction process for link checker and prevents false alarms about broken links in content not having the real data of a link.'),
+    '#description' => t('If a filter has been enabled for an input format it runs first and afterwards the link extraction. This helps the link checker module to find all links normally created by custom filters (e.g. Markdown filter, Bbcode). All filters used as inline references (e.g. Weblink filter <code>[link: id]</code>) to other content and filters only wasting processing time (e.g. Line break converter) should be disabled. This setting does not have any effect on how content is shown on a page. This feature optimizes the internal link extraction process for link checker and prevents false alarms about broken links in content not having the real data of a link.'),
   );
 
+  $count_lids_enabled = db_query("SELECT count(lid) FROM {linkchecker_link} WHERE status = :status", array(':status' => 1))->fetchField();
+  $count_lids_disabled = db_query("SELECT count(lid) FROM {linkchecker_link} WHERE status = :status", array(':status' => 0))->fetchField();
   $form['check'] = array(
     '#type' => 'fieldset',
     '#title' => t('Check settings'),
-    // '#description' => t('For simultaneous link checks it is highly recommended to install the <a href="@curl">cURL</a> library. This may be <strong>necessary</strong> on larger sites with very many links, but may still improve (speed up), link checking performance on smaller sites.', array('@curl' => 'http://www.php.net/manual/en/book.curl.php')),
+    '#description' => t('For simultaneous link checks it is recommended to install the <a href="@httprl">HTTP Parallel Request & Threading Library</a>. This may be <strong>necessary</strong> on larger sites with very many links (30.000+), but will also improve overall link check duration on smaller sites. Currently the site has @count links (@count_enabled enabled / @count_disabled disabled).', array('@httprl' => 'http://drupal.org/project/httprl', '@count' => $count_lids_enabled+$count_lids_disabled, '@count_enabled' => $count_lids_enabled, '@count_disabled' => $count_lids_disabled)),
     '#collapsible' => FALSE,
   );
+  $form['check']['linkchecker_check_library'] = array(
+    '#type' => 'select',
+    '#title' => t('Check library'),
+    '#description' => t('Defines the library that is used for checking links.'),
+    '#default_value' => variable_get('linkchecker_check_library', 'core'),
+    '#options' => array(
+      'core' => t('Drupal core'),
+      'httprl' => t('HTTP Parallel Request & Threading Library'),
+    ),
+  );
+  $form['check']['linkchecker_check_connections_max'] = array(
+    '#type' => 'select',
+    '#title' => t('Number of simultaneous connections'),
+    '#description' => t('Defines the maximum number of simultaneous connections that can be opened by the server. <em>HTTP Parallel Request & Threading Library</em> make sure that a single domain is not overloaded beyond RFC limits. For small hosting plans with very limited CPU and RAM it may be required to reduce the default limit.'),
+    '#default_value' => variable_get('linkchecker_check_connections_max', 8),
+    '#options' => drupal_map_assoc(array(2, 4, 8, 16, 24, 32, 48, 64, 96, 128)),
+    '#states' => array(
+      // Hide the setting when Drupal core check library is selected.
+      'invisible' => array(
+        ':input[name="linkchecker_check_library"]' => array('value' => 'core'),
+      ),
+    ),
+  );
   $form['check']['linkchecker_check_useragent'] = array(
     '#type' => 'select',
     '#title' => t('User-Agent'),
@@ -137,20 +165,12 @@ function linkchecker_admin_settings_form($form_state) {
     '#default_value' => variable_get('linkchecker_check_useragent', 'Drupal (+http://drupal.org/)'),
     '#options' => array(
       'Drupal (+http://drupal.org/)' => 'Drupal (+http://drupal.org/)',
-      'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1;)' => 'Windows XP / Internet Explorer 7.0',
-      'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5' => 'Windows XP / Mozilla Firefox 3.0.5',
-      'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0;)' => 'Windows Vista / Internet Explorer 7.0',
-      'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5' => 'Windows Vista / Mozilla Firefox 3.0.5',
+      'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)' => 'Windows 7 (x64), Internet Explorer 9.0',
+      'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0' => 'Windows 7 (x64), Mozilla Firefox 17.0',
+      'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)' => 'Windows 8 (x64), Internet Explorer 10.0',
+      'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0' => 'Windows 8 (x64), Mozilla Firefox 17.0',
     ),
   );
-/* For now it's better to guess this value from max_execution_time.
-   $form['check']['linkchecker_check_links_max'] = array(
-    '#type' => 'select',
-    '#title' => t('Check number of links per cron run'),
-    '#description' => t('Defines the number of links that will be checked per cron run. The possible setting hardly depends on your PHP timeout value and remote servers speed and may increased if <a href="@curl">cURL</a> is installed and use simultaneous request checking. All cron jobs may fail, if this setting is too high!', array('@curl' => 'http://www.php.net/manual/en/book.curl.php')),
-    '#default_value' => variable_get('linkchecker_check_links_max', 10),
-    '#options' => drupal_map_assoc(array(5, 10, 25, 50, 100, 200, 250, 300, 350, 400, 450, 500, 750, 1000)),
-  ); */
   $form['check']['linkchecker_check_links_interval'] = array(
     '#type' => 'select',
     '#title' => t('Check interval for links'),
@@ -171,6 +191,16 @@ function linkchecker_admin_settings_form($form_state) {
     '#description' => t('Defines error handling and custom actions to be executed if specific HTTP requests are failing.'),
     '#collapsible' => FALSE,
   );
+  $linkchecker_default_impersonate_user = user_load(1);
+  $form['error']['linkchecker_impersonate_user'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Impersonate user account'),
+    '#description' => t('If below error handling actions are executed they can be impersonated with a custom user account. By default this is user %name, but you are able to assign a custom user to allow easier identification of these automatic revision updates. Make sure you select a user with <em>full</em> permissions on your site or the user may not able to access and save all content.', array('%name' => $linkchecker_default_impersonate_user->name)),
+    '#size' => 30,
+    '#maxlength' => 60,
+    '#autocomplete_path' => 'user/autocomplete',
+    '#default_value' => variable_get('linkchecker_impersonate_user', ''),
+  );
   $form['error']['linkchecker_action_status_code_301'] = array(
     '#title' => t('Update permanently moved links'),
     '#description' => t('If enabled, outdated links in content providing a status <em>Moved Permanently</em> (status code 301) are automatically updated to the most recent URL. If used, it is recommended to use a value of <em>three</em> to make sure this is not only a temporarily change. This feature trust sites to provide a valid permanent redirect. A new content revision is automatically created on link updates if <em>create new revision</em> is enabled in the <a href="@content_types">content types</a> publishing options. It is recommended to create new revisions for all link checker enabled content types. Link updates are nevertheless always logged in <a href="@dblog">recent log entries</a>.', array('@dblog' => url('admin/reports/dblog'), '@content_types' => url('admin/structure/types'))),
@@ -228,12 +258,15 @@ function linkchecker_admin_settings_form($form_state) {
     '#submit' => array('linkchecker_clear_analyze_links_submit'),
   );
 
-  $form['buttons']['submit'] = array('#type' => 'submit', '#value' => t('Save configuration') );
-  $form['buttons']['reset'] = array('#type' => 'submit', '#value' => t('Reset to defaults') );
+  $form['buttons']['submit'] = array('#type' => 'submit', '#value' => t('Save configuration'));
+  $form['buttons']['reset'] = array('#type' => 'submit', '#value' => t('Reset to defaults'));
 
   return $form;
 }
 
+/**
+ * Implements hook_admin_settings_form_validate().
+ */
 function linkchecker_admin_settings_form_validate($form, &$form_state) {
   $form_state['values']['linkchecker_disable_link_check_for_urls'] = trim($form_state['values']['linkchecker_disable_link_check_for_urls']);
   $form_state['values']['linkchecker_ignore_response_codes'] = trim($form_state['values']['linkchecker_ignore_response_codes']);
@@ -248,8 +281,17 @@ function linkchecker_admin_settings_form_validate($form, &$form_state) {
   // reserved documentation domains and not "example" hostnames!
   $linkchecker_disable_link_check_for_urls = array_filter(preg_split('/(\r\n?|\n)/', $form_state['values']['linkchecker_disable_link_check_for_urls']));
   $form_state['values']['linkchecker_disable_link_check_for_urls'] = implode("\n", array_unique(array_merge(explode("\n", LINKCHECKER_RESERVED_DOCUMENTATION_DOMAINS), $linkchecker_disable_link_check_for_urls)));
+
+  // Validate impersonation user name.
+  $linkchecker_impersonate_user = user_load_by_name($form_state['values']['linkchecker_impersonate_user']);
+  if (empty($linkchecker_impersonate_user->uid)) {
+    form_set_error('linkchecker_impersonate_user', t('User account %name cannot found.', array('%name' => $form_state['values']['linkchecker_impersonate_user'])));
+  }
 }
 
+/**
+ * Implements hook_admin_settings_form_submit().
+ */
 function linkchecker_admin_settings_form_submit($form, &$form_state) {
   // Exclude unnecessary elements.
   unset($form_state['values']['linkchecker_analyze'], $form_state['values']['linkchecker_clear_analyze']);
@@ -283,7 +325,9 @@ function linkchecker_admin_settings_form_submit($form, &$form_state) {
 }
 
 /**
- * Submit callback; Analyze fields in all node types, comments, custom blocks.
+ * Submit callback.
+ *
+ * Analyze fields in all node types, comments, custom blocks.
  */
 function linkchecker_analyze_links_submit($form, &$form_state) {
   // Exclude unnecessary elements.
@@ -309,7 +353,10 @@ function linkchecker_analyze_links_submit($form, &$form_state) {
 }
 
 /**
- * Submit callback; Clear link data and analyze fields in all content types, comments, custom blocks.
+ * Submit callback.
+ *
+ * Clear link data and analyze fields in all content types, comments, custom
+ * blocks.
  */
 function linkchecker_clear_analyze_links_submit($form, &$form_state) {
   // Exclude unnecessary elements.
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.batch.inc b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.batch.inc
index 80d1fff..8c0ee21 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.batch.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.batch.inc
@@ -39,6 +39,16 @@ function _linkchecker_batch_node_import_op($nid, &$context) {
   $context['message'] = t('Content: @title', array('@title' => $node->title));
 }
 
+/**
+ * Output node batch result messages.
+ *
+ * @param bool $success
+ *   If scan completed successfully or not.
+ * @param int $results
+ *   Number of nodes scanned.
+ * @param array $operations
+ *   Array of functions called.
+ */
 function _linkchecker_batch_node_import_finished($success, $results, $operations) {
   if ($success) {
     $message = format_plural(count($results), 'One node has been scanned.', '@count nodes have been scanned.');
@@ -83,6 +93,16 @@ function _linkchecker_batch_comments_import_op($cid, &$context) {
   $context['message'] = t('Comment: @title', array('@title' => $comment->subject));
 }
 
+/**
+ * Output comment batch result messages.
+ *
+ * @param bool $success
+ *   If scan completed successfully or not.
+ * @param int $results
+ *   Number of comments scanned.
+ * @param array $operations
+ *   Array of functions called.
+ */
 function _linkchecker_batch_comments_import_finished($success, $results, $operations) {
   if ($success) {
     $message = format_plural(count($results), 'One comment has been scanned.', '@count comments have been scanned.');
@@ -97,14 +117,6 @@ function _linkchecker_batch_comments_import_finished($success, $results, $operat
  * Batch: Scan blocks for links.
  */
 function _linkchecker_batch_import_block_custom() {
-  // Get all active {block_custom}.bid's. Does not work as module is not
-  // notified if a block get assigned/unassigned to a region.
-  // $query = db_select('block_custom', 'bc');
-  // $query->leftJoin('block', 'b', 'b.delta = bc.bid AND module = :module ', array(':module' => 'block'));
-  // $query->fields('bc', array('bid'));
-  // $query->condition('b.status', 1);
-  // $result = $query->distinct()->execute();
-
   // Get all {block_custom}.bid's as block module suxxx and has no usable hooks.
   $result = db_query('SELECT bid FROM {block_custom} ORDER BY bid');
 
@@ -127,14 +139,24 @@ function _linkchecker_batch_import_block_custom() {
  */
 function _linkchecker_batch_import_block_custom_op($bid, &$context) {
   // Load the custom block and scan for links.
-  $block_custom = block_custom_block_get($bid);
-  _linkchecker_add_block_custom_links($block_custom, $block_custom['bid']);
+  $block_custom = linkchecker_block_custom_block_get($bid);
+  _linkchecker_add_block_custom_links($block_custom, $block_custom->delta);
 
   // Store some result for post-processing in the finished callback.
-  $context['results'][] = $block_custom['bid'];
-  $context['message'] = t('Block: @title', array('@title' => $block_custom['info']));
+  $context['results'][] = $block_custom->delta;
+  $context['message'] = t('Block: @title', array('@title' => $block_custom->info));
 }
 
+/**
+ * Output block batch result messages.
+ *
+ * @param bool $success
+ *   If scan completed successfully or not.
+ * @param int $results
+ *   Number of blocks scanned.
+ * @param array $operations
+ *   Array of functions called.
+ */
 function _linkchecker_batch_block_custom_import_finished($success, $results, $operations) {
   if ($success) {
     $message = format_plural(count($results), 'One block has been scanned.', '@count blocks have been scanned.');
@@ -159,7 +181,7 @@ function _linkchecker_batch_block_custom_import_finished($success, $results, $op
  */
 function _linkchecker_batch_import_single_node($nid, $missing_links_count) {
   $operations = array();
-  for ($i = 0; $i <= $missing_links_count; $i = $i+LINKCHECKER_SCAN_MAX_LINKS_PER_RUN) {
+  for ($i = 0; $i <= $missing_links_count; $i = $i + LINKCHECKER_SCAN_MAX_LINKS_PER_RUN) {
     $operations[] = array('_linkchecker_batch_single_node_import_op', array($nid));
   }
   $batch = array(
@@ -173,6 +195,14 @@ function _linkchecker_batch_import_single_node($nid, $missing_links_count) {
   return $batch;
 }
 
+/**
+ * Run single node link extraction.
+ *
+ * @param int $nid
+ *   Node ID.
+ * @param array $context
+ *   Batch context array.
+ */
 function _linkchecker_batch_single_node_import_op($nid, &$context) {
   // Load the node and scan for links.
   $node = node_load($nid, NULL, TRUE);
@@ -183,6 +213,16 @@ function _linkchecker_batch_single_node_import_op($nid, &$context) {
   $context['message'] = t('Content: @title', array('@title' => $node->title));
 }
 
+/**
+ * Output single node batch result messages.
+ *
+ * @param bool $success
+ *   If scan completed successfully or not.
+ * @param int $results
+ *   How often the node has been scanned.
+ * @param array $operations
+ *   Array of functions called.
+ */
 function _linkchecker_batch_single_node_import_finished($success, $results, $operations) {
   if ($success) {
     $message = format_plural(count($results), 'Node @nid has been re-scanned once to collect all links.', 'Node @nid has been re-scanned @count times to collect all links.', array('@nid' => $results[0]));
@@ -207,7 +247,7 @@ function _linkchecker_batch_single_node_import_finished($success, $results, $ope
  */
 function _linkchecker_batch_import_single_comment($cid, $missing_links_count) {
   $operations = array();
-  for ($i = 0; $i <= $missing_links_count; $i = $i+LINKCHECKER_SCAN_MAX_LINKS_PER_RUN) {
+  for ($i = 0; $i <= $missing_links_count; $i = $i + LINKCHECKER_SCAN_MAX_LINKS_PER_RUN) {
     $operations[] = array('_linkchecker_batch_single_comment_import_op', array($cid));
   }
   $batch = array(
@@ -221,6 +261,14 @@ function _linkchecker_batch_import_single_comment($cid, $missing_links_count) {
   return $batch;
 }
 
+/**
+ * Run single comment link extraction.
+ *
+ * @param int $cid
+ *   Comment ID.
+ * @param array $context
+ *   Batch context array.
+ */
 function _linkchecker_batch_single_comment_import_op($cid, &$context) {
   $comment = comment_load($cid);
   _linkchecker_add_comment_links($comment, TRUE);
@@ -230,6 +278,16 @@ function _linkchecker_batch_single_comment_import_op($cid, &$context) {
   $context['message'] = t('Comment: @title', array('@title' => $comment->subject));
 }
 
+/**
+ * Output single comment batch result messages.
+ *
+ * @param bool $success
+ *   If scan completed successfully or not.
+ * @param int $results
+ *   How often the comment has been scanned.
+ * @param array $operations
+ *   Array of functions called.
+ */
 function _linkchecker_batch_single_comment_import_finished($success, $results, $operations) {
   if ($success) {
     $message = format_plural(count($results), 'Comment @cid has been re-scanned once to collect all links.', 'Comment @cid has been re-scanned @count times to collect all links.', array('@cid' => $results[0]));
@@ -254,7 +312,7 @@ function _linkchecker_batch_single_comment_import_finished($success, $results, $
  */
 function _linkchecker_batch_import_single_block_custom($bid, $missing_links_count) {
   $operations = array();
-  for ($i = 0; $i <= $missing_links_count; $i = $i+LINKCHECKER_SCAN_MAX_LINKS_PER_RUN) {
+  for ($i = 0; $i <= $missing_links_count; $i = $i + LINKCHECKER_SCAN_MAX_LINKS_PER_RUN) {
     $operations[] = array('_linkchecker_batch_single_block_custom_import_op', array($nid));
   }
   $batch = array(
@@ -268,16 +326,34 @@ function _linkchecker_batch_import_single_block_custom($bid, $missing_links_coun
   return $batch;
 }
 
+/**
+ * Run single block link extraction.
+ *
+ * @param int $bid
+ *   Node ID.
+ * @param array $context
+ *   Batch context array.
+ */
 function _linkchecker_batch_single_block_custom_import_op($bid, &$context) {
   // Load the custom block and scan for links.
-  $block_custom = block_custom_block_get($bid);
-  _linkchecker_add_block_custom_links($block_custom, $block_custom['bid'], TRUE);
+  $block_custom = linkchecker_block_custom_block_get($bid);
+  _linkchecker_add_block_custom_links($block_custom, $block_custom->delta, TRUE);
 
   // Store some result for post-processing in the finished callback.
-  $context['results'][] = $block_custom['bid'];
-  $context['message'] = t('Block: @title', array('@title' => $block_custom['info']));
+  $context['results'][] = $block_custom->delta;
+  $context['message'] = t('Block: @title', array('@title' => $block_custom->info));
 }
 
+/**
+ * Output single block batch result messages.
+ *
+ * @param bool $success
+ *   If scan completed successfully or not.
+ * @param int $results
+ *   How often the block has been scanned.
+ * @param array $operations
+ *   Array of functions called.
+ */
 function _linkchecker_batch_single_block_custom_import_finished($success, $results, $operations) {
   if ($success) {
     $message = format_plural(count($results), 'Block @bid has been re-scanned once to collect all links.', 'Block @bid has been re-scanned @count times to collect all links.', array('@bid' => $results[0]));
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.drush.inc b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.drush.inc
index 4008369..2a969d5 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.drush.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.drush.inc
@@ -55,8 +55,8 @@ function drush_linkchecker_analyze() {
 }
 
 /**
-* Callback for command linkchecker-analyze.
-*/
+ * Callback for command linkchecker-analyze.
+ */
 function drush_linkchecker_clear() {
   global $base_url;
   if ($base_url == 'http://default') {
@@ -82,17 +82,15 @@ function drush_linkchecker_clear() {
 }
 
 /**
-* Callback for command linkchecker-check.
-*/
+ * Callback for command linkchecker-check.
+ */
 function drush_linkchecker_check() {
-  //global $conf;
-
-  //$linkchecker_check_links_max = (int) drush_get_option('links', 1000);
-  drush_log('Starting link checking...', 'status');
-
-  // Conditional override the default module setting.
-  //$conf['linkchecker_check_links_max'] = $linkchecker_check_links_max;
-
-  linkchecker_cron();
-  drush_log('Finished checking links.', 'status');
+  drush_log('Starting link checking...', 'info');
+  $run = _linkchecker_check_links();
+  if (!$run) {
+    drush_log('Attempted to re-run link checks while they are already running.', 'warning');
+  }
+  else {
+    drush_log('Finished checking links.', 'completed');
+  }
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.info b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.info
index 5edb338..6c13f53 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.info
@@ -2,12 +2,12 @@ name = Link checker
 description = "Periodically checks for broken links in node types, blocks and fields and reports the results."
 configure = admin/config/content/linkchecker
 core = 7.x
-
 files[] = linkchecker.drush.inc
 files[] = linkchecker.test
-; Information added by drupal.org packaging script on 2012-02-15
-version = "7.x-1.0-beta1"
+
+; Information added by drupal.org packaging script on 2013-02-14
+version = "7.x-1.1"
 core = "7.x"
 project = "linkchecker"
-datestamp = "1329342041"
+datestamp = "1360849273"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.install b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.install
index a297505..7cb7249 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.install
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.install
@@ -6,14 +6,23 @@
  */
 
 /**
+ * Implements hook_install().
+ */
+function linkchecker_install() {
+  $linkchecker_default_impersonate_user = user_load(1);
+  variable_set('linkchecker_impersonate_user', $linkchecker_default_impersonate_user->name);
+}
+
+/**
  * Implements hook_uninstall().
  */
 function linkchecker_uninstall() {
   variable_del('linkchecker_action_status_code_301');
   variable_del('linkchecker_action_status_code_404');
+  variable_del('linkchecker_check_connections_max');
+  variable_del('linkchecker_check_library');
   variable_del('linkchecker_check_links_interval');
   variable_del('linkchecker_check_links_types');
-  variable_del('linkchecker_check_links_max');
   variable_del('linkchecker_check_useragent');
   variable_del('linkchecker_cleanup_links_last');
   variable_del('linkchecker_disable_link_check_for_urls');
@@ -26,6 +35,7 @@ function linkchecker_uninstall() {
   variable_del('linkchecker_extract_from_video');
   variable_del('linkchecker_filter_blacklist');
   variable_del('linkchecker_ignore_response_codes');
+  variable_del('linkchecker_impersonate_user');
   variable_del('linkchecker_scan_blocks');
   variable_del('linkchecker_scan_comments');
   variable_del('linkchecker_scan_nodetypes');
@@ -173,36 +183,6 @@ function linkchecker_schema() {
 }
 
 /**
- * Implements hook_requirements().
- */
-function linkchecker_requirements($phase) {
-  $requirements = array();
-  $t = get_t();
-
-  switch ($phase) {
-    case 'runtime':
-      // Module cannot work without external HTTP requests.
-      if (variable_get('drupal_http_request_fails', TRUE) && !system_check_http_request()) {
-        $requirements['http requests'] = array(
-          'title' => $t('HTTP request status'),
-          'value' => $t('Fails'),
-          'severity' => REQUIREMENT_ERROR,
-          'description' => $t('Your system or network configuration does not allow Drupal to access web pages, resulting in reduced functionality. This could be due to your webserver configuration or PHP settings, and should be resolved in order to download information about available updates, fetch aggregator feeds, sign in via OpenID, or use other network-dependent services.'),
-        );
-      }
-
-/*      $requirements['linkchecker_curl'] = array(
-        'title' => $t('cURL'),
-        'value' => $has_curl ? $t('Enabled') : $t('Not found'),
-        'severity' => $has_curl ? REQUIREMENT_OK : REQUIREMENT_WARNING,
-        'description' => $t('You should install cURL for checking links with link checker module. If cURL is installed, simultaneuos link checks are used to speeds up the link checking process dramatically.'),
-      ); */
-      break;
-  }
-  return $requirements;
-}
-
-/**
  * If the core modules are disabled the integration need to be disabled.
  */
 function linkchecker_modules_disabled($modules) {
@@ -292,8 +272,8 @@ function linkchecker_update_7002(&$sandbox) {
 }
 
 /**
-* #1321378: Improve performance of queries.
-*/
+ * Issue #1321378: Improve performance of queries.
+ */
 function linkchecker_update_7003() {
   db_drop_index('linkchecker_block_custom', 'lid');
   db_drop_index('linkchecker_comment', 'lid');
@@ -307,8 +287,8 @@ function linkchecker_update_7003() {
 }
 
 /**
-* Add status code 206 to the default list of ignored response codes.
-*/
+ * Add status code 206 to the default list of ignored response codes.
+ */
 function linkchecker_update_7004() {
   $ignore_response_codes = preg_split('/(\r\n?|\n)/', variable_get('linkchecker_ignore_response_codes', "200\n206\n302\n304\n401\n403"));
   if (!in_array('206', $ignore_response_codes)) {
@@ -323,8 +303,8 @@ function linkchecker_update_7004() {
 }
 
 /**
-* Upgrade from linkchecker_fqdn_only to linkchecker_check_links_types variable.
-*/
+ * Upgrade from linkchecker_fqdn_only to linkchecker_check_links_types variable.
+ */
 function linkchecker_update_7005() {
 
   $linkchecker_fqdn_only = variable_get('linkchecker_fqdn_only', 1);
@@ -410,8 +390,8 @@ function linkchecker_update_7007() {
 }
 
 /**
-* #965720: Add indexes to improve performance of views queries.
-*/
+ * Issue #965720: Add indexes to improve performance of views queries.
+ */
 function linkchecker_update_7008() {
   db_drop_index('linkchecker_link', 'method');
   db_drop_index('linkchecker_link', 'code');
@@ -429,9 +409,56 @@ function linkchecker_update_7008() {
 }
 
 /**
-* PHP 5.3 backport for array_replace().
-*/
+ * Set user 1 as default user to impersonate content updates.
+ */
+function linkchecker_update_7009() {
+  // Do not overwrite D6 settings.
+  $linkchecker_impersonate_user = variable_get('linkchecker_impersonate_user', '');
+  if (empty($linkchecker_impersonate_user)) {
+    $linkchecker_default_impersonate_user = user_load(1);
+    variable_set('linkchecker_impersonate_user', $linkchecker_default_impersonate_user->name);
+  }
+
+  return t('Set user 1 as default user to impersonate content updates.');
+}
+
+/**
+ * Remove obsolete linkchecker_check_links_max variable.
+ */
+function linkchecker_update_7010() {
+  variable_del('linkchecker_check_links_max');
+
+  return t('Removed obsolete linkchecker_check_links_max variable.');
+}
+
+/**
+ * Upgrade outdated HTTP user agents.
+ */
+function linkchecker_update_7011() {
+
+  $linkchecker_check_useragent = variable_get('linkchecker_check_useragent', 'Drupal (+http://drupal.org/)');
+
+  $useragent_upgrade = array(
+    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1;)' => 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',
+    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0;)' => 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)',
+    'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5' => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0',
+    'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5' => 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0',
+  );
+
+  if (isset($useragent_upgrade[$linkchecker_check_useragent])) {
+    variable_set('linkchecker_check_useragent', $useragent_upgrade[$linkchecker_check_useragent]);
+    return t('Upgraded outdated HTTP user agent from "@user_agent_old" to "@user_agent_new".', array('@user_agent_old' => $linkchecker_check_useragent, '@user_agent_new' => $useragent_upgrade[$linkchecker_check_useragent]));
+  }
+  else {
+    return t('User agent already up to date.');
+  }
+}
+
+
 if (!function_exists('array_replace')) {
+  /**
+   * PHP 5.3 backport for array_replace().
+   */
   function array_replace() {
     $array = array();
     $n = func_num_args();
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.module b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.module
index 9c13058..bc1abf9 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.module
@@ -109,7 +109,7 @@ function linkchecker_menu() {
   );
   // Add the user menu item after node/edit tab.
   $items['user/%user/linkchecker'] = array(
-    'access callback' => '_linkchecker_user_access_own_broken_links_report',
+    'access callback' => '_linkchecker_user_access_account_broken_links_report',
     'access arguments' => array(1),
     'description' => 'Shows a list of broken links in content.',
     'file' => 'linkchecker.pages.inc',
@@ -133,8 +133,8 @@ function linkchecker_menu() {
 }
 
 /**
-* Implements hook_admin_paths().
-*/
+ * Implements hook_admin_paths().
+ */
 function linkchecker_admin_paths() {
   $paths = array(
     // This is marked as an administrative path so that if it is visited from
@@ -149,128 +149,397 @@ function linkchecker_admin_paths() {
 /**
  * Access callback for user/%user/linkchecker.
  */
-function _linkchecker_user_access_own_broken_links_report($account) {
+function _linkchecker_user_access_account_broken_links_report($account) {
   global $user;
 
-  // Access to this path is only granted for authenticated users viewing their
-  // own broken links and all administrative users.
-  return $account->uid && ($user->uid == $account->uid || (user_access('administer nodes') && user_access('administer linkchecker'))) && user_access('access own broken links report');
+  // Users with 'access own broken links report' permission can only view their
+  // own report. Users with the 'access broken links report' permission can
+  // view the report for any authenticated user.
+  return $account->uid && (($user->uid == $account->uid && user_access('access own broken links report')) || user_access('access broken links report'));
 }
 
 /**
  * Access callback for linkchecker/%linkchecker_link/edit.
  */
 function _linkchecker_user_access_edit_link_settings($link) {
-  global $user;
+  return user_access('edit link settings') && _linkchecker_link_access($link);
+}
+
+/**
+ * Determines if the current user has access to view a link.
+ *
+ * Link URLs can contain private information (for example, usernames and
+ * passwords). So this module should only display links to a user if the link
+ * already appears in at least one place on the site where the user would
+ * otherwise have access to see it.
+ */
+function _linkchecker_link_access($link) {
+  $link = (object) $link;
+  return _linkchecker_link_node_ids($link) || _linkchecker_link_comment_ids($link) || _linkchecker_link_block_ids($link);
+}
 
-  if (user_access('administer nodes') && user_access('administer linkchecker')) {
-    // Full access to this path is granted to administrative users.
-    return TRUE;
+/**
+ * Returns IDs of nodes that contain a link which the current user may be allowed to view.
+ *
+ * Important note: For performance reasons, this function is not always
+ * guaranteed to return the exact list of node IDs that the current user is
+ * allowed to view. It will, however, always return an empty array if the user
+ * does not have access to view *any* such nodes, thereby meeting the security
+ * goals of _linkchecker_link_access() and other places that call it.
+ *
+ * In the case where a user has access to some of the nodes that contain the
+ * link, this function may return some node IDs that the user does not have
+ * access to. Therefore, use caution with its results.
+ *
+ * @param object $link
+ *   An object representing the link to check.
+ * @param object $node_author_account
+ *   (optional) If a user account object is provided, the returned nodes will
+ *   additionally be restricted to only those owned by this account. Otherwise,
+ *   nodes owned by any user account may be returned.
+ *
+ * @return array
+ *   An array of node IDs that contain the provided link and that the current
+ *   user may be allowed to view.
+ */
+function _linkchecker_link_node_ids($link, $node_author_account = NULL) {
+  static $fields_with_node_links = array();
+
+  // Exit if all node types are disabled or if the user cannot access content,
+  // there is no need to check further.
+  $linkchecker_scan_nodetypes = array_filter(variable_get('linkchecker_scan_nodetypes', array()));
+  if (empty($linkchecker_scan_nodetypes) || !user_access('access content')) {
+    return array();
   }
-  else {
-    // Verify that $lid is at least in one of the authors nodes or comments.
-    $subquery2 = db_select('node', 'n');
-    $subquery2->innerJoin('node_revision', 'r', 'r.vid = n.vid');
-    $subquery2->innerJoin('linkchecker_node', 'ln', 'ln.nid = n.nid');
-    $subquery2->innerJoin('linkchecker_link', 'll', 'll.lid = ln.lid AND ll.lid = :lid', array(':lid' => $link->lid));
-    $subquery2->condition(db_or()
-      ->condition('n.uid', $user->uid)
-      ->condition('r.uid', $user->uid)
+
+  // Get a list of nodes containing the link, using addTag('node_access') to
+  // allow node access modules to exclude nodes that the current user does not
+  // have access to view.
+  if (!empty($node_author_account)) {
+    $query = db_select('node', 'n');
+    $query->addTag('node_access');
+    $query->innerJoin('linkchecker_node', 'ln', 'ln.nid = n.nid');
+    $query->innerJoin('node_revision', 'r', 'r.vid = n.vid');
+    $query->condition('ln.lid', $link->lid);
+    $query->condition(db_or()
+      ->condition('n.uid', $node_author_account->uid)
+      ->condition('r.uid', $node_author_account->uid)
     );
-    $subquery2->distinct();
-    $subquery2->fields('ll' , array('lid'));
-
-    if (variable_get('linkchecker_scan_comments', 0)) {
-      // Build query for broken links in nodes and comments of the current user.
-      $subquery3 = db_select('comment', 'c');
-      $subquery3->innerJoin('linkchecker_comment', 'lc', 'lc.cid = c.cid');
-      $subquery3->innerJoin('linkchecker_link', 'll', 'll.lid = lc.lid AND ll.lid = :lid', array(':lid' => $link->lid));
-      $subquery3->condition('c.uid', $user->uid);
-      $subquery3->distinct();
-      $subquery3->fields('ll' , array('lid'));
-
-      // UNION the linkchecker_node and linkchecker_comment tables.
-      $subquery1 = db_select($subquery2->union($subquery3), 'q1')->fields('q1', array('lid'));
+    $query->fields('n', array('nid'));
+  }
+  else {
+    $query = db_select('node', 'n');
+    $query->addTag('node_access');
+    $query->innerJoin('linkchecker_node', 'ln', 'ln.nid = n.nid');
+    $query->condition('ln.lid', $link->lid);
+    $query->fields('n', array('nid'));
+  }
+  $nodes = $query->execute();
+
+  // Check if the current user has access to view the link in each node.
+  // However, for performance reasons, as soon as we find one node where that
+  // is the case, stop checking and return the remainder of the list.
+  $nids = array();
+  $access_allowed = FALSE;
+  foreach ($nodes as $node) {
+    if ($access_allowed) {
+      $nids[] = $node->nid;
+      continue;
     }
-    else {
-      // Build query for broken links in nodes of the current user.
-      $subquery1 = db_select($subquery2, 'q1')->fields('q1', array('lid'));
+    $node = node_load($node->nid);
+
+    // We must check whether the link is currently part of the node; if not, we
+    // do not want to return it (and it is not safe to, since we cannot know if
+    // it contained access restrictions for the current user at the point which
+    // it was originally extracted by the Link checker module).
+    if (!isset($fields_with_node_links[$node->nid])) {
+      $fields_with_node_links[$node->nid] = _linkchecker_extract_node_links($node, TRUE);
+    }
+    if (empty($fields_with_node_links[$node->nid][$link->url])) {
+      continue;
     }
+    // If the link appears in fields and a field access module is being used,
+    // we must check that the current user has access to view at least one field
+    // that contains the link; if they don't, we should not return the node.
+    $fields = $fields_with_node_links[$node->nid][$link->url];
+    if (module_implements('field_access')) {
+      $fields_with_access = array();
+
+      $bundle_instances = field_info_instances('node', $node->type);
+      foreach ($bundle_instances as $field_name => $field_instance) {
+        $field = field_info_field($field_name);
+
+        // Field types supported by linkchecker.
+        $fields_supported = array(
+          'text_with_summary',
+          'text_long',
+          'text',
+          'link_field',
+        );
+
+        // Only check link and text fields, since those are the only types we
+        // extract links from.
+        if (in_array($field['type'], $fields_supported) && field_access('view', $field, 'node', $node)) {
+          $fields_with_access[] = $field['field_name'];
+        }
+      }
+      if (!array_intersect($fields, $fields_with_access)) {
+        continue;
+      }
+    }
+    $nids[] = $node->nid;
+    $access_allowed = TRUE;
+  }
+
+  return $nids;
+}
+
+/**
+ * Returns IDs of comments that contain a link which the current user is allowed to view.
+ *
+ * @param object $link
+ *   An object representing the link to check.
+ * @param object $comment_author_account
+ *   (optional) If a user account object is provided, the returned comments
+ *   will additionally be restricted to only those owned by this account.
+ *   Otherwise, comments owned by any user account may be returned.
+ *
+ * @return array
+ *   An array of comment IDs that contain the provided link and that the
+ *   current user is allowed to view.
+ */
+function _linkchecker_link_comment_ids($link, $comment_author_account = NULL) {
+  // Exit if comments are disabled or if the user cannot access comments, there
+  // is no need to check further.
+  if (!variable_get('linkchecker_scan_comments', 0) || !user_access('access comments')) {
+    return array();
+  }
+
+  // Get a list of comments containing the link, using addTag('node_access') to
+  // allow comment access modules to exclude comments that the current user
+  // does not have access to view.
+  if (!empty($comment_author_account)) {
+    $query = db_select('comment', 'c');
+    $query->addMetaData('base_table', 'comment');
+    $query->addTag('node_access');
+    $query->innerJoin('linkchecker_comment', 'lc', 'lc.cid = c.cid');
+    $query->condition('lc.lid', $link->lid);
+    $query->condition('c.uid', $comment_author_account->uid);
+    $query->fields('c', array('cid'));
+  }
+  else {
+    $query = db_select('comment', 'c');
+    $query->addMetaData('base_table', 'comment');
+    $query->addTag('node_access');
+    $query->innerJoin('linkchecker_comment', 'lc', 'lc.cid = c.cid');
+    $query->condition('lc.lid', $link->lid);
+    $query->fields('c', array('cid'));
+  }
+  $cids = $query->execute()->fetchCol();
 
-    // Build full query.
-    $query = db_select('linkchecker_link', 'll');
-    $query->innerJoin($subquery1, 'q2', 'q2.lid = ll.lid');
-    $query->fields('ll');
-    $is_author_of_lid = $query->countQuery()->execute()->fetchField();
+  // Return the array of comment IDs.
+  return $cids;
+}
+
+/**
+ * Returns IDs of blocks that contain a link which the current user is allowed to view.
+ *
+ * @param object $link
+ *   An object representing the link to check.
+ *
+ * @return array
+ *   An array of custom block IDs that contain the provided link and that the
+ *   current user is allowed to view.
+ */
+function _linkchecker_link_block_ids($link) {
+  // Exit if blocks are disabled.
+  if (!variable_get('linkchecker_scan_blocks', 0)) {
+    return array();
+  }
+
+  // Get the initial list of block IDs.
+  $bids = db_query('SELECT bid FROM {linkchecker_block_custom} WHERE lid = :lid', array(':lid' => $link->lid))->fetchCol();
 
-    // This path is only allowed for authenticated users looking at their own
-    // links.
-    return $is_author_of_lid && user_access('edit link settings');
+  // If the user can administer blocks, they're able to see all block content.
+  if (user_access('administer blocks')) {
+    return $bids;
   }
+
+  // Otherwise, only return blocks that this user (or anonymous users) have
+  // access to.
+  global $user;
+  $rids = array_keys($user->roles);
+  $rids[] = DRUPAL_ANONYMOUS_RID;
+
+  $query = db_select('block', 'b');
+  $query->leftJoin('block_role', 'r', 'b.module = r.module AND b.delta = r.delta');
+  $query->condition('b.module', 'block');
+  $query->condition(db_or()
+    ->condition('r.rid', $rids, 'IN')
+    ->isNull('r.rid')
+  );
+  $query->fields('b', array('delta'));
+  $query->distinct();
+  $allowed_bids = $query->execute()->fetchCol();
+
+  return array_intersect($bids, $allowed_bids);
 }
 
 /**
  * Implements hook_cron().
  */
 function linkchecker_cron() {
-  // Get max_execution_time from configuration, override 0 with 240 seconds.
-  $max_execution_time = ini_get('max_execution_time') == 0 ? 240 : ini_get('max_execution_time');
-
   // Remove outdated links no longer in use once per day.
   if (REQUEST_TIME - variable_get('linkchecker_cleanup_links_last', 0) >= 86400) {
     _linkchecker_cleanup_links();
     variable_set('linkchecker_cleanup_links_last', REQUEST_TIME);
   }
 
-  // @todo Implement cURL support.
-  // $has_curl = function_exists('curl_init');
+  // Run link checker in a new process, independent of cron.
+  if (module_exists('httprl') && variable_get('linkchecker_check_library', 'core') == 'httprl') {
+    // Setup callback options array; call _linkchecker_check_links() in the
+    // background.
+    $callback_options = array(array('function' => '_linkchecker_check_links'));
+    // Queue up the request.
+    httprl_queue_background_callback($callback_options);
+    // Execute request.
+    httprl_send_request();
+
+    // Exit here so we don't call _linkchecker_check_links() in this process.
+    return;
+  }
+  // Run the link checks the normal way.
+  _linkchecker_check_links();
+}
 
-  // @todo: Remove some confusion about the max links that can be checked per
-  // cron run and guess that 2 link can be checked per second what is
-  // nevertheless uncommon. But we can use the max_execution_time to calculate
-  // a value that is higher, but not totally out of scope to keep the query
-  // resultset small. For cURL we need to add this setting back or a thread
-  // limit per remote server for not overloading them.
-  $check_links_max_per_cron_run = $max_execution_time;
-  // $check_links_max_per_cron_run = variable_get('linkchecker_check_links_max', 10);
+/**
+ * Run link checks.
+ */
+function _linkchecker_check_links() {
+  // Get max_execution_time from configuration, override 0 with 240 seconds.
+  $max_execution_time = ini_get('max_execution_time') == 0 ? 240 : ini_get('max_execution_time');
+  // Make sure we have enough time to validate all of the links.
+  drupal_set_time_limit($max_execution_time);
 
-  $check_links_interval = variable_get('linkchecker_check_links_interval', 2419200);
-  $useragent = variable_get('linkchecker_check_useragent', 'Drupal (+http://drupal.org/)');
+  // Make sure this is the only process trying to run this function.
+  if (!lock_acquire(__FUNCTION__, $max_execution_time)) {
+    watchdog('linkchecker', 'Attempted to re-run link checks while they are already running.', array(), WATCHDOG_WARNING);
+    return FALSE;
+  }
+
+  $has_httprl = (module_exists('httprl') && variable_get('linkchecker_check_library', 'core') == 'httprl');
+
+  // Do not confuse admins with a setting of maximum checkable links per cron
+  // run and guess that 2 links can be checked per second with 1 thread, what is
+  // nevertheless uncommon. The max_execution_time can be used to calculate
+  // a useful value that is higher, but not totally out of scope and limits the
+  // query resultset to a resonable size.
+  $linkchecker_check_connections_max = variable_get('linkchecker_check_connections_max', 8);
+  $check_links_max_per_cron_run = ($has_httprl) ? ($linkchecker_check_connections_max * $max_execution_time) : $max_execution_time;
+
+  $linkchecker_check_links_interval = variable_get('linkchecker_check_links_interval', 2419200);
+  $linkchecker_check_useragent = variable_get('linkchecker_check_useragent', 'Drupal (+http://drupal.org/)');
+
+  // Connection limit can be overriden via settings.php. Two connections is the
+  // limit defined in RFC http://www.ietf.org/rfc/rfc2616.txt. Modern browsers
+  // are typically using 6-8 connections and no more. Never use more and keep
+  // in mind that you can overload other people servers.
+  $linkchecker_check_domain_connections = variable_get('linkchecker_check_domain_connections', 2);
 
   // Get URLs for checking.
-  $result = db_query_range('SELECT * FROM {linkchecker_link} WHERE last_checked < :last_checked AND status = :status ORDER BY last_checked, lid ASC', 0, $check_links_max_per_cron_run, array(':last_checked' => REQUEST_TIME - $check_links_interval, ':status' => 1));
-  foreach ($result as $link) {
-    // Make sure we have enough time to validate the link.
-    drupal_set_time_limit(240);
+  $links = db_query_range('SELECT * FROM {linkchecker_link} WHERE last_checked < :last_checked AND status = :status ORDER BY last_checked, lid ASC', 0, $check_links_max_per_cron_run, array(':last_checked' => REQUEST_TIME - $linkchecker_check_links_interval, ':status' => 1));
+  $links_remaining = $links->rowCount();
 
+  foreach ($links as $link) {
     $headers = array();
-    $headers['User-Agent'] = 'User-Agent: ' . $useragent;
+    $headers['User-Agent'] = $linkchecker_check_useragent;
+
+    $uri = @parse_url($link->url);
+
+    // URL contains a fragment.
+    if (in_array($link->method, array('HEAD', 'GET')) && !empty($uri['fragment'])) {
+      // We need the full content and not only the HEAD.
+      $link->method = 'GET';
+      // Request text content only (like Firefox/Chrome).
+      $headers['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
+    }
+    elseif ($link->method == 'GET') {
+      // Range: Only request the first 1024 bytes from remote server. This is
+      // required to prevent timeouts on URLs that are large downloads.
+      $headers['Range'] = 'bytes=0-1024';
+    }
+
+    // Add in the headers.
+    $options = array(
+      'headers' => $headers,
+      'method' => $link->method,
+      'max_redirects' => 0,
+    );
 
-    // Range: Only request the first 1024 bytes from remote server. This is
-    // required to prevent timeouts on URLs that are large downloads.
-    if ($link->method == 'GET') { $headers['Range'] = 'bytes=0-1024'; }
+    if ($has_httprl) {
+      // Define the callback and add the $link object to it.
+      // Notes:
+      // - 'global_timeout' does not require a timer_read('page'), as this job
+      //   runs in a new process, independent of cron.
+      $options += array(
+        'global_connections' => $linkchecker_check_connections_max,
+        'global_timeout' => $max_execution_time - 30,
+        'domain_connections' => $linkchecker_check_domain_connections,
+        'callback' => array(
+          array(
+            'function' => '_linkchecker_status_handling',
+          ),
+          $link, // This need to be passed or it's not send back to _linkchecker_status_handling()
+        ),
+      );
+      // Queue up the requests.
+      httprl_request($link->url, $options);
+      $links_remaining--;
+
+      // After all links are queued, run the url checks.
+      if ($links_remaining == 0) {
+        httprl_send_request();
+      }
+    }
+    else {
+      // Drupal core.
+      $response = drupal_http_request($link->url, $options);
 
-    // Fetch URL.
-    $response = drupal_http_request($link->url, array('headers' => $headers, 'method' => $link->method, 'max_redirects' => 0));
-    _linkchecker_status_handling($link, $response);
+      // Add 'redirect_code' property to core response object for consistency
+      // with HTTPRL object.
+      if ($response->code == 301 && !isset($response->redirect_code)) {
+        $response->redirect_code = $response->code;
+      }
+      // Add 'uri' property to core response object for 'fragment' check and
+      // consistency with HTTPRL object.
+      $response->uri = $uri;
 
-    if ((timer_read('page') / 1000) > ($max_execution_time / 2)) {
-      break; // Stop once we have used over half of the maximum execution time.
+      _linkchecker_status_handling($response, $link);
+
+      if ((timer_read('page') / 1000) > ($max_execution_time / 2)) {
+        // Stop once we have used over half of the maximum execution time.
+        break;
+      }
     }
   }
+
+  // Release the lock.
+  lock_release(__FUNCTION__);
+  watchdog('linkchecker', 'Link checks completed.', array(), WATCHDOG_INFO);
+  watchdog('linkchecker', 'Memory usage: @memory_get_usage, Peak memory usage: @memory_get_peak_usage.', array('@memory_get_peak_usage' => format_size(memory_get_peak_usage()), '@memory_get_usage' => format_size(memory_get_usage())), WATCHDOG_DEBUG);
+  return TRUE;
 }
 
 /**
  * Status code handling.
  *
- * @param string $link
- *   An object containing the url, lid and fail_count.
  * @param object $response
  *   An object containing the HTTP request headers, response code, headers,
  *   data and redirect status.
+ * @param string $link
+ *   An object containing the url, lid and fail_count.
  */
-function _linkchecker_status_handling($link, $response) {
-  $useragent = variable_get('linkchecker_check_useragent', 'Drupal (+http://drupal.org/)');
+function _linkchecker_status_handling(&$response, $link) {
   $ignore_response_codes = preg_split('/(\r\n?|\n)/', variable_get('linkchecker_ignore_response_codes', "200\n206\n302\n304\n401\n403"));
 
   // - Prevent E_ALL warnings in DB updates for non-existing $response->error.
@@ -278,17 +547,32 @@ function _linkchecker_status_handling($link, $response) {
   //   what results in a database UPDATE failure. For more information, see
   //   http://drupal.org/node/371495.
   //   Workaround: ISO-8859-1 as source encoding may be wrong, but WFM.
-  if (!isset($response->error)) { $response->error = ''; }
-  if (!isset($response->status_message)) { $response->status_message = ''; }
+  if (!isset($response->error)) {
+    $response->error = '';
+  }
+  if (!isset($response->status_message)) {
+    $response->status_message = '';
+  }
   $response->error = trim(drupal_convert_to_utf8($response->error, 'ISO-8859-1'));
   $response->status_message = trim(drupal_convert_to_utf8($response->status_message, 'ISO-8859-1'));
 
-  // Make core response object consistent with HTTPRL.
-  if ($response->code == 301 && !isset($response->redirect_code)) {
-    $response->redirect_code = $response->code;
+  // Destination anchors in HTML documents may be specified either by the A
+  // element (naming it with the name attribute), or by any other element
+  // (naming with the id attribute).
+  // See http://www.w3.org/TR/html401/struct/links.html
+  if ($response->code == 200 && !empty($response->uri['fragment']) && (!empty($response->data) && !preg_match('/(\s[^>]*(name|id)=["\'])(' . preg_quote($response->uri['fragment'], '/') . ')(["\'][^>]*>)/i', $response->data))) {
+    // Override status code 200 with status code 404 so it can be handled with
+    // default status code 404 logic and custom error text.
+    $response->code = 404;
+    $response->status_message = $response->error = 'URL fragment identifier not found in content';
   }
 
   switch ($response->code) {
+    case -4: // HTTPRL: httprl_send_request timed out.
+      // Skip these and try them again next cron run.
+      break;
+
+    case -2: // HTTPRL: maximum allowed redirects exhausted.
     case 301:
       // Remote site send status code 301 and link needs an update.
       db_update('linkchecker_link')
@@ -297,7 +581,7 @@ function _linkchecker_status_handling($link, $response) {
           'code' => $response->redirect_code,
           'error' => $response->status_message,
           'fail_count' => 0,
-          'last_checked' => time()
+          'last_checked' => time(),
         ))
         ->expression('fail_count', 'fail_count + 1')
         ->execute();
@@ -307,70 +591,114 @@ function _linkchecker_status_handling($link, $response) {
       // link and if we trust this change we are able to replace the old link
       // with the new one without any hand work.
       $auto_repair_301 = variable_get('linkchecker_action_status_code_301', 0);
-      if ($auto_repair_301 && $auto_repair_301 <= ($link->fail_count+1) && valid_url($response->redirect_url, TRUE)) {
+      if ($auto_repair_301 && $auto_repair_301 <= ($link->fail_count + 1) && valid_url($response->redirect_url, TRUE)) {
+        // Switch anonymous user to an admin.
+        linkchecker_impersonate_user(user_load_by_name(variable_get('linkchecker_impersonate_user', '')));
+
         // NODES: Autorepair all nodes having this outdated link.
-        $nids = db_query('SELECT nid FROM {linkchecker_node} WHERE lid = :lid', array(':lid' => $link->lid))->fetchCol();
-        $nodes = node_load_multiple($nids);
-        foreach ($nodes as $node) {
-          $node = _linkchecker_replace_fields($node, $node->type, 'node', $link->url, $response->redirect_url);
-
-          // Always use the default revision setting. For more information,
-          // see node_object_prepare().
-          $node_options = variable_get('node_options_' . $node->type, array('status', 'promote'));
-          $node->revision = in_array('revision', $node_options);
-
-          // Generate a log message for the node_revisions table, visible on
-          // the node's revisions tab.
-          $node->log = t('Changed permanently moved link in %node from %src to %dst.', array('%node' => url('node/' . $row->nid), '%src' => $link->url, '%dst' => $response->redirect_url));
-
-          // Save changed node and update the node link list.
-          node_save($node);
-          watchdog('linkchecker', 'Changed permanently moved link in %node from %src to %dst.', array('%node' => url('node/' . $row->nid), '%src' => $link->url, '%dst' => $response->redirect_url), WATCHDOG_INFO);
+        $result = db_query('SELECT nid FROM {linkchecker_node} WHERE lid = :lid', array(':lid' => $link->lid));
+        foreach ($result as $row) {
+          // Explicitly don't use node_load_multiple() or the module may run
+          // into issues like http://drupal.org/node/1210606. With this logic
+          // nodes can be updated until an out of memory occurs and further
+          // updates will be made on the remaining nodes only.
+          $node = node_load($row->nid);
+
+          // Has the node object loaded successfully?
+          if (is_object($node)) {
+            $node_original = clone $node;
+            $node = _linkchecker_replace_fields('node', $node->type, $node, $link->url, $response->redirect_url);
+
+            if ($node_original != $node) {
+              // Always use the default revision setting. For more information,
+              // see node_object_prepare().
+              $node_options = variable_get('node_options_' . $node->type, array('status', 'promote'));
+              $node->revision = in_array('revision', $node_options);
+
+              // Generate a log message for the node_revisions table, visible on
+              // the node's revisions tab.
+              $node->log = t('Changed permanently moved link in %node from %src to %dst.', array('%node' => url('node/' . $node->nid), '%src' => $link->url, '%dst' => $response->redirect_url));
+
+              // Save changed node and update the node link list.
+              node_save($node);
+              watchdog('linkchecker', 'Changed permanently moved link in %node from %src to %dst.', array('%node' => url('node/' . $node->nid), '%src' => $link->url, '%dst' => $response->redirect_url), WATCHDOG_INFO);
+            }
+            else {
+              watchdog('linkchecker', 'Link update in node failed. Permanently moved link %src not found in node %node. Manual fix required.', array('%node' => url('node/' . $row->nid), '%src' => $link->url), WATCHDOG_WARNING);
+            }
+          }
+          else {
+            watchdog('linkchecker', 'Loading node %node for update failed. Manual fix required.', array('%node' => $row->nid), WATCHDOG_ERROR);
+          }
         }
 
         // COMMENTS: Autorepair all comments having this outdated link.
-        if (variable_get('linkchecker_scan_comments', 0)) {
-          $cids = db_query('SELECT cid FROM {linkchecker_comment} WHERE lid = :lid', array(':lid' => $link->lid))->fetchCol();
-          $comments = comment_load_multiple($cids);
-          foreach ($comments as $comment) {
+        $result = db_query('SELECT cid FROM {linkchecker_comment} WHERE lid = :lid', array(':lid' => $link->lid));
+        foreach ($result as $row) {
+          // Explicitly don't use comment_load_multiple() or the module may run
+          // into issues like http://drupal.org/node/1210606. With this logic
+          // comment can be updated until an out of memory occurs and further
+          // updates will be made on the remaining comments only.
+          $comment = comment_load($row->cid);
+
+          // Has the comment object loaded successfully?
+          if (is_object($comment)) {
+            $comment_original = clone $comment;
+
             // Replace links in subject.
             _linkchecker_link_replace($comment->subject, $link->url, $response->redirect_url);
 
             // Replace links in fields.
-            $comment = _linkchecker_replace_fields($comment, $comment->node_type, 'comment', $link->url, $response->redirect_url);
+            $comment = _linkchecker_replace_fields('comment', $comment->node_type, $comment, $link->url, $response->redirect_url);
 
             // Save changed comment and update the comment link list.
-            comment_save($comment);
-            watchdog('linkchecker', 'Changed permanently moved link in comment %comment from %src to %dst.', array('%comment' => $comment['cid'], '%src' => $link->url, '%dst' => $response->redirect_url), WATCHDOG_INFO);
+            if ($comment_original != $comment) {
+              comment_save($comment);
+              watchdog('linkchecker', 'Changed permanently moved link in comment %comment from %src to %dst.', array('%comment' => $comment->cid, '%src' => $link->url, '%dst' => $response->redirect_url), WATCHDOG_INFO);
+            }
+            else {
+              watchdog('linkchecker', 'Link update in comment failed. Permanently moved link %src not found in comment %comment. Manual fix required.', array('%comment' => $comment->cid, '%src' => $link->url), WATCHDOG_WARNING);
+            }
+          }
+          else {
+            watchdog('linkchecker', 'Loading comment %comment for update failed. Manual fix required.', array('%comment' => $comment->cid), WATCHDOG_ERROR);
           }
         }
 
         // CUSTOM BLOCKS: Autorepair all custom blocks having this outdated
         // link.
-        if (variable_get('linkchecker_scan_blocks', 0)) {
-          $result = db_query('SELECT bid FROM {linkchecker_block_custom} WHERE lid = :lid', array(':lid' => $link->lid));
-          foreach ($result as $row) {
-            $block_custom = block_custom_block_get($row->bid);
+        $result = db_query('SELECT bid FROM {linkchecker_block_custom} WHERE lid = :lid', array(':lid' => $link->lid));
+        foreach ($result as $row) {
+          $block_custom = linkchecker_block_custom_block_get($row->bid);
 
-            // Create array of custom block fields to scan.
-            $text_items = array();
-            $text_items[] = 'info';
-            $text_items[] = 'body';
+          // Has the custom block object loaded successfully?
+          if (is_object($block_custom)) {
+            $block_custom_original = clone $block_custom;
 
             // Now replace the outdated link with the permanently moved one in
             // all custom block fields.
-            foreach ($text_items as $text_item) {
-              _linkchecker_link_replace($block_custom[$text_item], $link->url, $response->redirect_url);
+            _linkchecker_link_replace($block_custom->info, $link->url, $response->redirect_url);
+            _linkchecker_link_replace($block_custom->body['value'], $link->url, $response->redirect_url);
+
+            if ($block_custom_original != $block_custom) {
+              // Save changed block and update the block link list.
+              block_custom_block_save((array) $block_custom, $block_custom->delta);
+              // There is no hook that fires on block_custom_block_save(),
+              // therefore do link extraction programmatically.
+              _linkchecker_add_block_custom_links($block_custom, $block_custom->delta);
+              watchdog('linkchecker', 'Changed permanently moved link in custom block %bid from %src to %dst.', array('%bid' => $block_custom->delta, '%src' => $link->url, '%dst' => $response->redirect_url), WATCHDOG_INFO);
+            }
+            else {
+              watchdog('linkchecker', 'Link update in block failed. Permanently moved link %src not found in block %bid. Manual fix required.', array('%bid' => $block_custom->delta, '%src' => $link->url), WATCHDOG_WARNING);
             }
-
-            // Save changed block and update the block link list.
-            block_custom_block_save($block_custom, $block_custom['bid']);
-            // There is no hook that fires on block_custom_block_save(),
-            // therefore do link extraction programmatically.
-            _linkchecker_add_block_custom_links($block_custom, $block_custom['bid']);
-            watchdog('linkchecker', 'Changed permanently moved link in custom block %bid from %src to %dst.', array('%bid' => $block_custom['bid'], '%src' => $link->url, '%dst' => $response->redirect_url), WATCHDOG_INFO);
+          }
+          else {
+            watchdog('linkchecker', 'Loading block %bid for update failed. Manual fix required.', array('%bid' => $block_custom->delta), WATCHDOG_ERROR);
           }
         }
+
+        // Revert user back to anonymous.
+        linkchecker_revert_user();
       }
       else {
         watchdog('linkchecker', 'Link %link has changed and needs to be updated.', array('%link' => $link->url), WATCHDOG_NOTICE, l(t('Broken links'), 'admin/reports/linkchecker'));
@@ -384,7 +712,7 @@ function _linkchecker_status_handling($link, $response) {
           'code' => $response->code,
           'error' => $response->error,
           'fail_count' => 0,
-          'last_checked' => time()
+          'last_checked' => time(),
         ))
         ->expression('fail_count', 'fail_count + 1')
         ->execute();
@@ -392,25 +720,62 @@ function _linkchecker_status_handling($link, $response) {
 
       // If unpublishing limit is reached, unpublish all nodes having this link.
       $linkchecker_action_status_code_404 = variable_get('linkchecker_action_status_code_404', 0);
-      if ($linkchecker_action_status_code_404 && $linkchecker_action_status_code_404 <= ($link->fail_count+1)) {
+      if ($linkchecker_action_status_code_404 && $linkchecker_action_status_code_404 <= ($link->fail_count + 1)) {
+        // Switch anonymous user to an admin.
+        linkchecker_impersonate_user(user_load_by_name(variable_get('linkchecker_impersonate_user', '')));
         _linkchecker_unpublish_nodes($link->lid);
+        linkchecker_revert_user();
       }
       break;
 
     case 405:
-    case 500:
       // - 405: Special error handling if method is not allowed. Switch link
-      //        checking to GET method and try again.
-      // - 500: Like WGET, try with GET on "500 Internal server error".
+      //   checking to GET method and try again.
       db_update('linkchecker_link')
         ->condition('lid', $link->lid)
-        ->fields(array('method' => 'GET'))
+        ->fields(array(
+          'method' => 'GET',
+          'code' => $response->code,
+          'error' => $response->error,
+          'fail_count' => 0,
+          'last_checked' => time(),
+        ))
+        ->expression('fail_count', 'fail_count + 1')
+        ->execute();
+
+      watchdog('linkchecker', 'Method HEAD is not allowed for link %link. Method has been changed to GET.', array('%link' => $link->url), WATCHDOG_INFO, l(t('Broken links'), 'admin/reports/linkchecker'));
+      break;
+
+    case 500:
+      // - 500: Like WGET, try with GET on "500 Internal server error".
+      // - If GET also fails with status code 500, than the link is broken.
+      if ($link->method == 'GET' && $response->code == 500) {
+        db_update('linkchecker_link')
+        ->condition('lid', $link->lid)
+        ->fields(array(
+          'code' => $response->code,
+          'error' => $response->error,
+          'fail_count' => 0,
+          'last_checked' => time(),
+        ))
+        ->expression('fail_count', 'fail_count + 1')
         ->execute();
 
-      if ($response->code == 405) {
-        watchdog('linkchecker', 'Method HEAD is not allowed for link %link. Method has been changed to GET.', array('%link' => $link->url), WATCHDOG_INFO, l(t('Broken links'), 'admin/reports/linkchecker'));
+        watchdog('linkchecker', 'Broken link %link has been found.', array('%link' => $link->url), WATCHDOG_NOTICE, l(t('Broken links'), 'admin/reports/linkchecker'));
       }
-      elseif ($response->code == 500) {
+      else {
+        db_update('linkchecker_link')
+        ->condition('lid', $link->lid)
+        ->fields(array(
+          'method' => 'GET',
+          'code' => $response->code,
+          'error' => $response->error,
+          'fail_count' => 0,
+          'last_checked' => time(),
+        ))
+        ->expression('fail_count', 'fail_count + 1')
+        ->execute();
+
         watchdog('linkchecker', 'Internal server error for link %link. Method has been changed to GET.', array('%link' => $link->url), WATCHDOG_INFO, l(t('Broken links'), 'admin/reports/linkchecker'));
       }
       break;
@@ -436,71 +801,16 @@ function _linkchecker_status_handling($link, $response) {
             'code' => $response->code,
             'error' => $response->error,
             'fail_count' => 0,
-            'last_checked' => time()
+            'last_checked' => time(),
           ))
           ->expression('fail_count', 'fail_count + 1')
           ->execute();
         // watchdog('linkchecker', 'Unhandled link error %link has been found.', array('%link' => $link->url), WATCHDOG_ERROR, l(t('Broken links'), 'admin/reports/linkchecker'));
       }
   }
-}
 
-/**
- * Replace the old url by a new url on 301 status codes.
- *
- * @param object $entity
- *   The object we are working on, can be a $node, $comment.
- * @param string $entity_type
- *   The type of entity, like $node->type or $comment->node_type.
- * @param string $bundle
- *   The type of bundle like 'node' or 'comment'.
- * @param string $old_url
- *   The previous url.
- * @param string $new_url
- *   The new url to replace the old.
- */
-function _linkchecker_replace_fields($entity, $entity_type, $bundle, $old_url, $new_url) {
-  $field_list = field_info_fields();
-  foreach ($field_list as $name => $field) {
-    if (in_array($entity_type, $field['bundles'][$bundle])) {
-      // This is because of a php error.
-      $entity_field =& $entity->$name;
-
-      switch ($field['type']) {
-        // Core fields.
-        case 'text_with_summary':
-          foreach ($entity_field as $language_name => $language_value) {
-            foreach ($language_value as $item_name => $item_value) {
-              _linkchecker_link_replace($entity_field[$language_name][$item_name]['value'], $old_url, $new_url);
-              _linkchecker_link_replace($entity_field[$language_name][$item_name]['summary'], $old_url, $new_url);
-            }
-          }
-          break;
-
-        // Core fields.
-        case 'text_long':
-        case 'text':
-          foreach ($entity_field as $language_name => $language_value) {
-            foreach ($language_value as $item_name => $item_value) {
-              _linkchecker_link_replace($entity_field[$language_name][$item_name]['value'], $old_url, $new_url);
-            }
-          }
-          break;
-
-        // Link module field, http://drupal.org/project/link.
-        case 'link_field':
-          foreach ($entity_field as $language_name => $language_value) {
-            foreach ($language_value as $item_name => $item_value) {
-              _linkchecker_link_replace($entity_field[$language_name][$item_name]['url'], $old_url, $new_url);
-              _linkchecker_link_replace($entity_field[$language_name][$item_name]['title'], $old_url, $new_url);
-            }
-          }
-          break;
-      }
-    }
-  }
-
-  return $entity;
+  // Free Memory.
+  $response = new stdClass();
 }
 
 /**
@@ -508,21 +818,20 @@ function _linkchecker_replace_fields($entity, $entity_type, $bundle, $old_url, $
  */
 function linkchecker_node_prepare($node) {
   // Node edit tab is viewed.
-  if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == 'edit') {
+  if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == 'edit' && isset($node->nid)) {
     // Show a message on node edit page if a link check failed once or more.
     $ignore_response_codes = preg_split('/(\r\n?|\n)/', variable_get('linkchecker_ignore_response_codes', "200\n206\n302\n304\n401\n403"));
-    $links = db_query('SELECT url, code, fail_count FROM {linkchecker_node} ln INNER JOIN {linkchecker_link} ll ON ln.lid = ll.lid WHERE ln.nid = :nid AND ll.fail_count > :fail_count AND ll.status = :status AND ll.code NOT IN (:codes)', array(':nid' => $node->nid, ':fail_count' => 0, ':status' => 1, ':codes' => $ignore_response_codes));
+    $links = db_query('SELECT ll.* FROM {linkchecker_node} ln INNER JOIN {linkchecker_link} ll ON ln.lid = ll.lid WHERE ln.nid = :nid AND ll.fail_count > :fail_count AND ll.status = :status AND ll.code NOT IN (:codes)', array(':nid' => $node->nid, ':fail_count' => 0, ':status' => 1, ':codes' => $ignore_response_codes));
     foreach ($links as $link) {
-      drupal_set_message(format_plural($link->fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $link->url, '@code' => $link->code)), 'warning', FALSE);
+      if (_linkchecker_link_access($link)) {
+        drupal_set_message(format_plural($link->fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $link->url, '@code' => $link->code)), 'warning', FALSE);
+      }
     }
   }
 }
 
 /**
  * Implements hook_node_delete().
- *
- * @param object $node
- *   The node object that is being deleted.
  */
 function linkchecker_node_delete($node) {
   _linkchecker_delete_node_links($node->nid);
@@ -530,26 +839,34 @@ function linkchecker_node_delete($node) {
 
 /**
  * Implements hook_node_insert().
- *
- * @param object $node
- *   The node object that is being inserted.
  */
 function linkchecker_node_insert($node) {
+  // Every moderation module saving a forward revision needs to exit here.
+  // Please see _linkchecker_isdefaultrevision() for more details.
+  // @todo: Refactor this workaround under D8.
+  if (!_linkchecker_isdefaultrevision($node)) {
+    return;
+  }
+
   // The node is going to be published.
-  if ($node->status == NODE_PUBLISHED && _linkchecker_scan_nodetype($node->type)) {
+  if (_linkchecker_scan_nodetype($node->type) && $node->status == NODE_PUBLISHED) {
     _linkchecker_add_node_links($node);
   }
 }
 
 /**
  * Implements hook_node_update().
- *
- * @param object $node
- *   The node object that is being updated.
  */
 function linkchecker_node_update($node) {
+  // Every moderation module saving a forward revision needs to exit here.
+  // Please see _linkchecker_isdefaultrevision() for more details.
+  // @todo: Refactor this workaround under D8.
+  if (!_linkchecker_isdefaultrevision($node)) {
+    return;
+  }
+
   // The node is going to be published.
-  if ($node->status == NODE_PUBLISHED && _linkchecker_scan_nodetype($node->type)) {
+  if (_linkchecker_scan_nodetype($node->type) && $node->status == NODE_PUBLISHED) {
     _linkchecker_add_node_links($node);
   }
   else {
@@ -560,9 +877,6 @@ function linkchecker_node_update($node) {
 
 /**
  * Implements hook_comment_delete().
- *
- * @param object $comment
- *   The comment object that is being deleted.
  */
 function linkchecker_comment_delete($comment) {
   _linkchecker_delete_comment_links($comment->cid);
@@ -570,28 +884,22 @@ function linkchecker_comment_delete($comment) {
 
 /**
  * Implements hook_comment_insert().
- *
- * @param object $comment
- *   The comment object that is being inserted.
  */
 function linkchecker_comment_insert($comment) {
   // The comment is going to be published.
   $node_type = db_query('SELECT type FROM {node} WHERE nid = :nid', array(':nid' => $comment->nid))->fetchField();
-  if ($comment->status == COMMENT_PUBLISHED && _linkchecker_scan_nodetype($node_type)) {
+  if (_linkchecker_scan_nodetype($node_type) && variable_get('linkchecker_scan_comments', 0) && $comment->status == COMMENT_PUBLISHED) {
     _linkchecker_add_comment_links($comment);
   }
 }
 
 /**
  * Implements hook_comment_update().
- *
- * @param object $comment
- *   The comment object that is being updated.
  */
 function linkchecker_comment_update($comment) {
   // The node is going to be published.
   $node_type = db_query('SELECT type FROM {node} WHERE nid = :nid', array(':nid' => $comment->nid))->fetchField();
-  if ($comment->status == COMMENT_PUBLISHED && _linkchecker_scan_nodetype($node_type)) {
+  if (_linkchecker_scan_nodetype($node_type) && variable_get('linkchecker_scan_comments', 0) && $comment->status == COMMENT_PUBLISHED) {
     _linkchecker_add_comment_links($comment);
   }
   else {
@@ -617,9 +925,11 @@ function linkchecker_form_alter(&$form, &$form_state, $form_id) {
         // Show a message on custom block edit page if a link check failed once
         // or more often.
         $ignore_response_codes = preg_split('/(\r\n?|\n)/', variable_get('linkchecker_ignore_response_codes', "200\n206\n302\n304\n401\n403"));
-        $links = db_query('SELECT url, code, fail_count FROM {linkchecker_block_custom} lb INNER JOIN {linkchecker_link} ll ON lb.lid = ll.lid WHERE lb.bid = :bid AND ll.fail_count > :fail_count AND ll.status = :status AND ll.code NOT IN (:codes)', array(':bid' => arg(5), ':fail_count' => 0, ':status' => 1, ':codes' => $ignore_response_codes));
+        $links = db_query('SELECT ll.* FROM {linkchecker_block_custom} lb INNER JOIN {linkchecker_link} ll ON lb.lid = ll.lid WHERE lb.bid = :bid AND ll.fail_count > :fail_count AND ll.status = :status AND ll.code NOT IN (:codes)', array(':bid' => arg(5), ':fail_count' => 0, ':status' => 1, ':codes' => $ignore_response_codes));
         foreach ($links as $link) {
-          drupal_set_message(format_plural($link->fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $link->url, '@code' => $link->code)), 'warning', FALSE);
+          if (_linkchecker_link_access($link)) {
+            drupal_set_message(format_plural($link->fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $link->url, '@code' => $link->code)), 'warning', FALSE);
+          }
         }
       }
 
@@ -631,20 +941,25 @@ function linkchecker_form_alter(&$form, &$form_state, $form_id) {
       // Add custom submit handler to custom block delete form.
       $form['#submit'][] = 'linkchecker_block_custom_delete_form_submit';
       break;
+  }
+}
 
-    case 'comment_form':
-      // When displaying the form as 'view' or 'preview', show the broken links
-      // warning.
-      if ((empty($form_state['input']) || isset($form_state['input']['op']) && $form_state['input']['op'] == t('Preview')) && arg(0) == 'comment' && arg(1) == 'edit' && is_numeric(arg(2))) {
-        // Show a message on comment edit page if a link check failed once or
-        // more often.
-        $ignore_response_codes = preg_split('/(\r\n?|\n)/', variable_get('linkchecker_ignore_response_codes', "200\n206\n302\n304\n401\n403"));
-        $links = db_query('SELECT url, code, fail_count FROM {linkchecker_comment} lc INNER JOIN {linkchecker_link} ll ON lc.lid = ll.lid WHERE lc.cid = :cid AND ll.fail_count > :fail_count AND ll.status = :status AND ll.code NOT IN (:codes)', array(':cid' => arg(2), ':fail_count' => 0, ':status' => 1, ':codes' => $ignore_response_codes));
-        foreach ($links as $link) {
-          drupal_set_message(format_plural($link->fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $link->url, '@code' => $link->code)), 'warning', FALSE);
-        }
+/**
+ * Implements hook_form_BASE_FORM_ID_alter().
+ */
+function linkchecker_form_comment_form_alter(&$form, &$form_state, $form_id) {
+  // When displaying the form as 'view' or 'preview', show the broken links
+  // warning.
+  if ((empty($form_state['input']) || (isset($form_state['input']['op']) && $form_state['input']['op'] == t('Preview'))) && arg(0) == 'comment' && is_numeric(arg(1)) && arg(2) == 'edit') {
+    // Show a message on comment edit page if a link check failed once or
+    // more often.
+    $ignore_response_codes = preg_split('/(\r\n?|\n)/', variable_get('linkchecker_ignore_response_codes', "200\n206\n302\n304\n401\n403"));
+    $links = db_query('SELECT ll.* FROM {linkchecker_comment} lc INNER JOIN {linkchecker_link} ll ON lc.lid = ll.lid WHERE lc.cid = :cid AND ll.fail_count > :fail_count AND ll.status = :status AND ll.code NOT IN (:codes)', array(':cid' => arg(1), ':fail_count' => 0, ':status' => 1, ':codes' => $ignore_response_codes));
+    foreach ($links as $link) {
+      if (_linkchecker_link_access($link)) {
+        drupal_set_message(format_plural($link->fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $link->url, '@code' => $link->code)), 'warning', FALSE);
       }
-      break;
+    }
   }
 }
 
@@ -652,15 +967,19 @@ function linkchecker_form_alter(&$form, &$form_state, $form_id) {
  * Custom submit handler for block add page.
  */
 function linkchecker_block_custom_add_form_submit($form, &$form_state) {
-  $bid = db_query('SELECT MAX(bid) FROM {block_custom}')->fetchField();
-  _linkchecker_add_block_custom_links($form_state['values'], $bid);
+  if (variable_get('linkchecker_scan_blocks', 0)) {
+    $bid = db_query('SELECT MAX(bid) FROM {block_custom}')->fetchField();
+    _linkchecker_add_block_custom_links($form_state['values'], $bid);
+  }
 }
 
 /**
  * Custom submit handler for block configure page.
  */
 function linkchecker_block_custom_configure_form_submit($form, &$form_state) {
-  _linkchecker_add_block_custom_links($form_state['values'], $form_state['values']['delta']);
+  if (variable_get('linkchecker_scan_blocks', 0)) {
+    _linkchecker_add_block_custom_links($form_state['values'], $form_state['values']['delta']);
+  }
 }
 
 /**
@@ -671,35 +990,125 @@ function linkchecker_block_custom_delete_form_submit($form, &$form_state) {
 }
 
 /**
- * Add node links to database.
+ * Returns information from database about a user-created (custom) block.
+ *
+ * @param int $bid
+ *   ID of the block to get information for.
+ *
+ * @return object
+ *   Associative object of information stored in the database for this block.
+ *   Object keys:
+ *   - module: 'block' as the source of the custom blocks data.
+ *   - delta: Block ID.
+ *   - info: Block description.
+ *   - body['value']: Block contents.
+ *   - body['format']: Filter ID of the filter format for the body.
+ */
+function linkchecker_block_custom_block_get($bid) {
+  $block_custom = block_custom_block_get($bid);
+
+  if ($block_custom) {
+    $block = new stdClass();
+    $block->module = 'block';
+    $block->delta = $block_custom['bid'];
+    $block->info = $block_custom['info'];
+    $block->body = array();
+    $block->body['value'] = $block_custom['body'];
+    $block->body['format'] = $block_custom['format'];
+  }
+  else {
+    $block = FALSE;
+  }
+
+  return $block;
+}
+
+/**
+ * Extracts links from a node.
  *
  * @param object $node
  *   The fully populated node object.
- * @param bool $skip_missing_links_detection
- *   To prevent endless batch loops the value need to be TRUE. With FALSE
- *   the need for content re-scans is detected by the number of missing links.
+ * @param bool $return_field_names
+ *   If set to TRUE, the returned array will contain the link URLs as keys, and
+ *   each element will be an array containing all field names in which the URL
+ *   is found. Otherwise, a simple array of URLs will be returned.
+ *
+ * @return array
+ *   An array whose keys are fully qualified and unique URLs found in the node
+ *   (as returned by _linkchecker_extract_links()), or a more complex
+ *   structured array (see above) if $return_field_names is TRUE.
  */
-function _linkchecker_add_node_links($node, $skip_missing_links_detection = FALSE) {
-  // Get current node language options for url() functions.
-  $languages = language_list();
-  // Note: An "undefined language" (value: 'und') isn't listed in the available
-  // languages variable $languages.
-  $url_options = (empty($node->language) || empty($languages[$node->language])) ? array('absolute' => TRUE) : array('language' => $languages[$node->language], 'absolute' => TRUE);
+function _linkchecker_extract_node_links($node, $return_field_names = FALSE) {
 
-  $filter = new stdClass;
+  $filter = new stdClass();
   $filter->settings['filter_url_length'] = 72;
 
   // Create array of node fields to scan.
   $text_items = array();
-  $text_items[] = _filter_url($node->title, $filter);
-  $text_items = array_merge($text_items, linkchecker_parse_fields('node', $node, $node->type));
+  $text_items_by_field = array();
+
+  // Add fields typically not used for urls to the bottom. This way a link may
+  // found earlier while looping over $text_items_by_field below.
+  $text_items_by_field = array_merge($text_items_by_field, _linkchecker_parse_fields('node', $node->type, $node, TRUE));
+  $text_items_by_field['title'][] = _filter_url($node->title, $filter);
+  $text_items = _linkchecker_array_values_recursive($text_items_by_field);
 
   // Get the absolute node path for extraction of relative links.
+  $languages = language_list();
+  // Note: An "undefined language" (value: 'und') isn't listed in the available
+  // languages variable $languages.
+  $url_options = (empty($node->language) || empty($languages[$node->language])) ? array('absolute' => TRUE) : array('language' => $languages[$node->language], 'absolute' => TRUE);
   $path = url('node/' . $node->nid, $url_options);
 
   // Extract all links in a node.
   $links = _linkchecker_extract_links(implode(' ', $text_items), $path);
 
+  // Return either the array of links, or an array of field names containing
+  // each link, depending on what was requested.
+  if (!$return_field_names) {
+    return $links;
+  }
+  else {
+    $field_names = array();
+    foreach ($text_items_by_field as $field_name => $items) {
+      foreach ($items as $item) {
+        foreach ($links as $uri => $link) {
+          // We only need to do a quick check here to see if the URL appears
+          // anywhere in the text; if so, that means users with access to this
+          // field will be able to see the URL (and any private data such as
+          // passwords contained in it). This is sufficient for the purposes of
+          // _linkchecker_link_node_ids(), where this information is used.
+          foreach ($link as $original_link) {
+            if (strpos($item, $original_link) !== FALSE) {
+              $field_names[$uri][$field_name] = $field_name;
+            }
+            // URLs in $links have been auto-decoded by DOMDocument->loadHTML
+            // and does not provide the RAW url with html special chars.
+            // NOTE: htmlspecialchars() is 30% slower than str_replace().
+            elseif (strpos($item, str_replace('&', '&', $original_link)) !== FALSE) {
+              $field_names[$uri][$field_name] = $field_name;
+            }
+          }
+        }
+      }
+    }
+
+    return $field_names;
+  }
+}
+
+/**
+ * Add node links to database.
+ *
+ * @param object $node
+ *   The fully populated node object.
+ * @param bool $skip_missing_links_detection
+ *   To prevent endless batch loops the value need to be TRUE. With FALSE
+ *   the need for content re-scans is detected by the number of missing links.
+ */
+function _linkchecker_add_node_links($node, $skip_missing_links_detection = FALSE) {
+  $links = array_keys(_linkchecker_extract_node_links($node));
+
   // Node have links.
   if (!empty($links)) {
     // Remove all links from the links array already in the database and only
@@ -775,13 +1184,13 @@ function _linkchecker_add_node_links($node, $skip_missing_links_detection = FALS
  */
 function _linkchecker_add_comment_links($comment, $skip_missing_links_detection = FALSE) {
 
-  $filter = new stdClass;
+  $filter = new stdClass();
   $filter->settings['filter_url_length'] = 72;
 
   // Create array of comment fields to scan.
   $text_items = array();
   $text_items[] = _filter_url($comment->subject, $filter);
-  $text_items = array_merge($text_items, linkchecker_parse_fields('comment', $comment, $comment->node_type));
+  $text_items = array_merge($text_items, _linkchecker_parse_fields('comment', $comment->node_type, $comment));
 
   // Get the absolute node path for extraction of relative links.
   $languages = language_list();
@@ -790,7 +1199,7 @@ function _linkchecker_add_comment_links($comment, $skip_missing_links_detection
   $path = url('node/' . $comment->nid, $url_options);
 
   // Extract all links in a comment.
-  $links = _linkchecker_extract_links(implode(' ', $text_items), $path);
+  $links = array_keys(_linkchecker_extract_links(implode(' ', $text_items), $path));
 
   // Comment have links.
   if (!empty($links)) {
@@ -869,15 +1278,18 @@ function _linkchecker_add_comment_links($comment, $skip_missing_links_detection
  */
 function _linkchecker_add_block_custom_links($block_custom, $bid, $skip_missing_links_detection = FALSE) {
   // Convert custom block array to object.
+  // @todo: Are we able to remove this global conversion?
   $block_custom = (object) $block_custom;
 
-  // Custom blocks really suxxx as it's very inconsistent core logic.
-  // Try to hack around this bad logic as good as possible to prevent issues.
-  if ($block_custom->module != 'block' && !is_numeric($block_custom->delta) && !is_numeric($bid) && $block_custom->delta != $bid) {
+  // Custom blocks really suxxx as it's very inconsistent core logic (values are
+  // integers or strings) and there are no usable hooks. Try to workaround this
+  // bad logic as good as possible to prevent warnings/errors.
+  // NOTE: Only custom blocks from block.module are supported. Skip all others.
+  if ($block_custom->module != 'block' || !is_numeric($block_custom->delta) || !is_numeric($bid) || $block_custom->delta != $bid) {
     return;
   }
 
-  $filter = new stdClass;
+  $filter = new stdClass();
   $filter->settings['filter_url_length'] = 72;
 
   // Create array of custom block fields to scan. All fields cannot exists.
@@ -885,17 +1297,13 @@ function _linkchecker_add_block_custom_links($block_custom, $bid, $skip_missing_
   if (!empty($block_custom->info)) {
     $text_items[] = _filter_url($block_custom->info, $filter);
   }
-  // $block_custom from a scan for links in blocks. See block_custom_block_get().
-  if (!is_array($block_custom->body) && !empty($block_custom->body) && isset($block_custom->format)) {
-    $text_items[] = _linkchecker_check_markup($block_custom->body, $block_custom->format);
-  }
-  // $block_custom from editing a block. See block_custom_block_save().
-  if (is_array($block_custom->body) && array_key_exists('value', $block_custom->body) && array_key_exists('format', $block_custom->body)) {
+  // $block_custom from editing/scanning a block. See block_custom_block_save().
+  if (!empty($block_custom->body) && is_array($block_custom->body) && array_key_exists('value', $block_custom->body) && array_key_exists('format', $block_custom->body)) {
     $text_items[] = _linkchecker_check_markup($block_custom->body['value'], $block_custom->body['format']);
   }
 
   // Extract all links in a custom block.
-  $links = _linkchecker_extract_links(implode(' ', $text_items));
+  $links = array_keys(_linkchecker_extract_links(implode(' ', $text_items)));
 
   // Custom block has links.
   if (!empty($links)) {
@@ -1105,71 +1513,127 @@ function _linkchecker_block_custom_links_missing($bid, $links) {
  * This function parse all fields from the entity and returns an array of
  * filtered field items.
  *
- * @param string $bundle
- *   The bundle type to parse. Examples types are 'node', 'comment'.
+ * @param string $entity_type
+ *   The type of entity; e.g., 'node', 'comment'.
+ * @param string $bundle_name
+ *   The name of the bundle aka node type, e.g., 'article', 'page'.
  * @param object $entity
- *   The entity to parse, a node or a comment object.
- * @param string $type
- *   Content type name e.g. $node->type or $comment->node_type.
+ *   The entity to parse, a $node or a $comment object.
+ * @param bool $return_field_names
+ *   If set to TRUE, the returned array will contain the content as keys, and
+ *   each element will be an array containing all field names in which the
+ *   content is found. Otherwise, a simple array with content will be returned.
  *
  * @return array
  *   Array of field items with filters applied.
  */
-function linkchecker_parse_fields($bundle, $entity, $type) {
+function _linkchecker_parse_fields($entity_type, $bundle_name, $entity, $return_field_names = FALSE) {
   $text_items = array();
-  $field_list = field_info_fields();
+  $text_items_by_field = array();
 
   // Create settings for _filter_url() function.
-  $filter = new stdClass;
+  $filter = new stdClass();
   $filter->settings['filter_url_length'] = 72;
 
-  foreach ($field_list as $name => $field) {
-    if (!empty($field['bundles'][$bundle]) && in_array($type, $field['bundles'][$bundle])) {
-      // @todo This is because of a php parse error.
-      if (empty($entity->$name)) {
-        continue;
-      }
-      $entity_field = $entity->$name;
-
-      switch ($field['type']) {
-        // Core fields.
-        case 'text_with_summary':
-          foreach ($entity_field as $language) {
-            foreach ($language as $item) {
-              $format = isset($item['format']) ? $item['format'] : NULL;
-              $text_items[] = _linkchecker_check_markup($item['value'], $format, $entity->language, TRUE);
-              $text_items[] = _linkchecker_check_markup($item['summary'], $format, $entity->language, TRUE);
-            }
+  // Collect the fields from this entity_type and bundle.
+  foreach (field_info_instances($entity_type, $bundle_name) as $field_name => $instance) {
+    $field = field_info_field($field_name);
+    $entity_field = $entity->$field['field_name'];
+
+    switch ($field['type']) {
+      // Core fields.
+      case 'text_with_summary':
+        foreach ($entity_field as $language) {
+          foreach ($language as $item) {
+            $format = isset($item['format']) ? $item['format'] : NULL;
+            $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($item['value'], $format, linkchecker_entity_language($entity_type, $entity), TRUE);
+            $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($item['summary'], $format, linkchecker_entity_language($entity_type, $entity), TRUE);
           }
-          break;
-
-        // Core fields.
-        case 'text_long':
-        case 'text':
-          foreach ($entity_field as $language) {
-            foreach ($language as $item) {
-              $format = isset($item['format']) ? $item['format'] : NULL;
-              $text_items[] = _linkchecker_check_markup($item['value'], $format, $entity->language, TRUE);
-            }
+        }
+        break;
+
+      // Core fields.
+      case 'text_long':
+      case 'text':
+        foreach ($entity_field as $language) {
+          foreach ($language as $item) {
+            $format = isset($item['format']) ? $item['format'] : NULL;
+            $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($item['value'], $format, linkchecker_entity_language($entity_type, $entity), TRUE);
           }
-          break;
-
-        // Link module field, http://drupal.org/project/link.
-        case 'link_field':
-          foreach ($entity_field as $language) {
-            foreach ($language as $item) {
-              $options = drupal_parse_url($item['url']);
-              $title = !empty($item['title']) ? $item['title'] : '';
-              $text_items[] = l($title, $options['path'], $options);
-              $text_items[] = _linkchecker_check_markup($title, NULL, $entity->language, TRUE);
-            }
+        }
+        break;
+
+      // Link module field, http://drupal.org/project/link.
+      case 'link_field':
+        foreach ($entity_field as $language) {
+          foreach ($language as $item) {
+            $options = drupal_parse_url($item['url']);
+            $title = !empty($item['title']) ? $item['title'] : '';
+            $text_items[] = $text_items_by_field[$field['field_name']][] = l($title, $options['path'], $options);
+            $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($title, NULL, linkchecker_entity_language($entity_type, $entity), TRUE);
           }
-          break;
-      }
+        }
+        break;
     }
   }
 
-  return $text_items;
+  return ($return_field_names) ? $text_items_by_field : $text_items;
+}
+
+/**
+ * Replace the old url by a new url on 301 status codes.
+ *
+ * @param string $entity_type
+ *   The type of entity; e.g., 'node', 'comment'.
+ * @param string $bundle_name
+ *   The name of the bundle aka node type, e.g., 'article', 'page'.
+ * @param object $entity
+ *   The entity to parse, a $node or a $comment object.
+ * @param string $old_url
+ *   The previous url.
+ * @param string $new_url
+ *   The new url to replace the old.
+ */
+function _linkchecker_replace_fields($entity_type, $bundle_name, $entity, $old_url, $new_url) {
+  // Collect the fields from this entity_type and bundle.
+  foreach (field_info_instances($entity_type, $bundle_name) as $field_name => $instance) {
+    $field = field_info_field($field_name);
+    $entity_field =& $entity->$field['field_name'];
+
+    switch ($field['type']) {
+      // Core fields.
+      case 'text_with_summary':
+        foreach ($entity_field as $language_name => $language_value) {
+          foreach ($language_value as $item_name => $item_value) {
+            _linkchecker_link_replace($entity_field[$language_name][$item_name]['value'], $old_url, $new_url);
+            _linkchecker_link_replace($entity_field[$language_name][$item_name]['summary'], $old_url, $new_url);
+          }
+        }
+        break;
+
+      // Core fields.
+      case 'text_long':
+      case 'text':
+        foreach ($entity_field as $language_name => $language_value) {
+          foreach ($language_value as $item_name => $item_value) {
+            _linkchecker_link_replace($entity_field[$language_name][$item_name]['value'], $old_url, $new_url);
+          }
+        }
+        break;
+
+      // Link module field, http://drupal.org/project/link.
+      case 'link_field':
+        foreach ($entity_field as $language_name => $language_value) {
+          foreach ($language_value as $item_name => $item_value) {
+            _linkchecker_link_replace($entity_field[$language_name][$item_name]['url'], $old_url, $new_url);
+            _linkchecker_link_replace($entity_field[$language_name][$item_name]['title'], $old_url, $new_url);
+          }
+        }
+        break;
+    }
+  }
+
+  return $entity;
 }
 
 /**
@@ -1236,17 +1700,19 @@ function _linkchecker_cleanup_links() {
  * Extract links from content.
  *
  * @param string $text
- *    The text to be scanned for links.
+ *   The text to be scanned for links.
  * @param string $content_path
- *    Path to the content that is currently scanned for links. This value is
- *    required to build full qualified links from relative links. Relative links
- *    are not extracted from content, if path is not provided.
+ *   Path to the content that is currently scanned for links. This value is
+ *   required to build full qualified links from relative links. Relative links
+ *   are not extracted from content, if path is not provided.
  *
  * @return array
- *    Array of full qualified and unique URLs found in content.
+ *   Array whose keys are fully qualified and unique URLs found in the
+ *   content, and whose values are arrays of actual text (raw URLs or paths)
+ *   corresponding to each fully qualified URL.
  */
 function _linkchecker_extract_links($text = '', $content_path = NULL) {
-  global $base_root;
+  global $base_root, $is_https;
 
   $html_dom = filter_dom_load($text);
   $urls = array();
@@ -1322,7 +1788,7 @@ function _linkchecker_extract_links($text = '', $content_path = NULL) {
       foreach ($params as $param) {
         // @todo
         // - Try to extract links in unkown "flashvars" values
-        //   (e.g. file=http://, data=http://).
+        //   (e.g., file=http://, data=http://).
         $names = array('archive', 'filename', 'href', 'movie', 'src', 'url');
         if ($param->hasAttribute('name') && in_array($param->getAttribute('name'), $names)) {
           $urls[] = $param->getAttribute('value');
@@ -1356,8 +1822,6 @@ function _linkchecker_extract_links($text = '', $content_path = NULL) {
     }
   }
 
-  // Decode HTML links into plain text links.
-  $urls = array_map('decode_entities', $urls);
   // Remove empty values.
   $urls = array_filter($urls);
   // Remove duplicate urls.
@@ -1368,16 +1832,28 @@ function _linkchecker_extract_links($text = '', $content_path = NULL) {
 
   $links = array();
   foreach ($urls as $url) {
-    // @todo #1149596 HACK - Encode spaces in URLs, so validation equals TRUE
-    // and link gets added.
-    $url_encoded = str_replace(' ', '%20', $url);
+    // Decode HTML links into plain text links.
+    // DOMDocument->loadHTML does not provide the RAW url from code. All html
+    // entities are already decoded.
+    // @todo: Try to find a way to get the raw value.
+    $url_decoded = $url;
+
+    // Prefix protocol relative urls with a protocol to allow link checking.
+    if (preg_match('!^//!', $url_decoded)) {
+      $http_protocol = $is_https ? 'https' : 'http';
+      $url_decoded = $http_protocol . ':' . $url_decoded;
+    }
+
+    // FIXME: #1149596 HACK - Encode spaces in URLs, so validation equals TRUE and link gets added.
+    $url_encoded = str_replace(' ', '%20', $url_decoded);
 
     // Full qualified URLs.
     if ($linkchecker_check_links_types != 2 && valid_url($url_encoded, TRUE)) {
-      $links[] = $url;
+      // Add to Array and change HTML links into plain text links.
+      $links[$url_decoded][] = $url;
     }
     // Skip mailto:, javascript:, etc.
-    elseif (preg_match('/^\w[\w.+]*:/', $url)) {
+    elseif (preg_match('/^\w[\w.+]*:/', $url_decoded)) {
       continue;
     }
     // Local URLs. $linkchecker_check_links_types = 0 or 2
@@ -1386,23 +1862,25 @@ function _linkchecker_extract_links($text = '', $content_path = NULL) {
       $absolute_content_path = _linkchecker_absolute_content_path($content_path);
 
       // Absolute local URLs need to start with [/].
-      if (preg_match('!^/!', $url)) {
-        $links[] = $base_root . $url;
+      if (preg_match('!^/!', $url_decoded)) {
+        // Add to Array and change HTML encoded links into plain text links.
+        $links[$base_root . $url_decoded][] = $url;
       }
       // Anchors and URL parameters like "#foo" and "?foo=bar".
-      elseif (!empty($content_path) && preg_match('!^[?#]!', $url)) {
-        $links[] = $content_path . $url;
+      elseif (!empty($content_path) && preg_match('!^[?#]!', $url_decoded)) {
+        // Add to Array and change HTML encoded links into plain text links.
+        $links[$content_path . $url_decoded][] = $url;
       }
       // Relative URLs like "./foo/bar" and "../foo/bar".
-      elseif (!empty($absolute_content_path) && preg_match('!^\.{1,2}/!', $url)) {
+      elseif (!empty($absolute_content_path) && preg_match('!^\.{1,2}/!', $url_decoded)) {
         // Build the URI without hostname before the URI is normalized and
         // dot-segments will be removed. The hostname is added back after the
         // normalization has completed to prevent hostname removal by the regex.
         // This logic intentionally does not implement all the rules definied in
         // RFC 3986, section 5.2.4 to show broken links and over-dot-segmented
-        // URIs; e.g. http://example.com/../../foo/bar.
+        // URIs; e.g., http://example.com/../../foo/bar.
         // For more information, see http://drupal.org/node/832388.
-        $path = substr_replace($absolute_content_path . $url, '', 0, strlen($base_root));
+        $path = substr_replace($absolute_content_path . $url_decoded, '', 0, strlen($base_root));
 
         // Remove './' segments where possible.
         $path = str_replace('/./', '/', $path);
@@ -1416,11 +1894,11 @@ function _linkchecker_extract_links($text = '', $content_path = NULL) {
         }
 
         // Glue the hostname and path to full-qualified URI.
-        $links[] = $base_root . $path;
+        $links[$base_root . $path][] = $url;
       }
       // Relative URLs like "test.png".
-      elseif (!empty($absolute_content_path) && preg_match('!^[^/]!', $url)) {
-        $links[] = $absolute_content_path . $url;
+      elseif (!empty($absolute_content_path) && preg_match('!^[^/]!', $url_decoded)) {
+        $links[$absolute_content_path . $url_decoded][] = $url;
       }
       else {
         // @todo Are there more special cases the module need to handle?
@@ -1428,7 +1906,7 @@ function _linkchecker_extract_links($text = '', $content_path = NULL) {
     }
   }
 
-  return array_unique($links);
+  return $links;
 }
 
 /**
@@ -1447,7 +1925,7 @@ function _linkchecker_link_replace(&$text, $old_link_fqdn = '', $new_link_fqdn =
     // Remove protocols and hostname from local URLs.
     $base_roots = array(
       drupal_strtolower('http://' . $_SERVER['HTTP_HOST']),
-      drupal_strtolower('https://' . $_SERVER['HTTP_HOST'])
+      drupal_strtolower('https://' . $_SERVER['HTTP_HOST']),
     );
     $old_link = str_replace($base_roots, '', $old_link_fqdn);
     $new_link = str_replace($base_roots, '', $new_link_fqdn);
@@ -1481,7 +1959,7 @@ function _linkchecker_link_replace(&$text, $old_link_fqdn = '', $new_link_fqdn =
       // ampersand "&".
       $old_links = array_unique($old_links);
 
-      // Load HTML code into DOM
+      // Load HTML code into DOM.
       $html_dom = filter_dom_load($text);
 
       // Finds all hyperlinks in the content.
@@ -1586,7 +2064,7 @@ function _linkchecker_link_replace(&$text, $old_link_fqdn = '', $new_link_fqdn =
           foreach ($params as $param) {
             // @todo
             // - Try to replace links in unkown "flashvars" values
-            //   (e.g. file=http://, data=http://).
+            //   (e.g., file=http://, data=http://).
             $names = array('archive', 'filename', 'href', 'movie', 'src', 'url');
             if ($param->hasAttribute('name') && in_array($param->getAttribute('name'), $names)) {
               if (in_array($param->getAttribute('value'), $old_links)) {
@@ -1696,7 +2174,7 @@ function _linkchecker_check_markup($text, $format_id = NULL, $langcode = '', $ca
   // Perform filtering.
   foreach ($filters as $name => $filter) {
     if (!in_array($name, $filters_blacklist)) {
-        if ($filter->status && isset($filter_info[$name]['process callback']) && function_exists($filter_info[$name]['process callback'])) {
+      if ($filter->status && isset($filter_info[$name]['process callback']) && function_exists($filter_info[$name]['process callback'])) {
         $function = $filter_info[$name]['process callback'];
         $text = $function($text, $filter, $format, $langcode, $cache, $cache_id);
       }
@@ -1860,10 +2338,13 @@ function _linkchecker_scan_nodetype($node_type = NULL) {
  *   A link ID that have reached a defined failcount.
  */
 function _linkchecker_unpublish_nodes($lid) {
-  $nids = db_query('SELECT nid FROM {linkchecker_node} WHERE lid = :lid', array(':lid' => $lid))->fetchCol();
-
-  $nodes = node_load_multiple($nids);
-  foreach ($nodes as $node) {
+  $result = db_query('SELECT nid FROM {linkchecker_node} WHERE lid = :lid', array(':lid' => $lid));
+  foreach ($result as $row) {
+    // Explicitly don't use node_load_multiple() or the module may run
+    // into issues like http://drupal.org/node/1210606. With this logic
+    // nodes can be updated until an out of memory occurs and further
+    // updates will be made on the remaining nodes only.
+    $node = node_load($row->nid);
     $node->status = NODE_NOT_PUBLISHED;
     node_save($node);
     watchdog('linkchecker', 'Set @type %title to unpublished.', array('@type' => $node->type, '%title' => $node->title));
@@ -1876,3 +2357,145 @@ function _linkchecker_unpublish_nodes($lid) {
 function linkchecker_link_load($lid) {
   return db_query('SELECT * FROM {linkchecker_link} WHERE lid = :lid', array(':lid' => $lid))->fetchObject();
 }
+
+/**
+ * Impersonates another user, see http://drupal.org/node/287292#comment-3162350.
+ *
+ * Each time this function is called, the active user is saved and $new_user
+ * becomes the active user. Multiple calls to this function can be nested,
+ * and session saving will be disabled until all impersonation attempts have
+ * been reverted using linkchecker_revert_user().
+ *
+ * @param int|object $new_user
+ *   User to impersonate, either a UID or a user object.
+ *
+ * @return object
+ *   Current user object.
+ *
+ * @see linkchecker_revert_user()
+ */
+function linkchecker_impersonate_user($new_user = NULL) {
+  global $user;
+  $user_original = &drupal_static(__FUNCTION__);
+
+  if (!isset($new_user)) {
+    if (isset($user_original) && !empty($user_original)) {
+      // Restore the previous user from the stack.
+      $user = array_pop($user_original);
+
+      // Re-enable session saving if we are no longer impersonating a user.
+      if (empty($user_original)) {
+        drupal_save_session(TRUE);
+      }
+    }
+  }
+  else {
+    // Push the original user onto the stack and prevent session saving.
+    $user_original[] = $user;
+    drupal_save_session(FALSE);
+
+    if (is_numeric($new_user)) {
+      $user = user_load($new_user);
+    }
+    else {
+      $user = is_object($new_user) ? $new_user : (object) $new_user;
+    }
+  }
+
+  return $user;
+}
+
+/**
+ * Reverts to the previous user after impersonating.
+ *
+ * @return object
+ *   Current user.
+ *
+ * @see linkchecker_impersonate_user()
+ */
+function linkchecker_revert_user() {
+  return linkchecker_impersonate_user();
+}
+
+/**
+ * Checks if this entity is the default revision (published).
+ *
+ * @param object $entity
+ *   The entity object, e.g., $node.
+ *
+ * @return bool
+ *   TRUE if the entity is the default revision, FALSE otherwise.
+ */
+function _linkchecker_isdefaultrevision($entity) {
+  // D7 "Forward revisioning" is complex and causes a node_save() with the
+  // future node in node table. This fires hook_node_update() twice and cause
+  // abnormal behaviour in linkchecker.
+  //
+  // The steps taken by Workbench Moderation is to save the forward revision
+  // first and overwrite this with the live version in a shutdown function in
+  // a second step. This will confuse linkchecker. D7 has no generic property
+  // in the node object, if the node that is updated is the 'published' version
+  // or only a draft of a future version.
+  //
+  // This behaviour will change in D8 where $node->isDefaultRevision has been
+  // introduced. See below links for more details.
+  // - http://drupal.org/node/1879482
+  // - http://drupal.org/node/218755
+  // - http://drupal.org/node/1522154
+  //
+  // Every moderation module saving a forward revision needs to return FALSE.
+  // @todo: Refactor this workaround under D8.
+
+  // Workbench Moderation module.
+  if (module_exists('workbench_moderation') && workbench_moderation_node_type_moderated($entity->type) === TRUE && empty($entity->workbench_moderation['updating_live_revision'])) {
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+/**
+ * Returns the language code of the given entity.
+ *
+ * Backward compatibility layer to ensure that installations running an older
+ * version of core where entity_language() is not avilable do not break.
+ *
+ * @param string $entity_type
+ *   An entity type.
+ * @param object $entity
+ *   An entity object.
+ *
+ * @return string
+ *   The entity language code.
+ */
+function linkchecker_entity_language($entity_type, $entity) {
+  $langcode = NULL;
+  if (function_exists('entity_language')) {
+    $langcode = entity_language($entity_type, $entity);
+  }
+  elseif (!empty($entity->language)) {
+    $langcode = $entity->language;
+  }
+  return $langcode;
+}
+
+/**
+ * Return all the values of one-dimensional and multidimensional arrays.
+ *
+ * @return array
+ *   Returns all the values from the input array and indexes the array numerically.
+ */
+function _linkchecker_array_values_recursive(array $array) {
+  $array_values = array();
+
+  foreach ($array as $value) {
+    if (is_array($value)) {
+      $array_values = array_merge($array_values, _linkchecker_array_values_recursive($value));
+    }
+    else {
+      $array_values[] = $value;
+    }
+  }
+
+  return $array_values;
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.pages.inc b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.pages.inc
index a08c08c..b533149 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.pages.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.pages.inc
@@ -61,7 +61,7 @@ function linkchecker_user_report_page($account) {
     ->condition('r.uid', $account->uid)
   );
   $subquery2->distinct();
-  $subquery2->fields('ll' , array('lid'));
+  $subquery2->fields('ll', array('lid'));
 
   if (variable_get('linkchecker_scan_comments', 0)) {
     // Build query for broken links in nodes and comments of the current user.
@@ -73,7 +73,7 @@ function linkchecker_user_report_page($account) {
     $subquery3->condition('ll.code', $ignore_response_codes, 'NOT IN');
     $subquery3->condition('c.uid', $account->uid);
     $subquery3->distinct();
-    $subquery3->fields('ll' , array('lid'));
+    $subquery3->fields('ll', array('lid'));
 
     // UNION the linkchecker_node and linkchecker_comment tables.
     $subquery1 = db_select($subquery2->union($subquery3), 'q1')->fields('q1', array('lid'));
@@ -135,6 +135,21 @@ function _linkchecker_report_page($query, $account = NULL) {
 
   $rows = array();
   foreach ($result as $link) {
+    // Get the node, block and comment IDs that refer to this broken link and
+    // that the current user has access to.
+    $nids = _linkchecker_link_node_ids($link, $account);
+    $cids = _linkchecker_link_comment_ids($link, $account);
+    $bids = _linkchecker_link_block_ids($link);
+
+    // If the user does not have access to see this link anywhere, do not
+    // display it, for reasons explained in _linkchecker_link_access(). We
+    // still need to fill the table row, though, so as not to throw off the
+    // number of items in the pager.
+    if (empty($nids) && empty($cids) && empty($bids)) {
+      $rows[] = array(array('data' => t('Permission restrictions deny you access to this broken link.'), 'colspan' => count($header)));
+      continue;
+    }
+
     $links = array();
 
     // Show links to link settings.
@@ -143,39 +158,21 @@ function _linkchecker_report_page($query, $account = NULL) {
     }
 
     // Show link to nodes having this broken link.
-    if (!empty($account)) {
-      $nodes = db_query('SELECT ln.nid
-        FROM {linkchecker_node} ln
-        INNER JOIN {node} n ON n.nid = ln.nid
-        INNER JOIN {node_revision} r ON r.vid = n.vid
-        WHERE ln.lid = :lid AND (n.uid = :uid1 OR r.uid = :uid2)', array(':lid' => $link->lid, ':uid1' => $account->uid, ':uid2' => $account->uid));
-    }
-    else {
-      $nodes = db_query('SELECT nid FROM {linkchecker_node} WHERE lid = :lid', array(':lid' => $link->lid));
-    }
-    foreach ($nodes as $node) {
-      $links[] = l(t('Edit node @node', array('@node' => $node->nid)), 'node/' . $node->nid . '/edit', array('query' => drupal_get_destination()));
+    foreach ($nids as $nid) {
+      $links[] = l(t('Edit node @node', array('@node' => $nid)), 'node/' . $nid . '/edit', array('query' => drupal_get_destination()));
     }
 
     // Show link to comments having this broken link.
-    if (!empty($account) && variable_get('linkchecker_scan_comments', 0)) {
-      $comments = db_query('SELECT lc.cid
-        FROM {linkchecker_comment} lc
-        INNER JOIN {comment} c ON c.cid = lc.cid
-        WHERE lc.lid = :lid AND c.uid = :uid', array(':lid' => $link->lid, ':uid' => $account->uid));
-    }
-    else {
-      $comments = db_query('SELECT cid FROM {linkchecker_comment} WHERE lid = :lid', array(':lid' => $link->lid));
-    }
-    foreach ($comments as $comment) {
-      $links[] = l(t('Edit comment @comment', array('@comment' => $comment->cid)), 'comment/' . $comment->cid . '/edit', array('query' => drupal_get_destination()));
+    if (module_exists('comment') && variable_get('linkchecker_scan_comments', 0)) {
+      foreach ($cids as $cid) {
+        $links[] = l(t('Edit comment @comment', array('@comment' => $cid)), 'comment/' . $cid . '/edit', array('query' => drupal_get_destination()));
+      }
     }
 
     // Show link to blocks having this broken link.
     if ($access_administer_blocks) {
-      $blocks_custom = db_query('SELECT bid FROM {linkchecker_block_custom} WHERE lid = :lid', array(':lid' => $link->lid));
-      foreach ($blocks_custom as $block_custom) {
-        $links[] = l(t('Edit block @block', array('@block' => $block_custom->bid)), 'admin/structure/block/manage/block/' . $block_custom->bid . '/configure', array('query' => drupal_get_destination()));
+      foreach ($bids as $bid) {
+        $links[] = l(t('Edit block @block', array('@block' => $bid)), 'admin/structure/block/manage/block/' . $bid . '/configure', array('query' => drupal_get_destination()));
       }
     }
 
@@ -185,30 +182,30 @@ function _linkchecker_report_page($query, $account = NULL) {
     }
 
     // Create table data for output.
-    $rows[] = array('data' =>
-      array(
+    $rows[] = array(
+      'data' => array(
         l(_filter_url_trim($link->url, 40), $link->url),
         $link->code,
         check_plain($link->error),
-        theme('item_list', array('items' => $links))
+        theme('item_list', array('items' => $links)),
       ),
     );
   }
 
-  if (empty($rows)) {
-    $rows[] = array(array('data' => t('No broken links have been found.'), 'colspan' => count($header)));
-  }
-
   $build['linkchecker_table'] = array(
     '#theme' => 'table',
     '#header' => $header,
     '#rows' => $rows,
+    '#empty' => t('No broken links have been found.'),
   );
   $build['linkchecker_pager'] = array('#theme' => 'pager');
 
   return $build;
 }
 
+/**
+ * Edit link settings form.
+ */
 function linkchecker_link_edit_form($form, &$form_state, $link) {
 
   $form['settings'] = array(
@@ -258,6 +255,9 @@ function linkchecker_link_edit_form($form, &$form_state, $link) {
   return $form;
 }
 
+/**
+ * Edit link settings form submit handler.
+ */
 function linkchecker_link_edit_form_submit($form, &$form_state) {
   // Force link re-check asap.
   if ($form_state['values']['recheck']) {
@@ -276,7 +276,7 @@ function linkchecker_link_edit_form_submit($form, &$form_state) {
         'method' => $form_state['values']['method'],
         'fail_count' => 0,
         'last_checked' => 0,
-        'status' => $form_state['values']['status']
+        'status' => $form_state['values']['status'],
       ))
       ->execute();
     drupal_set_message(t('The link settings for %url have been saved and the fail counter has been reset.', array('%url' => $form_state['values']['url'])));
@@ -287,13 +287,22 @@ function linkchecker_link_edit_form_submit($form, &$form_state) {
       ->condition('lid', $form_state['values']['lid'])
       ->fields(array(
         'method' => $form_state['values']['method'],
-        'status' => $form_state['values']['status']
+        'status' => $form_state['values']['status'],
       ))
       ->execute();
     drupal_set_message(t('The link settings for %url have been saved.', array('%url' => $form_state['values']['url'])));
   }
 }
 
+/**
+ * Check if the link is an internal URL or not.
+ *
+ * @param object $link
+ *   Link object.
+ *
+ * @return bool
+ *   TRUE if link is internal, otherwise FALSE.
+ */
 function _linkchecker_is_internal_url(&$link) {
   global $base_url;
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.redirect.inc b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.redirect.inc
index 60e7296..0b1ea20 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.redirect.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.redirect.inc
@@ -13,8 +13,8 @@ function linkchecker_redirect_insert($redirect) {
 }
 
 /**
-* Implements hook_redirect_update().
-*/
+ * Implements hook_redirect_update().
+ */
 function linkchecker_redirect_update($redirect) {
   // It's unknown if this is a redirect for HTTP/HTTPS or the encoded urls.
   $url_http = url($redirect->source, array('absolute' => TRUE, $redirect->source_options));
@@ -41,7 +41,7 @@ function _linkchecker_redirect_reset($urls = array()) {
 
   $num_updated = db_update('linkchecker_link')
     ->condition('urlhash', array_map('drupal_hash_base64', $urls))
-    ->condition('fail_count',  0, '>')
+    ->condition('fail_count', 0, '>')
     ->condition('status', 1)
     ->fields(array('last_checked' => 0))
     ->execute();
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.test b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.test
index d4ea142..81ecaff 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.test
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/linkchecker/linkchecker.test
@@ -4,11 +4,12 @@
  * @file
  * Test file for Link checker module.
  */
+
 class LinkCheckerLinkExtractionTest extends DrupalWebTestCase {
 
   public static function getInfo() {
     return array(
-      'name' => t('Link extraction tests'),
+      'name' => t('Link checker link extraction tests'),
       'description' => t('Test Link checker module link extraction functionality.'),
       'group' => 'Link checker',
     );
@@ -182,11 +183,12 @@ EOT;
     $folder2 = $this->randomName(5);
 
     // Fill node array.
+    $langcode = LANGUAGE_NONE;
     $edit = array();
     $edit['title'] = $this->randomName(32);
-    $edit['body[und][0][value]'] = $body;
+    $edit["body[$langcode][0][value]"] = $body;
     $edit['path[alias]'] = $folder1 . '/' . $folder2;
-    $edit['body[und][0][format]'] = 'full_html';
+    $edit["body[$langcode][0][format]"] = 'full_html';
 
     // Extract only full qualified URLs.
     variable_set('linkchecker_check_links_types', 1);
@@ -198,12 +200,9 @@ EOT;
 
     // Save node.
     $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->assertText(t('@type @title has been created.', array('@type' => 'Basic page', '@title' => $edit['title'])), t('Node was created.'));
 
-    // @todo fix this test
-    // $this->assertText(t('@type %title has been created.', array('@type' => 'Basic page', '%title' => $edit['title'])), t('Node was created.'));
-    $this->assertText(t('has been created.'), t('Node was created.'));
-
-    // Verify if the content links are extracted correctly.
+    // Verify if the content links are extracted properly.
     $urls_fqdn = array(
       'http://www.lagrandeepicerie.fr/#e-boutique/Les_produits_du_moment,2/coffret_vins_doux_naturels,149',
       'http://wetterservice.msn.de/phclip.swf?zip=60329&ort=Frankfurt',
@@ -259,7 +258,7 @@ EOT;
     // @todo Path alias seems not saved!???
     // $this->assertIdentical($node->path, $edit['path'], t('URL alias "@node-path" matches path "@edit-path".', array('@node-path' => $node->path, '@edit-path' => $edit['path'])));
 
-    // Verify if the content links are extracted correctly.
+    // Verify if the content links are extracted properly.
     global $base_root, $base_path;
     $urls_relative = array(
       '../foo1/test.png' => $base_root . $base_path . 'foo1/test.png',
@@ -302,7 +301,6 @@ EOT;
     $urls_expected_count = count($urls_fqdn + $urls_relative);
     $this->assertEqual($urls_in_database, $urls_expected_count, t('Found @urls_in_database URLs in database matches expected result of @urls_expected_count.', array('@urls_in_database' => $urls_in_database, '@urls_expected_count' => $urls_expected_count)));
 
-
     // Verify if link check has been enabled for normal URLs.
     $urls = array(
       'http://www.lagrandeepicerie.fr/#e-boutique/Les_produits_du_moment,2/coffret_vins_doux_naturels,149',
@@ -335,7 +333,6 @@ EOT;
       $this->assertTrue($this->getLinkcheckerLink($url)->status, t('Link check for %url is enabled.', array('%url' => $url)));
     }
 
-
     // Verify if link check has been disabled for example.com/net/org URLs.
     $documentation_urls = array(
       'http://example.net/video/foo1.mov',
@@ -380,3 +377,266 @@ EOT;
     return db_query('SELECT COUNT(1) FROM {linkchecker_link}')->fetchField();
   }
 }
+
+
+class LinkCheckerInterfaceTest extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => t('Link checker interface tests'),
+      'description' => t('Test the interface functionality.'),
+      'group' => 'Link checker',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp('block', 'linkchecker', 'path');
+    // @todo: Add comment interface test.
+    // parent::setUp('block', 'comment', 'linkchecker', 'path');
+
+    $full_html_format = filter_format_load('full_html');
+    $permissions = array(
+      // Block permissions.
+      'administer blocks',
+      // Comment permissions.
+      'administer comments',
+      'access comments',
+      'post comments',
+      'skip comment approval',
+      'edit own comments',
+      // Node permissions.
+      'create page content',
+      'edit own page content',
+      // Path aliase permissions.
+      'administer url aliases',
+      'create url aliases',
+      // Content filter permissions.
+      filter_permission_name($full_html_format),
+    );
+
+    $user = $this->drupalCreateUser($permissions);
+    $this->drupalLogin($user);
+
+  }
+
+  public function testLinkCheckerCreateNodeWithBrokenLinks() {
+    // Enable all node type page for link extraction.
+    variable_set('linkchecker_scan_nodetypes', array('page'));
+
+    // Core enables the URL filter for "Full HTML" by default.
+    // -> Blacklist / Disable URL filter for testing.
+    variable_set('linkchecker_filter_blacklist', array('filter_url' => 'filter_url'));
+
+    // Extract from all link checker supported HTML tags.
+    variable_set('linkchecker_extract_from_a', 1);
+    variable_set('linkchecker_extract_from_audio', 1);
+    variable_set('linkchecker_extract_from_embed', 1);
+    variable_set('linkchecker_extract_from_iframe', 1);
+    variable_set('linkchecker_extract_from_img', 1);
+    variable_set('linkchecker_extract_from_object', 1);
+    variable_set('linkchecker_extract_from_video', 1);
+
+    $url1 = 'http://example.com/node/broken/link';
+    $body = 'Lorem ipsum dolor sit amet <a href="' . $url1 . '">broken link</a> sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat';
+
+    // Save folder names in variables for reuse.
+    $folder1 = $this->randomName(10);
+    $folder2 = $this->randomName(5);
+
+    // Fill node array.
+    $langcode = LANGUAGE_NONE;
+    $edit = array();
+    $edit['title'] = $this->randomName(32);
+    $edit["body[$langcode][0][value]"] = $body;
+    $edit['path[alias]'] = $folder1 . '/' . $folder2;
+    $edit["body[$langcode][0][format]"] = 'full_html';
+
+    // Extract only full qualified URLs.
+    variable_set('linkchecker_check_links_types', 1);
+
+    // Verify path input field appears on add "Basic page" form.
+    $this->drupalGet('node/add/page');
+    // Verify path input is present.
+    $this->assertFieldByName('path[alias]', '', t('Path input field present on add Basic page form.'));
+
+    // Save node.
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->assertText(t('@type @title has been created.', array('@type' => 'Basic page', '@title' => $edit['title'])), t('Node was created.'));
+
+    $node = $this->drupalGetNodeByTitle($edit['title']);
+    $this->assertTrue($node, t('Node found in database.'));
+
+    // Verify if the content link is extracted properly.
+    $link = $this->getLinkCheckerLink($url1);
+    if ($link) {
+      $this->assertIdentical($link->url, $url1, t('URL %url found.', array('%url' => $url1)));
+    }
+    else {
+      $this->fail(t('URL %url not found.', array('%url' => $url1)));
+    }
+
+    // Set link as failed once.
+    $fail_count = 1;
+    $status = '301';
+    $this->setLinkAsBroken($url1, $status, $fail_count);
+    $this->drupalGet('node/' . $node->nid . '/edit');
+    $this->assertRaw(format_plural($fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $url1, '@code' => $status)), t('Link check failed once found.'));
+
+    // Set link as failed multiple times.
+    $fail_count = 4;
+    $status = '404';
+    $this->setLinkAsBroken($url1, $status, $fail_count);
+    $this->drupalGet('node/' . $node->nid . '/edit');
+    $this->assertRaw(format_plural($fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $url1, '@code' => $status)), t('Link check failed multiple times found.'));
+  }
+
+  public function testLinkCheckerCreateBlockWithBrokenLinks() {
+    // Enable all blocks for link extraction.
+    variable_set('linkchecker_scan_blocks', 1);
+
+    // Confirm that the add block link appears on block overview pages.
+    $this->drupalGet('admin/structure/block');
+    $this->assertRaw(l(t('Add block'), 'admin/structure/block/add'), t('Add block link is present on block overview page for default theme.'));
+
+    $url1 = 'http://example.com/block/broken/link';
+    $body = 'Lorem ipsum dolor sit amet <a href="' . $url1 . '">broken link</a> sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat';
+
+    // Add a new custom block by filling out the input form on the admin/structure/block/add page.
+    $custom_block = array();
+    $custom_block['info'] = $this->randomName(8);
+    $custom_block['title'] = $this->randomName(8);
+    $custom_block['body[value]'] = $body;
+    $custom_block['body[format]'] = 'full_html';
+    $this->drupalPost('admin/structure/block/add', $custom_block, t('Save block'));
+
+    // Confirm that the custom block has been created, and then query the created bid.
+    $this->assertText(t('The block has been created.'), t('Custom block successfully created.'));
+    $bid = db_query("SELECT bid FROM {block_custom} WHERE info = :info", array(':info' => $custom_block['info']))->fetchField();
+
+    // Check to see if the custom block was created by checking that it's in the database.
+    $this->assertNotNull($bid, t('Custom block found in database'));
+
+    // Verify if the content link is extracted properly.
+    $link = $this->getLinkCheckerLink($url1);
+    if ($link) {
+      $this->assertIdentical($link->url, $url1, t('URL %url found.', array('%url' => $url1)));
+    }
+    else {
+      $this->fail(t('URL %url not found.', array('%url' => $url1)));
+    }
+
+    // Set link as failed once.
+    $fail_count = 1;
+    $status = '301';
+    $this->setLinkAsBroken($url1, $status, $fail_count);
+    $this->drupalGet('admin/structure/block/manage/block/' . $bid . '/configure');
+    $this->assertRaw(format_plural($fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $url1, '@code' => $status)), t('Link check failed once found.'));
+
+    // Set link as failed multiple times.
+    $fail_count = 4;
+    $status = '404';
+    $this->setLinkAsBroken($url1, $status, $fail_count);
+    $this->drupalGet('admin/structure/block/manage/block/' . $bid . '/configure');
+    $this->assertRaw(format_plural($fail_count, 'Link check of <a href="@url">@url</a> failed once (status code: @code).', 'Link check of <a href="@url">@url</a> failed @count times (status code: @code).', array('@url' => $url1, '@code' => $status)), t('Link check failed multiple times found.'));
+  }
+
+  /**
+   * Set an URL as broken.
+   *
+   * @param string $url
+   *   URL of the link to find.
+   * @param string $status
+   *   A fake HTTP code for testing.
+   */
+  function setLinkAsBroken($url = NULL, $status = '404', $fail_count = 0) {
+    db_update('linkchecker_link')
+    ->condition('urlhash', drupal_hash_base64($url))
+    ->fields(array(
+      'code' => $status,
+      'error' => 'Not available (test running)',
+      'fail_count' => $fail_count,
+      'last_checked' => time(),
+      'status' => 1,
+    ))
+    ->execute();
+  }
+
+  /**
+   * Get linkchecker link by url.
+   *
+   * @param string $url
+   *   URL of the link to find.
+   *
+   * @return object
+   *   The link object.
+   */
+  function getLinkCheckerLink($url) {
+    return db_query('SELECT * FROM {linkchecker_link} WHERE urlhash = :urlhash', array(':urlhash' => drupal_hash_base64($url)))->fetchObject();
+  }
+}
+
+/**
+ * Test case for impersonating users.
+ *
+ * Based on http://drupal.org/node/287292#comment-3162350
+ */
+class LinkCheckerImpersonatingUserTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Link checker impersonate users',
+      'description' => 'Temporarily impersonate another user, and then restore the original user.',
+      'group' => 'Link checker',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('linkchecker');
+  }
+
+  function testLinkCheckerImpersonateUser() {
+    global $user;
+    $original_user = $user;
+
+    // If not currently logged in, use linkchecker_impersonate_user() to switch to
+    // user 1. If logged in, switch to the anonymous user instead.
+    if (user_is_anonymous()) {
+      linkchecker_impersonate_user(1);
+    }
+    else {
+      linkchecker_impersonate_user(0);
+    }
+
+    // Verify that the active user has changed, and that session saving is
+    // disabled.
+    $this->assertEqual($user->uid, ($original_user->uid == 0 ? 1 : 0), t('User switched'));
+    $this->assertFalse(drupal_save_session(), t('Session saving is disabled.'));
+
+    // Perform a second (nested) impersonation.
+    linkchecker_impersonate_user(1);
+    $this->assertEqual($user->uid, 1, t('User switched.'));
+
+    // Revert to the user which was active between the first and second
+    // impersonation attempt.
+    linkchecker_revert_user();
+
+    // Since we are still impersonating the user from the first attempt,
+    // session handling still needs to be disabled.
+    $this->assertEqual($user->uid, ($original_user->uid == 0 ? 1 : 0), t('User switched.'));
+    $this->assertFalse(drupal_save_session(), t('Session saving is disabled.'));
+
+    // Revert to the original user which was active before the first
+    // impersonation attempt.
+    linkchecker_revert_user();
+
+    // Assert that the original user is the active user again, and that session
+    // saving has been re-enabled.
+    $this->assertEqual($user->uid, $original_user->uid, t('Original user successfully restored.'));
+
+    // Simpletest uses linkchecker_impersonate_user() too, revert the impersonation by
+    // Simpletest to enable session saving again. This is safe because calling
+    // linkchecker_revert_user() too often simply results in returning the active user.
+    linkchecker_revert_user();
+    $this->assertTrue(drupal_save_session(), t('Session saving is enabled.'));
+  }
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/LICENSE.txt b/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/LICENSE.txt
index 2c095c8..d159169 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/LICENSE.txt
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/LICENSE.txt
@@ -1,274 +1,339 @@
-GNU GENERAL PUBLIC LICENSE
-
-              Version 2, June 1991
-
-Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave,
-Cambridge, MA 02139, USA. Everyone is permitted to copy and distribute
-verbatim copies of this license document, but changing it is not allowed.
-
-                  Preamble
-
-The licenses for most software are designed to take away your freedom to
-share and change it. By contrast, the GNU General Public License is
-intended to guarantee your freedom to share and change free software--to
-make sure the software is free for all its users. This General Public License
-applies to most of the Free Software Foundation's software and to any other
-program whose authors commit to using it. (Some other Free Software
-Foundation software is covered by the GNU Library General Public License
-instead.) You can apply it to your programs, too.
-
-When we speak of free software, we are referring to freedom, not price. Our
-General Public Licenses are designed to make sure that you have the
-freedom to distribute copies of free software (and charge for this service if
-you wish), that you receive source code or can get it if you want it, that you
-can change the software or use pieces of it in new free programs; and that
-you know you can do these things.
-
-To protect your rights, we need to make restrictions that forbid anyone to
-deny you these rights or to ask you to surrender the rights. These restrictions
-translate to certain responsibilities for you if you distribute copies of the
-software, or if you modify it.
-
-For example, if you distribute copies of such a program, whether gratis or for
-a fee, you must give the recipients all the rights that you have. You must make
-sure that they, too, receive or can get the source code. And you must show
-them these terms so they know their rights.
-
-We protect your rights with two steps: (1) copyright the software, and (2)
-offer you this license which gives you legal permission to copy, distribute
-and/or modify the software.
-
-Also, for each author's protection and ours, we want to make certain that
-everyone understands that there is no warranty for this free software. If the
-software is modified by someone else and passed on, we want its recipients
-to know that what they have is not the original, so that any problems
-introduced by others will not reflect on the original authors' reputations.
-
-Finally, any free program is threatened constantly by software patents. We
-wish to avoid the danger that redistributors of a free program will individually
-obtain patent licenses, in effect making the program proprietary. To prevent
-this, we have made it clear that any patent must be licensed for everyone's
-free use or not licensed at all.
-
-The precise terms and conditions for copying, distribution and modification
-follow.
-
-           GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND
-               MODIFICATION
-
-0. This License applies to any program or other work which contains a notice
-placed by the copyright holder saying it may be distributed under the terms
-of this General Public License. The "Program", below, refers to any such
-program or work, and a "work based on the Program" means either the
-Program or any derivative work under copyright law: that is to say, a work
-containing the Program or a portion of it, either verbatim or with
-modifications and/or translated into another language. (Hereinafter, translation
-is included without limitation in the term "modification".) Each licensee is
-addressed as "you".
-
-Activities other than copying, distribution and modification are not covered
-by this License; they are outside its scope. The act of running the Program is
-not restricted, and the output from the Program is covered only if its contents
-constitute a work based on the Program (independent of having been made
-by running the Program). Whether that is true depends on what the Program
-does.
-
-1. You may copy and distribute verbatim copies of the Program's source
-code as you receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice and
-disclaimer of warranty; keep intact all the notices that refer to this License
-and to the absence of any warranty; and give any other recipients of the
-Program a copy of this License along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and you
-may at your option offer warranty protection in exchange for a fee.
-
-2. You may modify your copy or copies of the Program or any portion of it,
-thus forming a work based on the Program, and copy and distribute such
-modifications or work under the terms of Section 1 above, provided that you
-also meet all of these conditions:
-
-a) You must cause the modified files to carry prominent notices stating that
-you changed the files and the date of any change.
-
-b) You must cause any work that you distribute or publish, that in whole or in
-part contains or is derived from the Program or any part thereof, to be
-licensed as a whole at no charge to all third parties under the terms of this
-License.
-
-c) If the modified program normally reads commands interactively when run,
-you must cause it, when started running for such interactive use in the most
-ordinary way, to print or display an announcement including an appropriate
-copyright notice and a notice that there is no warranty (or else, saying that
-you provide a warranty) and that users may redistribute the program under
-these conditions, and telling the user how to view a copy of this License.
-(Exception: if the Program itself is interactive but does not normally print such
-an announcement, your work based on the Program is not required to print
-an announcement.)
-
-These requirements apply to the modified work as a whole. If identifiable
-sections of that work are not derived from the Program, and can be
-reasonably considered independent and separate works in themselves, then
-this License, and its terms, do not apply to those sections when you distribute
-them as separate works. But when you distribute the same sections as part
-of a whole which is a work based on the Program, the distribution of the
-whole must be on the terms of this License, whose permissions for other
-licensees extend to the entire whole, and thus to each and every part
-regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest your rights to
-work written entirely by you; rather, the intent is to exercise the right to
-control the distribution of derivative or collective works based on the
-Program.
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
 
 In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of a
-storage or distribution medium does not bring the other work under the scope
-of this License.
-
-3. You may copy and distribute the Program (or a work based on it, under
-Section 2) in object code or executable form under the terms of Sections 1
-and 2 above provided that you also do one of the following:
-
-a) Accompany it with the complete corresponding machine-readable source
-code, which must be distributed under the terms of Sections 1 and 2 above
-on a medium customarily used for software interchange; or,
-
-b) Accompany it with a written offer, valid for at least three years, to give
-any third party, for a charge no more than your cost of physically performing
-source distribution, a complete machine-readable copy of the corresponding
-source code, to be distributed under the terms of Sections 1 and 2 above on
-a medium customarily used for software interchange; or,
-
-c) Accompany it with the information you received as to the offer to distribute
-corresponding source code. (This alternative is allowed only for
-noncommercial distribution and only if you received the program in object
-code or executable form with such an offer, in accord with Subsection b
-above.)
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
 
 The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source code
-means all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation and
-installation of the executable. However, as a special exception, the source
-code distributed need not include anything that is normally distributed (in
-either source or binary form) with the major components (compiler, kernel,
-and so on) of the operating system on which the executable runs, unless that
-component itself accompanies the executable.
-
-If distribution of executable or object code is made by offering access to
-copy from a designated place, then offering equivalent access to copy the
-source code from the same place counts as distribution of the source code,
-even though third parties are not compelled to copy the source along with the
-object code.
-
-4. You may not copy, modify, sublicense, or distribute the Program except as
-expressly provided under this License. Any attempt otherwise to copy,
-modify, sublicense or distribute the Program is void, and will automatically
-terminate your rights under this License. However, parties who have received
-copies, or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-5. You are not required to accept this License, since you have not signed it.
-However, nothing else grants you permission to modify or distribute the
-Program or its derivative works. These actions are prohibited by law if you
-do not accept this License. Therefore, by modifying or distributing the
-Program (or any work based on the Program), you indicate your acceptance
-of this License to do so, and all its terms and conditions for copying,
-distributing or modifying the Program or works based on it.
-
-6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the original
-licensor to copy, distribute or modify the Program subject to these terms and
-conditions. You may not impose any further restrictions on the recipients'
-exercise of the rights granted herein. You are not responsible for enforcing
-compliance by third parties to this License.
-
-7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues), conditions
-are imposed on you (whether by court order, agreement or otherwise) that
-contradict the conditions of this License, they do not excuse you from the
-conditions of this License. If you cannot distribute so as to satisfy
-simultaneously your obligations under this License and any other pertinent
-obligations, then as a consequence you may not distribute the Program at all.
-For example, if a patent license would not permit royalty-free redistribution
-of the Program by all those who receive copies directly or indirectly through
-you, then the only way you could satisfy both it and this License would be to
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
 refrain entirely from distribution of the Program.
 
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply and
-the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any patents or
-other property right claims or to contest validity of any such claims; this
-section has the sole purpose of protecting the integrity of the free software
-distribution system, which is implemented by public license practices. Many
-people have made generous contributions to the wide range of software
-distributed through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing to
-distribute software through any other system and a licensee cannot impose
-that choice.
-
-This section is intended to make thoroughly clear what is believed to be a
-consequence of the rest of this License.
-
-8. If the distribution and/or use of the Program is restricted in certain
-countries either by patents or by copyrighted interfaces, the original copyright
-holder who places the Program under this License may add an explicit
-geographical distribution limitation excluding those countries, so that
-distribution is permitted only in or among countries not thus excluded. In such
-case, this License incorporates the limitation as if written in the body of this
-License.
-
-9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will be
-similar in spirit to the present version, but may differ in detail to address new
-problems or concerns.
-
-Each version is given a distinguishing version number. If the Program specifies
-a version number of this License which applies to it and "any later version",
-you have the option of following the terms and conditions either of that
-version or of any later version published by the Free Software Foundation. If
-the Program does not specify a version number of this License, you may
-choose any version ever published by the Free Software Foundation.
-
-10. If you wish to incorporate parts of the Program into other free programs
-whose distribution conditions are different, write to the author to ask for
-permission. For software which is copyrighted by the Free Software
-Foundation, write to the Free Software Foundation; we sometimes make
-exceptions for this. Our decision will be guided by the two goals of
-preserving the free status of all derivatives of our free software and of
-promoting the sharing and reuse of software generally.
-
-               NO WARRANTY
-
-11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE,
-THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT
-PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
-STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
-WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
-PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR
-AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR
-ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL,
-SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
-ARISING OUT OF THE USE OR INABILITY TO USE THE
-PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA
-OR DATA BEING RENDERED INACCURATE OR LOSSES
-SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE
-PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN
-IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.
-
-          END OF TERMS AND CONDITIONS
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            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
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision 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, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This 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.
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/checkbox-checked.png b/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/checkbox-checked.png
new file mode 100644
index 0000000..14c2300
Binary files /dev/null and b/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/checkbox-checked.png differ
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/checkbox-unchecked.png b/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/checkbox-unchecked.png
new file mode 100644
index 0000000..825f2c0
Binary files /dev/null and b/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/checkbox-unchecked.png differ
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.css b/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.css
index 7e19087..b867220 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.css
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.css
@@ -1,18 +1,30 @@
-#permissions th {
-	white-space: nowrap;
-}
-#permissions .pselect {
+.pselect {
   font-weight: normal !important;
   text-align: center;
   margin: 0;
-  padding: 0 5px;
-  white-space: nowrap;
+  padding: 0;
 }
-#permissions .pselect a, #permissions .pselect a:link, #permissions .pselect a:visited {
-	font-size: 9px;
-  text-decoration: underline; 
-  margin: 0;
+/* Creating Image Links to clean up the interface now instead of the traditional text links */
+.pselect a, 
+.permission_select a.rcheck, 
+.permission_select a.runcheck,
+.permission_select a.check, 
+.permission_select a.uncheck {
+	text-indent: -2000em;
+	height: 14px;
+	width: 13px;
+	display: inline-block;
+	margin: 0 5px;
+}
+a.rcheck,
+a.check {
+  background: transparent url('checkbox-checked.png') no-repeat top left; 
+}
+a.runcheck,
+a.uncheck {
+  background: transparent url('checkbox-unchecked.png') no-repeat top left; 
 }
-#permissions .pselect a:hover {
-  text-decoration: none; 
+span.role {
+  margin: 0 10px;
+  padding: 0 0 5px 0;
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.info b/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.info
index 9d16fb0..b9514af 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.info
@@ -4,9 +4,9 @@ description = Gives select all/deselect all options on the permissions section o
 package = Administration
 core = 7.x
 files[] = permission_select.module
-; Information added by drupal.org packaging script on 2009-05-18
-version = "7.x-1.1"
+; Information added by drupal.org packaging script on 2013-08-13
+version = "7.x-1.2"
 core = "7.x"
 project = "permission_select"
-datestamp = "1242606933"
+datestamp = "1376410933"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.js b/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.js
index 2505e2e..3fc35b1 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.js
@@ -1,4 +1,4 @@
-var $j = jQuery.noConflict();
+var $ = jQuery.noConflict();
 
 function safelog(data) {if(console){console.log(data)}}
 /** 
@@ -6,36 +6,37 @@ function safelog(data) {if(console){console.log(data)}}
  * @return the jQuery selector to use in finding the checkboxes we are attempting to manipulate
  */
 function find_matching_checkboxes(link) {
-	var module = $j(link)
+
+	var module = $(link)
 								.parent('td')
 								.parent('tr')
 								.children('td.module_name')
 								.attr('id');
 	safelog('module name to modify: '+module);
-	var ctd = $j(link).parent('td');
+	var ctd = $(link).parent('td');
 	// get the index of the current column
-	var col_index = $j('tr.'+module+' td').index(ctd);
+	var col_index = $('tr.'+module+' td').index(ctd);
 	col_index++;
-	return 'tr.'+module+' td:nth-child('+col_index+') input:checkbox';
+	return 'td.'+module+':nth-child('+col_index+') input:checkbox';
 }
 
-$j(document).ready(function(){
+$(document).ready(function(){
 
   // get number of columns we will need to manipulate & add 
   // select / unselect options for each module header row
-  var roles = $j('#permissions > thead > tr > th.checkbox');
+  var roles = $('#permissions > thead > tr > th.checkbox');
   var role_count = roles.size();
   
   // take off the stupid colspan from the module header row, because we 
   // will be matching up to the other rows perfectly now
-  $j('td.module').removeAttr('colspan');
+  $('td.module').removeAttr('colspan');
   
   // needed to add in a defining class or id to the parent TR in 
   // order to have a reference to grab a proper index for the links
   // being clicked.
-  $j('td.module').each(function(){
-    var module_id = $j(this).attr('id');
-    $j(this)
+  $('td.module').each(function(){
+    var module_id = $(this).attr('id');
+    $(this)
     	.parent('tr')
     	.addClass(module_id+' module_parent')
     	.attr('rel', module_id);
@@ -43,23 +44,36 @@ $j(document).ready(function(){
   
   // cycle how many roles we have and insert that many columns worth of 
   // select / deselect options
-  $j(roles).each(function(){
-	  $j('td.module')
+  $(roles).each(function(){
+	  $('td.module')
 	   		.after('<td class="pselect"><a href="#" class="check">check all</a> / <a href="#" class="uncheck">uncheck all</a></td>');
 	  });
 
   // give the new boxes the module class to preserve styling of the row
-  $j('td.pselect').addClass('module');
+  $('td.pselect').addClass('module');
 
   // clicky 
-  $j('a.check').click(function(){
+  $('a.check').click(function(){
 	var check_it = find_matching_checkboxes(this);
-	$j(check_it).attr('checked', true);
+	safelog(check_it);
+	$(check_it).attr('checked', true);
 	return false;	
   });
-  $j('a.uncheck').click(function(){
+  $('a.uncheck').click(function(){
 	var uncheck_it = find_matching_checkboxes(this);
-	$j(uncheck_it).attr('checked', false);
+	$(uncheck_it).attr('checked', false);
 	return false;	
   });  
+	
+	$('a.rcheck').click(function(){
+	var check_it = $(this).parent('li').children('span.role').attr('id');
+	$('td.'+check_it+' input:checkbox').attr('checked', true);
+	return false;	
+  });
+	$('a.runcheck').click(function(){
+	var check_it = $(this).parent('li').children('span.role').attr('id');
+	$('td.'+check_it+' input:checkbox').attr('checked', false);
+	return false;	
+  });
+	
 });
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.module b/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.module
index 02a7534..9b19372 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/permission_select/permission_select.module
@@ -1,5 +1,4 @@
 <?php
-// $Id: permission_select.module,v 1.1.4.2 2009/05/18 00:29:20 himerus Exp $
 /**
  * @file
  * Module will add select all/deselect all options through out the 
@@ -9,7 +8,7 @@
 /**
  * Implementation of hook_perm().
  */
-function permission_select_perm() {
+function permission_select_permission() {
   return array(
     'use permission select' => array(
       'title' => t('Use permission select'),
@@ -22,7 +21,7 @@ function permission_select_perm() {
  */
 function permission_select_init() {
   if (user_access('use permission select') && 
-substr($_GET['q'], 0, 22) == 'admin/user/permissions') {
+substr($_GET['q'], 0, 24) == 'admin/people/permissions' ) {
     $path = drupal_get_path('module', 'permission_select');
     drupal_add_css($path .'/permission_select.css', array('type' => 'module', 'media' => 'all', 'preprocess' => TRUE,));
     drupal_add_js($path .'/permission_select.js');
@@ -33,92 +32,47 @@ substr($_GET['q'], 0, 22) == 'admin/user/permissions') {
  * telling the system we want to use out custom function to render this form
  */
 function permission_select_theme_registry_alter(&$theme_registry) {
-  if (!empty($theme_registry['user_admin_perm'])) {
-    $theme_registry['user_admin_perm']['function'] = 'permission_select_theme_user_admin_perm';
+	if (!empty($theme_registry['user_admin_permissions'])) {
+    $theme_registry['user_admin_permissions']['function'] = 'permission_select_theme_user_admin_perm';
   }
 }
 /**
  * Theme the administer permissions page.
  */
-function permission_select_theme_user_admin_perm($form) {
+function permission_select_theme_user_admin_perm($variables) {
+  $form = $variables['form'];
   $roles = user_roles();
+	$permission_select_header = '<div class="permission_select"><h5>Master Permission Select</h5><ul>';
   foreach (element_children($form['permission']) as $key) {
-    // Don't take form control structures
-    if (is_array($form['permission'][$key])) {
-      $row = array();
-      // Module name
-      if (is_numeric($key)) {
-        $mod_name = t($form['permission'][$key]['#id']);
-        $row[] = array('data' => t('@module module', array('@module' => drupal_render($form['permission'][$key]))), 'class' => 'module module_name', 'id' => 'module-'. $mod_name, 'colspan' => count($form['role_names']) + 1);
-      }
-      else {
-        // Permission row.
-        $row[] = array(
-          'data' => drupal_render($form['permission'][$key]),
-          'class' => 'permission',
-        );
-        foreach (element_children($form['checkboxes']) as $rid) {
-          if (is_array($form['checkboxes'][$rid])) {
-            $row[] = array('data' => drupal_render($form['checkboxes'][$rid][$key]), 'class' => 'checkbox module-'. $mod_name, 'title' => $roles[$rid] . ' : ' . t($key));
-          }
-        }
-      }
-      $rows[] = array(
-        'data' => $row,
-        'class' => 'module-'. $mod_name,
-      );
-    }
-  }
-  $header[] = (t('Permission'));
-  foreach (element_children($form['role_names']) as $rid) {
-    if (is_array($form['role_names'][$rid])) {
-      $header[] = array('data' => drupal_render($form['role_names'][$rid]), 'class' => 'checkbox');
+    $row = array();
+    // Module name
+    if (is_numeric($key)) {
+			$mod_name = t($form['permission'][$key]['#id']);
+      $row[] = array('data' => drupal_render($form['permission'][$key]), 'class' => array('module module_name'), 'id' => 'module-' . $mod_name, 'colspan' => count($form['role_names']['#value']) + 1);
     }
-  }
-  $output = theme('system_compact_link');
-  $output .= theme('table', $header, $rows, array('id' => 'permissions'));
-  $output .= drupal_render_children($form);
-  return $output;
-}
-
-
-
-
-
-
-function _____theme_user_admin_perm($form) {
-  $roles = user_roles();
-  foreach (element_children($form['permission']) as $key) {
-    // Don't take form control structures
-    if (is_array($form['permission'][$key])) {
-      $row = array();
-      // Module name
-      if (is_numeric($key)) {
-        $row[] = array('data' => drupal_render($form['permission'][$key]), 'class' => 'module', 'id' => 'module-' . $form['permission'][$key]['#id'], 'colspan' => count($form['role_names']) + 1);
-      }
-      else {
-        // Permission row.
-        $row[] = array(
-          'data' => drupal_render($form['permission'][$key]),
-          'class' => 'permission',
-        );
-        foreach (element_children($form['checkboxes']) as $rid) {
-          if (is_array($form['checkboxes'][$rid])) {
-            $row[] = array('data' => drupal_render($form['checkboxes'][$rid][$key]), 'class' => 'checkbox', 'title' => $roles[$rid] . ' : ' . t($key));
-          }
-        }
+    else {
+      // Permission row.
+      $row[] = array(
+        'data' => drupal_render($form['permission'][$key]),
+        'class' => array('permission'),
+      );
+      foreach (element_children($form['checkboxes']) as $rid) {
+        $form['checkboxes'][$rid][$key]['#title'] = $roles[$rid] . ': ' . $form['permission'][$key]['#markup'];
+        $form['checkboxes'][$rid][$key]['#title_display'] = 'invisible';
+        $row[] = array('data' => drupal_render($form['checkboxes'][$rid][$key]), 'class' => array('checkbox module-' . $mod_name .' rid-'.$rid));
       }
-      $rows[] = $row;
     }
+    $rows[] = $row; 
   }
   $header[] = (t('Permission'));
   foreach (element_children($form['role_names']) as $rid) {
-    if (is_array($form['role_names'][$rid])) {
-      $header[] = array('data' => drupal_render($form['role_names'][$rid]), 'class' => 'checkbox');
-    }
+		$permission_select_header .= '<li><a href="#" class="rcheck">check all</a> / <a href="#" class="runcheck">uncheck all</a><span id ="rid-'.$rid.'" class="role">' .$roles[$rid].'</span></li>'; 
+    $header[] = array('data' => drupal_render($form['role_names'][$rid]), 'class' => array('checkbox'));
   }
+	$permission_select_header .= '</ul></div>';
   $output = theme('system_compact_link');
-  $output .= theme('table', $header, $rows, array('id' => 'permissions'));
+	$output .= $permission_select_header;
+  $output .= theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'permissions')));
   $output .= drupal_render_children($form);
   return $output;
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.admin.inc b/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.admin.inc
index b04bf3f..bf97b56 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.admin.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.admin.inc
@@ -21,7 +21,7 @@ function piwik_admin_settings_form($form_state) {
     '#size' => 15,
     '#maxlength' => 20,
     '#required' => TRUE,
-    '#description' => t('The user account number is unique to the websites domain. Click the <strong>Settings</strong> link in your Piwik account, then the <strong>Sites</strong> tab and enter the <strong>ID</strong> into this field.'),
+    '#description' => t('The user account number is unique to the websites domain. Click the <strong>Settings</strong> link in your Piwik account, then the <strong>Websites</strong> tab and enter the appropriate site <strong>ID</strong> into this field.'),
   );
   $form['account']['piwik_url_http'] = array(
     '#type' => 'textfield',
@@ -194,14 +194,14 @@ function piwik_admin_settings_form($form_state) {
     '#title' => t('Search'),
   );
 
-  $site_search_dependencies = '<div class="admin-dependencies">';
-  $site_search_dependencies .= t('Depends on: !dependencies', array('!dependencies' => (module_exists('search') ? t('@module (<span class="admin-enabled">enabled</span>)', array('@module' => 'Search')) : t('@module (<span class="admin-disabled">disabled</span>)', array('@module' => 'Search')))));
+  $site_search_dependencies = '<div class="admin-requirements">';
+  $site_search_dependencies .= t('Requires: !module-list', array('!module-list' => (module_exists('search') ? t('@module (<span class="admin-enabled">enabled</span>)', array('@module' => 'Search')) : t('@module (<span class="admin-disabled">disabled</span>)', array('@module' => 'Search')))));
   $site_search_dependencies .= '</div>';
 
   $form['tracking']['search']['piwik_site_search'] = array(
     '#type' => 'checkbox',
     '#title' => t('Track internal search'),
-    '#description' => t('If checked, internal search keywords are tracked. You must manually install and configure the SiteSearch plugin for your sites. For the setting <em>Search URL</em> use a value of <strong>/search</strong> and for <em>Search Parameter</em> use a value of <strong>query</strong>. For more information see <a href="@url">SiteSearch plugin for piwik</a>.', array('@url' => 'http://github.com/BeezyT/piwik-sitesearch/wiki')) . $site_search_dependencies,
+    '#description' => t('If checked, internal search keywords are tracked.') . $site_search_dependencies,
     '#default_value' => variable_get('piwik_site_search', FALSE),
     '#disabled' => (module_exists('search') ? FALSE : TRUE),
   );
@@ -242,7 +242,7 @@ function piwik_admin_settings_form($form_state) {
   $form['piwik_custom_var'] = array(
     '#collapsible' => TRUE,
   	'#collapsed' => TRUE,
-    '#description' => t('You can add Piwiks <a href="!custom_var_documentation">Custom Variables</a> here. These will be added to every page that Piwik tracking code appears on. Custom variables names and values are limited to 100 characters in length each. Keep the names and values as short as possible and expect long values to get trimmed. You may use tokens in custom variable values. Global and user tokens are always available; on node pages, node tokens are also available.', array('!custom_var_documentation' => 'http://piwik.org/docs/custom-variables/')),
+    '#description' => t('You can add Piwiks <a href="!custom_var_documentation">Custom Variables</a> here. These will be added to every page that Piwik tracking code appears on. Custom variable names and values are limited to 200 characters in length. Keep the names and values as short as possible and expect long values to get trimmed. You may use tokens in custom variable names and values. Global and user tokens are always available; on node pages, node tokens are also available.', array('!custom_var_documentation' => 'http://piwik.org/docs/custom-variables/')),
     '#theme' => 'piwik_admin_custom_var_table',
     '#title' => t('Custom variables'),
     '#tree' => TRUE,
@@ -273,7 +273,7 @@ function piwik_admin_settings_form($form_state) {
     );
     $form['piwik_custom_var']['slots'][$i]['value'] = array(
       '#default_value' => !empty($piwik_custom_vars['slots'][$i]['value']) ? $piwik_custom_vars['slots'][$i]['value'] : '',
-      '#description' => t('The custom variable value. You may use tokens in this field.'),
+      '#description' => t('The custom variable value.'),
       '#maxlength' => 255,
       '#title' => t('Custom variable value #@slot', array('@slot' => $i)),
       '#title_display' => 'invisible',
@@ -304,6 +304,7 @@ function piwik_admin_settings_form($form_state) {
   $form['piwik_custom_var']['piwik_custom_var_token_tree'] = array(
     '#theme' => 'token_tree',
     '#token_types' => array('node'),
+    '#dialog' => TRUE,
   );
 
   // Advanced feature configurations.
@@ -371,16 +372,20 @@ function piwik_admin_settings_form($form_state) {
 function piwik_admin_settings_form_validate($form, &$form_state) {
   // Custom variables validation.
   foreach ($form_state['values']['piwik_custom_var']['slots'] as $custom_var) {
+    $form_state['values']['piwik_custom_var']['slots'][$custom_var['slot']]['name'] = trim($custom_var['name']);
+    $form_state['values']['piwik_custom_var']['slots'][$custom_var['slot']]['value'] = trim($custom_var['value']);
+
     // Validate empty names/values.
     if (empty($custom_var['name']) && !empty($custom_var['value'])) {
-      form_set_error("piwik_custom_var][slots][" . $custom_var['slot'] . "][name", t('The custom variable @slot-number requires a <em>Value</em> if a <em>Name</em> has been provided.', array('@slot-number' =>  $custom_var['slot'])));
+      form_set_error("piwik_custom_var][slots][" . $custom_var['slot'] . "][name", t('The custom variable @slot-number requires a <em>Name</em> if a <em>Value</em> has been provided.', array('@slot-number' => $custom_var['slot'])));
     }
     elseif (!empty($custom_var['name']) && empty($custom_var['value'])) {
-      form_set_error("piwik_custom_var][slots][" . $custom_var['slot'] . "][value", t('The custom variable @slot-number requires a <em>Name</em> if a <em>Value</em> has been provided.', array('@slot-number' =>  $custom_var['slot'])));
+      form_set_error("piwik_custom_var][slots][" . $custom_var['slot'] . "][value", t('The custom variable @slot-number requires a <em>Value</em> if a <em>Name</em> has been provided.', array('@slot-number' => $custom_var['slot'])));
     }
   }
 
   // Trim some text area values.
+  $form_state['values']['piwik_site_id'] = trim($form_state['values']['piwik_site_id']);
   $form_state['values']['piwik_pages'] = trim($form_state['values']['piwik_pages']);
   $form_state['values']['piwik_codesnippet_before'] = trim($form_state['values']['piwik_codesnippet_before']);
   $form_state['values']['piwik_codesnippet_after'] = trim($form_state['values']['piwik_codesnippet_after']);
@@ -519,6 +524,8 @@ function _piwik_contains_forbidden_token($token_string) {
     ':author:edit-url]',
     ':author:url]',
     ':author:path]',
+    ':current-user]',
+    ':current-user:original]',
     ':fid]',
     ':mail]',
     ':name]',
@@ -533,6 +540,18 @@ function _piwik_contains_forbidden_token($token_string) {
     'user:edit-url]',
     'user:url]',
     'user:path]',
+    'user:picture]',
+    // addressfield_tokens.module
+    ':first-name]',
+    ':last-name]',
+    ':name-line]',
+    ':mc-address]',
+    ':thoroughfare]',
+    ':premise]',
+    // realname.module
+    ':name-raw]',
+    // token.module
+    ':ip-address]',
   );
 
   return preg_match('/' . implode('|', array_map('preg_quote', $token_blacklist)) . '/i', $token_string);
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.info b/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.info
index fcfaaba..2b3105a 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.info
@@ -3,12 +3,11 @@ description = Adds Piwik javascript tracking code to all your site's pages.
 core = 7.x
 package = Statistics
 configure = admin/config/system/piwik
-
 files[] = piwik.test
-
-; Information added by drupal.org packaging script on 2011-10-08
-version = "7.x-2.3"
+test_dependencies[] = token
+; Information added by drupal.org packaging script on 2012-11-24
+version = "7.x-2.4"
 core = "7.x"
 project = "piwik"
-datestamp = "1318077407"
+datestamp = "1353789816"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.install b/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.install
index 0af6633..fc0ba9b 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.install
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.install
@@ -80,7 +80,7 @@ function piwik_requirements($phase) {
         $requirements['piwik'] = array(
           'title' => $t('Piwik module'),
           'description' => $t('Piwik module has not been configured yet. Please configure its settings from the <a href="@url">Piwik settings page</a>.', array('@url' => url('admin/config/system/piwik'))),
-          'severity' => REQUIREMENT_ERROR,
+          'severity' => REQUIREMENT_WARNING,
           'value' => $t('Not configured'),
         );
       }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.module b/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.module
index ed39b37..85d66cf 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.module
@@ -47,7 +47,8 @@ function piwik_permission() {
     ),
     'use PHP for tracking visibility' => array(
       'title' => t('Use PHP for tracking visibility'),
-      'description' => t('Enter PHP code in the field for tracking visibility settings. %warning', array('%warning' => t('Warning: Give to trusted roles only; this permission has security implications.'))),
+      'description' => t('Enter PHP code in the field for tracking visibility settings.'),
+      'restrict access' => TRUE,
     ),
   );
 }
@@ -117,12 +118,6 @@ function piwik_page_alter(&$page) {
       }
     }
 
-    // Site search tracking support.
-    if (module_exists('search') && variable_get('piwik_site_search', FALSE) && arg(0) == 'search' && $keys = piwik_search_get_keys()) {
-      $set_custom_url = drupal_json_encode(url('search', array('query' => array('query' => $keys), 'absolute' => TRUE)));
-      $set_custom_data[] = '{SiteSearch_Results: (window.piwik_search_results) ? window.piwik_search_results : 0 }';
-    }
-
     // If this node is a translation of another node, pass the original
     // node instead.
     if (module_exists('translation') && variable_get('piwik_translation_set', 0)) {
@@ -158,19 +153,20 @@ function piwik_page_alter(&$page) {
         if (is_object($node)) {
           $types += array('node' => $node);
         }
+        $custom_var_name = token_replace($custom_var_name, $types, array('clear' => TRUE));
         $custom_var_value = token_replace($custom_var_value, $types, array('clear' => TRUE));
 
-        // Suppress empty custom variables.
-        if (!is_numeric($custom_var_value) && empty($custom_var_value)) {
+        // Suppress empty custom names and/or variables.
+        if (!drupal_strlen(trim($custom_var_name)) || !drupal_strlen(trim($custom_var_value))) {
           continue;
         }
 
-        // Custom variables names and values are limited to 100 characters in
-        // length each. It is recommended to store values that are as small as
+        // Custom variables names and values are limited to 200 characters in
+        // length. It is recommended to store values that are as small as
         // possible to ensure that the Piwik Tracking request URL doesn't go
         // over the URL limit for the webserver or browser.
-        $custom_var_name = rtrim(substr($custom_var_name, 0, 100));
-        $custom_var_value = rtrim(substr($custom_var_value, 0, 100));
+        $custom_var_name = rtrim(substr($custom_var_name, 0, 200));
+        $custom_var_value = rtrim(substr($custom_var_value, 0, 200));
 
         $custom_var_name = drupal_json_encode($custom_var_name);
         $custom_var_value = drupal_json_encode($custom_var_value);
@@ -234,7 +230,23 @@ function piwik_page_alter(&$page) {
       $script .= $codesnippet_before;
     }
 
-    $script .= '_paq.push(["trackPageView"]);';
+    // Site search tracking support.
+    // NOTE: It's recommended not to call trackPageView() on the Site Search Result page.
+    if (module_exists('search') && variable_get('piwik_site_search', FALSE) && arg(0) == 'search' && $keys = piwik_search_get_keys()) {
+      // Parameters:
+      // 1. Search keyword searched for. Example: "Banana"
+      // 2. Search category selected in your search engine. If you do not need
+      //    this, set to false. Example: "Organic Food"
+      // 3. Number of results on the Search results page. Zero indicates a
+      //    'No Result Search Keyword'. Set to false if you don't know.
+      //
+      // hook_preprocess_search_results() is not executed if search result is
+      // empty. Make sure the counter is set to 0 if there are no results.
+      $script .= '_paq.push(["trackSiteSearch", ' . drupal_json_encode($keys) . ', false, (window.piwik_search_results) ? window.piwik_search_results : 0]);';
+    }
+    else {
+      $script .= '_paq.push(["trackPageView"]);';
+    }
 
     // Add link tracking.
     if (variable_get('piwik_track', 1)) {
@@ -274,6 +286,19 @@ function piwik_page_alter(&$page) {
 }
 
 /**
+ * Implements hook_field_extra_fields().
+ */
+function piwik_field_extra_fields() {
+  $extra['user']['user']['form']['piwik'] = array(
+    'label' => t('Piwik configuration'),
+    'description' => t('Piwik module form element.'),
+    'weight' => 3,
+  );
+
+  return $extra;
+}
+
+/**
  * Implement hook_form_FORM_ID_alter().
  *
  * Allow users to decide if tracking code will be added to pages or not.
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.test b/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.test
index 19cdd37..ef9be93 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.test
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.test
@@ -156,6 +156,125 @@ class PiwikBasicTest extends DrupalWebTestCase {
 
 }
 
+class PiwikCustomVariablesTest extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => t('Piwik Custom Variables tests'),
+      'description' => t('Test custom variables functionality of Piwik module.'),
+      'group' => 'Piwik',
+      'dependencies' => array('token'),
+    );
+  }
+
+  function setUp() {
+    parent::setUp('piwik', 'token');
+
+    $permissions = array(
+      'access administration pages',
+      'administer piwik',
+    );
+
+    // User to set up piwik.
+    $this->admin_user = $this->drupalCreateUser($permissions);
+  }
+
+  function testPiwikCustomVariables() {
+    $ua_code = '3';
+    variable_set('piwik_site_id', $ua_code);
+
+    // Basic test if the feature works.
+    $custom_vars = array(
+      'slots' => array(
+        1 => array(
+          'slot' => 1,
+          'name' => 'Foo 1',
+          'value' => 'Bar 1',
+          'scope' => 3,
+        ),
+        2 => array(
+          'slot' => 2,
+          'name' => 'Foo 2',
+          'value' => 'Bar 2',
+          'scope' => 2,
+        ),
+        3 => array(
+          'slot' => 3,
+          'name' => 'Foo 3',
+          'value' => 'Bar 3',
+          'scope' => 3,
+        ),
+        4 => array(
+          'slot' => 4,
+          'name' => 'Foo 4',
+          'value' => 'Bar 4',
+          'scope' => 2,
+        ),
+        5 => array(
+          'slot' => 5,
+          'name' => 'Foo 5',
+          'value' => 'Bar 5',
+          'scope' => 1,
+        ),
+      )
+    );
+    variable_set('piwik_custom_var', $custom_vars);
+    $this->drupalGet('');
+
+    foreach ($custom_vars['slots'] as $slot) {
+      $this->assertRaw("_paq.push(['setCustomVariable', " . $slot['slot'] . ", \"" . $slot['name'] . "\", \"" . $slot['value'] . "\", " . $slot['scope'] . "]);", '[testPiwikCustomVariables]: setCustomVariable ' . $slot['slot'] . ' is shown.');
+    }
+
+    // Test whether tokens are replaced in custom variable names.
+    $site_slogan = $this->randomName(16);
+    variable_set('site_slogan', $site_slogan);
+
+    $custom_vars = array(
+      'slots' => array(
+        1 => array(
+          'slot' => 1,
+          'name' => 'Name: [site:slogan]',
+          'value' => 'Value: [site:slogan]',
+          'scope' => 3,
+        ),
+        2 => array(
+          'slot' => 2,
+          'name' => '',
+          'value' => $this->randomName(16),
+          'scope' => 1,
+        ),
+        3 => array(
+          'slot' => 3,
+          'name' => $this->randomName(16),
+          'value' => '',
+          'scope' => 2,
+        ),
+        4 => array(
+          'slot' => 4,
+          'name' => '',
+          'value' => '',
+          'scope' => 3,
+        ),
+        5 => array(
+          'slot' => 5,
+          'name' => '',
+          'value' => '',
+          'scope' => 3,
+        ),
+      )
+    );
+    variable_set('piwik_custom_var', $custom_vars);
+    $this->verbose('<pre>' . print_r($custom_vars, TRUE) . '</pre>');
+
+    $this->drupalGet('');
+    $this->assertRaw("_paq.push(['setCustomVariable', 1, \"Name: $site_slogan\", \"Value: $site_slogan\", 3]", '[testPiwikCustomVariables]: Tokens have been replaced in custom variable.');
+    $this->assertNoRaw("_paq.push(['setCustomVariable', 2,", '[testPiwikCustomVariables]: Value with empty name is not shown.');
+    $this->assertNoRaw("_paq.push(['setCustomVariable', 3,", '[testPiwikCustomVariables]: Name with empty value is not shown.');
+    $this->assertNoRaw("_paq.push(['setCustomVariable', 4,", '[testPiwikCustomVariables]: Empty name and value is not shown.');
+    $this->assertNoRaw("_paq.push(['setCustomVariable', 5,", '[testPiwikCustomVariables]: Empty name and value is not shown.');
+  }
+}
+
 class PiwikRolesTest extends DrupalWebTestCase {
 
   public static function getInfo() {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.variable.inc b/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.variable.inc
new file mode 100644
index 0000000..3dbbfe5
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/piwik/piwik.variable.inc
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * @file
+ * Definition of variables for Variable API module.
+ */
+
+/**
+ * Implements hook_variable_info().
+ */
+function piwik_variable_info($options) {
+  $variables['piwik_site_id'] = array(
+    'type' => 'string',
+    'title' => t('Piwik site ID', array(), $options),
+    'default' => '',
+    'description' => t('The user account number is unique to the websites domain. Click the <strong>Settings</strong> link in your Piwik account, then the <strong>Websites</strong> tab and enter the appropriate site <strong>ID</strong> into this field.'),
+    'required' => TRUE,
+    'group' => 'piwik',
+    'localize' => TRUE,
+    'multidomain' => TRUE,
+    'validate callback' => 'piwik_validate_piwik_site_id',
+  );
+
+  return $variables;
+}
+
+/**
+ * Implements hook_variable_group_info().
+ */
+function piwik_variable_group_info() {
+  $groups['piwik'] = array(
+    'title' => t('Piwik'),
+    'description' => t('Configure tracking behavior to get insights into your website traffic and marketing effectiveness.'),
+    'access' => 'administer piwik',
+    'path' => array('admin/config/system/piwik'),
+  );
+
+  return $groups;
+}
+
+/**
+ * Validate Piwik site ID variable.
+ */
+function piwik_validate_piwik_site_id($variable) {
+  if (!preg_match('/^\d{1,}$/', $variable['value'])) {
+    return t('A valid Piwik site ID is an integer only.');
+  }
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist.info b/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist.info
index 00e48e0..2f2b3d4 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist.info
@@ -5,9 +5,9 @@ dependencies[] = checklistapi
 package = SEO
 configure = admin/config/search/seo-checklist
 
-; Information added by drupal.org packaging script on 2012-07-24
-version = "7.x-4.0"
+; Information added by drupal.org packaging script on 2013-02-08
+version = "7.x-4.1"
 core = "7.x"
 project = "seo_checklist"
-datestamp = "1343141863"
+datestamp = "1360294437"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist.install b/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist.install
index 3244159..1e72b45 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist.install
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist.install
@@ -33,87 +33,89 @@ function seo_checklist_uninstall() {
  */
 function seo_checklist_update_7400() {
   // Convert saved progress data.
-  $result = db_query('SELECT id, completed, uid FROM {seo_checklist}');
-  $old_data = $result->fetchAllAssoc('id');
-  $data_mapping = array(
-    'install_page_title' => 1,
-    'enable_clean_urls' => 2,
-    'install_pathauto' => 5,
-    'install_globalredirect' => 6,
-    'get_google_account' => 7,
-    'install_google_analytics' => 9,
-    'create_google_analytics_analytics' => 11,
-    'input_google_analytics_code' => 12,
-    'authenticate_with_google_analytics' => 13,
-    'install_metatags_quick' => 15,
-    'install_scheduler' => 16,
-    'install_htmlpurifier' => 17,
-    'install_search404' => 18,
-    'validate_html' => 19,
-    'check_links' => 20,
-    'install_xmlsitemap' => 21,
-    'authenticate_with_google' => 23,
-    'submit_xml_sitemap_to_google' => 24,
-    'submit_xml_sitemap_to_bing' => 28,
-    'add_to_google_places' => 29,
-    'install_addthis' => 30,
-    'install_service_links' => 31,
-    'install_mollom' => 39,
-    'sign_up_for_mollom_account' => 40,
-    'authenticate_with_bing' => 43,
-    'get_windows_live_id' => 44,
-    'install_htmlpurifier' => 45,
-    'install_site_map' => 46,
-    'install_site_verify' => 47,
-    'install_addtoany' => 49,
-    'add_geo_meta_tags' => 51,
-    'install_admin_menu' => 53,
-    'enable_drupal_caching' => 54,
-    'install_boost' => 55,
-    'install_seo_checker' => 57,
-    'install_fb_social' => 58,
-    'install_follow' => 59,
-    'install_elements' => 60,
-    'install_security_review' => 61,
-    'install_read_more' => 62,
-    'install_ga_tokenizer' => 63,
-    'install_contact_google_analytics' => 64,
-    'install_context_keywords' => 65,
-  );
-  global $user;
-  $new_data = array(
-    '#changed' => $time = time(),
-    '#changed_by' => $user->uid,
-    '#completed_items' => 0,
-  );
-  $definitions = seo_checklist_checklistapi_checklist_info();
-  $groups = $definitions['seo_checklist'];
-  foreach (element_children($groups) as $group_key) {
-    $group = &$groups[$group_key];
-    foreach (element_children($group) as $item_key) {
-      if (!empty($data_mapping[$item_key])) {
-        $old_item = $old_data[$data_mapping[$item_key]];
-        if (!empty($old_item->completed)) {
-          $new_data[$item_key] = array(
-            '#completed' => $old_item->completed,
-            '#uid' => $old_item->uid,
-          );
-          $new_data['#completed_items']++;
+  if (db_table_exists('seo_checklist')) {
+    $result = db_query('SELECT id, completed, uid FROM {seo_checklist}');
+    $old_data = $result->fetchAllAssoc('id');
+    $data_mapping = array(
+      'install_page_title' => 1,
+      'enable_clean_urls' => 2,
+      'install_pathauto' => 5,
+      'install_globalredirect' => 6,
+      'get_google_account' => 7,
+      'install_google_analytics' => 9,
+      'create_google_analytics_analytics' => 11,
+      'input_google_analytics_code' => 12,
+      'authenticate_with_google_analytics' => 13,
+      'install_metatags_quick' => 15,
+      'install_scheduler' => 16,
+      'install_htmlpurifier' => 17,
+      'install_search404' => 18,
+      'validate_html' => 19,
+      'check_links' => 20,
+      'install_xmlsitemap' => 21,
+      'authenticate_with_google' => 23,
+      'submit_xml_sitemap_to_google' => 24,
+      'submit_xml_sitemap_to_bing' => 28,
+      'add_to_google_places' => 29,
+      'install_addthis' => 30,
+      'install_service_links' => 31,
+      'install_mollom' => 39,
+      'sign_up_for_mollom_account' => 40,
+      'authenticate_with_bing' => 43,
+      'get_windows_live_id' => 44,
+      'install_htmlpurifier' => 45,
+      'install_site_map' => 46,
+      'install_site_verify' => 47,
+      'install_addtoany' => 49,
+      'add_geo_meta_tags' => 51,
+      'install_admin_menu' => 53,
+      'enable_drupal_caching' => 54,
+      'install_boost' => 55,
+      'install_seo_checker' => 57,
+      'install_fb_social' => 58,
+      'install_follow' => 59,
+      'install_elements' => 60,
+      'install_security_review' => 61,
+      'install_read_more' => 62,
+      'install_ga_tokenizer' => 63,
+      'install_contact_google_analytics' => 64,
+      'install_context_keywords' => 65,
+    );
+    global $user;
+    $new_data = array(
+      '#changed' => $time = time(),
+      '#changed_by' => $user->uid,
+      '#completed_items' => 0,
+    );
+    $definitions = seo_checklist_checklistapi_checklist_info();
+    $groups = $definitions['seo_checklist'];
+    foreach (element_children($groups) as $group_key) {
+      $group = &$groups[$group_key];
+      foreach (element_children($group) as $item_key) {
+        if (!empty($data_mapping[$item_key])) {
+          $old_item = $old_data[$data_mapping[$item_key]];
+          if (!empty($old_item->completed)) {
+            $new_data[$item_key] = array(
+              '#completed' => $old_item->completed,
+              '#uid' => $old_item->uid,
+            );
+            $new_data['#completed_items']++;
+          }
+        }
+        if (!isset($new_data[$item_key])) {
+          $new_data[$item_key] = 0;
         }
-      }
-      if (!isset($new_data[$item_key])) {
-        $new_data[$item_key] = 0;
       }
     }
+    if (variable_get('seo_checklist_link', 0)) {
+      $new_data['link_to_volacci'] = array(
+        '#completed' => $time,
+        '#uid' => $user->uid,
+      );
+    }
+    ksort($new_data);
+    variable_set('checklistapi_checklist_seo_checklist', $new_data);
   }
-  if (variable_get('seo_checklist_link', 0)) {
-    $new_data['link_to_volacci'] = array(
-      '#completed' => $time,
-      '#uid' => $user->uid,
-    );
-  }
-  ksort($new_data);
-  variable_set('checklistapi_checklist_seo_checklist', $new_data);
 
   // Remove old database tables.
   foreach (array('seo_group', 'seo_checklist') as $table) {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist.module b/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist.module
index 88e841a..82ba42e 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist.module
@@ -46,15 +46,21 @@ function seo_checklist_checklistapi_checklist_info() {
     // Introduction.
     'introduction' => array(
       '#title' => t('Introduction'),
-      '#description' => theme('seo_checklist_intro_tab'),
+      '#description' => theme('seo_checklist_intro_tab', array(
+        'volacci_logo' => theme('image', array(
+          'path' => drupal_get_path('module', 'seo_checklist') . '/volacci-logo.png',
+          'alt' => t('Volacci'),
+          'title' => t('Volacci'),
+        )),
+      )),
     ),
 
     // Tools.
     'tools' => array(
-      '#title' => t('Tools'),
+      '#title' => t('Tools (optional)'),
       '#description' => t('<p>While not strictly necessary for SEO, these modules will accelerate your work.</p>'),
       'install_admin_menu' => array(
-        '#title' => t('Install Administration menu module.'),
+        '#title' => t('[Optional] Install Administration menu module.'),
         '#default_value' => module_exists('admin_menu'),
         'project_page' => array(
           '#text' => t('Download'),
@@ -62,26 +68,16 @@ function seo_checklist_checklistapi_checklist_info() {
         ),
         'modules_page' => $modules_page,
       ),
-      'install_elements' => array(
-        '#title' => t('Install Elements module.'),
-        '#default_value' => module_exists('elements'),
+      'install_drush' => array(
+        '#title' => t('[Optional] Install Drush.'),
+        '#description' => t('Drush is a command line tool for Drupal that you can use, among other things, to <a href="http://vimeo.com/5207683">install modules faster</a>.'),
         'project_page' => array(
-          '#text' => t('Download'),
-          '#path' => 'http://drupal.org/project/elements',
+          '#text' => t('Download and install'),
+          '#path' => 'http://drupal.org/project/drush',
         ),
-        'modules_page' => $modules_page,
-      ),
-      'install_security_review' => array(
-        '#title' => t('Install Security Review module.'),
-        '#default_value' => module_exists('security_review'),
-        'project_page' => array(
-          '#text' => t('Download'),
-          '#path' => 'http://drupal.org/project/security_review',
-        ),
-        'modules_page' => $modules_page,
       ),
       'install_module_filter' => array(
-        '#title' => t('Install Module Filter module.'),
+        '#title' => t('[Optional] Install Module Filter module.'),
         '#default_value' => module_exists('module_filter'),
         'project_page' => array(
           '#text' => t('Download'),
@@ -91,24 +87,42 @@ function seo_checklist_checklistapi_checklist_info() {
       ),
     ),
 
-    // Page titles.
-    'page_titles' => array(
-      '#title' => t('Page titles'),
-      '#description' => t('<p>The single most important thing you can do for on-site SEO.</p>'),
-      'install_page_title' => array(
-        '#title' => t('Install Page Title module.'),
-        '#default_value' => module_exists('page_title'),
+    // Page titles and meta tags.
+    'page_titles_meta_tags' => array(
+      '#title' => t('Page titles and meta tags'),
+      '#description' => t('<p>Search engines look at your <code>TITLE</code> tags and certain meta data to determine what your site is about. These modules give you control over this important information.</p>'),
+      'install_metatag' => array(
+        '#title' => t('Install Meta tags module.'),
+        '#default_value' => module_exists('metatag'),
         'project_page' => array(
           '#text' => t('Download'),
-          '#path' => 'http://drupal.org/project/page_title',
+          '#path' => 'http://drupal.org/project/metatag',
         ),
         'modules_page' => $modules_page,
       ),
-      'configure_page_title' => array(
-        '#title' => t('Configure Page Title module.'),
+      'configure_metatag' => array(
+        '#title' => t('Configure Meta tags module.'),
+        '#description' => t('If local SEO is important to you, add geo meta tags.'),
         'config_page' => array(
           '#text' => t('Configure'),
-          '#path' => 'admin/config/search/page-title',
+          '#path' => 'admin/config/search/metatags',
+        ),
+      ),
+      'install_metatags_quick' => array(
+        '#title' => t('[Optional] Install Meta tags quick module.'),
+        '#description' => t("If you want to add meta tags to non-node entities, you'll need this module for now."),
+        '#default_value' => module_exists('metatags_quick'),
+        'project_page' => array(
+          '#text' => t('Download'),
+          '#path' => 'http://drupal.org/project/metatags_quick',
+        ),
+        'modules_page' => $modules_page,
+      ),
+      'configure_metatags_quick' => array(
+        '#title' => t('[Optional] Configure Meta tags quick module.'),
+        'config_page' => array(
+          '#text' => t('Configure'),
+          '#path' => 'admin/config/search/metatags_quick',
         ),
       ),
     ),
@@ -116,7 +130,7 @@ function seo_checklist_checklistapi_checklist_info() {
     // URL paths.
     'url_paths' => array(
       '#title' => t('URL paths'),
-      '#description' => t('<p>The second most important thing you can do.</p>'),
+      '#description' => t("<p>Search engines use your site's URLs to help determine structure, organization, and topical relevance.</p>"),
       'enable_clean_urls' => array(
         '#title' => t('Enable clean URLs.'),
         '#default_value' => variable_get('clean_url', 0),
@@ -168,7 +182,7 @@ function seo_checklist_checklistapi_checklist_info() {
     // Create search engine accounts.
     'search_engine_accounts' => array(
       '#title' => t('Create search engine accounts'),
-      '#description' => t("<p>Set yourself up with the search engines. You'll need these accounts for later steps.</p>"),
+      '#description' => t("<p>Set your site up with the search engines. You'll need these accounts for later steps in the SEO Checklist but also to help you communicate and evaluate your site on an ongoing basis.</p>"),
       'get_google_account' => array(
         '#title' => t('Get a Google account.'),
         'create_account' => array(
@@ -188,7 +202,7 @@ function seo_checklist_checklistapi_checklist_info() {
     // Track your visitors.
     'track_visitors' => array(
       '#title' => t('Track your visitors'),
-      '#description' => t('<p>Know where your visitors are coming from and what they do while visiting your site.</p>'),
+      '#description' => t('<p>See where your visitors are coming from and what they do while visiting your site.</p>'),
       'install_google_analytics' => array(
         '#title' => t('Install Google Analytics module.'),
         '#default_value' => module_exists('googleanalytics'),
@@ -256,50 +270,26 @@ function seo_checklist_checklistapi_checklist_info() {
       ),
     ),
 
-    // Page content.
-    'page_content' => array(
-      '#title' => t('Page content'),
-      '#description' => t('<p>Take control of your page content.</p>'),
-      'install_metatag' => array(
-        '#title' => t('Install Meta tags module.'),
-        '#default_value' => module_exists('metatag'),
-        'project_page' => array(
-          '#text' => t('Download'),
-          '#path' => 'http://drupal.org/project/metatag',
-        ),
-        'modules_page' => $modules_page,
-      ),
-      'configure_metatag' => array(
-        '#title' => t('Configure Meta tags module.'),
+    // Content.
+    'content' => array(
+      '#title' => t('Content'),
+      '#description' => t('<p>Well-written content is important to the search engines. These modules help.</p>'),
+      'install_microdata' => array(
+        '#title' => t('Install Microdata module.'),
+        '#description' => t("Microdata enables you to share content with other sites and services, like Google's Recipe View, using inline metadata."),
+        '#default_value' => module_exists('microdata'),
         'config_page' => array(
-          '#text' => t('Configure'),
-          '#path' => 'admin/config/search/metatags',
-        ),
-      ),
-      'install_metatags_quick' => array(
-        '#title' => t('Install Meta tags quick module.'),
-        '#default_value' => module_exists('metatags_quick'),
-        'project_page' => array(
-          '#text' => t('Download'),
-          '#path' => 'http://drupal.org/project/metatags_quick',
+          '#text' => t('Download module'),
+          '#path' => 'http://drupal.org/project/microdata',
         ),
         'modules_page' => $modules_page,
       ),
-      'configure_metatags_quick' => array(
-        '#title' => t('Configure Meta tags quick module.'),
-        'config_page' => array(
-          '#text' => t('Configure'),
-          '#path' => 'admin/config/search/metatags_quick',
-        ),
-      ),
-      'install_scheduler' => array(
-        '#title' => t('Install Scheduler module.'),
-        '#default_value' => module_exists('scheduler'),
+      'configure_microdata' => array(
+        '#title' => t('Configure Microdata module.'),
         'project_page' => array(
-          '#text' => t('Download'),
-          '#path' => 'http://drupal.org/project/scheduler',
+          '#text' => t('Configure'),
+          '#path' => 'admin/config/services/microdata',
         ),
-        'modules_page' => $modules_page,
       ),
       'install_htmlpurifier' => array(
         '#title' => t('Install HTML Purifier module.'),
@@ -337,21 +327,6 @@ function seo_checklist_checklistapi_checklist_info() {
         ),
         'modules_page' => $modules_page,
       ),
-      'install_read_more' => array(
-        '#title' => t('Install Read More Link module.'),
-        '#default_value' => module_exists('read_more'),
-        'project_page' => array(
-          '#text' => t('Download'),
-          '#path' => 'http://drupal.org/project/read_more',
-        ),
-        'modules_page' => $modules_page,
-      ),
-    ),
-
-    // Clean code.
-    'clean_code' => array(
-      '#title' => t('Clean code'),
-      '#description' => t('<p>Well written markup is very important to the search engine spiders.</p>'),
       'validate_html' => array(
         '#title' => t('Validate your markup.'),
         'w3c_validator' => array(
@@ -371,7 +346,7 @@ function seo_checklist_checklistapi_checklist_info() {
     // Submit your site to the search engines.
     'submit_to_search_engines' => array(
       '#title' => t('Submit your site to the search engines'),
-      '#description' => t("<p>Now that you've got your site ready for the search engines, tell them about it!</p>"),
+      '#description' => t("<p>Now that you've got your site ready for the search engines, use these tools to tell them you're ready for them to visit.</p>"),
       'install_site_verify' => array(
         '#title' => t('Install Site verification module.'),
         '#default_value' => module_exists('site_verify'),
@@ -439,7 +414,7 @@ function seo_checklist_checklistapi_checklist_info() {
         ),
       ),
       'add_to_google_places' => array(
-        '#title' => t('Add your business to Google Places, if appropriate.'),
+        '#title' => t('[Optional] Add your business to Google Places, if appropriate.'),
         'google_places' => array(
           '#text' => t('Google Places'),
           '#path' => 'http://www.google.com/local/add/',
@@ -447,144 +422,104 @@ function seo_checklist_checklistapi_checklist_info() {
       ),
     ),
 
-    // Social media.
-    'social_media' => array(
-      '#title' => t('Social media'),
-      '#description' => t('<p>Using Social news sites, blogs, etc? Consider these:</p>'),
-      'install_addthis' => array(
-        '#title' => t('Install AddThis module.'),
-        '#default_value' => module_exists('addthis'),
+    // Other checklists.
+    'other_checklists' => array(
+      '#title' => t('Other checklists'),
+      '#description' => t('<p>These checklists are essential for additional important Internet Marketing related tasks for your website.</p>'),
+      'install_security_review' => array(
+        '#title' => t('[Optional] Install Security Review module.'),
+        '#description' => t('The more popular your website becomes, the more important good security will be.'),
+        '#default_value' => module_exists('security_review'),
         'project_page' => array(
           '#text' => t('Download'),
-          '#path' => 'http://drupal.org/project/addthis',
+          '#path' => 'http://drupal.org/project/security_review',
         ),
         'modules_page' => $modules_page,
       ),
-      'install_service_links' => array(
-        '#title' => t('Install Service links module.'),
-        '#default_value' => module_exists('service_links'),
-        'project_page' => array(
-          '#text' => t('Download'),
-          '#path' => 'http://drupal.org/project/service_links',
+    ),
+
+    // Paid services.
+    'paid_services' => array(
+      '#title' => t('Paid services (optional)'),
+      '#description' => t('<p>There are many paid tools available to help you with your SEO and website maintenance. Here are some suggestions typically used by top Internet Marketing firms. At Volacci, we have tested and use all of these tools.</p>'),
+      'mollom_spam_prevention' => array(
+        '#title' => t('[Optional] Mollom spam prevention'),
+        '#description' => t('<p>If your site will get heavy use from visitors creating accounts, commenting and/or creating content then use Mollom.</p>'),
+        'register_page' => array(
+          '#text' => t('Mollom website'),
+          '#path' => 'http://mollom.com/',
         ),
-        'modules_page' => $modules_page,
-      ),
-      'install_addtoany' => array(
-        '#title' => t('Install Share Buttons (AddToAny) module.'),
-        '#default_value' => module_exists('addtoany'),
         'project_page' => array(
           '#text' => t('Download'),
-          '#path' => 'http://drupal.org/project/addtoany',
+          '#path' => 'http://drupal.org/project/mollom',
         ),
         'modules_page' => $modules_page,
-      ),
-      'install_fb_social' => array(
-        '#title' => t('Install Facebook social plugins integration module.'),
-        '#default_value' => module_exists('fb_social'),
-        'project_page' => array(
-          '#text' => t('Download'),
-          '#path' => 'http://drupal.org/project/fb_social',
+        'config_page' => array(
+          '#text' => t('Configure'),
+          '#path' => 'admin/config/content/mollom',
         ),
-        'modules_page' => $modules_page,
       ),
-      'install_follow' => array(
-        '#title' => t('Install Follow module.'),
-        '#default_value' => module_exists('follow'),
-        'project_page' => array(
-          '#text' => t('Download'),
-          '#path' => 'http://drupal.org/project/follow',
+      'volacci_automatr' => array(
+        '#title' => t('[Optional] Volacci Automatr™ marketing automation'),
+        '#description' => t('<p>If you need marketing automation, lead scoring, advanced email marketing, and more, along with SalesForce or SugarCRM integration, then use <a href="@automatr_url">Volacci Automatr™</a>. If, for some reason, Automatr™ does not work for you, consider <a href="@marketo_url">Marketo</a> or <a href="@eloqua_url">Eloqua</a>.</p>', array(
+          '@automatr_url' => $automatr_url = 'http://automatr.volacci.com/?utm_source=seo_checklist&utm_medium=backend&utm_content=text&utm_campaign=volacci_automatr',
+          '@marketo_url' => 'http://www.marketo.com/',
+          '@eloqua_url' => 'http://www.eloqua.com/',
+        )),
+        'automatr_website' => array(
+          '#text' => t('Automatr website'),
+          '#path' => $automatr_url,
         ),
-        'modules_page' => $modules_page,
-      ),
-    ),
-
-    // Use Mollom to prevent spam.
-    'prevent_spam' => array(
-      '#title' => t('Use Mollom to prevent spam'),
-      '#description' => t('<p>If your site will get heavy use from visitors creating accounts, commenting and/or creating content then use Mollom. If, for some reason, Mollom does not work for you, consider the <a href="http://drupal.org/project/captcha">CAPTCHA</a> or <a href="http://drupal.org/project/antispam">AntiSpam</a> modules.</p>'),
-      'sign_up_for_mollom_account' => array(
-        '#title' => t('Sign up for a free mollom account.'),
-        'register_page' => array(
-          '#text' => t('Create account'),
-          '#path' => 'http://mollom.com/user/register',
-        ),
-      ),
-      'install_mollom' => array(
-        '#title' => t('Install Mollom module.'),
-        '#default_value' => module_exists('mollom'),
         'project_page' => array(
           '#text' => t('Download'),
-          '#path' => 'http://drupal.org/project/mollom',
+          '#path' => 'http://drupal.org/project/automatr',
         ),
         'modules_page' => $modules_page,
-      ),
-      'configure_mollom_api_keys' => array(
-        '#title' => t('Configure Mollom API keys.'),
-        '#default_value' => variable_get('mollom_public_key', '') && variable_get('mollom_private_key', ''),
         'config_page' => array(
           '#text' => t('Configure'),
-          '#path' => 'admin/config/content/mollom/settings',
+          '#path' => 'admin/config/marketing/automatr',
         ),
       ),
     ),
 
-    // Geographic.
-    'geographic' => array(
-      '#title' => t('Geographic'),
-      'add_geo_meta_tags' => array(
-        '#title' => t('Add geo meta tags with the Meta Tags module.'),
-      ),
-    ),
-
-    // Performance.
-    'performance' => array(
-      '#title' => t('Performance'),
-      'enable_drupal_caching' => array(
-        '#title' => t("Turn on Drupal's built-in caching."),
-        '#default_value' => variable_get('cache', FALSE) && variable_get('block_cache', FALSE),
-        'config_page' => array(
-          '#text' => t('Performance page'),
-          '#path' => 'admin/config/development/performance',
+    // Extras.
+    'extras' => array(
+      '#title' => t('Extras (optional)'),
+      'install_scheduler' => array(
+        '#title' => t('[Optional] Install Scheduler module.'),
+        '#default_value' => module_exists('scheduler'),
+        'project_page' => array(
+          '#text' => t('Download'),
+          '#path' => 'http://drupal.org/project/scheduler',
         ),
+        'modules_page' => $modules_page,
       ),
-      'install_boost' => array(
-        '#title' => t('Install Boost module.'),
-        '#default_value' => module_exists('boost'),
+      'install_read_more' => array(
+        '#title' => t('[Optional] Install Read More Link module.'),
+        '#default_value' => module_exists('read_more'),
         'project_page' => array(
           '#text' => t('Download'),
-          '#path' => 'http://drupal.org/project/boost',
+          '#path' => 'http://drupal.org/project/read_more',
         ),
         'modules_page' => $modules_page,
-        'more_info' => array(
-          '#text' => t('More info'),
-          '#path' => 'http://drupal.org/node/1434362',
-        ),
       ),
-    ),
-
-    // Extras.
-    'extras' => array(
-      '#title' => t('Extras'),
       'download_internet_marketing_whitepapers' => array(
-        '#title' => t('Download <a href="http://www.volacci.com/resources/whitepapers">free internet marketing whitepapers</a> from Volacci.'),
+        '#title' => t('[Optional] Download <a href="http://www.volacci.com/resources/whitepapers">free internet marketing whitepapers</a> from Volacci.'),
       ),
       'link_to_volacci' => array(
-        '#title' => t('Link to <a href="http://www.volacci.com/">Volacci</a> to thank them for this awesome module.'),
+        '#title' => t('[Optional] Link to <a href="http://www.volacci.com/">Volacci</a> to thank them for this awesome module.'),
         '#description' => t('Checking this item will cause a small link to appear at the very bottom of your website. You can disable it at any time by un-checking this box. We really appreciate it!'),
       ),
       'send_feedback' => array(
-        '#title' => t("Send feedback on the Drupal 7 SEO Checklist or just say <em>Thanks!</em>, and we'll link to your web site from volacci.com."),
+        '#title' => t("[Optional] Send feedback on the Drupal 7 SEO Checklist or just say <em>Thanks!</em>, and we'll link to your web site from volacci.com."),
         '#description' => t("Remember to include your link information in your email. If you don't know why you should link with other websites, read <a href=\"http://www.volacci.com/why-links-help-seo\">Why links help SEO</a>."),
         'email_link' => array(
           '#text' => t('seochecklist at volacci.com'),
           '#path' => 'mailto:seochecklist at volacci.com',
         ),
       ),
-      'listen_to_volacci_podcast' => array(
-        '#title' => t('Listen to the <a href="http://www.volacci.com/podcast">Volacci Drupal SEO Podcast</a> for more tips and tricks about Drupal SEO. '),
-      ),
       'read_drupal_6_seo_book' => array(
-        '#title' => t('Read Drupal 6 Search Engine Optimization by Ben Finklea.'),
+        '#title' => t('[Optional] Read Drupal 6 Search Engine Optimization by Ben Finklea.'),
         'buy_from_amazon' => array(
           '#text' => t('Buy from Amazon'),
           '#path' => 'http://www.amazon.com/gp/product/1847198228?ie=UTF8&tag=dvdcentral02&linkCode=as2&camp=1789&creative=390957&creativeASIN=1847198228',
@@ -595,7 +530,7 @@ function seo_checklist_checklistapi_checklist_info() {
         ),
       ),
       'watch_drupalize_me_video' => array(
-        '#title' => t('Watch the free <a href="http://drupalize.me/videos/introduction-drupal-seo">Introduction to Drupal SEO</a> video from Lullabot.'),
+        '#title' => t('[Optional] Watch the free <a href="http://drupalize.me/videos/introduction-drupal-seo">Introduction to Drupal SEO</a> video from Lullabot.'),
       ),
     ),
 
@@ -619,23 +554,12 @@ function seo_checklist_page_alter(&$page) {
   if (_seo_checklist_volacci_link_is_enabled()) {
     $page['page_bottom']['seo_checklist_volacci_link'] = array(
       '#type' => 'markup',
-      '#markup' => '<div id="seo-checklist-volacci-link"><a href="http://www.volacci.com/">Drupal SEO</a></div>',
+      '#markup' => '<div id="seo-checklist-volacci-link"><a href="http://www.volacci.com/contact?utm_source=seo_checklist&utm_medium=footer&utm_campaign=volacci_seo">Drupal SEO</a></div>',
     );
   }
 }
 
 /**
- * Implements hook_preprocess_HOOK() for seo_checklist_intro_tab.tpl.php.
- */
-function template_preprocess_seo_checklist_intro_tab(&$variables) {
-  $variables['volacci_logo'] = theme('image', array(
-    'path' => drupal_get_path('module', 'seo_checklist') . '/volacci-logo.png',
-    'alt' => t('Volacci'),
-    'title' => t('Volacci'),
-  ));
-}
-
-/**
  * Implements hook_theme().
  */
 function seo_checklist_theme($existing, $type, $theme, $path) {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist_intro_tab.tpl.php b/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist_intro_tab.tpl.php
index 10a97e4..502e1d8 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist_intro_tab.tpl.php
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/seo_checklist_intro_tab.tpl.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Default theme implementation to display a node.
+ * Default theme implementation for the SEO Checklist "Intro" tab.
  *
  * Available variables:
  * - $volacci_logo: An HTML image tag for the Volacci logo.
@@ -16,7 +16,7 @@
 <p>Please read these instructions to get the most out of your Drupal Search Engine Optimization efforts.</p>
 
 <h4>Important warning</h4>
-<p>This checklist will not search engine optimize your site. It was written as a guide for Drupal SEO experts. If you need help with Drupal SEO best practices, the search engines' latest changes, your brand's target audience, or strategic marketing objectives, consider using a Drupal-specific Internet Marketing consultant like <a href="mailto:sales at volacci.com">Volacci</a> or ask your Drupal developer for a recommendation.</p>
+<p>This checklist will not search engine optimize your site. It was written as a guide for Drupal SEO experts. If you need help with Drupal SEO best practices, the search engines' latest changes, your brand's target audience, or strategic marketing objectives, consider using a Drupal-specific Internet Marketing consultant like <a href="http://www.volacci.com/contact?utm_source=seo_checklist&utm_medium=backend&utm_content=text&utm_campaign=volacci_seo">Volacci</a> or ask your Drupal developer for a recommendation.</p>
 
 <h4>Getting started</h4>
 <p>Each time you open the SEO Checklist, it will look to see if any tasks have already been completed. For example, if you've already turned on clean URLs then that item will be checked.  You still need to click "Save" to time and date stamp the automatically-checked items.</p>
@@ -24,17 +24,19 @@
 
 <h4>How it's organized</h4>
 <p>The sections are listed from most important to least important. The tasks in each section are also ordered from most to least important. A notable exception to this is the Tools section.</p>
-<p>Tools: The tools section contains  items that will help you get things done faster. They are not necessary for good SEO, but they are highly recommended.</p>
-<p>Save Button: Be sure to click the save button after you check off each item. This will create a time and date stamp so that you can easily see when each task was completed.</p>
-<p>Links: Many tasks have links next to them. Some links are to drupal.org, outside websites, or to admin sections of your own site. Links to outside resources will open in a new window.</p>
-<p>Help: Some items have "More info" links. These will take you to appropriate documentation pages where you can read more about a module or important concept.</p>
+<ul>
+  <li><strong>Tools:</strong> The tools section contains  items that will help you get things done faster. They are not necessary for good SEO, but they are highly recommended.</li>
+  <li><strong>Save Button:</strong> Be sure to click the save button after you check off each item. This will create a time and date stamp so that you can easily see when each task was completed.</li>
+  <li><strong>Links:</strong> Many tasks have links next to them. Some links are to drupal.org, outside websites, or to admin sections of your own site. Links to outside resources will open in a new window.</li>
+  <li><strong>Help:</strong> Some items have "More info" links. These will take you to appropriate documentation pages where you can read more about a module or important concept.</li>
+</ul>
 
 <h4>A note about pre-release modules</h4>
 <p><em>Some recommended modules may not be considered ready for production websites. These modules are usually marked with "beta" or "dev" or "alpha" on Drupal.org. Please be very careful when installing any module—even those that have been fully tested and released—but be especially careful with dev, alpha, or beta modules.</em></p>
 
 <h4>Credits</h4>
-<p>The Drupal SEO Checklist was created by <a href="http://drupal.org/user/46676">Ben Finklea</a>, the CEO of <a href="http://www.volacci.com/">Volacci</a> and a long-time Drupal community member. Development was paid for exclusively by Volacci. Special thanks to <a href="http://drupal.org/user/236758">Travis Carden</a> who created the <a href="http://drupal.org/project/checklistapi">Checklist API</a> and ported the Drupal SEO Checklist module to use it. </p>
+<p>The Drupal SEO Checklist was created by <a href="http://drupal.org/user/46676">Ben Finklea</a>, the CEO of <a href="http://www.volacci.com/?utm_source=seo_checklist&utm_medium=backend&utm_content=text&utm_campaign=volacci_seo">Volacci</a> and a long-time Drupal community member. Development was paid for exclusively by Volacci. Special thanks to <a href="http://drupal.org/user/236758">Travis Carden</a> who created the <a href="http://drupal.org/project/checklistapi">Checklist API</a> and ported the Drupal SEO Checklist module to use it. </p>
 <p id="seo-checklist-intro-volacci">
-  <a href="http://www.volacci.com/"><?php print $volacci_logo; ?></a>
-  <strong>More Leads. Less Work.</strong>
+  <a href="http://www.volacci.com/?utm_source=seo_checklist&utm_medium=backend&utm_content=logo&utm_campaign=volacci_seo"><?php print $volacci_logo; ?></a>
+  <strong>Marketing Intelligence.</strong>
 </p>
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/volacci-logo.png b/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/volacci-logo.png
index 046b8c3..27437ed 100644
Binary files a/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/volacci-logo.png and b/kolab.org/www/drupal-7.18/sites/all/modules/seo_checklist/volacci-logo.png differ
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/.gitignore b/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/.gitignore
new file mode 100644
index 0000000..485dee6
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/.gitignore
@@ -0,0 +1 @@
+.idea
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/css/overlay_fix.css b/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/css/overlay_fix.css
new file mode 100644
index 0000000..46ca25b
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/css/overlay_fix.css
@@ -0,0 +1,8 @@
+.social_share_privacy_area li.settings_info .settings_info_menu {
+  z-index: 9;
+}
+
+.social_share_privacy_area li.help_info .info,
+.social_share_privacy_area li .help_info.icon .info {
+  z-index: 8;
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/css/reset.css b/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/css/reset.css
index 6e08dca..c4aec42 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/css/reset.css
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/css/reset.css
@@ -1,20 +1,28 @@
 ul.social_share_privacy_area{
-    list-style-image: none;
+  list-style-image: none;
 }
 
-.social_share_privacy_area li.settings_info .settings_info_menu form fieldset{
-    top: 0;
-    display: block;
-    background: none;
+.social_share_privacy_area li.settings_info .settings_info_menu form fieldset {
+  top: 0;
+  display: block;
+  background: none;
 }
 
 .social_share_privacy_area li.settings_info .settings_info_menu form fieldset legend {
-    position: relative;
-    height: 100%;
-    left: 0;
-    text-indent: 0;
-    top: 0;
-    display: block;
-    background: none;
-    border: none;
-}
\ No newline at end of file
+  position: relative;
+  height: 100%;
+  left: 0;
+  text-indent: 0;
+  top: 0;
+  display: block;
+  background: none;
+  border: none;
+}
+
+/* These fixes are specially for the Responsive Blog Theme */
+ul.social_share_privacy_area img {
+  padding: 0 !important;
+  margin: 0 !important;
+  border: none !important;
+  max-width: 100% !important;
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/socialshareprivacy.admin.inc b/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/socialshareprivacy.admin.inc
index 43e80bc..bbb0240 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/socialshareprivacy.admin.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/socialshareprivacy.admin.inc
@@ -301,4 +301,4 @@ function socialshareprivacy_form_admin_bulk_submit($form, &$form_state) {
       drupal_set_message(t('Please choose at least one language.'), 'error');
     }
   }
-}
\ No newline at end of file
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/socialshareprivacy.info b/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/socialshareprivacy.info
index 56b2da3..196d1a9 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/socialshareprivacy.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/socialshareprivacy.info
@@ -5,9 +5,9 @@ core = 7.x
 configure = admin/config/user-interface/socialshareprivacy
 
 
-; Information added by drupal.org packaging script on 2012-11-26
-version = "7.x-1.10"
+; Information added by drupal.org packaging script on 2013-05-22
+version = "7.x-1.11"
 core = "7.x"
 project = "socialshareprivacy"
-datestamp = "1353933845"
+datestamp = "1369236015"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/socialshareprivacy.module b/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/socialshareprivacy.module
index f3c77fd..52bc913 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/socialshareprivacy.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/socialshareprivacy/socialshareprivacy.module
@@ -309,6 +309,11 @@ function _socialshareprivacy_get_markup($nodeId = 'socialshareprivacy') {
  */
 function _socialshareprivacy_write_javascript($nodeId = 'socialshareprivacy', $url = '', $library_path = '') {
 
+  $path = $library_path;
+  if ($path == '') {
+    $path = _socialshareprivacy_get_path();
+  }
+
   $options = _socialshareprivacy_get_javascript_options($url, $library_path);
 
   $minFileNamePart = '.min';
@@ -317,13 +322,36 @@ function _socialshareprivacy_write_javascript($nodeId = 'socialshareprivacy', $u
   }
 
   if (variable_get('socialshareprivacy_reset_css', 'false') == 'true') {
-    drupal_add_css(drupal_get_path('module', 'socialshareprivacy') . '/css/reset.css');
+    drupal_add_css(drupal_get_path('module', 'socialshareprivacy') . '/css/reset.css',
+    array(
+      'every_page' => TRUE,
+    ));
   }
 
-  drupal_add_js(_socialshareprivacy_get_path() . '/jquery.socialshareprivacy' . $minFileNamePart . '.js', array('group' => JS_LIBRARY));
-  drupal_add_js('(function ($) { jQuery(document).ready(function () { if(jQuery("#' . $nodeId . '").length > 0){ jQuery("#' . $nodeId . '").socialSharePrivacy(' . $options . ');' . _socialshareprivacy_external_link() . ' } }); })(jQuery);', 'inline');
-
-  return '(function ($) { jQuery(document).ready(function () { if(jQuery("#' . $nodeId . '").length > 0){ jQuery("#' . $nodeId . '").socialSharePrivacy(' . $options . ');' . _socialshareprivacy_external_link() . ' } }); })(jQuery);';
+  drupal_add_css($path . '/socialshareprivacy/socialshareprivacy.css',
+    array(
+      'every_page' => TRUE,
+    ));
+  drupal_add_js($path . '/jquery.socialshareprivacy' . $minFileNamePart . '.js',
+    array(
+      'group' => JS_LIBRARY,
+      'every_page' => TRUE,
+    ));
+
+  drupal_add_css(drupal_get_path('module', 'socialshareprivacy') . '/css/overlay_fix.css',
+  array(
+    'every_page' => TRUE,
+  ));
+
+  $inline_script = '(function ($) { jQuery(document).ready(function () { if(jQuery("#' . $nodeId . '").length > 0){ jQuery("#' . $nodeId . '").socialSharePrivacy(' . $options . ');' . _socialshareprivacy_external_link() . ' } }); })(jQuery);';
+
+  drupal_add_js($inline_script,
+    array(
+      'type' => 'inline',
+      'scope' => 'footer',
+    ));
+
+  return $inline_script;
 }
 
 /**
@@ -376,8 +404,8 @@ function _socialshareprivacy_get_javascript_options($url = '', $library_path = '
                   'referrer_track' : '" . _socialshareprivacy_get_referer_track() . "'
               }
           },
-          'css_path': '" . base_path() . $path . "/socialshareprivacy/socialshareprivacy.css',
-          'cookie_expires' : '" . variable_get('socialshareprivacy_cookie_expires', '365') . "',
+          'css_path': ''," . // setting css_path to an empty string disables loading the css in socialshareprivacy.js and we can use drupal_add_css() instead
+"          'cookie_expires' : '" . variable_get('socialshareprivacy_cookie_expires', '365') . "',
           'info_link': '" . url(variable_get('socialshareprivacy_ext_link_target', 'http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html')) . "'";
   }
   else {
@@ -409,8 +437,8 @@ function _socialshareprivacy_get_javascript_options($url = '', $library_path = '
                   'referrer_track' : '" . _socialshareprivacy_get_referer_track() . "'
               }
           },
-          'css_path': '" . base_path() . $path . "/socialshareprivacy/socialshareprivacy.css',
-          'cookie_expires' : '" . (is_numeric(variable_get('socialshareprivacy_cookie_expires', '365')) ? variable_get('socialshareprivacy_cookie_expires', '365') : '365') . "',
+          'css_path': ''," . // setting css_path to an empty string disables loading the css in socialshareprivacy.js and we can use drupal_add_css() instead
+"          'cookie_expires' : '" . (is_numeric(variable_get('socialshareprivacy_cookie_expires', '365')) ? variable_get('socialshareprivacy_cookie_expires', '365') : '365') . "',
           'txt_help'       : '" . _socialshareprivacy_escape_javascript(t('If you enable any of these options then the corresponding social network will receive and store data about your visit on this site. For more information please click on the <em>i</em>')) . "',
           'settings_perma' : '" . _socialshareprivacy_escape_javascript(t('Agree to permanent activation and thus data transfer:')) . "',
           'info_link': '" . url(variable_get('socialshareprivacy_ext_link_target', 'http://www.heise.de/ct/artikel/2-Klicks-fuer-mehr-Datenschutz-1333879.html')) . "'";
@@ -604,4 +632,4 @@ function _socialshareprivacy_map_facebook_language($language) {
 
 function _socialshareprivacy_has_access() {
   return user_access('access socialshareprivacy');
-}
\ No newline at end of file
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/css/views-admin.ctools.css b/kolab.org/www/drupal-7.18/sites/all/modules/views/css/views-admin.ctools.css
index 52c8952..b1f0e29 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/css/views-admin.ctools.css
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/css/views-admin.ctools.css
@@ -8,11 +8,6 @@
   padding-top: 2px;
 }
 
-.ctools-button-processed,
-.ctools-button-processed input {
-  text-transform: lowercase;
-}
-
 .ctools-button-processed:hover {
   border-color: #b8b8b8;
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_area_text.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_area_text.inc
index d772786..edb282f 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_area_text.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_area_text.inc
@@ -56,7 +56,7 @@ class views_handler_area_text extends views_handler_area {
         if (!empty($options[$type])) {
           $items = array();
           foreach ($options[$type] as $key => $value) {
-            $items[] = $key . ' == ' . $value;
+            $items[] = $key . ' == ' . check_plain($value);
           }
           $output .= theme('item_list',
             array(
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_field.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_field.inc
index c687575..65210d9 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_field.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_field.inc
@@ -410,7 +410,7 @@ class views_handler_field extends views_handler {
         'link_class' => array('default' => ''),
         'prefix' => array('default' => '', 'translatable' => TRUE),
         'suffix' => array('default' => '', 'translatable' => TRUE),
-        'target' => array('default' => '', 'translatable' => TRUE),
+        'target' => array('default' => ''),
         'nl2br' => array('default' => FALSE, 'bool' => TRUE),
         'max_length' => array('default' => ''),
         'word_boundary' => array('default' => TRUE, 'bool' => TRUE),
@@ -814,7 +814,7 @@ If you would like to have the characters \'[\' and \']\' please use the html ent
           if (!empty($options[$type])) {
             $items = array();
             foreach ($options[$type] as $key => $value) {
-              $items[] = $key . ' == ' . $value;
+              $items[] = $key . ' == ' . check_plain($value);
             }
             $output .= theme('item_list',
               array(
@@ -965,7 +965,7 @@ If you would like to have the characters \'[\' and \']\' please use the html ent
       '#type' => 'textarea',
       '#title' => t('No results text'),
       '#default_value' => $this->options['empty'],
-      '#description' => t('Provide text to display if this field returns no results. You may include HTML. You may enter data from this view as per the "Replacement patterns" in the "Rewrite Results" section below.'),
+      '#description' => t('Provide text to display if this field contains an empty result. You may include HTML. You may enter data from this view as per the "Replacement patterns" in the "Rewrite Results" section below.'),
       '#fieldset' => 'empty_field_behavior',
     );
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_field_boolean.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_field_boolean.inc
index 13fff07..8acfb32 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_field_boolean.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_field_boolean.inc
@@ -25,6 +25,8 @@ class views_handler_field_boolean extends views_handler_field {
   function option_definition() {
     $options = parent::option_definition();
     $options['type'] = array('default' => 'yes-no');
+    $options['type_custom_true'] = array('default' => '', 'translatable' => TRUE);
+    $options['type_custom_false'] = array('default' => '', 'translatable' => TRUE);
     $options['not'] = array('definition bool' => 'reverse');
 
     return $options;
@@ -38,10 +40,12 @@ class views_handler_field_boolean extends views_handler_field {
       'true-false' => array(t('True'), t('False')),
       'on-off' => array(t('On'), t('Off')),
       'enabled-disabled' => array(t('Enabled'), t('Disabled')),
+      'boolean' => array(1, 0),
       'unicode-yes-no' => array('✔', '✖'),
     );
     $output_formats = isset($this->definition['output formats']) ? $this->definition['output formats'] : array();
-    $this->formats = array_merge($default_formats, $output_formats);
+    $custom_format = array('custom' => array(t('Custom')));
+    $this->formats = array_merge($default_formats, $output_formats, $custom_format);
   }
 
   function options_form(&$form, &$form_state) {
@@ -55,6 +59,29 @@ class views_handler_field_boolean extends views_handler_field {
       '#options' => $options,
       '#default_value' => $this->options['type'],
     );
+
+    $form['type_custom_true'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Custom output for TRUE'),
+      '#default_value' => $this->options['type_custom_true'],
+      '#states' => array(
+        'visible' => array(
+          'select[name="options[type]"]' => array('value' => 'custom'),
+        ),
+      ),
+    );
+
+    $form['type_custom_false'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Custom output for FALSE'),
+      '#default_value' => $this->options['type_custom_false'],
+      '#states' => array(
+        'visible' => array(
+          'select[name="options[type]"]' => array('value' => 'custom'),
+        ),
+      ),
+    );
+
     $form['not'] = array(
       '#type' => 'checkbox',
       '#title' => t('Reverse'),
@@ -70,7 +97,10 @@ class views_handler_field_boolean extends views_handler_field {
       $value = !$value;
     }
 
-    if (isset($this->formats[$this->options['type']])) {
+    if ($this->options['type'] == 'custom') {
+      return $value ? filter_xss_admin($this->options['type_custom_true']) : filter_xss_admin($this->options['type_custom_false']);
+    }
+    else if (isset($this->formats[$this->options['type']])) {
       return $value ? $this->formats[$this->options['type']][0] : $this->formats[$this->options['type']][1];
     }
     else {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_filter_combine.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_filter_combine.inc
index c9def53..915924b 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_filter_combine.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_filter_combine.inc
@@ -14,7 +14,7 @@ class views_handler_filter_combine extends views_handler_filter_string {
   /**
    * @var views_plugin_query_default
    */
-  var $query;
+  public $query;
 
   function option_definition() {
     $options = parent::option_definition();
@@ -27,7 +27,7 @@ class views_handler_filter_combine extends views_handler_filter_string {
     parent::options_form($form, $form_state);
     $this->view->init_style();
 
-    // Allow to choose all fields as possible
+    // Allow to choose all fields as possible.
     if ($this->view->style_plugin->uses_fields()) {
       $options = array();
       foreach ($this->view->display_handler->get_handlers('field') as $name => $field) {
@@ -55,7 +55,8 @@ class views_handler_filter_combine extends views_handler_filter_string {
     // Only add the fields if they have a proper field and table alias.
     foreach ($this->options['fields'] as $id) {
       $field = $this->view->field[$id];
-      // Always add the table of the selected fields to be sure a table alias exists.
+      // Always add the table of the selected fields to be sure a table alias
+      // exists.
       $field->ensure_my_table();
       if (!empty($field->field_alias) && !empty($field->field_alias)) {
         $fields[] = "$field->table_alias.$field->real_field";
@@ -63,14 +64,14 @@ class views_handler_filter_combine extends views_handler_filter_string {
     }
     if ($fields) {
       $count = count($fields);
-      $seperated_fields = array();
+      $separated_fields = array();
       foreach ($fields as $key => $field) {
-        $seperated_fields[] = $field;
-        if ($key < $count-1) {
-          $seperated_fields[] = "' '";
+        $separated_fields[] = $field;
+        if ($key < $count - 1) {
+          $separated_fields[] = "' '";
         }
       }
-      $expression = implode(', ', $seperated_fields);
+      $expression = implode(', ', $separated_fields);
       $expression = "CONCAT_WS(' ', $expression)";
 
       $info = $this->operators();
@@ -82,7 +83,6 @@ class views_handler_filter_combine extends views_handler_filter_string {
 
   // By default things like op_equal uses add_where, that doesn't support
   // complex expressions, so override all operators.
-
   function op_equal($field) {
     $placeholder = $this->placeholder();
     $operator = $this->operator();
@@ -94,6 +94,39 @@ class views_handler_filter_combine extends views_handler_filter_string {
     $this->query->add_where_expression($this->options['group'], "$field LIKE $placeholder", array($placeholder => '%' . db_like($this->value) . '%'));
   }
 
+  function op_word($field) {
+    $where = $this->operator == 'word' ? db_or() : db_and();
+
+    // Don't filter on empty strings.
+    if (empty($this->value)) {
+      return;
+    }
+
+    preg_match_all('/ (-?)("[^"]+"|[^" ]+)/i', ' ' . $this->value, $matches, PREG_SET_ORDER);
+    foreach ($matches as $match) {
+      $phrase = FALSE;
+      // Strip off phrase quotes.
+      if ($match[2]{0} == '"') {
+        $match[2] = substr($match[2], 1, -1);
+        $phrase = TRUE;
+      }
+      $words = trim($match[2], ',?!();:-');
+      $words = $phrase ? array($words) : preg_split('/ /', $words, -1, PREG_SPLIT_NO_EMPTY);
+      $placeholder = $this->placeholder();
+      foreach ($words as $word) {
+        $where->where($field . " LIKE $placeholder", array($placeholder => '%' . db_like(trim($word, " ,!?")) . '%'));
+      }
+    }
+
+    if (!$where) {
+      return;
+    }
+
+    // Previously this was a call_user_func_array() but that's unnecessary
+    // as views will unpack an array that is a single arg.
+    $this->query->add_where($this->options['group'], $where);
+  }
+
   function op_starts($field) {
     $placeholder = $this->placeholder();
     $this->query->add_where_expression($this->options['group'], "$field LIKE $placeholder", array($placeholder => db_like($this->value) . '%'));
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_filter_numeric.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_filter_numeric.inc
index 982abd8..03384f6 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_filter_numeric.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/handlers/views_handler_filter_numeric.inc
@@ -258,7 +258,7 @@ class views_handler_filter_numeric extends views_handler_filter {
   }
 
   function op_regex($field) {
-    $this->query->add_where($this->options['group'], $field, $this->value, 'RLIKE');
+    $this->query->add_where($this->options['group'], $field, $this->value['value'], 'RLIKE');
   }
 
   function admin_summary() {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/admin.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/admin.inc
index ff4a99f..160a61a 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/admin.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/admin.inc
@@ -91,10 +91,10 @@ function views_ui_check_advanced_help() {
     $filename = db_query_range("SELECT filename FROM {system} WHERE type = 'module' AND name = 'advanced_help'", 0, 1)
       ->fetchField();
     if ($filename && file_exists($filename)) {
-      drupal_set_message(t('If you <a href="@modules">enable the advanced help module</a>, Views will provide more and better help. <a href="@hide">Hide this message.</a>', array('@modules' => url('admin/modules'),'@hide' => url('admin/structure/views/settings'))));
+      drupal_set_message(t('If you <a href="@modules">enable the advanced help module</a>, Views will provide more and better help. <a href="@hide">You can disable this message at the Views settings page.</a>', array('@modules' => url('admin/modules'),'@hide' => url('admin/structure/views/settings'))));
     }
     else {
-      drupal_set_message(t('If you install the advanced help module from !href, Views will provide more and better help. <a href="@hide">Hide this message.</a>', array('!href' => l('http://drupal.org/project/advanced_help', 'http://drupal.org/project/advanced_help'), '@hide' => url('admin/structure/views/settings'))));
+      drupal_set_message(t('If you install the advanced help module from !href, Views will provide more and better help. <a href="@hide">You can disable this message at the Views settings page.</a>', array('!href' => l('http://drupal.org/project/advanced_help', 'http://drupal.org/project/advanced_help'), '@hide' => url('admin/structure/views/settings'))));
     }
   }
 }
@@ -835,10 +835,10 @@ function theme_views_ui_view_info($variables) {
   }
 
   $output = '';
-  $output .= '<div class="views-ui-view-title">' . $title . "</div>\n";
+  $output .= '<div class="views-ui-view-title">' . check_plain($title) . "</div>\n";
   $output .= '<div class="views-ui-view-displays">' . $displays . "</div>\n";
   $output .= '<div class="views-ui-view-storage">' . $type . "</div>\n";
-  $output .= '<div class="views-ui-view-base">' . t('Type') . ': ' . $variables['base']. "</div>\n";
+  $output .= '<div class="views-ui-view-base">' . t('Type') . ': ' . check_plain($variables['base']). "</div>\n";
   return $output;
 }
 
@@ -3038,7 +3038,7 @@ function views_ui_reorder_displays_form($form, &$form_state) {
 
   foreach ($view->display as $display) {
     $form[$display->id] = array(
-      'title'  => array('#markup' => $display->display_title),
+      'title'  => array('#markup' => check_plain($display->display_title)),
       'weight' => array(
         '#type' => 'weight',
         '#value' => $display->position,
@@ -4122,8 +4122,8 @@ function views_ui_add_item_form($form, &$form_state) {
         $zebra_class = ($zebra % 2) ? 'odd' : 'even';
         $form['options']['name'][$key] = array(
           '#type' => 'checkbox',
-          '#title' => t('!group: !field', array('!group' => $option['group'], '!field' => $option['title'])),
-          '#description' => $option['help'],
+          '#title' => t('!group: !field', array('!group' => check_plain($option['group']), '!field' => check_plain($option['title']))),
+          '#description' => filter_xss_admin($option['help']),
           '#return_value' => $key,
           '#prefix' => "<div class='$zebra_class filterable-option'>",
           '#suffix' => '</div>',
@@ -5047,7 +5047,7 @@ function views_ui_autocomplete_tag($string = '') {
   $views = views_get_all_views();
   foreach ($views as $view) {
     if (!empty($view->tag) && strpos($view->tag, $string) === 0) {
-      $matches[$view->tag] = $view->tag;
+      $matches[$view->tag] = check_plain($view->tag);
       if (count($matches) >= 10) {
         break;
       }
@@ -5267,7 +5267,7 @@ function theme_views_ui_style_plugin_table($variables) {
   $rows = array();
   foreach (element_children($form['columns']) as $id) {
     $row = array();
-    $row[] = drupal_render($form['info'][$id]['name']);
+    $row[] = check_plain(drupal_render($form['info'][$id]['name']));
     $row[] = drupal_render($form['columns'][$id]);
     $row[] = drupal_render($form['info'][$id]['align']);
     $row[] = drupal_render($form['info'][$id]['separator']);
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/base.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/base.inc
index 0e2a407..217bbec 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/base.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/base.inc
@@ -346,8 +346,8 @@ class views_object {
       $value = $options;
       // Build source data and add to the array
       $format = NULL;
-      if (isset($definition['format_key']) && isset($options[$definition['format_key']])) {
-        $format = $options[$definition['format_key']];
+      if (isset($definition['format_key']) && isset($storage[$definition['format_key']])) {
+        $format = $storage[$definition['format_key']];
       }
       $translatable[] = array(
         'value' => $value,
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/cache.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/cache.inc
index c655c21..59c1733 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/cache.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/cache.inc
@@ -15,54 +15,82 @@
 function _views_fetch_data($table = NULL, $move = TRUE, $reset = FALSE) {
   $cache = &drupal_static(__FUNCTION__ . '_cache');
   $recursion_protection = &drupal_static(__FUNCTION__ . '_recursion_protected');
-  if (!isset($cache) || $reset) {
-    $start = microtime(TRUE);
-    // NOTE: This happens whether we retrieve them from cache or otherwise.
-
-    $data = views_cache_get('views_data', TRUE);
-    if (!empty($data->data)) {
-      $cache = $data->data;
+  $fully_loaded = &drupal_static(__FUNCTION__ . '_fully_loaded');
+  if ($reset) {
+    $cache = NULL;
+    $fully_loaded = FALSE;
+  }
+  if ($table) {
+    if (!isset($cache[$table])) {
+      $cid = 'views_data:' . $table;
+      $data = views_cache_get($cid, TRUE);
+      if (!empty($data->data)) {
+        $cache[$table] = $data->data;
+      }
+      else {
+        if (!$fully_loaded) {
+          // No cache entry, rebuild.
+          $cache = _views_fetch_data_build();
+          $fully_loaded = TRUE;
+        }
+      }
     }
-
-    if (empty($cache)) {
-      views_include_handlers();
-      $cache = module_invoke_all('views_data');
-      foreach (module_implements('views_data_alter') as $module) {
-        $function = $module . '_views_data_alter';
-        $function($cache);
+    if (isset($cache[$table])) {
+      if (isset($cache[$table]['moved to']) && $move) {
+        $moved_table = $cache[$table]['moved to'];
+        if (!empty($recursion_protection[$table])) {
+          // recursion detected!
+          return NULL;
+        }
+        $recursion_protection[$table] = TRUE;
+        $data = _views_fetch_data($moved_table);
+        $recursion_protection = array();
+        return $data;
       }
-      _views_data_process_entity_types($cache);
-
-      views_cache_set('views_data', $cache, TRUE);
+      return $cache[$table];
     }
   }
+  else {
+    if (!$fully_loaded) {
+      $data = views_cache_get('views_data', TRUE);
+      if (!empty($data->data)) {
+        $cache = $data->data;
+      }
 
-  if (!$table) {
-    return $cache;
-  }
-  if (isset($cache[$table])) {
-    // Support old views_data entries conversion.
-    if (isset($cache[$table]['moved to']) && $move) {
-      $moved_table = $cache[$table]['moved to'];
-      if (!empty($recursion_protection[$table])) {
-        // recursion detected!
-        return NULL;
+      if (empty($cache)) {
+        $cache = _views_fetch_data_build();
       }
-      $recursion_protection[$table] = TRUE;
-      $data = _views_fetch_data($moved_table);
-      $recursion_protection = array();
-      return $data;
-    }
-    else {
-      return $cache[$table];
+      $fully_loaded = TRUE;
     }
+    return $cache;
   }
-
   // Return an empty array if there is no match.
   return array();
 }
 
 /**
+ * Build and set the views data cache if empty.
+ */
+function _views_fetch_data_build() {
+  views_include_handlers();
+  $cache = module_invoke_all('views_data');
+  foreach (module_implements('views_data_alter') as $module) {
+    $function = $module . '_views_data_alter';
+    $function($cache);
+  }
+  _views_data_process_entity_types($cache);
+
+  // Keep a record with all data.
+  views_cache_set('views_data', $cache, TRUE);
+  // Save data in seperate cache entries.
+  foreach ($cache as $key => $data) {
+    $cid = 'views_data:' . $key;
+    views_cache_set($cid, $data, TRUE);
+  }
+  return $cache;
+}
+
+/**
  * Links tables having an 'entity type' specified to the respective generic entity-type tables.
  */
 function _views_data_process_entity_types(&$data) {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/handlers.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/handlers.inc
index a79aa5c..2a33d5d 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/handlers.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/handlers.inc
@@ -751,6 +751,13 @@ class views_handler extends views_object {
  *
  */
 class views_many_to_one_helper {
+  /**
+   * Contains possible existing placeholders used by the query.
+   *
+   * @var array
+   */
+  public $placeholders = array();
+
   function views_many_to_one_helper(&$handler) {
     $this->handler = &$handler;
   }
@@ -1423,7 +1430,7 @@ function views_date_sql_extract($extract_type, $field, $field_type = 'int', $set
  *   // PHP 4 doesn't call constructors of the base class automatically from a
  *   // constructor of a derived class. It is your responsibility to propagate
  *   // the call to constructors upstream where appropriate.
- *   function construct($table, $left_table, $left_field, $field, $extra = array(), $type = 'LEFT') {
+ *   function construct($table = NULL, $left_table = NULL, $left_field = NULL, $field = NULL, $extra = array(), $type = 'LEFT') {
  *     parent::construct($table, $left_table, $left_field, $field, $extra, $type);
  *   }
  *
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/view.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/view.inc
index 90dd3a2..d8c0c1f 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/view.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/includes/view.inc
@@ -960,8 +960,16 @@ class view extends views_db_object {
 
     if ($this->display_handler->uses_exposed()) {
       $exposed_form = $this->display_handler->get_plugin('exposed_form');
+      // (1) Record the errors before rendering the exposed form widgets.
+      $errors_before = form_set_error();
       $this->exposed_widgets = $exposed_form->render_exposed_form();
-      if (form_set_error() || !empty($this->build_info['abort'])) {
+      // (2) Record the errors after rendering the exposed form widgets.
+      $errors_after = form_set_error();
+      // Find out if the validation of any of the elements in the exposed form
+      // has failed by comparing (1) and (2) above. Don't mess with the view
+      // otherwise.
+      $exposed_errors = count($errors_after) > count($errors_before);
+      if ($exposed_errors || !empty($this->build_info['abort'])) {
         $this->built = TRUE;
         // Don't execute the query, but rendering will still be executed to display the empty text.
         $this->executed = TRUE;
@@ -1258,6 +1266,7 @@ class view extends views_db_object {
         $cache->cache_set('output');
       }
     }
+    $this->render_time = microtime(TRUE) - $start;
 
     $exposed_form->post_render($this->display_handler->output);
 
@@ -1286,7 +1295,6 @@ class view extends views_db_object {
     if (!empty($this->live_preview) && variable_get('views_show_additional_queries', FALSE)) {
       $this->end_query_capture();
     }
-    $this->render_time = microtime(TRUE) - $start;
 
     return $this->display_handler->output;
   }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/js/ajax_view.js b/kolab.org/www/drupal-7.18/sites/all/modules/views/js/ajax_view.js
index 2a4012f..e3bc821 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/js/ajax_view.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/js/ajax_view.js
@@ -69,7 +69,7 @@ Drupal.views.ajaxView = function(settings) {
 };
 
 Drupal.views.ajaxView.prototype.attachExposedFormAjax = function() {
-  var button = $('input[type=submit], input[type=image]', this.$exposed_form);
+  var button = $('input[type=submit], button[type=submit], input[type=image]', this.$exposed_form);
   button = button[0];
 
   this.exposedFormAjax = new Drupal.ajax($(button).attr('id'), button, this.element_settings);
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/js/views-admin.js b/kolab.org/www/drupal-7.18/sites/all/modules/views/js/views-admin.js
index 1eb3897..2b4ccf3 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/js/views-admin.js
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/js/views-admin.js
@@ -209,7 +209,7 @@ Drupal.viewsUi.addItemForm.prototype.handleCheck = function (event) {
  */
 Drupal.viewsUi.addItemForm.prototype.refreshCheckedItems = function() {
   // Perhaps we should precache the text div, too.
-  this.$selected_div.find('.views-selected-options').html(this.checkedItems.join(', '));
+  this.$selected_div.find('.views-selected-options').html(Drupal.checkPlain(this.checkedItems.join(', ')));
   Drupal.viewsUi.resizeModal('', true);
 }
 
@@ -255,10 +255,11 @@ Drupal.behaviors.viewsUiRenderAddViewButton.attach = function (context, settings
   // away from the item. We use mouseleave instead of mouseout because
   // the user is going to trigger mouseout when she moves from the trigger
   // link to the sub menu items.
-  // We use the live binder because the open class on this item will be
+  //
+  // We use the 'li.add' selector because the open class on this item will be
   // toggled on and off and we want the handler to take effect in the cases
   // that the class is present, but not when it isn't.
-  $('li.add', $menu).live('mouseleave', function (event) {
+  $menu.delegate('li.add', 'mouseleave', function (event) {
     var $this = $(this);
     var $trigger = $this.children('a[href="#"]');
     if ($this.children('.action-list').is(':visible')) {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/aggregator/views_handler_argument_aggregator_iid.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/aggregator/views_handler_argument_aggregator_iid.inc
index d959b04..4c7824e 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/aggregator/views_handler_argument_aggregator_iid.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/aggregator/views_handler_argument_aggregator_iid.inc
@@ -18,9 +18,9 @@ class views_handler_argument_aggregator_iid extends views_handler_argument_numer
     $titles = array();
     $placeholders = implode(', ', array_fill(0, sizeof($this->value), '%d'));
 
-    $result = db_select('aggregator_item')
+    $result = db_select('aggregator_item', 'ai')
       ->condition('iid', $this->value, 'IN')
-      ->fields(array('title'))
+      ->fields('ai', array('title'))
       ->execute();
     foreach ($result as $term) {
       $titles[] = check_plain($term->title);
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/field.views.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/field.views.inc
index fe1968b..873153e 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/field.views.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/field.views.inc
@@ -396,6 +396,84 @@ function field_views_field_default_views_data($field) {
           'field_name' => $field['field_name'],
         );
       }
+
+      // Expose additional language column for translatable fields.
+      if (!empty($field['translatable'])) {
+        $title_language = t('@label (!name:language)', array('@label' => $label, '!name' => $field['field_name']));
+        $title_short_language = t('@label:language', array('@label' => $label));
+
+        $data[$table]['language'] = array(
+          'group' => $group,
+          'title' => $title_language,
+          'title short' => $title_short_language,
+          'help' => t('Language - Appears in: @bundles.', array('@bundles' => implode(', ', $bundles_names))),
+        );
+        $data[$table]['language']['field'] = array(
+          'handler' => 'views_handler_field_locale_language',
+        );
+        $data[$table]['language']['argument'] = array(
+          'field' => 'language',
+          'table' => $table,
+          'handler' => 'views_handler_argument_locale_language',
+          'additional fields' => $additional_fields,
+          'empty field name' => t('<No value>'),
+          'field_name' => $field['field_name'],
+        );
+        $data[$table]['language']['filter'] = array(
+          'field' => 'language',
+          'table' => $table,
+          'handler' => 'views_handler_filter_locale_language',
+          'additional fields' => $additional_fields,
+          'field_name' => $field['field_name'],
+          'allow empty' => TRUE,
+        );
+        $data[$table]['language']['sort'] = array(
+          'field' => 'language',
+          'table' => $table,
+          'handler' => 'views_handler_sort',
+          'additional fields' => $additional_fields,
+          'field_name' => $field['field_name'],
+        );
+      }
+
+      // Expose additional language column for translatable fields.
+      if (!empty($field['translatable'])) {
+        $title_language = t('@label (!name:language)', array('@label' => $label, '!name' => $field['field_name']));
+        $title_short_language = t('@label:language', array('@label' => $label));
+
+        $data[$table]['language'] = array(
+          'group' => $group,
+          'title' => $title_language,
+          'title short' => $title_short_language,
+          'help' => t('Language - Appears in: @bundles.', array('@bundles' => implode(', ', $bundles_names))),
+        );
+        $data[$table]['language']['field'] = array(
+          'handler' => 'views_handler_field_locale_language',
+        );
+        $data[$table]['language']['argument'] = array(
+          'field' => 'language',
+          'table' => $table,
+          'handler' => 'views_handler_argument_locale_language',
+          'additional fields' => $additional_fields,
+          'empty field name' => t('<No value>'),
+          'field_name' => $field['field_name'],
+        );
+        $data[$table]['language']['filter'] = array(
+          'field' => 'language',
+          'table' => $table,
+          'handler' => 'views_handler_filter_locale_language',
+          'additional fields' => $additional_fields,
+          'field_name' => $field['field_name'],
+          'allow empty' => TRUE,
+        );
+        $data[$table]['language']['sort'] = array(
+          'field' => 'language',
+          'table' => $table,
+          'handler' => 'views_handler_sort',
+          'additional fields' => $additional_fields,
+          'field_name' => $field['field_name'],
+        );
+      }
     }
   }
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/node.views.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/node.views.inc
index ebba3d3..71a1023 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/node.views.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/node.views.inc
@@ -439,7 +439,7 @@ function node_views_data() {
   $data['node_revision']['table']['default_relationship'] = array(
     'node' => array(
       'table' => 'node',
-      'field' => 'vid',
+      'field' => 'nid',
     ),
   );
 
@@ -456,24 +456,57 @@ function node_views_data() {
   );
 
   // nid
+  $data['node_revision']['nid'] = array(
+    'title' => t('Nid'),
+    // The help that appears on the UI.
+    'help' => t('The revision NID of the content revision.'),
+    // Information for displaying the nid.
+    'field' => array(
+      'click sortable' => TRUE,
+    ),
+    // Information for accepting a nid as an argument.
+    'argument' => array(
+      'handler' => 'views_handler_argument_node_nid',
+      'click sortable' => TRUE,
+      'numeric' => TRUE,
+    ),
+    // Information for accepting a nid as a filter.
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    // Information for sorting on a nid.
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'relationship' => array(
+      'handler' => 'views_handler_relationship',
+      'base' => 'node',
+      'base field' => 'nid',
+      'title' => t('Content'),
+      'label' => t('Get the actual content from a content revision.'),
+    ),
+  );
+
+  // vid
   $data['node_revision']['vid'] = array(
     'title' => t('Vid'),
-    'help' => t('The revision ID of the content revision.'), // The help that appears on the UI,
-    // Information for displaying the nid
+    // The help that appears on the UI.
+    'help' => t('The revision ID of the content revision.'),
+    // Information for displaying the vid.
     'field' => array(
       'click sortable' => TRUE,
     ),
-    // Information for accepting a nid as an argument
+    // Information for accepting a vid as an argument.
     'argument' => array(
       'handler' => 'views_handler_argument_node_vid',
       'click sortable' => TRUE,
       'numeric' => TRUE,
     ),
-    // Information for accepting a nid as a filter
+    // Information for accepting a vid as a filter.
     'filter' => array(
       'handler' => 'views_handler_filter_numeric',
     ),
-    // Information for sorting on a nid.
+    // Information for sorting on a vid.
     'sort' => array(
       'handler' => 'views_handler_sort',
     ),
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/node/views_handler_field_node_revision.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/node/views_handler_field_node_revision.inc
index c04693a..d29b070 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/node/views_handler_field_node_revision.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/node/views_handler_field_node_revision.inc
@@ -54,7 +54,10 @@ class views_handler_field_node_revision extends views_handler_field_node {
       $this->options['alter']['make_link'] = TRUE;
       $nid = $this->get_value($values, 'nid');
       $vid = $this->get_value($values, 'vid');
-      $this->options['alter']['path'] = "node/" . $nid . '/revisions/' . $vid . '/view';
+      $this->options['alter']['path'] = 'node/' . $nid;
+      if ($nid != $vid) {
+        $this->options['alter']['path'] .= "/revisions/$vid/view";
+      }
       if (module_exists('translation')) {
         $language = $this->get_value($values, 'language');
         $languages = language_list();
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/node/views_handler_filter_node_access.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/node/views_handler_filter_node_access.inc
index a9ee85c..a29b13f 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/node/views_handler_filter_node_access.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/node/views_handler_filter_node_access.inc
@@ -21,7 +21,7 @@ class views_handler_filter_node_access extends views_handler_filter {
    * See _node_access_where_sql() for a non-views query based implementation.
    */
   function query() {
-    if (!user_access('administer nodes')) {
+    if (!user_access('administer nodes') && module_implements('node_grants')) {
       $table = $this->ensure_my_table();
       $grants = db_or();
       foreach (node_access_grants('view') as $realm => $gids) {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/search/views_handler_filter_search.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/search/views_handler_filter_search.inc
index 7430494..16515a7 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/search/views_handler_filter_search.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/search/views_handler_filter_search.inc
@@ -29,11 +29,29 @@ class views_handler_filter_search extends views_handler_filter {
     $options = parent::option_definition();
 
     $options['operator']['default'] = 'optional';
+    $options['remove_score'] = array('default' => FALSE, 'bool' => TRUE);
 
     return $options;
   }
 
   /**
+   * Overrides views_handler_filter::options_form().
+   *
+   * Add an option to remove search scores from the query.
+   */
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+
+    $form['remove_score'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Remove search score'),
+      '#description' => t('Check this box to remove the search score from the query. This can help reduce help reduce duplicate search results when using this filter.'),
+      '#default_value' => $this->options['remove_score'],
+    );
+  }
+
+
+  /**
    * Provide simple equality operator
    */
   function operator_form(&$form, &$form_state) {
@@ -126,12 +144,14 @@ class views_handler_filter_search extends views_handler_filter {
 
       $search_condition = db_and();
 
-      // Create a new join to relate the 'serach_total' table to our current 'search_index' table.
-      $join = new views_join;
-      $join->construct('search_total', $search_index, 'word', 'word');
-      $search_total = $this->query->add_relationship('search_total', $join, $search_index);
+      if (!$this->options['remove_score']) {
+        // Create a new join to relate the 'serach_total' table to our current 'search_index' table.
+        $join = new views_join;
+        $join->construct('search_total', $search_index, 'word', 'word');
+        $search_total = $this->query->add_relationship('search_total', $join, $search_index);
 
-      $this->search_score = $this->query->add_field('', "SUM($search_index.score * $search_total.count)", 'score', array('aggregate' => TRUE));
+        $this->search_score = $this->query->add_field('', "SUM($search_index.score * $search_total.count)", 'score', array('aggregate' => TRUE));
+      }
 
       if (empty($this->query->relationships[$this->relationship])) {
         $base_table = $this->query->base_table;
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/taxonomy/views_handler_field_term_link_edit.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/taxonomy/views_handler_field_term_link_edit.inc
index 75ab0f8..2efb4a6 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/taxonomy/views_handler_field_term_link_edit.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/taxonomy/views_handler_field_term_link_edit.inc
@@ -44,16 +44,19 @@ class views_handler_field_term_link_edit extends views_handler_field {
   }
 
   function render($values) {
-    // Mock a term object for taxonomy_term_edit_access(). Use machine name and
-    // vid to ensure compatibility with vid based and machine name based
-    // access checks. See http://drupal.org/node/995156
-    $term = new stdClass();
-    $term->vid = $values->{$this->aliases['vid']};
-    $term->vocabulary_machine_name = $values->{$this->aliases['vocabulary_machine_name']};
-    if (taxonomy_term_edit_access($term)) {
-      $text = !empty($this->options['text']) ? $this->options['text'] : t('edit');
-      $tid = $this->get_value($values, 'tid');
-      return l($text, 'taxonomy/term/'. $tid . '/edit', array('query' => drupal_get_destination()));
+    // Check there is an actual value, as on a relationship there may not be.
+    if ($tid = $this->get_value($values, 'tid')) {
+      // Mock a term object for taxonomy_term_edit_access(). Use machine name and
+      // vid to ensure compatibility with vid based and machine name based
+      // access checks. See http://drupal.org/node/995156
+      $term = new stdClass();
+      $term->vid = $values->{$this->aliases['vid']};
+      $term->vocabulary_machine_name = $values->{$this->aliases['vocabulary_machine_name']};
+      if (taxonomy_term_edit_access($term)) {
+        $text = !empty($this->options['text']) ? $this->options['text'] : t('edit');
+        $tid = $this->get_value($values, 'tid');
+        return l($text, 'taxonomy/term/'. $tid . '/edit', array('query' => drupal_get_destination()));
+      }
     }
   }
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc
index 3a88199..435db0d 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc
@@ -96,15 +96,15 @@ class views_plugin_argument_validate_taxonomy_term extends views_plugin_argument
         $query = db_select('taxonomy_term_data', 'td');
         $query->leftJoin('taxonomy_vocabulary', 'tv', 'td.vid = tv.vid');
         $query->fields('td');
-        $query->fields('tv', array('machine_name'));
         $query->condition('td.tid', $argument);
         $query->addTag('term_access');
         $term = $query->execute()->fetchObject();
         if (!$term) {
           return FALSE;
         }
-        $this->argument->validated_title = check_plain($term->name);
-        return empty($vocabularies) || !empty($vocabularies[$term->machine_name]);
+        $term = taxonomy_term_load($term->tid);
+        $this->argument->validated_title = check_plain(entity_label('taxonomy_term', $term));
+        return empty($vocabularies) || !empty($vocabularies[$term->vocabulary_machine_name]);
 
       case 'tids':
         // An empty argument is not a term so doesn't pass.
@@ -151,8 +151,8 @@ class views_plugin_argument_validate_taxonomy_term extends views_plugin_argument
               $validated_cache[$term->tid] = FALSE;
               return FALSE;
             }
-
-            $titles[] = $validated_cache[$term->tid] = check_plain($term->name);
+            $term = taxonomy_term_load($term->tid);
+            $titles[] = $validated_cache[$term->tid] = check_plain(entity_label('taxonomy_term', $term));
             unset($test[$term->tid]);
           }
         }
@@ -185,7 +185,8 @@ class views_plugin_argument_validate_taxonomy_term extends views_plugin_argument
           if ($type == 'convert') {
             $this->argument->argument = $term->tid;
           }
-          $this->argument->validated_title = check_plain($term->name);
+          $term = taxonomy_term_load($term->tid);
+          $this->argument->validated_title = check_plain(entity_label('taxonomy_term', $term));
           return TRUE;
         }
         return FALSE;
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/tracker.views.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/tracker.views.inc
new file mode 100644
index 0000000..ee14589
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/tracker.views.inc
@@ -0,0 +1,183 @@
+<?php
+
+/**
+ * @file
+ * Provide views data and handlers for tracker.module.
+ *
+ * @ingroup views_module_handlers
+ */
+/**
+ * Implementation of hook_views_data().
+ */
+function tracker_views_data() {
+  $data = array();
+
+  $data['tracker_node']['table']['group'] = t('Tracker');
+  $data['tracker_node']['table']['join'] = array(
+    'node' => array(
+      'type' => 'INNER',
+      'left_field' => 'nid',
+      'field' => 'nid',
+    ),
+  );
+  $data['tracker_node']['nid'] = array(
+    'title' => t('Nid'),
+    'help' => t('The node ID of the node.'),
+    'field' => array(
+      'handler' => 'views_handler_field_node',
+      'click sortable' => TRUE,
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_node_nid',
+      'name field' => 'title',
+      'numeric' => TRUE,
+      'validate type' => 'nid',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+  $data['tracker_node']['changed'] = array(
+    'title' => t('Updated date'),
+    'help' => t('The date the node was last updated.'),
+    'field' => array(
+      'handler' => 'views_handler_field_date',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort_date',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_date',
+    ),
+  );
+  $data['tracker_node']['published'] = array(
+    'title' => t('Published'),
+    'help' => t('Whether or not the node is published.'),
+    'field' => array(
+      'handler' => 'views_handler_field_boolean',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_tracker_boolean_operator',
+      'label' => t('Published'),
+      'type' => 'yes-no',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+
+  $data['tracker_user']['table']['group'] = t('Tracker - User');
+  $data['tracker_user']['table']['join'] = array(
+    'node' => array(
+      'type' => 'INNER',
+      'left_field' => 'nid',
+      'field' => 'nid',
+    ),
+    'user' => array(
+      'type' => 'INNER',
+      'left_field' => 'uid',
+      'field' => 'uid',
+    ),
+  );
+  $data['tracker_user']['nid'] = array(
+    'title' => t('Nid'),
+    'help' => t('The node ID of the node a user created or commented on. You must use an argument or filter on UID or you will get misleading results using this field.'),
+    'field' => array(
+      'handler' => 'views_handler_field_node',
+      'click sortable' => TRUE,
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_node_nid',
+      'name field' => 'title',
+      'numeric' => TRUE,
+      'validate type' => 'nid',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+  $data['tracker_user']['uid'] = array(
+    'title' => t('Uid'),
+    'help' => t('The user ID of a user who touched the node (either created or commented on it).'),
+    'field' => array(
+      'handler' => 'views_handler_field_user',
+      'click sortable' => TRUE,
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_user_uid',
+      'name field' => 'name',
+    ),
+    'filter' => array(
+      'title' => t('Name'),
+      'handler' => 'views_handler_filter_user_name',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+  $data['tracker_user']['changed'] = array(
+    'title' => t('Updated date'),
+    'help' => t('The date the node was last updated or commented on. You must use an argument or filter on UID or you will get misleading results using this field.'),
+    'field' => array(
+      'handler' => 'views_handler_field_date',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort_date',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_date',
+    ),
+  );
+  $data['tracker_user']['published'] = array(
+    'title' => t('Published'),
+    'help' => t('Whether or not the node is published. You must use an argument or filter on UID or you will get misleading results using this field.'),
+    'field' => array(
+      'handler' => 'views_handler_field_boolean',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_tracker_boolean_operator',
+      'label' => t('Published'),
+      'type' => 'yes-no',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+
+  return $data;
+}
+
+/**
+ * Implementation of hook_views_data_alter().
+ */
+function tracker_views_data_alter(&$data) {
+  // Provide additional uid_touch handlers which are handled by tracker
+  $data['node']['uid_touch_tracker'] = array(
+    'group' => t('Tracker - User'),
+    'title' => t('User posted or commented'),
+    'help' => t('Display nodes only if a user posted the node or commented on the node.'),
+    'argument' => array(
+      'field' => 'uid',
+      'name table' => 'users',
+      'name field' => 'name',
+      'handler' => 'views_handler_argument_tracker_comment_user_uid',
+      'no group by' => TRUE,
+    ),
+    'filter' => array(
+      'field' => 'uid',
+      'name table' => 'users',
+      'name field' => 'name',
+      'handler' => 'views_handler_filter_tracker_comment_user_uid'
+    ),
+  );
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/tracker/views_handler_argument_tracker_comment_user_uid.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/tracker/views_handler_argument_tracker_comment_user_uid.inc
new file mode 100644
index 0000000..e614482
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/tracker/views_handler_argument_tracker_comment_user_uid.inc
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Contains views_handler_argument_tracker_comment_user_uid
+ */
+
+/**
+ * UID argument to check for nodes that user posted or commented on.
+ *
+ * @ingroup views_argument_handlers
+ */
+class views_handler_argument_tracker_comment_user_uid extends views_handler_argument_comment_user_uid {
+
+  /**
+   * Overrides views_handler_argument_comment_user_uid::query().
+   */
+  function query($group_by = FALSE) {
+    // Because this handler thinks it's an argument for a field on the {node}
+    // table, we need to make sure {tracker_user} is JOINed and use its alias
+    // for the WHERE clause.
+    $tracker_user_alias = $this->query->ensure_table('tracker_user');
+    $this->query->add_where(0, "$tracker_user_alias.uid", $this->argument);
+  }
+
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/tracker/views_handler_filter_tracker_boolean_operator.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/tracker/views_handler_filter_tracker_boolean_operator.inc
new file mode 100644
index 0000000..455e824
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/tracker/views_handler_filter_tracker_boolean_operator.inc
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Contains views_handler_filter_tracker_boolean_operator
+ */
+
+  /**
+   * Filter handler for boolean values to use = 1 instead of <> 0.
+   */
+class views_handler_filter_tracker_boolean_operator extends views_handler_filter_boolean_operator {
+
+  /**
+   * Overrides views_handler_filter_boolean_operator::query().
+   */
+  function query() {
+    $this->ensure_my_table();
+    $where = "$this->table_alias.$this->real_field ";
+    if (empty($this->value)) {
+      $where .= '= 0';
+      if ($this->accept_null) {
+        $where = '(' . $where . " OR $this->table_alias.$this->real_field IS NULL)";
+      }
+    }
+    else {
+      $where .= '= 1';
+    }
+    $this->query->add_where_expression($this->options['group'], $where);
+  }
+
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/tracker/views_handler_filter_tracker_comment_user_uid.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/tracker/views_handler_filter_tracker_comment_user_uid.inc
new file mode 100644
index 0000000..da6f65b
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/modules/tracker/views_handler_filter_tracker_comment_user_uid.inc
@@ -0,0 +1,23 @@
+<?php
+/**
+ * @file
+ * Contains views_handler_filter_tracker_comment_user_uid
+ */
+
+/**
+ * UID filter to check for nodes that user posted or commented on.
+ */
+class views_handler_filter_tracker_comment_user_uid extends views_handler_filter_comment_user_uid {
+
+  /**
+   * Overrides views_handler_filter_comment_user_uid::query()
+   */
+  function query() {
+    // Because this handler thinks it's an argument for a field on the {node}
+    // table, we need to make sure {tracker_user} is JOINed and use its alias
+    // for the WHERE clause.
+    $tracker_user_alias = $this->query->ensure_table('tracker_user');
+    $this->query->add_where(0, "$tracker_user_alias.uid", $this->value);
+  }
+
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/export_ui/views_ui.class.php b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/export_ui/views_ui.class.php
index 22b65cb..9d80138 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/export_ui/views_ui.class.php
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/export_ui/views_ui.class.php
@@ -376,6 +376,11 @@ class views_ui extends ctools_export_ui {
   }
 
   function list_page($js, $input) {
+    // Remove filters values from session if filters are hidden.
+    if (!variable_get('views_ui_show_listing_filters', FALSE) && isset($_SESSION['ctools_export_ui'][$this->plugin['name']])) {
+      unset($_SESSION['ctools_export_ui'][$this->plugin['name']]);
+    }
+
     // wrap output in a div for CSS
     $output = parent::list_page($js, $input);
     if (is_string($output)) {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_display.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_display.inc
index 6be3dcc..75a32c5 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_display.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_display.inc
@@ -476,7 +476,7 @@ class views_plugin_display extends views_plugin {
           'display_description' => FALSE,
           'use_ajax' => TRUE,
           'hide_attachment_summary' => TRUE,
-          'hide_admin_links' => FALSE,
+          'hide_admin_links' => TRUE,
           'pager' => TRUE,
           'pager_options' => TRUE,
           'use_more' => TRUE,
@@ -783,6 +783,10 @@ class views_plugin_display extends views_plugin {
     if ($display_id && !empty($this->view->display[$display_id]) && is_object($this->view->display[$display_id]->handler)) {
       return $this->view->display[$display_id]->handler->get_path();
     }
+
+    if ($this->get_option('link_display') == 'custom_url' && $link_url = $this->get_option('link_url')) {
+      return $link_url;
+    }
   }
 
   function get_url() {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_display_feed.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_display_feed.inc
index 37d0ae4..bfd220c 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_display_feed.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_display_feed.inc
@@ -139,7 +139,6 @@ class views_plugin_display_feed extends views_plugin_display_page {
    * Provide the default form for setting options.
    */
   function options_form(&$form, &$form_state) {
-    parent::options_form($form, $form_state);
     // It is very important to call the parent function here.
     parent::options_form($form, $form_state);
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_display_page.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_display_page.inc
index cd7fe37..7ca4bf7 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_display_page.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_display_page.inc
@@ -30,6 +30,7 @@ class views_plugin_display_page extends views_plugin_display {
         'weight' => array('default' => 0),
         'name' => array('default' => variable_get('menu_default_node_menu', 'navigation')),
         'context' => array('default' => ''),
+        'context_only_inline' => array('default' => FALSE),
        ),
     );
     $options['tab_options'] = array(
@@ -153,7 +154,7 @@ class views_plugin_display_page extends views_plugin_display {
       // Add context for contextual links.
       // @see menu_contextual_links()
       if (!empty($menu['context'])) {
-        $items[$path]['context'] = MENU_CONTEXT_INLINE;
+        $items[$path]['context'] = !empty($menu['context_only_inline']) ? MENU_CONTEXT_INLINE : (MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE);
       }
 
       // If this is a 'default' tab, check to see if we have to create teh
@@ -251,9 +252,12 @@ class views_plugin_display_page extends views_plugin_display {
       ),
     );
 
-    $path = strip_tags('/' . $this->get_option('path'));
+    $path = strip_tags($this->get_option('path'));
     if (empty($path)) {
-      $path = t('None');
+      $path = t('No path is set');
+    }
+    else {
+      $path = '/' . $path;
     }
 
     $options['path'] = array(
@@ -297,7 +301,6 @@ class views_plugin_display_page extends views_plugin_display {
    * Provide the default form for setting options.
    */
   function options_form(&$form, &$form_state) {
-    parent::options_form($form, $form_state);
     // It is very important to call the parent function here:
     parent::options_form($form, $form_state);
 
@@ -384,12 +387,23 @@ class views_plugin_display_page extends views_plugin_display {
         );
         $form['menu']['context'] = array(
           '#title' => t('Context'),
-          '#suffix' => '</div>',
           '#type' => 'checkbox',
           '#default_value' => !empty($menu['context']),
           '#description' => t('Displays the link in contextual links'),
           '#dependency' => array('radio:menu[type]' => array('tab')),
         );
+        $form['menu']['context_only_inline'] = array(
+          '#title' => t('Hide menu tab'),
+          '#suffix' => '</div>',
+          '#type' => 'checkbox',
+          '#default_value' => !empty($menu['context_only_inline']),
+          '#description' => t('Only display menu item entry in contextual links. Menu tab should not be displayed.'),
+          '#dependency' => array(
+            'radio:menu[type]' => array('tab'),
+            'edit-menu-context' => array(1),
+          ),
+          '#dependency_count' => 2,
+        );
         break;
       case 'tab_options':
         $form['#title'] .= t('Default tab options');
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_exposed_form.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_exposed_form.inc
index 833f44b..343eee8 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_exposed_form.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_exposed_form.inc
@@ -41,6 +41,7 @@ class views_plugin_exposed_form extends views_plugin {
     $options['reset_button'] = array('default' => FALSE, 'bool' => TRUE);
     $options['reset_button_label'] = array('default' => 'Reset', 'translatable' => TRUE);
     $options['exposed_sorts_label'] = array('default' => 'Sort by', 'translatable' => TRUE);
+    $options['expose_sort_order'] = array('default' => TRUE, 'bool' => TRUE);
     $options['sort_asc_label'] = array('default' => 'Asc', 'translatable' => TRUE);
     $options['sort_desc_label'] = array('default' => 'Desc', 'translatable' => TRUE);
     $options['autosubmit'] = array('default' => FALSE, 'bool' => TRUE);
@@ -84,12 +85,20 @@ class views_plugin_exposed_form extends views_plugin {
       '#required' => TRUE,
     );
 
+    $form['expose_sort_order'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Expose sort order'),
+      '#description' => t('Allow the user to choose the sort order. If sort order is not exposed, the sort criteria settings for each sort will determine its order.'),
+      '#default_value' => $this->options['expose_sort_order'],
+    );
+
     $form['sort_asc_label'] = array(
       '#type' => 'textfield',
       '#title' => t('Ascending'),
       '#description' => t('Text to use when exposed sort is ordered ascending.'),
       '#default_value' => $this->options['sort_asc_label'],
       '#required' => TRUE,
+      '#dependency' => array('edit-exposed-form-options-expose-sort-order' => array(TRUE)),
     );
 
     $form['sort_desc_label'] = array(
@@ -98,6 +107,7 @@ class views_plugin_exposed_form extends views_plugin {
       '#description' => t('Text to use when exposed sort is ordered descending.'),
       '#default_value' => $this->options['sort_desc_label'],
       '#required' => TRUE,
+      '#dependency' => array('edit-exposed-form-options-expose-sort-order' => array(TRUE)),
     );
 
     $form['autosubmit'] = array(
@@ -231,12 +241,14 @@ class views_plugin_exposed_form extends views_plugin {
         $form_state['input']['sort_by'] = array_shift($keys);
       }
 
-      $form['sort_order'] = array(
-        '#type' => 'select',
-        '#options' => $sort_order,
-        '#title' => t('Order'),
-        '#default_value' => $default_sort_order,
-      );
+      if ($this->options['expose_sort_order']) {
+        $form['sort_order'] = array(
+          '#type' => 'select',
+          '#options' => $sort_order,
+          '#title' => t('Order'),
+          '#default_value' => $default_sort_order,
+        );
+      }
       $form['submit']['#weight'] = 10;
       if (isset($form['reset'])) {
         $form['reset']['#weight'] = 10;
@@ -312,6 +324,7 @@ class views_plugin_exposed_form extends views_plugin {
       $this->view->exposed_data = array();
     }
 
+    $form_state['redirect'] = current_path();
     $form_state['values'] = array();
   }
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_pager_mini.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_pager_mini.inc
index 2daea99..bec48c8 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_pager_mini.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_pager_mini.inc
@@ -6,7 +6,7 @@
  */
 
 /**
- * The plugin to handle full pager.
+ * The plugin to handle mini pager.
  *
  * @ingroup views_pager_plugins
  */
@@ -18,9 +18,53 @@ class views_plugin_pager_mini extends views_plugin_pager_full {
       return format_plural($this->options['items_per_page'], 'Mini pager, @count item', 'Mini pager, @count items', array('@count' => $this->options['items_per_page']));
   }
 
+  /**
+   * Overrides views_plugin_pager_full::option_definition().
+   *
+   * Overrides the full pager options form by deleting unused settings.
+   */
+  function option_definition() {
+    $options = parent::option_definition();
+
+    unset($options['quantity']);
+    unset($options['tags']['first']);
+    unset($options['tags']['last']);
+    $options['tags']['previous']['default'] = '‹‹';
+    $options['tags']['next']['default'] = '››';
+
+    return $options;
+  }
+
+  /**
+   * Overrides views_plugin_pager_full::options_form().
+   *
+   * Overrides the full pager options form by deleting unused settings.
+   */
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    unset($form['quantity']);
+    unset($form['tags']['first']);
+    unset($form['tags']['last']);
+  }
+
+  /**
+   * Overrides views_plugin_pager_full::render().
+   *
+   * Overrides the full pager renderer by changing the theme function
+   * and leaving out variables that are not used in the mini pager.
+   */
   function render($input) {
     $pager_theme = views_theme_functions('views_mini_pager', $this->view, $this->display);
+    // The 1, 3 index are correct.
+    // @see theme_pager().
+    $tags = array(
+      1 => $this->options['tags']['previous'],
+      3 => $this->options['tags']['next'],
+    );
     return theme($pager_theme, array(
-      'parameters' => $input, 'element' => $this->options['id']));
+      'tags' => $tags,
+      'element' => $this->options['id'],
+      'parameters' => $input,
+    ));
   }
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_query_default.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_query_default.inc
index c6c7649..030c5ea 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_query_default.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_query_default.inc
@@ -1578,7 +1578,7 @@ class views_plugin_query_default extends views_plugin_query {
         ),
       ),
       'stddev_pop' => array(
-        'title' => t('Standard derivation'),
+        'title' => t('Standard deviation'),
         'method' => 'views_query_default_aggregation_method_simple',
         'handler' => array(
           'argument' => 'views_handler_argument_group_by_numeric',
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_grid.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_grid.inc
index 9be7ee1..a2e4375 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_grid.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_grid.inc
@@ -21,6 +21,7 @@ class views_plugin_style_grid extends views_plugin_style {
     $options['alignment'] = array('default' => 'horizontal');
     $options['fill_single_line'] = array('default' => TRUE, 'bool' => TRUE);
     $options['summary'] = array('default' => '');
+    $options['caption'] = array('default' => '');
 
     return $options;
   }
@@ -52,10 +53,17 @@ class views_plugin_style_grid extends views_plugin_style {
       '#default_value' => !empty($this->options['fill_single_line']),
     );
 
+    $form['caption'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Short description of table'),
+      '#description' => t('Include a caption for better accessibility of your table.'),
+      '#default_value' => $this->options['caption'],
+    );
+
     $form['summary'] = array(
       '#type' => 'textfield',
       '#title' => t('Table summary'),
-      '#description' => t('This value will be displayed as table-summary attribute in the html. Set this for better accessiblity of your site.'),
+      '#description' => t('This value will be displayed as table-summary attribute in the html. Use this to give a summary of complex tables.'),
       '#default_value' => $this->options['summary'],
     );
   }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_jump_menu.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_jump_menu.inc
index f571f62..16b0aef 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_jump_menu.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_jump_menu.inc
@@ -17,7 +17,9 @@ class views_plugin_style_jump_menu extends views_plugin_style {
     $options['hide'] = array('default' => FALSE, 'bool' => TRUE);
     $options['path'] = array('default' => '');
     $options['text'] = array('default' => 'Go', 'translatable' => TRUE);
+    $options['label'] = array('default' => '', 'translatable' => TRUE);
     $options['choose'] = array('default' => '- Choose -', 'translatable' => TRUE);
+    $options['inline'] = array('default' => TRUE, 'bool' => TRUE);
     $options['default_value'] = array('default' => FALSE, 'bool' => TRUE);
 
     return $options;
@@ -68,6 +70,13 @@ class views_plugin_style_jump_menu extends views_plugin_style {
       '#default_value' => $this->options['text'],
     );
 
+    $form['label'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Selector label'),
+      '#default_value' => $this->options['label'],
+      '#description' => t('The text that will appear as the the label of the selector element. If blank no label tag will be used.'),
+    );
+
     $form['choose'] = array(
       '#type' => 'textfield',
       '#title' => t('Choose text'),
@@ -75,6 +84,12 @@ class views_plugin_style_jump_menu extends views_plugin_style {
       '#description' => t('The text that will appear as the selected option in the jump menu.'),
     );
 
+    $form['inline'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Set this field to display inline'),
+      '#default_value' => !empty($this->options['inline']),
+    );
+
     $form['default_value'] = array(
       '#type' => 'checkbox',
       '#title' => t('Select the current contextual filter value'),
@@ -135,7 +150,9 @@ class views_plugin_style_jump_menu extends views_plugin_style {
     $settings = array(
       'hide' => $this->options['hide'],
       'button' => $this->options['text'],
+      'title' => $this->options['label'],
       'choose' => $this->options['choose'],
+      'inline' => $this->options['inline'],
       'default_value' => $default_value,
     );
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_mapping.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_mapping.inc
new file mode 100644
index 0000000..fb60a03
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_mapping.inc
@@ -0,0 +1,125 @@
+<?php
+
+/**
+ * @file
+ * Definition of views_plugin_style_mapping.
+ */
+
+/**
+ * Allows fields to be mapped to specific use cases.
+ */
+abstract class views_plugin_style_mapping extends views_plugin_style {
+
+  /**
+   * Builds the list of field mappings.
+   *
+   * @return array
+   *   An associative array, keyed by the field name, containing the following
+   *   key-value pairs:
+   *   - #title: The human-readable label for this field.
+   *   - #default_value: The default value for this field. If not provided, an
+   *     empty string will be used.
+   *   - #description: A description of this field.
+   *   - #required: Whether this field is required.
+   *   - #filter: (optional) A method on the plugin to filter field options.
+   *   - #toggle: (optional) If this select should be toggled by a checkbox.
+   */
+  abstract protected function define_mapping();
+
+  /**
+   * Overrides views_plugin_style::option_definition().
+   */
+  function option_definition() {
+    $options = parent::option_definition();
+
+    // Parse the mapping and add a default for each.
+    foreach ($this->define_mapping() as $key => $value) {
+      $default = !empty($value['#multiple']) ? array() : '';
+      $options['mapping']['contains'][$key] = array(
+        'default' => isset($value['#default_value']) ? $value['#default_value'] : $default,
+      );
+      if (!empty($value['#toggle'])) {
+        $options['mapping']['contains']["toggle_$key"] = array(
+          'default' => FALSE,
+          'bool' => TRUE,
+        );
+      }
+    }
+
+    return $options;
+  }
+
+  /**
+   * Overrides views_plugin_style::options_form().
+   */
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+
+    // Get the mapping.
+    $mapping = $this->define_mapping();
+
+    // Restrict the list of defaults to the mapping, in case they have changed.
+    $options = array_intersect_key($this->options['mapping'], $mapping);
+
+    // Get the labels of the fields added to this display.
+    $field_labels = $this->display->handler->get_field_labels();
+
+    // Provide some default values.
+    $defaults = array(
+      '#type' => 'select',
+      '#required' => FALSE,
+      '#multiple' => FALSE,
+    );
+
+    // For each mapping, add a select element to the form.
+    foreach ($options as $key => $value) {
+      // If the field is optional, add a 'None' value to the top of the options.
+      $field_options = array();
+      $required = !empty($mapping[$key]['#required']);
+      if (!$required && empty($mapping[$key]['#multiple'])) {
+        $field_options = array('' => t('- None -'));
+      }
+      $field_options += $field_labels;
+
+      // Optionally filter the available fields.
+      if (isset($mapping[$key]['#filter'])) {
+        $this->view->init_handlers();
+        $this::$mapping[$key]['#filter']($field_options);
+        unset($mapping[$key]['#filter']);
+      }
+
+      // These values must always be set.
+      $overrides = array(
+        '#options' => $field_options,
+        '#default_value' => $options[$key],
+      );
+
+      // Optionally allow the select to be toggleable.
+      if (!empty($mapping[$key]['#toggle'])) {
+        $form['mapping']["toggle_$key"] = array(
+          '#type' => 'checkbox',
+          '#title' => t('Use a custom %field_name', array('%field_name' => strtolower($mapping[$key]['#title']))),
+          '#default_value' => $this->options['mapping']["toggle_$key"],
+        );
+        $overrides['#states']['visible'][':input[name="style_options[mapping][' . "toggle_$key" . ']"]'] = array('checked' => TRUE);
+      }
+
+      $form['mapping'][$key] = $overrides + $mapping[$key] + $defaults;
+    }
+  }
+
+  /**
+   * Overrides views_plugin_style::render().
+   *
+   * Provides the mapping definition as an available variable.
+   */
+  function render() {
+    return theme($this->theme_functions(), array(
+      'view' => $this->view,
+      'options' => $this->options,
+      'rows' => $this->view->result,
+      'mapping' => $this->define_mapping(),
+    ));
+  }
+
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_summary_jump_menu.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_summary_jump_menu.inc
index 5b02163..a16a84b 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_summary_jump_menu.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_summary_jump_menu.inc
@@ -18,7 +18,9 @@ class views_plugin_style_summary_jump_menu extends views_plugin_style {
     $options['count'] = array('default' => TRUE, 'bool' => TRUE);
     $options['hide'] = array('default' => FALSE, 'bool' => TRUE);
     $options['text'] = array('default' => 'Go', 'translatable' => TRUE);
+    $options['label'] = array('default' => '', 'translatable' => TRUE);
     $options['choose'] = array('default' => '- Choose -', 'translatable' => TRUE);
+    $options['inline'] = array('default' => TRUE, 'bool' => TRUE);
     $options['default_value'] = array('default' => FALSE, 'bool' => TRUE);
 
     return $options;
@@ -63,6 +65,13 @@ class views_plugin_style_summary_jump_menu extends views_plugin_style {
       '#default_value' => $this->options['text'],
     );
 
+    $form['label'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Selector label'),
+      '#default_value' => $this->options['label'],
+      '#description' => t('The text that will appear as the the label of the selector element. If blank no label tag will be used.'),
+    );
+
     $form['choose'] = array(
       '#type' => 'textfield',
       '#title' => t('Choose text'),
@@ -70,6 +79,12 @@ class views_plugin_style_summary_jump_menu extends views_plugin_style {
       '#description' => t('The text that will appear as the selected option in the jump menu.'),
     );
 
+    $form['inline'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Set this field to display inline'),
+      '#default_value' => !empty($this->options['inline']),
+    );
+
     $form['default_value'] = array(
       '#type' => 'checkbox',
       '#title' => t('Select the current contextual filter value'),
@@ -119,7 +134,9 @@ class views_plugin_style_summary_jump_menu extends views_plugin_style {
     $settings = array(
       'hide' => $this->options['hide'],
       'button' => $this->options['text'],
+      'title' => $this->options['label'],
       'choose' => $this->options['choose'],
+      'inline' => $this->options['inline'],
       'default_value' => $default_value,
     );
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_table.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_table.inc
index 98919ab..45ed976 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_table.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/plugins/views_plugin_style_table.inc
@@ -33,6 +33,7 @@ class views_plugin_style_table extends views_plugin_style {
     $options['override'] = array('default' => TRUE, 'bool' => TRUE);
     $options['sticky'] = array('default' => FALSE, 'bool' => TRUE);
     $options['order'] = array('default' => 'asc');
+    $options['caption'] = array('default' => '', 'translatable' => TRUE);
     $options['summary'] = array('default' => '', 'translatable' => TRUE);
     $options['empty_table'] = array('default' => FALSE, 'bool' => TRUE);
 
@@ -179,10 +180,18 @@ class views_plugin_style_table extends views_plugin_style {
       '#description' => t('(Sticky header effects will not be active for preview below, only on live output.)'),
     );
 
+    $form['caption'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Short description of table'),
+      '#description' => t('Include a caption for better accessibility of your table.'),
+      '#default_value' => $this->options['caption'],
+      '#maxlength' => 255,
+    );
+
     $form['summary'] = array(
       '#type' => 'textfield',
       '#title' => t('Table summary'),
-      '#description' => t('This value will be displayed as table-summary attribute in the html. Set this for better accessiblity of your site.'),
+      '#description' => t('This value will be displayed as table-summary attribute in the html. Use this to give a summary of complex tables.'),
       '#default_value' => $this->options['summary'],
       '#maxlength' => 255,
     );
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/field/views_fieldapi.test b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/field/views_fieldapi.test
index c5393b5..da4c27b 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/field/views_fieldapi.test
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/field/views_fieldapi.test
@@ -88,10 +88,9 @@ class ViewsFieldApiTestHelper extends ViewsSqlTest {
    */
   function clearViewsCaches() {
     // Reset views data cache.
-    $cache = &drupal_static('_views_fetch_data' . '_cache');
-    $recursion_protection = &drupal_static('_views_fetch_data' . '_recursion_protected');
-    $cache = NULL;
-    $recursion_protection = NULL;
+    drupal_static_reset('_views_fetch_data_cache');
+    drupal_static_reset('_views_fetch_data_recursion_protected');
+    drupal_static_reset('_views_fetch_data_fully_loaded');
   }
 }
 
@@ -169,10 +168,7 @@ class viewsFieldApiDataTest extends ViewsFieldApiTestHelper {
     }
 
     // Reset views data cache.
-    $cache = &drupal_static('_views_fetch_data' . '_cache');
-    $recursion_protection = &drupal_static('_views_fetch_data' . '_recursion_protected');
-    $cache = NULL;
-    $recursion_protection = NULL;
+    $this->clearViewsCaches();
   }
 
   /**
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/handlers/views_handler_field_boolean.test b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/handlers/views_handler_field_boolean.test
index 92ec7a5..286b942 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/handlers/views_handler_field_boolean.test
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/handlers/views_handler_field_boolean.test
@@ -66,11 +66,43 @@ class ViewsHandlerFieldBooleanTest extends ViewsSqlTest {
     $this->assertEqual('✖', $view->field['age']->advanced_render($view->result[0]));
     $this->assertEqual('✔', $view->field['age']->advanced_render($view->result[1]));
 
-    // Set a custom output format.
+    // Set a custom output format programmatically.
     $view->field['age']->formats['test'] = array(t('Test-True'), t('Test-False'));
     $view->field['age']->options['type'] = 'test';
     $this->assertEqual(t('Test-False'), $view->field['age']->advanced_render($view->result[0]));
     $this->assertEqual(t('Test-True'), $view->field['age']->advanced_render($view->result[1]));
 
+    // Set a custom output format through the UI using plain-text inputs.
+    $view->field['age']->options['type'] = 'custom';
+    $values = array(
+      'false' => 'Nay',
+      'true' => 'Yay',
+    );
+    $view->field['age']->options['type_custom_false'] = $values['false'];
+    $view->field['age']->options['type_custom_true'] = $values['true'];
+    $this->assertEqual($values['false'], $view->field['age']->advanced_render($view->result[0]));
+    $this->assertEqual($values['true'], $view->field['age']->advanced_render($view->result[1]));
+
+    // Set a custom output format through the UI using valid HTML inputs.
+    $view->field['age']->options['type'] = 'custom';
+    $values = array(
+      'false' => '<div class="bar">Nay</div>',
+      'true' => '<div class="foo">Yay</div>',
+    );
+    $view->field['age']->options['type_custom_false'] = $values['false'];
+    $view->field['age']->options['type_custom_true'] = $values['true'];
+    $this->assertEqual($values['false'], $view->field['age']->advanced_render($view->result[0]));
+    $this->assertEqual($values['true'], $view->field['age']->advanced_render($view->result[1]));
+
+    // Set a custom output format through the UI using unsafe inputs.
+    $view->field['age']->options['type'] = 'custom';
+    $values = array(
+      'false' => '<script>alert("Nay");</script>',
+      'true' => '<script>alert("Yay");</script>',
+    );
+    $view->field['age']->options['type_custom_false'] = $values['false'];
+    $view->field['age']->options['type_custom_true'] = $values['true'];
+    $this->assertNotEqual($values['false'], $view->field['age']->advanced_render($view->result[0]));
+    $this->assertNotEqual($values['true'], $view->field['age']->advanced_render($view->result[1]));
   }
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/node/views_node_revision_relations.test b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/node/views_node_revision_relations.test
new file mode 100644
index 0000000..6b38396
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/node/views_node_revision_relations.test
@@ -0,0 +1,177 @@
+<?php
+
+/**
+ * @file
+ * Definition of ViewsNodeRevisionRelationsTestCase.
+ */
+
+/**
+ * Tests basic node_revision table integration into views.
+ */
+class ViewsNodeRevisionRelationsTestCase extends ViewsSqlTest {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Tests basic node_revision integration',
+      'description' => 'Tests the integration of node_revision table of node module',
+      'group' => 'Views Modules',
+    );
+  }
+
+  /**
+   * Create a node with revision and rest result count for both views.
+   */
+  public function testNodeRevisionRelationship() {
+    $node = $this->drupalCreateNode();
+    // Create revision of the node.
+    $node_revision = clone $node;
+    $node_revision->revision = 1;
+    node_save($node_revision);
+    $column_map = array(
+      'vid' => 'vid',
+      'node_revision_nid' => 'node_revision_nid',
+      'node_node_revision_nid' => 'node_node_revision_nid',
+    );
+
+    // Here should be two rows.
+    $view_nid = $this->test_view_node_revision_nid();
+    $this->executeView($view_nid, array($node->nid));
+    $resultset_nid = array(
+      array(
+        'vid' => '1',
+        'node_revision_nid' => '1',
+        'node_node_revision_nid' => '1',
+      ),
+      array(
+        'vid' => '2',
+        'node_revision_nid' => '1',
+        'node_node_revision_nid' => '1',
+      ),
+    );
+    $this->assertIdenticalResultset($view_nid, $resultset_nid, $column_map);
+
+    // There should be only one row with active revision 2.
+    $view_vid = $this->test_view_node_revision_vid();
+    $this->executeView($view_vid, array($node->nid));
+    $resultset_vid = array(
+      array(
+        'vid' => '2',
+        'node_revision_nid' => '1',
+        'node_node_revision_nid' => '1',
+      ),
+    );
+    $this->assertIdenticalResultset($view_vid, $resultset_vid, $column_map);
+  }
+
+  /**
+   * Test view with default join on node.nid.
+   */
+  function test_view_node_revision_nid() {
+    $view = new view();
+    $view->name = 'test_node_revision_nid';
+    $view->description = '';
+    $view->tag = '';
+    $view->base_table = 'node_revision';
+    $view->human_name = 'Test node revision nid';
+    $view->core = 7;
+    $view->api_version = '3.0';
+    $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+    /* Display: Master */
+    $handler = $view->new_display('default', 'Master', 'default');
+    $handler->display->display_options['use_more_always'] = FALSE;
+    $handler->display->display_options['access']['type'] = 'perm';
+    $handler->display->display_options['access']['perm'] = 'view revisions';
+    $handler->display->display_options['cache']['type'] = 'none';
+    $handler->display->display_options['query']['type'] = 'views_query';
+    $handler->display->display_options['exposed_form']['type'] = 'basic';
+    $handler->display->display_options['pager']['type'] = 'full';
+    $handler->display->display_options['style_plugin'] = 'default';
+    $handler->display->display_options['row_plugin'] = 'fields';
+    /* Relationship: Content revision: Content */
+    $handler->display->display_options['relationships']['nid']['id'] = 'nid';
+    $handler->display->display_options['relationships']['nid']['table'] = 'node_revision';
+    $handler->display->display_options['relationships']['nid']['field'] = 'nid';
+    $handler->display->display_options['relationships']['nid']['label'] = 'NID';
+    $handler->display->display_options['relationships']['nid']['required'] = TRUE;
+    /* Field: Content revision: Vid */
+    $handler->display->display_options['fields']['vid']['id'] = 'vid';
+    $handler->display->display_options['fields']['vid']['table'] = 'node_revision';
+    $handler->display->display_options['fields']['vid']['field'] = 'vid';
+    /* Field: Content revision: Nid */
+    $handler->display->display_options['fields']['nid_1']['id'] = 'nid_1';
+    $handler->display->display_options['fields']['nid_1']['table'] = 'node_revision';
+    $handler->display->display_options['fields']['nid_1']['field'] = 'nid';
+    /* Field: Content: Nid */
+    $handler->display->display_options['fields']['nid']['id'] = 'nid';
+    $handler->display->display_options['fields']['nid']['table'] = 'node';
+    $handler->display->display_options['fields']['nid']['field'] = 'nid';
+    $handler->display->display_options['fields']['nid']['relationship'] = 'nid';
+    /* Contextual filter: Content revision: Nid */
+    $handler->display->display_options['arguments']['nid']['id'] = 'nid';
+    $handler->display->display_options['arguments']['nid']['table'] = 'node_revision';
+    $handler->display->display_options['arguments']['nid']['field'] = 'nid';
+    $handler->display->display_options['arguments']['nid']['default_argument_type'] = 'fixed';
+    $handler->display->display_options['arguments']['nid']['summary']['number_of_records'] = '0';
+    $handler->display->display_options['arguments']['nid']['summary']['format'] = 'default_summary';
+    $handler->display->display_options['arguments']['nid']['summary_options']['items_per_page'] = '25';
+
+    return $view;
+  }
+
+  /**
+   * Test view with default join on node.vid.
+   */
+  function test_view_node_revision_vid() {
+    $view = new view();
+    $view->name = 'test_node_revision_vid';
+    $view->description = '';
+    $view->tag = '';
+    $view->base_table = 'node_revision';
+    $view->human_name = 'Test node revision vid';
+    $view->core = 7;
+    $view->api_version = '3.0';
+    $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+    /* Display: Master */
+    $handler = $view->new_display('default', 'Master', 'default');
+    $handler->display->display_options['use_more_always'] = FALSE;
+    $handler->display->display_options['access']['type'] = 'perm';
+    $handler->display->display_options['access']['perm'] = 'view revisions';
+    $handler->display->display_options['cache']['type'] = 'none';
+    $handler->display->display_options['query']['type'] = 'views_query';
+    $handler->display->display_options['exposed_form']['type'] = 'basic';
+    $handler->display->display_options['pager']['type'] = 'full';
+    $handler->display->display_options['style_plugin'] = 'default';
+    $handler->display->display_options['row_plugin'] = 'fields';
+    /* Relationship: Content revision: Content */
+    $handler->display->display_options['relationships']['vid']['id'] = 'vid';
+    $handler->display->display_options['relationships']['vid']['table'] = 'node_revision';
+    $handler->display->display_options['relationships']['vid']['field'] = 'vid';
+    $handler->display->display_options['relationships']['vid']['label'] = 'VID';
+    $handler->display->display_options['relationships']['vid']['required'] = TRUE;
+    /* Field: Content revision: Vid */
+    $handler->display->display_options['fields']['vid']['id'] = 'vid';
+    $handler->display->display_options['fields']['vid']['table'] = 'node_revision';
+    $handler->display->display_options['fields']['vid']['field'] = 'vid';
+    /* Field: Content revision: Nid */
+    $handler->display->display_options['fields']['nid_1']['id'] = 'nid_1';
+    $handler->display->display_options['fields']['nid_1']['table'] = 'node_revision';
+    $handler->display->display_options['fields']['nid_1']['field'] = 'nid';
+    /* Field: Content: Nid */
+    $handler->display->display_options['fields']['nid']['id'] = 'nid';
+    $handler->display->display_options['fields']['nid']['table'] = 'node';
+    $handler->display->display_options['fields']['nid']['field'] = 'nid';
+    $handler->display->display_options['fields']['nid']['relationship'] = 'vid';
+    /* Contextual filter: Content revision: Nid */
+    $handler->display->display_options['arguments']['nid']['id'] = 'nid';
+    $handler->display->display_options['arguments']['nid']['table'] = 'node_revision';
+    $handler->display->display_options['arguments']['nid']['field'] = 'nid';
+    $handler->display->display_options['arguments']['nid']['default_argument_type'] = 'fixed';
+    $handler->display->display_options['arguments']['nid']['summary']['number_of_records'] = '0';
+    $handler->display->display_options['arguments']['nid']['summary']['format'] = 'default_summary';
+    $handler->display->display_options['arguments']['nid']['summary_options']['items_per_page'] = '25';
+
+    return $view;
+  }
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style.test b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style.test
index 87f5b7d..dfc5413 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style.test
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style.test
@@ -8,7 +8,7 @@
 /**
  * Tests some general style plugin related functionality.
  */
-class ViewsPluginStyleTestCase extends ViewsSqlTest {
+class ViewsPluginStyleTestCase extends ViewsPluginStyleTestBase {
   public static function getInfo() {
     return array(
       'name' => 'Styles',
@@ -232,20 +232,6 @@ class ViewsPluginStyleTestCase extends ViewsSqlTest {
     }
   }
 
-
-  /**
-   * Stores a view output in the elements.
-   */
-  function storeViewPreview($output) {
-    $htmlDom = new DOMDocument();
-    @$htmlDom->loadHTML($output);
-    if ($htmlDom) {
-      // It's much easier to work with simplexml than DOM, luckily enough
-      // we can just simply import our DOM tree.
-      $this->elements = simplexml_import_dom($htmlDom);
-    }
-  }
-
   /**
    * Tests custom css classes.
    */
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_base.test b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_base.test
new file mode 100644
index 0000000..514077d
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_base.test
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Definition of ViewsPluginStyleTestBase.
+ */
+
+/**
+ * Provides a base foundation for testing style plugins.
+ */
+abstract class ViewsPluginStyleTestBase extends ViewsSqlTest {
+
+  /**
+   * Stores the SimpleXML representation of the output.
+   *
+   * @var SimpleXMLElement
+   */
+  protected $elements;
+
+  /**
+   * Stores a view output in the elements.
+   */
+  function storeViewPreview($output) {
+    $htmlDom = new DOMDocument();
+    @$htmlDom->loadHTML($output);
+    if ($htmlDom) {
+      // It's much easier to work with simplexml than DOM, luckily enough
+      // we can just simply import our DOM tree.
+      $this->elements = simplexml_import_dom($htmlDom);
+    }
+  }
+
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_jump_menu.test b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_jump_menu.test
index 9a53bfc..dd4eca0 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_jump_menu.test
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_jump_menu.test
@@ -9,6 +9,14 @@
  * Tests jump menu style functionality.
  */
 class viewsPluginStyleJumpMenuTest extends ViewsSqlTest {
+
+  /**
+   * Stores all created nodes.
+   *
+   * @var array
+   */
+  var $nodes;
+
   public static function getInfo() {
     return array(
       'name' => 'Jump menu',
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_mapping.test b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_mapping.test
new file mode 100644
index 0000000..5785075
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_mapping.test
@@ -0,0 +1,144 @@
+<?php
+
+/**
+ * @file
+ * Definition of ViewsPluginStyleMappingTest.
+ */
+
+/**
+ * Tests the default/mapping row style.
+ */
+class ViewsPluginStyleMappingTest extends ViewsPluginStyleTestBase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Style: Mapping',
+      'description' => 'Test mapping style functionality.',
+      'group' => 'Views Plugins',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp();
+
+    // Reset the plugin data.
+    views_fetch_plugin_data(NULL, NULL, TRUE);
+  }
+
+  protected function viewsPlugins() {
+    return array(
+      'style' =>  array(
+        'test_mapping' => array(
+          'title' => t('Field mapping'),
+          'help' => t('Maps specific fields to specific purposes.'),
+          'handler' => 'views_test_plugin_style_test_mapping',
+          'path' => drupal_get_path('module', 'views_test') . '/test_plugins',
+          'theme' => 'views_view_mapping_test',
+          'theme path' => drupal_get_path('module', 'views_test'),
+          'theme file' => 'views_test.module',
+          'uses row plugin' => FALSE,
+          'uses fields' => TRUE,
+          'uses options' => TRUE,
+          'uses grouping' => FALSE,
+          'type' => 'normal',
+        ),
+      ),
+    );
+  }
+
+  /**
+   * Overrides ViewsTestCase::getBasicView().
+   */
+  protected function getBasicView() {
+    $view = parent::getBasicView();
+    $view->display['default']->handler->override_option('style_plugin', 'test_mapping');
+    $view->display['default']->handler->override_option('style_options', array(
+      'mapping' => array(
+        'name_field' => 'name',
+        'numeric_field' => array(
+          'age',
+        ),
+        'title_field' => 'name',
+        'toggle_numeric_field' => TRUE,
+        'toggle_title_field' => TRUE,
+      ),
+    ));
+    $view->display['default']->handler->override_option('fields', array(
+      'age' => array(
+        'id' => 'age',
+        'table' => 'views_test',
+        'field' => 'age',
+        'relationship' => 'none',
+      ),
+      'name' => array(
+        'id' => 'name',
+        'table' => 'views_test',
+        'field' => 'name',
+        'relationship' => 'none',
+      ),
+      'job' => array(
+        'id' => 'job',
+        'table' => 'views_test',
+        'field' => 'job',
+        'relationship' => 'none',
+      ),
+    ));
+    return $view;
+  }
+
+  /**
+   * Verifies that the fields were mapped correctly.
+   */
+  public function testMappedOutput() {
+    $view = $this->getBasicView();
+    $output = $this->mappedOutputHelper($view);
+    $this->assertTrue(strpos($output, 'job') === FALSE, 'The job field is added to the view but not in the mapping.');
+
+    $view = $this->getBasicView();
+    $view->display['default']->display_options['style_options']['mapping']['name_field'] = 'job';
+    $output = $this->mappedOutputHelper($view);
+    $this->assertTrue(strpos($output, 'job') !== FALSE, 'The job field is added to the view and is in the mapping.');
+  }
+
+  /**
+   * Tests the mapping of fields.
+   *
+   * @param view $view
+   *   The view to test.
+   *
+   * @return string
+   *   The view rendered as HTML.
+   */
+  protected function mappedOutputHelper($view) {
+    $rendered_output = $view->preview();
+    $this->storeViewPreview($rendered_output);
+    $rows = $this->elements->body->div->div->div;
+    $data_set = $this->dataSet();
+
+    $count = 0;
+    foreach ($rows as $row) {
+      $attributes = $row->attributes();
+      $class = (string) $attributes['class'][0];
+      $this->assertTrue(strpos($class, 'views-row-mapping-test') !== FALSE, 'Make sure that each row has the correct CSS class.');
+
+      foreach ($row->div as $field) {
+        // Split up the field-level class, the first part is the mapping name
+        // and the second is the field ID.
+        $field_attributes = $field->attributes();
+        $name = strtok((string) $field_attributes['class'][0], '-');
+        $field_id = strtok('-');
+
+        // The expected result is the mapping name and the field value,
+        // separated by ':'.
+        $expected_result = $name . ':' . $data_set[$count][$field_id];
+        $actual_result = (string) $field;
+        $this->assertIdentical($expected_result, $actual_result, format_string('The fields were mapped successfully: %name => %field_id', array('%name' => $name, '%field_id' => $field_id)));
+      }
+
+      $count++;
+    }
+
+    return $rendered_output;
+  }
+
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_unformatted.test b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_unformatted.test
index 20b7b4d..0c0e882 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_unformatted.test
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/styles/views_plugin_style_unformatted.test
@@ -8,14 +8,7 @@
 /**
  * Tests the default/unformatted row style.
  */
-class ViewsPluginStyleUnformattedTestCase extends ViewsSqlTest {
-
-  /**
-   * Stores all created nodes.
-   *
-   * @var array
-   */
-  var $nodes;
+class ViewsPluginStyleUnformattedTestCase extends ViewsPluginStyleTestBase {
 
   public static function getInfo() {
     return array(
@@ -26,19 +19,6 @@ class ViewsPluginStyleUnformattedTestCase extends ViewsSqlTest {
   }
 
   /**
-   * Stores a view output in the elements.
-   */
-  function storeViewPreview($output) {
-    $htmlDom = new DOMDocument();
-    @$htmlDom->loadHTML($output);
-    if ($htmlDom) {
-      // It's much easier to work with simplexml than DOM, luckily enough
-      // we can just simply import our DOM tree.
-      $this->elements = simplexml_import_dom($htmlDom);
-    }
-  }
-
-  /**
    * Take sure that the default css classes works as expected.
    */
   function testDefaultRowClasses() {
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/test_plugins/views_test_plugin_style_test_mapping.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/test_plugins/views_test_plugin_style_test_mapping.inc
new file mode 100644
index 0000000..b926787
--- /dev/null
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/test_plugins/views_test_plugin_style_test_mapping.inc
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @file
+ * Definition of views_test_plugin_style_test_mapping.
+ */
+
+/**
+ * Provides a test mapping style plugin.
+ */
+class views_test_plugin_style_test_mapping extends views_plugin_style_mapping {
+
+  /**
+   * Overrides views_plugin_style_mapping::define_mapping().
+   */
+  protected function define_mapping() {
+    return array(
+      'title_field' => array(
+        '#title' => t('Title field'),
+        '#description' => t('Choose the field with the custom title.'),
+        '#toggle' => TRUE,
+        '#required' => TRUE,
+      ),
+      'name_field' => array(
+        '#title' => t('Name field'),
+        '#description' => t('Choose the field with the custom name.'),
+      ),
+      'numeric_field' => array(
+        '#title' => t('Numeric field'),
+        '#description' => t('Select one or more numeric fields.'),
+        '#multiple' => TRUE,
+        '#toggle' => TRUE,
+        '#filter' => 'filter_numeric_fields',
+        '#required' => TRUE,
+      ),
+    );
+  }
+
+  /**
+   * Restricts the allowed fields to only numeric fields.
+   *
+   * @param array $fields
+   *   An array of field labels, keyed by the field ID.
+   */
+  protected function filter_numeric_fields(&$fields) {
+    foreach ($this->view->field as $id => $field) {
+      if (!($field instanceof views_handler_field_numeric)) {
+        unset($fields[$id]);
+      }
+    }
+  }
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/views_test.info b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/views_test.info
index c41ad54..23bd884 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/views_test.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/views_test.info
@@ -5,9 +5,9 @@ core = 7.x
 dependencies[] = views
 hidden = TRUE
 
-; Information added by drupal.org packaging script on 2012-08-24
-version = "7.x-3.5"
+; Information added by drupal.org packaging script on 2013-04-09
+version = "7.x-3.7"
 core = "7.x"
 project = "views"
-datestamp = "1345829394"
+datestamp = "1365499236"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/views_test.module b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/views_test.module
index f6026b8..7adcf43 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/views_test.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/views_test.module
@@ -59,3 +59,59 @@ function views_test_views_pre_render(&$view) {
     $view->pre_render_called = TRUE;
   }
 }
+
+/**
+ * Implements hook_preprocess_HOOK() for theme_views_view_mapping_test().
+ */
+function template_preprocess_views_view_mapping_test(&$variables) {
+  $variables['element'] = array();
+
+  foreach ($variables['rows'] as $delta => $row) {
+    $fields = array();
+    foreach ($variables['options']['mapping'] as $type => $field_names) {
+      if (!is_array($field_names)) {
+        $field_names = array($field_names);
+      }
+      foreach ($field_names as $field_name) {
+        if ($value = $variables['view']->style_plugin->get_field($delta, $field_name)) {
+          $fields[$type . '-' . $field_name] = $type . ':' . $value;
+        }
+      }
+    }
+
+    // If there are no fields in this row, skip to the next one.
+    if (empty($fields)) {
+      continue;
+    }
+
+    // Build a container for the row.
+    $variables['element'][$delta] = array(
+      '#type' => 'container',
+      '#attributes' => array(
+        'class' => array(
+          'views-row-mapping-test',
+        ),
+      ),
+    );
+
+    // Add each field to the row.
+    foreach ($fields as $key => $render) {
+      $variables['element'][$delta][$key] = array(
+        '#children' => $render,
+        '#type' => 'container',
+        '#attributes' => array(
+          'class' => array(
+            $key,
+          ),
+        ),
+      );
+    }
+  }
+}
+
+/**
+ * Returns HTML for the Mapping Test style.
+ */
+function theme_views_view_mapping_test($variables) {
+  return drupal_render($variables['element']);
+}
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/views_translatable.test b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/views_translatable.test
index 0cb27e4..983a97e 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/views_translatable.test
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/tests/views_translatable.test
@@ -114,7 +114,6 @@ class ViewsTranslatableTest extends ViewsSqlTest {
         'more1' => array('use_more_text'),
         'Reset1' => array('exposed_form', 'reset_button_label'),
         'Offset1' => array('pager', 'expose', 'offset_label'),
-        'Master1' => array('title'),
         'title1' => array('title'),
         'Tag first1' => array('pager', 'tags', 'first'),
         'Tag prev1' => array('pager', 'tags', 'previous'),
@@ -124,9 +123,23 @@ class ViewsTranslatableTest extends ViewsSqlTest {
         'fieldlabel1' => array('field', 'node', 'nid', 'label'),
         'filterlabel1' => array('filter', 'node', 'nid', 'expose', 'label'),
         '- All -' => array('pager', 'expose', 'items_per_page_options_all_label'),
+        'Header1' => array('header', 'views', 'area', 'content'),
+      );
+
+      $formats = array(
+        'Header1' => 'filtered_html',
       );
+
       foreach ($translatables as $translatable) {
         $this->assertEqual($translatable['keys'], $this->string_keys[$translatable['value']]);
+
+        // Make sure the format is correct.
+        if (isset($formats[$translatable['value']])) {
+          $this->assertEqual($translatable['format'], $formats[$translatable['value']]);
+        }
+        else {
+          $this->assertNull($translatable['format'], 'No format defined');
+        }
       }
     }
   }
@@ -169,6 +182,14 @@ class ViewsTranslatableTest extends ViewsSqlTest {
     $handler->display->display_options['pager']['options']['expose']['offset_label'] = 'Offset1';
     $handler->display->display_options['style_plugin'] = 'default';
     $handler->display->display_options['row_plugin'] = 'fields';
+    /* Global: Header */
+    $handler->display->display_options['header']['area']['id'] = 'area';
+    $handler->display->display_options['header']['area']['table'] = 'views';
+    $handler->display->display_options['header']['area']['field'] = 'area';
+    $handler->display->display_options['header']['area']['empty'] = FALSE;
+    $handler->display->display_options['header']['area']['content'] = 'Header1';
+    $handler->display->display_options['header']['area']['format'] = 'filtered_html';
+    $handler->display->display_options['header']['area']['tokenize'] = 0;
     /* Field: Content: Nid */
     $handler->display->display_options['fields']['nid']['id'] = 'nid';
     $handler->display->display_options['fields']['nid']['table'] = 'node';
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/theme/theme.inc b/kolab.org/www/drupal-7.18/sites/all/modules/views/theme/theme.inc
index 52598d5..e7f7a15 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/theme/theme.inc
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/theme/theme.inc
@@ -649,8 +649,17 @@ function template_preprocess_views_view_table(&$vars) {
   }
   $vars['classes_array'][] = 'cols-'. count($vars['header']);
 
+  // Add the summary to the list if set.
   if (!empty($handler->options['summary'])) {
-    $vars['attributes_array'] = array('summary' => $handler->options['summary']);
+    $vars['attributes_array'] = array('summary' => filter_xss_admin($handler->options['summary']));
+  }
+
+  // Add the caption to the list if set.
+  if (!empty($handler->options['caption'])) {
+    $vars['caption'] = filter_xss_admin($handler->options['caption']);
+  }
+  else {
+    $vars['caption'] = '';
   }
 }
 
@@ -762,8 +771,18 @@ function template_preprocess_views_view_grid(&$vars) {
   }
   $vars['rows'] = $rows;
   $vars['class'] = 'views-view-grid cols-' . $columns;
+
+  // Add the summary to the list if set.
   if (!empty($handler->options['summary'])) {
-    $vars['attributes_array'] = array('summary' => $handler->options['summary']);
+    $vars['attributes_array'] = array('summary' => filter_xss_admin($handler->options['summary']));
+  }
+
+  // Add the caption to the list if set.
+  if (!empty($handler->options['caption'])) {
+    $vars['caption'] = filter_xss_admin($handler->options['caption']);
+  }
+  else {
+    $vars['caption'] = '';
   }
 }
 
@@ -1021,19 +1040,13 @@ function theme_views_mini_pager($vars) {
   $tags = $vars['tags'];
   $element = $vars['element'];
   $parameters = $vars['parameters'];
-  $quantity = $vars['quantity'];
 
-  // Calculate various markers within this pager piece:
-  // Middle is used to "center" pages around the current page.
-  $pager_middle = ceil($quantity / 2);
   // current is the page we are currently paged to
   $pager_current = $pager_page_array[$element] + 1;
   // max is the maximum page number
   $pager_max = $pager_total[$element];
   // End of marker calculations.
 
-
-
   if ($pager_total[$element] > 1) {
 
     $li_previous = theme('pager_previous',
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/theme/views-view-grid.tpl.php b/kolab.org/www/drupal-7.18/sites/all/modules/views/theme/views-view-grid.tpl.php
index cd8d39e..09f807a 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/theme/views-view-grid.tpl.php
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/theme/views-view-grid.tpl.php
@@ -14,6 +14,10 @@
   <h3><?php print $title; ?></h3>
 <?php endif; ?>
 <table class="<?php print $class; ?>"<?php print $attributes; ?>>
+  <?php if (!empty($caption)) : ?>
+    <caption><?php print $caption; ?></caption>
+  <?php endif; ?>
+
   <tbody>
     <?php foreach ($rows as $row_number => $columns): ?>
       <tr <?php if ($row_classes[$row_number]) { print 'class="' . $row_classes[$row_number] .'"';  } ?>>
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/theme/views-view-table.tpl.php b/kolab.org/www/drupal-7.18/sites/all/modules/views/theme/views-view-table.tpl.php
index a9abcd3..4fec9fa 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/theme/views-view-table.tpl.php
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/theme/views-view-table.tpl.php
@@ -6,6 +6,7 @@
  *
  * - $title : The title of this group of rows.  May be empty.
  * - $header: An array of header labels keyed by field id.
+ * - $caption: The caption for this table. May be empty.
  * - $header_classes: An array of header classes keyed by field id.
  * - $fields: An array of CSS IDs to use for each field id.
  * - $classes: A class or classes to apply to the table, based on settings.
@@ -19,8 +20,8 @@
  */
 ?>
 <table <?php if ($classes) { print 'class="'. $classes . '" '; } ?><?php print $attributes; ?>>
-  <?php if (!empty($title)) : ?>
-    <caption><?php print $title; ?></caption>
+   <?php if (!empty($title) || !empty($caption)) : ?>
+     <caption><?php print $caption . $title; ?></caption>
   <?php endif; ?>
   <?php if (!empty($header)) : ?>
     <thead>
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/theme/views-view-unformatted.tpl.php b/kolab.org/www/drupal-7.18/sites/all/modules/views/theme/views-view-unformatted.tpl.php
index 4f4558e..f1cccb8 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/theme/views-view-unformatted.tpl.php
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/theme/views-view-unformatted.tpl.php
@@ -11,7 +11,7 @@
   <h3><?php print $title; ?></h3>
 <?php endif; ?>
 <?php foreach ($rows as $id => $row): ?>
-  <div <?php if ($classes_array[$id]) { print 'class="' . $classes_array[$id] .'"';  } ?>>
+  <div<?php if ($classes_array[$id]) { print ' class="' . $classes_array[$id] .'"';  } ?>>
     <?php print $row; ?>
   </div>
 <?php endforeach; ?>
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/views.api.php b/kolab.org/www/drupal-7.18/sites/all/modules/views/views.api.php
index f41c565..ba9b326 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/views.api.php
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/views.api.php
@@ -482,13 +482,15 @@ function hook_views_data_alter(&$data) {
   $data['users']['example_field'] = array(
     'title' => t('Example field'),
     'help' => t('Some example content that references a user'),
-    'handler' => 'hook_handlers_field_example_field',
+    'field' => array(
+      'handler' => 'modulename_handler_field_example_field',
+    ),
   );
 
   // This example changes the handler of the node title field.
   // In this handler you could do stuff, like preview of the node when clicking
   // the node title.
-  $data['node']['title']['handler'] = 'modulename_handlers_field_node_title';
+  $data['node']['title']['field']['handler'] = 'modulename_handler_field_node_title';
 
   // This example adds a relationship to table {foo}, so that 'foo' views can
   // add this table using a relationship. Because we don't want to write over
@@ -663,10 +665,10 @@ function hook_views_api() {
  * This hook allows modules to provide their own views which can either be used
  * as-is or as a "starter" for users to build from.
  *
- * This hook should be placed in MODULENAME.views.inc and it will be
- * auto-loaded. MODULENAME.views.inc must be in the directory specified by the
- * 'path' key returned by MODULENAME_views_api(), or the same directory as the
- * .module file, if 'path' is unspecified.
+ * This hook should be placed in MODULENAME.views_default.inc and it will be
+ * auto-loaded. MODULENAME.views_default.inc must be in the directory specified
+ * by the 'path' key returned by MODULENAME_views_api(), or the same directory
+ * as the .module file, if 'path' is unspecified.
  *
  * The $view->disabled boolean flag indicates whether the View should be
  * enabled (FALSE) or disabled (TRUE) by default.
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/views.info b/kolab.org/www/drupal-7.18/sites/all/modules/views/views.info
index 3bd7470..50d8148 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/views.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/views.info
@@ -171,6 +171,9 @@ files[] = modules/taxonomy/views_handler_filter_vocabulary_machine_name.inc
 files[] = modules/taxonomy/views_handler_relationship_node_term_data.inc
 files[] = modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc
 files[] = modules/taxonomy/views_plugin_argument_default_taxonomy_tid.inc
+files[] = modules/tracker/views_handler_argument_tracker_comment_user_uid.inc
+files[] = modules/tracker/views_handler_filter_tracker_comment_user_uid.inc
+files[] = modules/tracker/views_handler_filter_tracker_boolean_operator.inc
 files[] = modules/system/views_handler_filter_system_type.inc
 files[] = modules/translation/views_handler_argument_node_tnid.inc
 files[] = modules/translation/views_handler_field_node_link_translate.inc
@@ -242,6 +245,7 @@ files[] = plugins/views_plugin_style_default.inc
 files[] = plugins/views_plugin_style_grid.inc
 files[] = plugins/views_plugin_style_list.inc
 files[] = plugins/views_plugin_style_jump_menu.inc
+files[] = plugins/views_plugin_style_mapping.inc
 files[] = plugins/views_plugin_style_rss.inc
 files[] = plugins/views_plugin_style_summary.inc
 files[] = plugins/views_plugin_style_summary_jump_menu.inc
@@ -272,9 +276,12 @@ files[] = tests/handlers/views_handler_sort_date.test
 files[] = tests/handlers/views_handler_sort.test
 files[] = tests/test_plugins/views_test_plugin_access_test_dynamic.inc
 files[] = tests/test_plugins/views_test_plugin_access_test_static.inc
+files[] = tests/test_plugins/views_test_plugin_style_test_mapping.inc
 files[] = tests/plugins/views_plugin_display.test
 files[] = tests/styles/views_plugin_style_jump_menu.test
 files[] = tests/styles/views_plugin_style.test
+files[] = tests/styles/views_plugin_style_base.test
+files[] = tests/styles/views_plugin_style_mapping.test
 files[] = tests/styles/views_plugin_style_unformatted.test
 files[] = tests/views_access.test
 files[] = tests/views_analyze.test
@@ -295,6 +302,7 @@ files[] = tests/views_upgrade.test
 files[] = tests/views_test.views_default.inc
 files[] = tests/comment/views_handler_argument_comment_user_uid.test
 files[] = tests/comment/views_handler_filter_comment_user_uid.test
+files[] = tests/node/views_node_revision_relations.test
 files[] = tests/taxonomy/views_handler_relationship_node_term_data.test
 files[] = tests/user/views_handler_field_user_name.test
 files[] = tests/user/views_user_argument_default.test
@@ -304,9 +312,9 @@ files[] = tests/views_cache.test
 files[] = tests/views_view.test
 files[] = tests/views_ui.test
 
-; Information added by drupal.org packaging script on 2012-08-24
-version = "7.x-3.5"
+; Information added by drupal.org packaging script on 2013-04-09
+version = "7.x-3.7"
 core = "7.x"
 project = "views"
-datestamp = "1345829394"
+datestamp = "1365499236"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/views.module b/kolab.org/www/drupal-7.18/sites/all/modules/views/views.module
index 3b9eff1..fc427f4 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/views.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/views.module
@@ -69,7 +69,7 @@ function views_theme($existing, $type, $theme, $path) {
 
   // Our extra version of pager from pager.inc
   $hooks['views_mini_pager'] = $base + array(
-    'variables' => array('tags' => array(), 'quantity' => 10, 'element' => 0, 'parameters' => array()),
+    'variables' => array('tags' => array(), 'element' => 0, 'parameters' => array()),
     'pattern' => 'views_mini_pager__',
   );
 
@@ -341,10 +341,12 @@ function views_permission() {
     'administer views' => array(
       'title' => t('Administer views'),
       'description' => t('Access the views administration pages.'),
+      'restrict access' => TRUE,
     ),
     'access all views' => array(
       'title' => t('Bypass views access control'),
       'description' => t('Bypass access control when accessing views.'),
+      'restrict access' => TRUE,
     ),
   );
 }
@@ -373,7 +375,7 @@ function views_menu() {
     'page callback' => 'views_ajax_autocomplete_user',
     'theme callback' => 'ajax_base_page_theme',
     'access callback' => 'user_access',
-    'access arguments' => array('access content'),
+    'access arguments' => array('access user profiles'),
     'type' => MENU_CALLBACK,
     'file' => 'includes/ajax.inc',
   );
@@ -2511,6 +2513,10 @@ if (!function_exists('system_views_api')) {
   function system_views_api() { return views_views_api(); }
 }
 
+if (!function_exists('tracker_views_api')) {
+  function tracker_views_api() { return views_views_api(); }
+}
+
 if (!function_exists('taxonomy_views_api')) {
   function taxonomy_views_api() { return views_views_api(); }
 }
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/views_ui.info b/kolab.org/www/drupal-7.18/sites/all/modules/views/views_ui.info
index 74d9e16..95ea014 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/views_ui.info
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/views_ui.info
@@ -7,9 +7,9 @@ dependencies[] = views
 files[] = views_ui.module
 files[] = plugins/views_wizard/views_ui_base_views_wizard.class.php
 
-; Information added by drupal.org packaging script on 2012-08-24
-version = "7.x-3.5"
+; Information added by drupal.org packaging script on 2013-04-09
+version = "7.x-3.7"
 core = "7.x"
 project = "views"
-datestamp = "1345829394"
+datestamp = "1365499236"
 
diff --git a/kolab.org/www/drupal-7.18/sites/all/modules/views/views_ui.module b/kolab.org/www/drupal-7.18/sites/all/modules/views/views_ui.module
index 8182714..5366f77 100644
--- a/kolab.org/www/drupal-7.18/sites/all/modules/views/views_ui.module
+++ b/kolab.org/www/drupal-7.18/sites/all/modules/views/views_ui.module
@@ -845,7 +845,8 @@ function _views_ui_get_displays_list($view) {
 
 function views_ui_library_alter(&$libraries, $module) {
   if ($module == 'system' && isset($libraries['ui.dialog'])) {
-    if (version_compare($libraries['ui.dialog']['version'], '1.7.2', '>=')) {
+    // Only apply the fix, if we don't have an up to date jQueryUI version.
+    if (version_compare($libraries['ui.dialog']['version'], '1.7.2', '>=') && version_compare($libraries['ui.dialog']['version'], '1.10.0', '<')) {
       $libraries['ui.dialog']['js'][drupal_get_path('module', 'views') . '/js/jquery.ui.dialog.patch.js'] = array();
     }
   }




More information about the commits mailing list