From 9f85c8492a863a01d1f5fe824f183f5e42e9fd42 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 14 Dec 2022 12:30:47 -0500 Subject: [PATCH] first commit --- .gitignore | 3 + .htaccess | 63 + LICENSE | 22 + README | 5 + cli_cron.php | 24 + cli_unit_tests.php | 25 + public/assets/ex/favicon/about.txt | 6 + .../ex/favicon/android-chrome-192x192.png | Bin 0 -> 8702 bytes .../ex/favicon/android-chrome-512x512.png | Bin 0 -> 22838 bytes public/assets/ex/favicon/apple-touch-icon.png | Bin 0 -> 8133 bytes public/assets/ex/favicon/favicon-16x16.png | Bin 0 -> 469 bytes public/assets/ex/favicon/favicon-32x32.png | Bin 0 -> 994 bytes public/assets/ex/favicon/favicon.ico | Bin 0 -> 15406 bytes public/assets/ex/favicon/site.webmanifest | 1 + public/assets/mockup/ajax/testing.js | 1 + public/assets/mockup/favicon/about.txt | 6 + .../mockup/favicon/android-chrome-192x192.png | Bin 0 -> 8478 bytes .../mockup/favicon/android-chrome-512x512.png | Bin 0 -> 24792 bytes .../mockup/favicon/apple-touch-icon.png | Bin 0 -> 7692 bytes .../assets/mockup/favicon/favicon-16x16.png | Bin 0 -> 588 bytes .../assets/mockup/favicon/favicon-32x32.png | Bin 0 -> 1190 bytes public/assets/mockup/favicon/favicon.ico | Bin 0 -> 15406 bytes public/assets/mockup/favicon/site.webmanifest | 1 + public/assets/mockup/fonts/JennaSue.ttf | Bin 0 -> 42948 bytes public/assets/mockup/js/testing.js | 1 + .../prototype/ajax/maintenance_dash_main.js | 137 + .../ajax/maintenance_dash_new_maintenance.js | 68 + .../assets/prototype/ajax/maintenance_main.js | 70 + .../prototype/ajax/page_not_found_main.js | 13 + .../prototype/ajax/properties_dash_main.js | 242 + .../assets/prototype/ajax/properties_main.js | 114 + .../assets/prototype/ajax/properties_notes.js | 49 + .../prototype/ajax/properties_profile.js | 137 + .../prototype/ajax/settings_filters.css | 36 + .../assets/prototype/ajax/settings_filters.js | 52 + public/assets/prototype/ajax/settings_main.js | 61 + .../prototype/ajax/settings_new_filter.js | 9 + .../assets/prototype/ajax/settings_users.js | 10 + .../prototype/ajax/tenants_dash_main.js | 293 + .../prototype/ajax/tenants_dash_new_tenant.js | 68 + .../prototype/ajax/tenants_dash_reports.js | 47 + .../ajax/tenants_edit_transaction.js | 313 + public/assets/prototype/ajax/tenants_lease.js | 218 + public/assets/prototype/ajax/tenants_main.js | 265 + .../prototype/ajax/tenants_new_transaction.js | 275 + public/assets/prototype/ajax/tenants_notes.js | 53 + .../assets/prototype/ajax/tenants_profile.js | 124 + .../prototype/ajax/tenants_transactions.js | 102 + .../ajax/tenants_view_transaction.js | 67 + .../assets/prototype/css/daterangepicker.css | 388 + .../assets/prototype/css/jquery-confirm.css | 976 + .../prototype/css/jquery-confirm.min.css | 9 + public/assets/prototype/css/jquery.toast.css | 28 + .../assets/prototype/css/jquery.toast.min.css | 1 + public/assets/prototype/css/main.css | 565 + public/assets/prototype/css/paper.css | 56 + .../prototype/css/perfect-scrollbar.css | 25 + .../prototype/css/perfect-scrollbar.min.css | 2 + public/assets/prototype/fonts/JennaSue.ttf | Bin 0 -> 42948 bytes public/assets/prototype/images/drag.png | Bin 0 -> 4340 bytes public/assets/prototype/js/ajax-loaders.js | 144 + public/assets/prototype/js/countUp.js | 261 + public/assets/prototype/js/countUp.min.js | 1 + public/assets/prototype/js/daterangepicker.js | 1525 ++ public/assets/prototype/js/edison.js | 2028 ++ public/assets/prototype/js/edison.min.js | 6 + public/assets/prototype/js/grapnel.js | 424 + public/assets/prototype/js/grapnel.min.js | 12 + .../assets/prototype/js/handlebars-v4.0.5.js | 4608 ++++ public/assets/prototype/js/handlebars.js | 4839 ++++ .../assets/prototype/js/jquery-3.1.1.min.js | 4 + .../assets/prototype/js/jquery-3.2.1.min.js | 4 + .../assets/prototype/js/jquery-3.2.1.min.map | 1 + public/assets/prototype/js/jquery-confirm.js | 1347 + .../assets/prototype/js/jquery-confirm.min.js | 10 + public/assets/prototype/js/jquery-scrollto.js | 260 + .../prototype/js/jquery-scrollto.min.js | 1 + .../prototype/js/jquery-sortable-min.js | 19 + public/assets/prototype/js/jquery-sortable.js | 693 + .../js/jquery-ui-1.7.1.custom.min.js | 273 + public/assets/prototype/js/jquery.mark.js | 1097 + public/assets/prototype/js/jquery.mark.min.js | 7 + public/assets/prototype/js/jquery.mask.js | 1 + public/assets/prototype/js/jquery.mask.min.js | 15 + public/assets/prototype/js/jquery.scrollTo.js | 1 + .../prototype/js/jquery.scrollTo.min.js | 7 + .../js/jquery.searchable-ie-1.1.0.min.js | 2 + .../prototype/js/jquery.searchable-ie.js | 232 + .../assets/prototype/js/jquery.searchable.js | 1 + .../assets/prototype/js/jquery.tablesort.js | 2 + .../prototype/js/jquery.tablesort.min.js | 6 + public/assets/prototype/js/jquery.timeago.js | 1 + public/assets/prototype/js/jquery.toast.js | 374 + .../assets/prototype/js/jquery.toast.min.js | 1 + public/assets/prototype/js/liquid-ui.js | 93 + public/assets/prototype/js/login_system.js | 183 + public/assets/prototype/js/main.js | 309 + public/assets/prototype/js/moment.js | 2 + .../prototype/js/perfect-scrollbar.jquery.js | 1576 ++ .../js/perfect-scrollbar.jquery.min.js | 2 + .../assets/prototype/js/perfect-scrollbar.js | 1549 ++ .../prototype/js/perfect-scrollbar.min.js | 2 + public/assets/prototype/js/router_loader.js | 217 + public/assets/prototype/js/routes.js | 193 + public/assets/prototype/js/semantic.js | 22397 ++++++++++++++++ public/assets/prototype/js/semantic.min.js | 19 + public/assets/prototype/js/semanticNew.js | 22385 +++++++++++++++ public/assets/prototype/js/semanticNew.min.js | 11 + public/assets/prototype/js/stupidtable.js | 141 + public/assets/prototype/js/stupidtable.min.js | 4 + public/assets/prototype/js/top-bar.js | 63 + public/assets/prototype/placeholder.css | 239 + public/assets/prototype/placeholder.min.css | 9 + .../prototype/tinymce/jquery.tinymce.min.js | 1 + .../assets/prototype/tinymce/langs/readme.md | 3 + public/assets/prototype/tinymce/license.txt | 504 + .../tinymce/plugins/advlist/plugin.min.js | 1 + .../tinymce/plugins/anchor/plugin.min.js | 1 + .../tinymce/plugins/autolink/plugin.min.js | 1 + .../tinymce/plugins/autoresize/plugin.min.js | 1 + .../tinymce/plugins/autosave/plugin.min.js | 1 + .../tinymce/plugins/bbcode/plugin.min.js | 1 + .../tinymce/plugins/charmap/plugin.min.js | 1 + .../tinymce/plugins/code/plugin.min.js | 1 + .../tinymce/plugins/codesample/css/prism.css | 138 + .../tinymce/plugins/codesample/plugin.min.js | 1 + .../tinymce/plugins/colorpicker/plugin.min.js | 1 + .../tinymce/plugins/contextmenu/plugin.min.js | 1 + .../plugins/directionality/plugin.min.js | 1 + .../plugins/emoticons/img/smiley-cool.gif | Bin 0 -> 354 bytes .../plugins/emoticons/img/smiley-cry.gif | Bin 0 -> 329 bytes .../emoticons/img/smiley-embarassed.gif | Bin 0 -> 331 bytes .../emoticons/img/smiley-foot-in-mouth.gif | Bin 0 -> 342 bytes .../plugins/emoticons/img/smiley-frown.gif | Bin 0 -> 340 bytes .../plugins/emoticons/img/smiley-innocent.gif | Bin 0 -> 336 bytes .../plugins/emoticons/img/smiley-kiss.gif | Bin 0 -> 338 bytes .../plugins/emoticons/img/smiley-laughing.gif | Bin 0 -> 343 bytes .../emoticons/img/smiley-money-mouth.gif | Bin 0 -> 321 bytes .../plugins/emoticons/img/smiley-sealed.gif | Bin 0 -> 323 bytes .../plugins/emoticons/img/smiley-smile.gif | Bin 0 -> 344 bytes .../emoticons/img/smiley-surprised.gif | Bin 0 -> 338 bytes .../emoticons/img/smiley-tongue-out.gif | Bin 0 -> 328 bytes .../emoticons/img/smiley-undecided.gif | Bin 0 -> 337 bytes .../plugins/emoticons/img/smiley-wink.gif | Bin 0 -> 350 bytes .../plugins/emoticons/img/smiley-yell.gif | Bin 0 -> 336 bytes .../tinymce/plugins/emoticons/plugin.min.js | 1 + .../tinymce/plugins/fullpage/plugin.min.js | 1 + .../tinymce/plugins/fullscreen/plugin.min.js | 1 + .../tinymce/plugins/help/img/logo.png | Bin 0 -> 13208 bytes .../tinymce/plugins/help/plugin.min.js | 1 + .../tinymce/plugins/hr/plugin.min.js | 1 + .../tinymce/plugins/image/plugin.min.js | 1 + .../tinymce/plugins/imagetools/plugin.min.js | 1 + .../tinymce/plugins/importcss/plugin.min.js | 1 + .../plugins/insertdatetime/plugin.min.js | 1 + .../plugins/legacyoutput/plugin.min.js | 1 + .../tinymce/plugins/link/plugin.min.js | 1 + .../tinymce/plugins/lists/plugin.min.js | 1 + .../tinymce/plugins/media/plugin.min.js | 1 + .../tinymce/plugins/nonbreaking/plugin.min.js | 1 + .../tinymce/plugins/noneditable/plugin.min.js | 1 + .../tinymce/plugins/pagebreak/plugin.min.js | 1 + .../tinymce/plugins/paste/plugin.min.js | 1 + .../tinymce/plugins/preview/plugin.min.js | 1 + .../tinymce/plugins/print/plugin.min.js | 1 + .../tinymce/plugins/save/plugin.min.js | 1 + .../plugins/searchreplace/plugin.min.js | 1 + .../plugins/spellchecker/plugin.min.js | 1 + .../tinymce/plugins/tabfocus/plugin.min.js | 1 + .../tinymce/plugins/table/plugin.min.js | 1 + .../tinymce/plugins/template/plugin.min.js | 1 + .../tinymce/plugins/textcolor/plugin.min.js | 1 + .../tinymce/plugins/textpattern/plugin.min.js | 1 + .../tinymce/plugins/toc/plugin.min.js | 1 + .../plugins/visualblocks/css/visualblocks.css | 154 + .../plugins/visualblocks/plugin.min.js | 1 + .../tinymce/plugins/visualchars/plugin.min.js | 1 + .../tinymce/plugins/wordcount/plugin.min.js | 1 + .../skins/lightgray/content.inline.min.css | 1 + .../tinymce/skins/lightgray/content.min.css | 1 + .../skins/lightgray/content.mobile.min.css | 1 + .../skins/lightgray/fonts/tinymce-mobile.woff | Bin 0 -> 4624 bytes .../skins/lightgray/fonts/tinymce-small.eot | Bin 0 -> 9492 bytes .../skins/lightgray/fonts/tinymce-small.svg | 63 + .../skins/lightgray/fonts/tinymce-small.ttf | Bin 0 -> 9304 bytes .../skins/lightgray/fonts/tinymce-small.woff | Bin 0 -> 9380 bytes .../tinymce/skins/lightgray/fonts/tinymce.eot | Bin 0 -> 18808 bytes .../tinymce/skins/lightgray/fonts/tinymce.svg | 131 + .../tinymce/skins/lightgray/fonts/tinymce.ttf | Bin 0 -> 18644 bytes .../skins/lightgray/fonts/tinymce.woff | Bin 0 -> 18720 bytes .../tinymce/skins/lightgray/img/anchor.gif | Bin 0 -> 53 bytes .../tinymce/skins/lightgray/img/loader.gif | Bin 0 -> 2608 bytes .../tinymce/skins/lightgray/img/object.gif | Bin 0 -> 152 bytes .../tinymce/skins/lightgray/img/trans.gif | Bin 0 -> 43 bytes .../tinymce/skins/lightgray/skin.min.css | 1 + .../skins/lightgray/skin.mobile.min.css | 2 + .../tinymce/themes/inlite/theme.min.js | 1 + .../tinymce/themes/mobile/theme.min.js | 1 + .../tinymce/themes/modern/theme.min.js | 1 + .../assets/prototype/tinymce/tinymce.min.js | 2 + public/main.page | 15 + src/configs/ex/loadall.php | 75 + src/configs/ex/on_email.php | 10 + src/configs/ex/on_html.php | 10 + src/configs/ex/on_http_request.php | 5 + src/configs/ex/on_security.php | 12 + src/configs/ex/on_sessions.php | 11 + src/configs/ex/on_tts.php | 14 + src/configs/ex/on_view_mode.php | 5 + src/configs/live/off_cache.php | 11 + src/configs/live/off_twilio.php | 9 + src/configs/live/on_database.php | 19 + src/configs/live/on_email.php | 10 + src/configs/live/on_html.php | 9 + src/configs/live/on_http_request.php | 5 + src/configs/live/on_security.php | 12 + src/configs/live/on_sessions.php | 11 + src/configs/live/on_tts.php | 14 + src/configs/live/on_view_mode.php | 5 + src/configs/mockup/loadall.php | 75 + src/configs/mockup/on_email.php | 10 + src/configs/mockup/on_html.php | 10 + src/configs/mockup/on_http_request.php | 5 + src/configs/mockup/on_security.php | 12 + src/configs/mockup/on_sessions.php | 11 + src/configs/mockup/on_tts.php | 14 + src/configs/mockup/on_view_mode.php | 5 + src/documentation/Purifier.txt | 7 + src/documentation/SecurityURLs.txt | 8 + src/documentation/chgrp_on_folders.txt | 27 + src/documentation/mysql8.txt | 20 + src/documentation/nginx-default-conf.txt | 45 + src/documentation/old_debuging.txt | 7 + src/ex/controllers/app/home_ctrl.php | 48 + src/ex/controllers/cronjobs/daily_ctrl.php | 12 + src/ex/inputs/app/home_in.php | 30 + src/ex/models/app/home_model.php | 69 + src/ex/outputs/app/home_out.php | 55 + src/ex/templates/main.php | 36 + src/ex/views/default/app/footer.php | 20 + src/ex/views/default/app/header.php | 12 + src/ex/views/default/app/home_index.php | 8 + src/ex/views/default/app/name_demo.php | 16 + src/main.php | 6 + src/mockup/controllers/app/home_ctrl.php | 68 + src/mockup/controllers/bills/notices_ctrl.php | 36 + src/mockup/inputs/app/home_in.php | 42 + src/mockup/models/app/home_model.php | 91 + src/mockup/outputs/app/home_out.php | 43 + src/mockup/outputs/bills/notices_out.php | 41 + src/mockup/routes/routes.php | 13 + src/mockup/templates/main.php | 36 + src/mockup/views/default/app/footer.php | 20 + src/mockup/views/default/app/header.php | 12 + src/mockup/views/default/app/home_index.php | 14 + src/mockup/views/default/app/name_demo.php | 17 + .../views/default/app/name_demo_post.php | 19 + .../bills/notice_of_late_payment_css.php | 124 + .../bills/notice_of_late_payment_pdf.tpl | 20 + src/services/ex/loadall.php | 52 + src/services/ex/on_html_filter.php | 5 + src/services/ex/on_log.php | 19 + src/services/ex/on_templates.php | 9 + src/services/ex/on_test_db.php | 14 + src/services/live/off_cache.php | 14 + src/services/live/off_test_db.php | 11 + src/services/live/on_crypto.php | 5 + src/services/live/on_db.php | 52 + src/services/live/on_debugger.php | 5 + src/services/live/on_emailer.php | 5 + src/services/live/on_encryption.php | 5 + src/services/live/on_html_filter.php | 5 + src/services/live/on_http_request.php | 9 + src/services/live/on_log.php | 19 + src/services/live/on_passwords.php | 5 + src/services/live/on_session.php | 10 + src/services/live/on_templates.php | 9 + src/services/live/on_twillio.php | 5 + src/services/mockup/loadall.php | 50 + src/services/mockup/on_html_filter.php | 5 + src/services/mockup/on_log.php | 19 + src/services/mockup/on_templates.php | 9 + src/services/mockup/on_test_db.php | 12 + tts_framework | 1 + 284 files changed, 75460 insertions(+) create mode 100644 .gitignore create mode 100644 .htaccess create mode 100644 LICENSE create mode 100644 README create mode 100755 cli_cron.php create mode 100755 cli_unit_tests.php create mode 100644 public/assets/ex/favicon/about.txt create mode 100644 public/assets/ex/favicon/android-chrome-192x192.png create mode 100644 public/assets/ex/favicon/android-chrome-512x512.png create mode 100644 public/assets/ex/favicon/apple-touch-icon.png create mode 100644 public/assets/ex/favicon/favicon-16x16.png create mode 100644 public/assets/ex/favicon/favicon-32x32.png create mode 100644 public/assets/ex/favicon/favicon.ico create mode 100644 public/assets/ex/favicon/site.webmanifest create mode 100644 public/assets/mockup/ajax/testing.js create mode 100644 public/assets/mockup/favicon/about.txt create mode 100644 public/assets/mockup/favicon/android-chrome-192x192.png create mode 100644 public/assets/mockup/favicon/android-chrome-512x512.png create mode 100644 public/assets/mockup/favicon/apple-touch-icon.png create mode 100644 public/assets/mockup/favicon/favicon-16x16.png create mode 100644 public/assets/mockup/favicon/favicon-32x32.png create mode 100644 public/assets/mockup/favicon/favicon.ico create mode 100644 public/assets/mockup/favicon/site.webmanifest create mode 100644 public/assets/mockup/fonts/JennaSue.ttf create mode 100644 public/assets/mockup/js/testing.js create mode 100644 public/assets/prototype/ajax/maintenance_dash_main.js create mode 100644 public/assets/prototype/ajax/maintenance_dash_new_maintenance.js create mode 100644 public/assets/prototype/ajax/maintenance_main.js create mode 100644 public/assets/prototype/ajax/page_not_found_main.js create mode 100644 public/assets/prototype/ajax/properties_dash_main.js create mode 100644 public/assets/prototype/ajax/properties_main.js create mode 100644 public/assets/prototype/ajax/properties_notes.js create mode 100644 public/assets/prototype/ajax/properties_profile.js create mode 100644 public/assets/prototype/ajax/settings_filters.css create mode 100644 public/assets/prototype/ajax/settings_filters.js create mode 100644 public/assets/prototype/ajax/settings_main.js create mode 100644 public/assets/prototype/ajax/settings_new_filter.js create mode 100644 public/assets/prototype/ajax/settings_users.js create mode 100644 public/assets/prototype/ajax/tenants_dash_main.js create mode 100644 public/assets/prototype/ajax/tenants_dash_new_tenant.js create mode 100644 public/assets/prototype/ajax/tenants_dash_reports.js create mode 100644 public/assets/prototype/ajax/tenants_edit_transaction.js create mode 100644 public/assets/prototype/ajax/tenants_lease.js create mode 100644 public/assets/prototype/ajax/tenants_main.js create mode 100644 public/assets/prototype/ajax/tenants_new_transaction.js create mode 100644 public/assets/prototype/ajax/tenants_notes.js create mode 100644 public/assets/prototype/ajax/tenants_profile.js create mode 100644 public/assets/prototype/ajax/tenants_transactions.js create mode 100644 public/assets/prototype/ajax/tenants_view_transaction.js create mode 100644 public/assets/prototype/css/daterangepicker.css create mode 100644 public/assets/prototype/css/jquery-confirm.css create mode 100644 public/assets/prototype/css/jquery-confirm.min.css create mode 100644 public/assets/prototype/css/jquery.toast.css create mode 100644 public/assets/prototype/css/jquery.toast.min.css create mode 100644 public/assets/prototype/css/main.css create mode 100644 public/assets/prototype/css/paper.css create mode 100644 public/assets/prototype/css/perfect-scrollbar.css create mode 100644 public/assets/prototype/css/perfect-scrollbar.min.css create mode 100644 public/assets/prototype/fonts/JennaSue.ttf create mode 100644 public/assets/prototype/images/drag.png create mode 100644 public/assets/prototype/js/ajax-loaders.js create mode 100644 public/assets/prototype/js/countUp.js create mode 100644 public/assets/prototype/js/countUp.min.js create mode 100644 public/assets/prototype/js/daterangepicker.js create mode 100644 public/assets/prototype/js/edison.js create mode 100644 public/assets/prototype/js/edison.min.js create mode 100644 public/assets/prototype/js/grapnel.js create mode 100644 public/assets/prototype/js/grapnel.min.js create mode 100644 public/assets/prototype/js/handlebars-v4.0.5.js create mode 100644 public/assets/prototype/js/handlebars.js create mode 100644 public/assets/prototype/js/jquery-3.1.1.min.js create mode 100644 public/assets/prototype/js/jquery-3.2.1.min.js create mode 100644 public/assets/prototype/js/jquery-3.2.1.min.map create mode 100644 public/assets/prototype/js/jquery-confirm.js create mode 100644 public/assets/prototype/js/jquery-confirm.min.js create mode 100644 public/assets/prototype/js/jquery-scrollto.js create mode 100644 public/assets/prototype/js/jquery-scrollto.min.js create mode 100644 public/assets/prototype/js/jquery-sortable-min.js create mode 100644 public/assets/prototype/js/jquery-sortable.js create mode 100644 public/assets/prototype/js/jquery-ui-1.7.1.custom.min.js create mode 100644 public/assets/prototype/js/jquery.mark.js create mode 100644 public/assets/prototype/js/jquery.mark.min.js create mode 100644 public/assets/prototype/js/jquery.mask.js create mode 100644 public/assets/prototype/js/jquery.mask.min.js create mode 100644 public/assets/prototype/js/jquery.scrollTo.js create mode 100644 public/assets/prototype/js/jquery.scrollTo.min.js create mode 100644 public/assets/prototype/js/jquery.searchable-ie-1.1.0.min.js create mode 100644 public/assets/prototype/js/jquery.searchable-ie.js create mode 100644 public/assets/prototype/js/jquery.searchable.js create mode 100644 public/assets/prototype/js/jquery.tablesort.js create mode 100644 public/assets/prototype/js/jquery.tablesort.min.js create mode 100644 public/assets/prototype/js/jquery.timeago.js create mode 100644 public/assets/prototype/js/jquery.toast.js create mode 100644 public/assets/prototype/js/jquery.toast.min.js create mode 100644 public/assets/prototype/js/liquid-ui.js create mode 100644 public/assets/prototype/js/login_system.js create mode 100644 public/assets/prototype/js/main.js create mode 100644 public/assets/prototype/js/moment.js create mode 100644 public/assets/prototype/js/perfect-scrollbar.jquery.js create mode 100644 public/assets/prototype/js/perfect-scrollbar.jquery.min.js create mode 100644 public/assets/prototype/js/perfect-scrollbar.js create mode 100644 public/assets/prototype/js/perfect-scrollbar.min.js create mode 100644 public/assets/prototype/js/router_loader.js create mode 100644 public/assets/prototype/js/routes.js create mode 100644 public/assets/prototype/js/semantic.js create mode 100644 public/assets/prototype/js/semantic.min.js create mode 100644 public/assets/prototype/js/semanticNew.js create mode 100644 public/assets/prototype/js/semanticNew.min.js create mode 100644 public/assets/prototype/js/stupidtable.js create mode 100644 public/assets/prototype/js/stupidtable.min.js create mode 100644 public/assets/prototype/js/top-bar.js create mode 100644 public/assets/prototype/placeholder.css create mode 100644 public/assets/prototype/placeholder.min.css create mode 100644 public/assets/prototype/tinymce/jquery.tinymce.min.js create mode 100644 public/assets/prototype/tinymce/langs/readme.md create mode 100644 public/assets/prototype/tinymce/license.txt create mode 100644 public/assets/prototype/tinymce/plugins/advlist/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/anchor/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/autolink/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/autoresize/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/autosave/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/bbcode/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/charmap/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/code/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/codesample/css/prism.css create mode 100644 public/assets/prototype/tinymce/plugins/codesample/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/colorpicker/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/contextmenu/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/directionality/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/img/smiley-cool.gif create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/img/smiley-cry.gif create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/img/smiley-embarassed.gif create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/img/smiley-foot-in-mouth.gif create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/img/smiley-frown.gif create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/img/smiley-innocent.gif create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/img/smiley-kiss.gif create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/img/smiley-laughing.gif create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/img/smiley-money-mouth.gif create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/img/smiley-sealed.gif create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/img/smiley-smile.gif create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/img/smiley-surprised.gif create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/img/smiley-tongue-out.gif create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/img/smiley-undecided.gif create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/img/smiley-wink.gif create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/img/smiley-yell.gif create mode 100644 public/assets/prototype/tinymce/plugins/emoticons/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/fullpage/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/fullscreen/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/help/img/logo.png create mode 100644 public/assets/prototype/tinymce/plugins/help/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/hr/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/image/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/imagetools/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/importcss/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/insertdatetime/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/legacyoutput/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/link/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/lists/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/media/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/nonbreaking/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/noneditable/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/pagebreak/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/paste/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/preview/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/print/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/save/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/searchreplace/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/spellchecker/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/tabfocus/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/table/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/template/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/textcolor/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/textpattern/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/toc/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/visualblocks/css/visualblocks.css create mode 100644 public/assets/prototype/tinymce/plugins/visualblocks/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/visualchars/plugin.min.js create mode 100644 public/assets/prototype/tinymce/plugins/wordcount/plugin.min.js create mode 100644 public/assets/prototype/tinymce/skins/lightgray/content.inline.min.css create mode 100644 public/assets/prototype/tinymce/skins/lightgray/content.min.css create mode 100644 public/assets/prototype/tinymce/skins/lightgray/content.mobile.min.css create mode 100644 public/assets/prototype/tinymce/skins/lightgray/fonts/tinymce-mobile.woff create mode 100644 public/assets/prototype/tinymce/skins/lightgray/fonts/tinymce-small.eot create mode 100644 public/assets/prototype/tinymce/skins/lightgray/fonts/tinymce-small.svg create mode 100644 public/assets/prototype/tinymce/skins/lightgray/fonts/tinymce-small.ttf create mode 100644 public/assets/prototype/tinymce/skins/lightgray/fonts/tinymce-small.woff create mode 100644 public/assets/prototype/tinymce/skins/lightgray/fonts/tinymce.eot create mode 100644 public/assets/prototype/tinymce/skins/lightgray/fonts/tinymce.svg create mode 100644 public/assets/prototype/tinymce/skins/lightgray/fonts/tinymce.ttf create mode 100644 public/assets/prototype/tinymce/skins/lightgray/fonts/tinymce.woff create mode 100644 public/assets/prototype/tinymce/skins/lightgray/img/anchor.gif create mode 100644 public/assets/prototype/tinymce/skins/lightgray/img/loader.gif create mode 100644 public/assets/prototype/tinymce/skins/lightgray/img/object.gif create mode 100644 public/assets/prototype/tinymce/skins/lightgray/img/trans.gif create mode 100644 public/assets/prototype/tinymce/skins/lightgray/skin.min.css create mode 100644 public/assets/prototype/tinymce/skins/lightgray/skin.mobile.min.css create mode 100644 public/assets/prototype/tinymce/themes/inlite/theme.min.js create mode 100644 public/assets/prototype/tinymce/themes/mobile/theme.min.js create mode 100644 public/assets/prototype/tinymce/themes/modern/theme.min.js create mode 100644 public/assets/prototype/tinymce/tinymce.min.js create mode 100644 public/main.page create mode 100644 src/configs/ex/loadall.php create mode 100644 src/configs/ex/on_email.php create mode 100644 src/configs/ex/on_html.php create mode 100644 src/configs/ex/on_http_request.php create mode 100644 src/configs/ex/on_security.php create mode 100644 src/configs/ex/on_sessions.php create mode 100644 src/configs/ex/on_tts.php create mode 100644 src/configs/ex/on_view_mode.php create mode 100644 src/configs/live/off_cache.php create mode 100644 src/configs/live/off_twilio.php create mode 100644 src/configs/live/on_database.php create mode 100644 src/configs/live/on_email.php create mode 100644 src/configs/live/on_html.php create mode 100644 src/configs/live/on_http_request.php create mode 100644 src/configs/live/on_security.php create mode 100644 src/configs/live/on_sessions.php create mode 100644 src/configs/live/on_tts.php create mode 100644 src/configs/live/on_view_mode.php create mode 100644 src/configs/mockup/loadall.php create mode 100644 src/configs/mockup/on_email.php create mode 100644 src/configs/mockup/on_html.php create mode 100644 src/configs/mockup/on_http_request.php create mode 100644 src/configs/mockup/on_security.php create mode 100644 src/configs/mockup/on_sessions.php create mode 100644 src/configs/mockup/on_tts.php create mode 100644 src/configs/mockup/on_view_mode.php create mode 100644 src/documentation/Purifier.txt create mode 100644 src/documentation/SecurityURLs.txt create mode 100644 src/documentation/chgrp_on_folders.txt create mode 100644 src/documentation/mysql8.txt create mode 100644 src/documentation/nginx-default-conf.txt create mode 100644 src/documentation/old_debuging.txt create mode 100644 src/ex/controllers/app/home_ctrl.php create mode 100644 src/ex/controllers/cronjobs/daily_ctrl.php create mode 100644 src/ex/inputs/app/home_in.php create mode 100644 src/ex/models/app/home_model.php create mode 100644 src/ex/outputs/app/home_out.php create mode 100644 src/ex/templates/main.php create mode 100644 src/ex/views/default/app/footer.php create mode 100644 src/ex/views/default/app/header.php create mode 100644 src/ex/views/default/app/home_index.php create mode 100644 src/ex/views/default/app/name_demo.php create mode 100644 src/main.php create mode 100644 src/mockup/controllers/app/home_ctrl.php create mode 100644 src/mockup/controllers/bills/notices_ctrl.php create mode 100644 src/mockup/inputs/app/home_in.php create mode 100644 src/mockup/models/app/home_model.php create mode 100644 src/mockup/outputs/app/home_out.php create mode 100644 src/mockup/outputs/bills/notices_out.php create mode 100644 src/mockup/routes/routes.php create mode 100644 src/mockup/templates/main.php create mode 100644 src/mockup/views/default/app/footer.php create mode 100644 src/mockup/views/default/app/header.php create mode 100644 src/mockup/views/default/app/home_index.php create mode 100644 src/mockup/views/default/app/name_demo.php create mode 100644 src/mockup/views/default/app/name_demo_post.php create mode 100644 src/mockup/views/default/bills/notice_of_late_payment_css.php create mode 100644 src/mockup/views/includes/bills/notice_of_late_payment_pdf.tpl create mode 100644 src/services/ex/loadall.php create mode 100644 src/services/ex/on_html_filter.php create mode 100644 src/services/ex/on_log.php create mode 100644 src/services/ex/on_templates.php create mode 100644 src/services/ex/on_test_db.php create mode 100644 src/services/live/off_cache.php create mode 100644 src/services/live/off_test_db.php create mode 100644 src/services/live/on_crypto.php create mode 100644 src/services/live/on_db.php create mode 100644 src/services/live/on_debugger.php create mode 100644 src/services/live/on_emailer.php create mode 100644 src/services/live/on_encryption.php create mode 100644 src/services/live/on_html_filter.php create mode 100644 src/services/live/on_http_request.php create mode 100644 src/services/live/on_log.php create mode 100644 src/services/live/on_passwords.php create mode 100644 src/services/live/on_session.php create mode 100644 src/services/live/on_templates.php create mode 100644 src/services/live/on_twillio.php create mode 100644 src/services/mockup/loadall.php create mode 100644 src/services/mockup/on_html_filter.php create mode 100644 src/services/mockup/on_log.php create mode 100644 src/services/mockup/on_templates.php create mode 100644 src/services/mockup/on_test_db.php create mode 120000 tts_framework diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..97d6f02 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/src/logs/ +tts_framework/ +/src/tmp/ diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..ef4dbd5 --- /dev/null +++ b/.htaccess @@ -0,0 +1,63 @@ + + Options +FollowSymLinks -Indexes + RewriteEngine On +# LOG AND DENY ACCESS TO CORE DIRs + RewriteRule "^(src|models|views|controllers|includes|forms|templates|sql|classes|settings|uploads|notes|configs|vendor|node_modules)/(.*)$" "index.php?route=/app/home&m=deny&f=$1/$2" [NC,L] +# TRACE and TRACK HTTP methods disabled to prevent XSS attacks + RewriteCond "%{REQUEST_METHOD}" "^TRAC[EK]" + RewriteRule ".*" "-" [L,R=405] +# API +# never rewrite for existing files, directories and links + RewriteCond "%{REQUEST_FILENAME}" "!-f" + RewriteCond "%{REQUEST_FILENAME}" "!-d" + RewriteCond "%{REQUEST_FILENAME}" "!-l" + RewriteRule "^(api|api2)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$" "index.php?project=$2&route=/$3/$4&m=$5&$1=true" [QSA,L] +# Mobile + RewriteCond "%{HTTP_USER_AGENT}" "android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC] + RewriteCond "%{REQUEST_FILENAME}" "!-f" + RewriteCond "%{REQUEST_FILENAME}" "!-d" + RewriteCond "%{REQUEST_FILENAME}" "!-l" + RewriteRule "^([^/]*)/([^/]*)/([^/]*)/([^/]*)\.html$" "index.php?project=$1&route=/$2/$3&m=$4&mobile=true" [QSA,L] +# Site + RewriteCond "%{REQUEST_FILENAME}" "!-f" + RewriteCond "%{REQUEST_FILENAME}" "!-d" + RewriteCond "%{REQUEST_FILENAME}" "!-l" + RewriteRule "^([^/]*)/([^/]*)/([^/]*)/([^/]*)\.html$" "index.php?project=$1&route=/$2/$3&m=$4" [QSA,L] +# always send 404 on missing files in these folders + RewriteCond "%{REQUEST_FILENAME}" "!-f" + RewriteCond "%{REQUEST_FILENAME}" "!-d" + RewriteCond "%{REQUEST_FILENAME}" "!-l" + RewriteRule "^(assets|skin|js|css|public)/(.*)$" "-" [R=404,L,NS] +# Short Hand Site + RewriteCond "%{REQUEST_FILENAME}" "!-f" + RewriteCond "%{REQUEST_FILENAME}" "!-d" + RewriteCond "%{REQUEST_FILENAME}" "!-l" + RewriteRule "^([^/]*)/([^/]*)/([^/]*)/$" "index.php?project=$1&route=/$2/$3&m=index" [QSA,L] +# rewrite everything not found to index.php + RewriteCond "%{REQUEST_FILENAME}" "!-f" + RewriteCond "%{REQUEST_FILENAME}" "!-d" + RewriteCond "%{REQUEST_FILENAME}" "!-l" + RewriteRule ".*" "index.php" [L] + + +#ErrorDocument 404 /404.php + + + Order allow,deny + Deny from all + + + + Order allow,deny + Deny from all + + + + Header set Content-Type "text/x-handlebars-template; charset=UTF-8" + AddCharset UTF-8 .tpl + + + + Order allow,deny + Allow from all + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2831971 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2021 Robert Strutts + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README b/README new file mode 100644 index 0000000..be6026c --- /dev/null +++ b/README @@ -0,0 +1,5 @@ +## TTS Project for use with the PHP - TTS Framework. + +Example demo/testing site. + +See - tts_framework README file for install guide. \ No newline at end of file diff --git a/cli_cron.php b/cli_cron.php new file mode 100755 index 0000000..f095697 --- /dev/null +++ b/cli_cron.php @@ -0,0 +1,24 @@ +#!/usr/bin/php +load_controller(); +} \ No newline at end of file diff --git a/cli_unit_tests.php b/cli_unit_tests.php new file mode 100755 index 0000000..abffdf8 --- /dev/null +++ b/cli_unit_tests.php @@ -0,0 +1,25 @@ +#!/usr/bin/php +load_controller(); +} \ No newline at end of file diff --git a/public/assets/ex/favicon/about.txt b/public/assets/ex/favicon/about.txt new file mode 100644 index 0000000..86a430c --- /dev/null +++ b/public/assets/ex/favicon/about.txt @@ -0,0 +1,6 @@ +This favicon was generated using the following font: + +- Font Title: Ubuntu Mono +- Font Author: Copyright 2011 Canonical Ltd. Licensed under the Ubuntu Font Licence 1.0 +- Font Source: http://fonts.gstatic.com/s/ubuntumono/v14/KFO8CneDtsqEr0keqCMhbCc_Mn33tYhkf3O1GVg.ttf +- Font License: Ubuntu Font License, 1.0 (http://font.ubuntu.com/ufl/)) diff --git a/public/assets/ex/favicon/android-chrome-192x192.png b/public/assets/ex/favicon/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..c4dfbd3924b8bc74ffbb14aa3d6c3702737afd44 GIT binary patch literal 8702 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 literal 0 HcmV?d00001 diff --git a/public/assets/ex/favicon/apple-touch-icon.png b/public/assets/ex/favicon/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..825fb4c1f7e4f64a66864d3b589ff16c4e3e5259 GIT binary patch literal 8133 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 literal 0 HcmV?d00001 diff --git a/public/assets/ex/favicon/favicon-16x16.png b/public/assets/ex/favicon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..0adc61c9dbdb6e51556ae7bb3589d98d306b3989 GIT binary patch literal 469 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 N?{Am4d!TK4;J>B2tlR(q literal 0 HcmV?d00001 diff --git a/public/assets/ex/favicon/site.webmanifest b/public/assets/ex/favicon/site.webmanifest new file mode 100644 index 0000000..7423f63 --- /dev/null +++ b/public/assets/ex/favicon/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"./assets/favicon/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"./assets/favicon/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/public/assets/mockup/ajax/testing.js b/public/assets/mockup/ajax/testing.js new file mode 100644 index 0000000..9982e94 --- /dev/null +++ b/public/assets/mockup/ajax/testing.js @@ -0,0 +1 @@ +alert('hi22'); diff --git a/public/assets/mockup/favicon/about.txt b/public/assets/mockup/favicon/about.txt new file mode 100644 index 0000000..86a430c --- /dev/null +++ b/public/assets/mockup/favicon/about.txt @@ -0,0 +1,6 @@ +This favicon was generated using the following font: + +- Font Title: Ubuntu Mono +- Font Author: Copyright 2011 Canonical Ltd. Licensed under the Ubuntu Font Licence 1.0 +- Font Source: http://fonts.gstatic.com/s/ubuntumono/v14/KFO8CneDtsqEr0keqCMhbCc_Mn33tYhkf3O1GVg.ttf +- Font License: Ubuntu Font License, 1.0 (http://font.ubuntu.com/ufl/)) diff --git a/public/assets/mockup/favicon/android-chrome-192x192.png b/public/assets/mockup/favicon/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..4e5e38fcc24419dda2fbfad6a04a0473813940c0 GIT binary patch literal 8478 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

    1y@k<%mH8KydIwSH1~m=+d!`!JtVMy4 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 Nw6>vEk%nXVe*m_BSZM$N literal 0 HcmV?d00001 diff --git a/public/assets/mockup/favicon/apple-touch-icon.png b/public/assets/mockup/favicon/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3916f68a5af38e81e1618dd9c4315d4c8a1a0b GIT binary patch literal 7692 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 Eg5a+)egFUf literal 0 HcmV?d00001 diff --git a/public/assets/mockup/favicon/favicon.ico b/public/assets/mockup/favicon/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3b1cd3d31c062c1dea31b9e1b209b76ed9e6ced0 GIT binary patch literal 15406 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 n#F%|QK)RnmY0SRg;5R7z7GgBd2exR|EeAn+$;{ literal 0 HcmV?d00001 diff --git a/public/assets/mockup/favicon/site.webmanifest b/public/assets/mockup/favicon/site.webmanifest new file mode 100644 index 0000000..7423f63 --- /dev/null +++ b/public/assets/mockup/favicon/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"./assets/favicon/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"./assets/favicon/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/public/assets/mockup/fonts/JennaSue.ttf b/public/assets/mockup/fonts/JennaSue.ttf new file mode 100644 index 0000000000000000000000000000000000000000..667a55112dd47eed376f983864a2f9a703eed3a6 GIT binary patch literal 42948 zcmeFacbH^Hc`saba?YW14%3smr+cPncH*YlyxOSMtOC2MypmP{2_b|5kz|ly0U3k? z(FS2m5@5^A8ZfX}Hny;ZZEV08gcDfyB^WR^Vf+5-^o+pwKHukizk9#uxqsZzo_A_a zpFUOfzHhy`N`w+ZJOF`|b{;%%Yw6`==QC2%dlX%&B{B=N{z#3D07Tq;%`4GuQpfS1Lat>fHY9>ux_s$QZ^qhvx;taD}Vd|C)ZnUi>~u^WVT7@`ttNkCNZr9~>Uc zU3@-wg1-iTtAt~B@q_Ph-yC3^{FcGo;12FY@}}WuLwHwm=PvqOVk9?MPe1{_2RtQh zp3c+P5|IepN4W=Z=T*bs^sh;m{4jZ99o&ZjqPc71-tEtO_MK!iDOJ4T7`VTqFUMy| z5A=K7N6{{!oBP+FXTRTukL|%fV>Ax=)?mP0PttU5@HBmT@CEuEQ1pjHq74xFukg%Q zNr|ouzDR!&Z4GaI*We;~0XWJgHhI(F5xSpPG#L!$XbPWwodkHdMdQIA zkZ%)}eh&9`4Sr0Q27gVyJ@_{H?BGvncW{wDIQTxjk;vfGRrLEMau3Opw-3HU*T_C{ zfuzVu;*vka?~jlMCy|rjswMIs647rGoBk>=cn68e=WzWtsgWnpr$tWDNz$Tk8hnjD zOmcJ=G3ndM6up{MfUAF{CDNoVk^^pR^byi`l05e+-1{uPvqq-rlcZ1YB`xxm!Dq;e zNFMK6p`RhMz|R6bOY-D9gCBkiz|+JdpC9}!9U%q$br=25e`f#lN9ex)foGn11pQKy`~^<_ zH)TK+A`O0wwIBm(L;=)^I`|PjWzZzr;D_K49ndBQpab~tpp6OW5o_>o#3wdjkid{Q zgCCHHxPUS708@bfO47s!%#dL4ebAY~90>vQBpQ4V*oXm(fZqkLrvS?&4Ok(W!M^~X z4Aw|?@EuYoIluU(g2($&A~sB88QOc2Yi~$k`~|`83o)##s>dL<`cL;#?f9R6N7JnCno`y z0lyB~w*fbk4&W9tHTVazHG$hmckuV%jvnADnFibe_;+L{nE~8I`h&kEyU8rzo&@eC zbA!LZD%b?LKY^E!`N7x70kQyikSt*p6mm>f$SgrCAl$yr^zK~-$V`!{({_04g%f+_<3@M90I(R90t6N92xvM zxjlh*kfUfnn_N2hGjb<626z|XpOWX0%K+~tYkII<#L&t{?m%d4Svi_#ohC$g9YWfUhQ}0nd_~AkAKrz}J$S2ft5VM{WUph@1iZ z1;EG2>&dNvZy>h;J`DJK&Zzj(fe2Tm! zfo~;uqy0AW+`%Ww+sQqEzY6#X@@wRIfbSsp0=|eNSehgCbMS$-m_W{0-ym;_Y^8N&VfV^bzJLFOFQos);@I&NfgY)FW>afjQl*>zfE2-I7iNrR|0+{f#=BsgWo2AmshSfPX~Z z2>1lxqvW&X7Xkm6{Lza>2lzC3|KJ_upAz`b zevkYX+TSOS4cRE3Foj^`v^ z5b#Uj1&*T}_PSd zj+gKV`Vn}d;8~bNtY7v@bRyybk$si*%A;RFVqd}gB;4ou;pa)e=!y-N^^4Dve%W*E zANvtxkrxHL2d`tJ)jT0iX`@>7hV!XHlbm^qRjfm8)P0c zA6{%+xbxF~Wljmh49{6d$Y#MAZ!bZOW(UX2{GwD|nR8f}k6;xPg*Wq}l=Lg2UtYmyQo;nHgxjoNL6kIElqGNrdmZ`}1dZ_! zhoKV_qaeg#{j#ZOqJmxo%#rnr-b7B5R8W|`OilV#Sl`2bB^gM=i_x#jEAp^knRUjd zEXkTIp*ifA4Mx;JFZ3&mtY483*JAx*R6p$(bP<71iPP8nmGN7_cNM%+!Ap3&{+WK& zq+fEMxY#r?Y+;pA!oRAjEfg0#1}gLsC_A58Mv>1ttwy$L!h5 zbdW(5lMBccBt>ScP-aZ0>Ab2iHWVcVodF+`C@Y34tN2)Auaj_3H1GiWQ6%DEdB8LD zSiktxlr;@s(PR|_mOy8jGZh2Fl`(Qd(130YeQH1^`c+h*HtAQ#XDVZQ2?IxG5+0IO zOOrKB0CYyb3htT7G8I*cc=$dcsQ~>7=**T4^dcIHhJIz>Q{ipZ#DEmM%oKG=k_{kI z$E5IHm8}Lv1p67LU}%gTKvYf9R2dH`nxiYaip8npb!;%Q&9h~SagYGthvygx1l*!Y zu40<9BAKcVStAP=I`3+>tct3lDYk?@mEq^ABq=(u%LDhAgk_7S&X`YDbY0akK@3#) z4As;m9{AQ}d|y^vFdO>O6%yh5gyd7`S5$P_Q!NYAwp0TwqyV29@97SPtEsx`NG85( z;gu$4B;oZ2h=mtRqV0&5!TMEH!_W*3B#<@3H#JiSx0sqCtGK850$ZlCp^y~54_7kF z`bB4f<~aC@t(mHbnE+2hV0ely>8hc5vaKqrqpFInWAvJ7Fs{_mujG27V}c1JRWnW9 z)IkD8H$z*u4O!4^-BdI~Rn<_Cu}l?HC0SWUzvchXuO>UX3C0@s8yX(aq-*B?bH6hB zl^ko>uVw0%p@Pb~75(@9GV!2T8p&eZgw%^70jFAOYA zf#Pba=4qPh8iuOqw#in531*l5Q1Wa+k!4M{ZNoM-P}y`+uIXBesJn)(>ZYdYDUmHx z)z(Q7-zQ|WDiKN69W7&qp>C*w>4LFz+0rdB7mhY&d>07R5+JE`Og*%1U9~(n00TR!psJ~i68j=nkYV}0?K_5v zf%=8e30+OHLfg|V*EGz$r0eL%H%UX+EJC`YG6ARhM$t*9OS z62t>mVrY|5L$?uhnn1s*9hhY|leHWp<3<*^TJbDTssshg*L{qmcJD_WWqEYLgqUP z!3v42nwQJlu9@>wHn>^^%H vI9MEBd=s+ZQIG=m091j3@;ATSPg+L8G50l2AyNe4IRg+E2gEWcFH9k%Rr=U+nh=uUeZo0ESKHDE`?bS zT&+cJq>QHPUTnreCa7CQ&-Kfm?-ZlZvBFF$rzpU^WEs`EUe1B}EHB7qqg=}K12@i% z7vo~uR)b=cb%K=d`D3c>s+yY%$ed##TDNyuBbpK9yvev;_amp4Dh8$+7{HU-&W#2c zI}_#OmQxA*upWe7HJ$S8xR5QWs*$l}+iH%Q^`hcfP7oIh>0&mBB0p1_s%EM=SBop@ zf){1OAna(aujzg1`F?TMZ zxE5aab%+-ngQu$^`X?iXVjy1PAT|;p4w6F5BZv4#39*bC;ua%_QH&!V(LwBC8ou*9 zISp_61ia!~5xG}?$?^bo7K1K#?x z;l2Ow__+dpIQzLWfoq5uT%NT4zXL|Mjh~~4Oe`TzaucEh*R0>XVdKO9>EBl&rg#kB zY5=bcYg3@a3*kBcD*WL0!^8bc@&oS6rJ$59)_Hw1-4F-6=1gy{hchC8yR4Ml# zo=XujxMuLV!J~uU7`$ij;NX^@y!fdtPaS@${M7tY)vwNdi;jR^Bf`Ld(RQ|;MxZ%J$w8d9lZP;*`EIhBnE%tSrg}wJ}H$}Pj7#ep2Q#A zIBtxV(c;HTJ09ihI}Wc^kCz@OJ+S-Q2TD6iH=eroQK6pv#s}9uaJ*f5lpI+*4R~~| z{OIQ6*=L&99X~#g_XzAg_zE6>;5goJ)A}3mJGs^V2_6#1_m&>z8wb}8tv!0*_UxmZ zw;#`z%ca#vKXGvF(NAp8mX9CDQ_?dd#fV>UI<-D#8Do}4@wqa5%aOH5H)kIu#~*lr zz4ORgwfyLP4?K{40P|S?`yBbie{+M9|Mte_^&7wh-T_Rko}>32#LMujTF$Z?)pE6r zaUS1}zSZ%)N7hy`((>^MgsmVcS#FCP{4=7{Pjf#HskuyUIS;YfApF=l(r_^8Cx^d{ zFK@|0j?6$}vyW#W(Pyx_XCT*SAfIOtk(@!)a0ZdR8ARV^$YZ!3$7No%MI@g`cxwS~EwnpRe79eqaY2li`PpTPW@K@)MXQkn*laW>dHnM&UXGT9WqNU4JF~t17y~~zDZH*$Ta>?%E*5%o-api&j#ru_!P1`GC*yv7;!S!LHj3Rpf zUHS-j9=MW$!ZA#OVtf|glL~yl$L7I@xFKQi6z$n=fuq+dy&e0@dg!Q}Y~~uZypW%n zY}kTnsP59v-G#Be5p%}6`%X>^QD|^);f==bm3a5g>Fq~5J}(<1y~Pq7A1cgVzI|L( zrnc9Pk6-%Q+jg0Pf{Ya;w?OmA-PDpXWiTdxh{zZyO@NRzrthUv!lEROTNBv$%GechLozgsTQqEM%*Y?x)oWcf)&I@SPV5zo!_!arc#*Rxnt3C z;iiFqkck*@bKE)Tdt@&C0vE&uJ|U$v$)Qgg$w7gOCq+ijMt>F`PET?(eIJC6FrxmX z&DJ>*rYN|Dz;IoS$zAN>ZFPmjr| z_!)7<8g&Ub@bM%f$DrmUdpDyleWI-8=gNX*nSAH!xpX6K&{W!DjLxFS*))Pn2%gG@ z9l7{htt8&0d`$%vkcTwKFSAKe=1CL)~hOc9<$l&0G6&D8`w z%vq|VQ#mtHO)I(~QXi2sQLt4xw6fba_ie<4v_D$8WnQm!mm7XoRetg(_SOSO%8@Ik zJZtqZ$|oqYmKW*2b035KpR5b4b07ucfZ-W`BsgA9u+9VnaKz-%BtOHRq9H>dgykQn zt~h;DlLhJIW@mcmk_c~g^w6&56zArfDSf2By_HR=*@@0vy|;ZVqrr((1UGHKLxo;I z5Q3ww!V1Rm8bOAy0sPH(U6oJ2ekY@d>he6LlI^zz=@ zw{xmN?J!na#}93BvCJT1JlRYkQh)(TkadW}QI*!=rOc6o=i#P|ZE$u6oZSIucfi>l zaCQfr-2rEJpc^~j><&1)1J3S%vpeAI&IV_9z}X#eHpKQajr$Sf$#q=K;xFhzreM~E zC-BD*)ofHDOfKhhYQAXtD`VQo_^1iN#)DT7&(%HC&K2vaAZ1Ea1 zU_h_qK8(4&;XK@~!y6c=0s~cGpb89Bfq^P8P{mVKV4w;Nu)Kd27^ngRRbZgHfq^P8 zP)*i$73-7P93s{-YY#1jVY`9*jrIE@Xpf+M7|*Ptz1oI0UdD|rO#AhJs`!3(oy$>x zvJ0%$WVI$LlCMJZ#4tH#rW;KQBD!B;?1)tlao(7og}Um`vQ>YKr7rlwf`7 zI%jg+;_AzHBPT^UB?*Yjjs93GB~VETSVBt>5Q#)s2J8!a?>wF3UJ3vG&FA6rwKwQj z0{u#$UkUUpfqo^>uLSy)K)({`R|5S?pkE2}D}jEc4f>TpzfwZK66oQA9xh1HM!OC< z&3-T9-eQ}ahu=Pp?(hI^Mz|T_!D+PHXt&X3_lFNdNRQISbh9$af!Fx}eBUeZ)uAi_ zbt*6$AgSdFliK*lgb5QMT}VF4vB+Dl7V8jY>Cgk3WS}sY$+{Feo^mddQ;@il6z9Ug zM(mzS^HtGIm#pe+&E{fI#E*PAKf7!9wvZ8)B7)3_PJ4%T?`VSFoYUBG>mharfmvk7 zgp)5m*p#gFD5|X>3rmA1IF)+|A|&J)T@zRwV@w#cvrzaj$Y#4}cKbcdiKz?lA&fMv zezxFQb7(>?^K=qjLj=!k-{!EiqwL1n`MGX0Mdfm9)HZ!iZBEb6P9WZ-a_M4G6>VDz z!0f3`(aC1PvE_WmjH#}d#^xJ>6Q;NqBgLR7bmCdBxmu|AmU3QTiP6~n@>0t3p*8Sl zn9ZhDQ!nPzqA)hyQ3L7~^ukKbLg*0&xEKW8n>MfBe&S%A8YV0B8hr8M^XU>DM~%WO z$c^U_sJWYQmWZtK-N^jj4F-V;prVn+)xxz2*KS*&Q4Y1xMM42k#l#A`hiNRp=KuP83|GV zJSnkcEAnS7AN329}uIxgrSn-rdH{KQ_I~f(kiPd~*D)!@4`ME<`^854?-0y>Ye|#RLGzUTP^9Z_K zwINeZLZ+OAOgRaeauPD-BxK4-$dr>H>q*FzlaMJVAyZC5rksRKIk_QIPC}-fOk~PQ zP`e9icOf3GLVFhN+4c53+Vf~1#QmWjNUY2?^ty&#*U;-4dR;@WYv^?iy{@6xHT1fM zUf0m;8hTyZ=yeUfuA$eVE{21`7^VyB1e}1sk~PXS@uWC|J3%zOQ*A6#s1Mq#fHe~B z0YxqqxERa>SEo72P5-@^*O_q+&m>)nJk#}6YByUgk0S4djEq1BBp= zH5FGL-@WJH6d$PRqig$p8PX?_Z*=fY>T-XEcp>wH8%*oM(u;Cj$QBHAss!=euml*> zQCw+M7dhZzy5D4KQg69IXqr)@oN1L(j>btyWgutAN*v@23J3%t#XZSS>^T0cEBDW+ zQ=2&0%0zYQr_5J5H^5KDyON2=XAb^kA&y)(-w%uT-KlYh>9WpD5kav5d9 z5fzU9(AaB8P4EkN3;%{*)Ggb3BC^X)OMs(Q{l*R!tz&)uZQk z?p!I=9HgL~J(nF$!2n=1;!tlG(gycC5VNqzXV=Z10vsM#<4jUAp*YDUEISQqE%Px5 z#~1jx5iy0joMq@xw(#N$WV^D}b5<-WBVC@XrnRcR)_CO=;+0aOPppo`KBkcjI_CO=;fkxT`k+ugK zX%95g9%!UJ&`5irk@i3%?E!O~N7`Z!DZ{@UzI$k?f=gO#EdYJMBj^dF7O*}oK7=Lt zjE1UKHnb6o6G5Qxuu2O+IoFtBYKi|@&PYjthWsjQLKG``sl10eAx<(X1sEpKJ&^1s zviQYJ&*vq}Mb<7|3Ly<(-pGo4L^1;^(OYt#y>`2;+C|rSo;M$Tp(&@Nb z%Hol6#Fto6Q>swZVDHL}V_T-@%f6{N`%5$9HODDcM>EJSN0K+zDqq|_zSV-jGIm^X z?YKt8U~0O@?F0`i8d%0seAq!2s+jNMUXRQW)?*Keo%J|C59<+irMUXIcHlaO>v~*w zHxuf2$2i}0P=^*%?4x*!zmWkEadd`G8ZyJ zh)gtt>n;A2uyXXWJOnK@=k{Gbf!}b|A!$tmp{@+m!_dKoZEy-zvZZp)=THNnsiNyc zXy-;o=~Ys5yn!kX#Ga^|ABo#nw7GJtE@^saY1`72j&c!{Us$Tp+_YtW9JVFuO?EwR zQK^o%TSZiyz_B#)g}lLy&CUWx+~7xW(tZtjs~0ePJhg$N|4sI|39e^$xr5&hRzeEx z5bY3ccE9>0xV8jbuCpvK2TO_x2gEz3`*4ha$Vg(Uuz=tQ-Hrt3L=myF(sZw1hHt^* zRB#W$bG&T2Fksw9ImLqy`=4edL%e3fV8o<*2TE{9RPKRq+!XYtny7!E_kQzcvr)@Z zMW?wHW;gS|#WC(9aH|nXloMN-tqdlvpkJBh1zq_*2OiT66o%N15p;%5AWn=@rD7Jx zvZy9dL?iMHl=0{mcTSl*blpuiu5Gm}B|ko1XC+23lY8yD9$10XoY^||+_zufMf^`r z<9X^l7_^#56XuWFz?YlQxDO8QC;#mLJcjFfTzBKTAJ@aU z9>Mh(uE%k$b8sIV+#hnV%&^WpP&P4U`d2IPH-T>a>mw93-I!VAmSMI+iNbls)Q3^T z0_~y31|^KJ;ZYW1i=M-bM{qGG>x_HRVkLL^QW4cJVJhXOOSWkEk%`6qCwzC;k-eKB z%@y0a@|9yL)Juq{NYet?o4VtoieP5Tt}QcGz9@!Kv;*<-J*C~RzI~O-BfGA;5;0!r z**_mV#qH!ig*xK9&Lg$^f&@b^0EP%KM1~kT0}P!3hR$HRXRyZ407GYhp)+tw??wAww(JpBuE>@MQy%O9bXAw3 zKKT$X7W_nJ;{&T~!6&8&gsj-Cz=Th{1E^T2HpFT1Y;p%?9J|K?Q8UYk`+?=($JC4% zO|)uhlhZ>^NL89asz$Ax4F$;TI4Xp>S_r8*bn%T`p=i4yN-t3Dfp{&%C~D_W*qE(` zDpf2_6JhGZv_pAU;5%Fpq96?aakk@9R(i-hNk+f3=$Wdsdynku!BKU?T}O_V8Y8G} z;!Dk@nw#n`jf9Ky9hK`fg<@->8uCGBtSAVr9cxE-dJeuGu652=KvyN9s{&ez zprts}#sRc(fDaP?Fn~4=pp64);{e(?fHn@GjRR=o0NOZ!HV&YT18Cy_+Bm@LkyyhU zH{*?)8Fx(gA@L(ATo$_EibM&ENW~y=kvM{^Oo}O9X5lavNT_e1a0zi3c*p5f1mb`e zYMd#!u%<*S6B!64)Z1A+V){{F3u2Vms}MwPKC(GP%fJXcJp_YIX-?ao9APT*S4VbDZGUI-QnLncIA56K6^O(bIQ!xki7>Vq23-3;Xx42B_4eV(rq)4zDyB zuCagTBK7GO7%0FsK_SUHt_g6>>L^f1g^SfQu)2!taovsUeq0aZdIZ;FxE{x~&g%rY zh7k_VBtL`eCfcLG^(ezN6IRp90^?8^|TVVZNuhhfz5*PmVLI!`_(j|FYGAC|^2>@*#p3tuHlhJ()675XAyN%R*p@ zd%={RNRKNApS976Cq>>vU~V=&?{q9D6hMfi~=Et$Az!i0x44+RZIhXP^l zpXg7H*A0~PhM9sH6+9ING)ThA$pxj!Yqq1NQmoQccQYYs|7AK(Rg@g+6a7t-g|JXI zW)5dj&yDb;AbkUdxuB+J+BH;f!=@^2o@ru?--A50{WB9&m&N?*^OtQu zWM%XG#IEf-$IS?-E|hh1ZV`*vXXcsBQu5Rd)>j~FYFL39R-lFzs9^iD0bG4DyO_MVzHK@6239<}97V5!g^X=)Q^Eu(vOOA{>u+S8_ z*5Fr8Jo}a_)0~sanN)?S+NIT6BRTzPe{o?F&YPvQx;>wH%M4FM82ko&{|j(|o|Qyi zBt~yg5p-U6G+C+*0vk0HOxIz0Ll@s?Ie4ZOms!rOiQp!lW64SpA@w<=iZw-=+5fE0 zbU#3SGLp-V5X7+>cVbSaBP*RM%7LpB=}gIjTZ9Swl%kH`4(viUK)48AqZT0x0rlo| zs!B>5n_ZYHQx>)6UXyG^C~|scyiz}K;9xz|pPqEHd$y$M-_lTRncmbTEcwwjCY0;%LG@Bzy4{v_wbY z`cIIx^C&b-_=m-wBiI(vhHVi+G)1s2BG?uYY>NoCMFiU-f^8AOwuoR`M6fL)*cK6N zizu-zMDR@e%MfSa0z}n;NT7D6GD-UgZy`^#ETBRKV!{FvP-zbXj#C_ytteTdH0<>{ zj;v(H=eEDy*fiJTGo6v5FVeERdH>-`YWu!RcFfr%&nz!bhTjUD z`736*RC8*w&eq5igMa3_s69AoTL zGC-Tf=D-G6q9FYYZo>2Zq`mFXp`4bB%AK)^!pL|^lenl*ldM>U-Pp>fD*xp7V3B+00*jqI|`Xc`D2uIW-|D^a;0|3#Du! z%G3*4*Rin40ig`RO1Da;j|~OJ#N1+k6#Fgc)`!-Z9W1jlatE7aDhqS7MMN=W2M86Y z)t;WdQpy&~mTH%BDQWz6$nFgG<9?s6g6_m`tn+jnu=R?6C_27<8G| zrV%~Jj}BSG6SIcEcMO{=YkTFa2Za z%tb^qSXPI5ZEzxz0wy}!OR^6`;mWa;Aws_hfnvF_5&;Bwm|F*KL5>#I5Ql2}$R61_ z6=?e8!nUPptJu%ONmkRDw3hdr?nq{_R}`INbIqmQ+on|%lvi~Y@PIv2nyRF;B9egZ zsRnmVfFgEFN6gl#_6p^t`QAj$bRr$WU(fgCe0!pu^)h0r+`qET=f>wZ@2HGz9!tSH z5#pcRCWCH)JJKv`V!bnsIX*r3ByG?YWVctD2hJw}Nr=axv_LF;m7AMa_>@#g~+HCItaO2Xg>txsSuJWAW-L5J{Q;hY1GB(t&@-1SUo_ zo`2&$2LWISrBtSCVn2k9GJJFo+5Hdna{4it;3NqUCK!yMeSl2n@G}NV>#`_BG^EpSs!bsur)~J3ge|v);$POHycRY8>ySlna<_UdEpIP1i5|q z=37pcWQd;1mDgW?>9VGHCDhGWcHAw?f!tZ%o;|i!G z>ZXakhA0fw^I5o*nR4AmDuL&eAn>FhN_IJ7FCuo7VS^b$y5r*b>Lqz-RT^#E+E-*J z<@0VSLg`qTE13?oA_rm3SNq#{uI5?5A-?M{?*<;$z#jkybKK`qX;0Sk49rgsu?CiT z1p2yBXo(+i6gixm>p7-l#`VTzsW_H4IK$F;HO*(1&3!_2_bkA(ImohKNQ##?k_2gwIkIYueH=V^P+1 z3mbMK9=nQk-b-a;hwfrK?D$K5aTWV-w(Q1s>c4$Vzm zd*X1$)_6m_>}@YRqI#Z4H=nru#EM*4ICSjN3gk7Ps*Okfro~xD>>a!1`Xj!fVWXb_ zQ(P3XqjTlnEvK(eIMj75|b;E)brkR`H z>jP~FtZ`l5^s}zupkO7670re^!?G6bFr^vUlrKuDT*1V~FYI_VQR2q%#7hlp;?Op> zyQ?`-r`-7Bvco&7>`xtCuF&#mOU~^^CR6RL?%O$wt$7kh-I1+rt36(1^d9{6;9Yc? zyByvs@j*NAY$QEHbXKy%1n7{*m^@8b8ngHZx8_1~j%PJpv2)e2oE*oYs5_>M4S^7H zsH~f)7qF*Q)dVk-Zx-y(Mrnv{DBRIY-?8eCwEOTpsZ$=Asn@SOw!?y>)Zeo(Q^kHE zl^ff=Ww8hrQKa-(d#*WmcxlvS8y_*=Z{uu=$LS3~bD~8P@xET(%<^wQBeTYaJj)`O z$?D+EIL^4bBXB;lp(@HsSWqb*m1EV&+1SzOAnJ?iA8Z!YS#<^~`>u6Ml~y+2g_h;z zOfD^BU#gTpjao(*m5j(x ziZq^n;hk$HC+VZ}-PfM9!;Il?-Lo6TBs{(DdF7@vdh2z26iv=<-@SLs493I_E?#^a z&T3i49;1WgW#_@%{S7G{;g1NM&Td8E^az|Dfzu;!dIV07!08bo||0FI5Z1y+HjF@O|M!SV}YrQ>&HY@F(g&#Ey0mce;JM=5AhaD_&_Gou57pLHG3VI_h z?b)+yzQt6AEcpvN_H3WE`_q|4*Q!)o{myg~uPk*JW=1ZTk;dz9-qOqS+$d~H7Db?g z?+<=Re{0AG6wxPeVq%6chCq87Glfx<1aFuXOUL=BP|gQjZDk3SK)g~vuy1<`E6N=o zt*M=zhsruqwD#hj{bk$N1@5I2x7~f$)w}KV#MlH%lI`4fKA1ID;1B7PGlWjsx2=pltgBA+tp%P6pNju8i#%5nm)a}j5wPe z^iEEwK@h0CZdMvi2gTQ1W^rjL$HDGENC&mp#Y&p_->ZbDw{!19t^E{o>P$WkEqrF^ zpnvuUJS>)(NIU`PJs5J`Ps!K@EJ*40a>3S6eOuePJY~7Y#LiZxTf>glY`s-U`N+*6 zcNVxRiooB=_9*lE$j)01*1H9p_x;|ks=2UrPLpUf*(@Kq?9v_Wd!gwy)Q&h2Fh>Vp z8oUvu&OH=8Fgs0Q3=D>Z9fna&LZk_~D(rkWTbzPi@uw$CLb{1f8Q4J=l4l|8uQCk7 zM*()Z25dSuHyY*nD0VsOguy(DZ4JSU;;)$wXWEJ(D8Hy93Mn}#7{&Vi4$knnhep`l zmr6#Uu@SJ;)o=)jR>7NBnc*jhl~ywu3?GE>?`+>+5>Pdv_%l;wHm<)yA4bwg!V~)j ze@L6$6YT5`kr@**lsWUfXj4RWpP$L2PR$im3+e1qeWV<|5bJuN?vDid9 z|I6=q`%8}{?@Hk;mfu4RC1Q3E<|rYp){QN3-V6|Lh2@4h@s{I?cCnBRt!=Wa?zrJa zFMZMV+fiC62%CQSo$q-0aqy{&eU|$nk+6Gv18eRxvx$Fp{2WQqACV7X--v;TE7J&A zRxHSr#F>Up7GIsDuM`k65VgQ_P~&$BTij7e;c0vZNd^lCK2Yv;UZWiId}d@E^=3r` z=W>&yBQcJP@MfkedQ#uXkp}%o^!0J{RZi$2f(|~aCt0PO)WF6Brf|TepbJD*13DUY zCY&q9iy1Dp9jMCk+Vt7#XiXF70BrohzHg_g!Un{&!T+; z+BdAXUyAliS#>Zg8JlOAfL_D=S@k6xmndfS{E+O3@xf|fIuBUF-w=RIKhq{|K_tKr z8%Ba*Tg*15@zEs2BUbw)q<&&zCgA``BfJIoP~aKQGp~+4NfBa%21%R&=I?!qM?oq! z#VaT!*F1y{(|QVL2PisnaBze8?Z-u-G1G%pP4xgl3N9$YMB!uyVL()Iqzicj9yu+S zO~HcUXgE^z5QwgqQ2vDit!ZYK3RdXjT@w6!RliO&yc8B0oI)<0_3lE@!_;^xxH%Mj zaF@GdwU}-07{itto;#IYu0j)uyj?JHDoE&}N0>w?J*rOBn|U?#3$2XB)kZyRLWssZ zcp{UFIYb1D@ccz1^iawpS-QwYDQv5j%&?L{*;*mMw)a9Dy)~WBR*HCCrdk`Xu`KCn zm}at+P6e5)5#>LRA?Di|m_1P@N^63F?dl3kau}AAgREL2`{;ML4)z1TB#GCTK-CVY zN?CPq;!p#EyoulgEy9FSpkuP@2H^_O#)5+|q@2Zw!*mDkE)UJdB=Nrf7yCX)n2?+4 zc)B|?S}n3u7W^Y~*e(`k<*2j;L!%lWMXyY|T zKW=0t3x7c^R-i%IUL}+>@dz*QMuZbBP%Wmg@?F#fawkDtYSt{gg46LKeGVeYf{yaQ zz=*05vlk!&bkwG(a$L+;viQTQ*K+JU9jji+v7>QNXp&LjKnm0bA{EbtV3SnJj(E{v zWoJgJl>o$*N~0Y(n~*Wu%zQ_LS!YepwznG@CIN6BgpIBA%o=4nFrwc^eZ)r+S;jPt z$yOCOd_$&TT}dn)FvRwB|Ajcu1_MLUscK)Q!Lefp!N3q?MH@W#e6LkaakMbjc4WQB zDY^FeSPESRv)vknNE1-U_9gmz+`F-3yny1&tC0gaM|OhlyK%9NJ|mE+yOWJRE9)(k z1v6&Af`eL43M%@D(DKQq3AtKHY#S`q`xj4h3X}2FnN~@F)_^8%;VNlxg z>ers#rlzxLIn}PAysNu;*|5P)0<1bOmkr=Hh^+8WvORDAwRhfm^PwsF0j)h*6od8% zEEi;qaJt{8>8ns@Gz+bTUF@@vRG2RaHI!QGN{M;Xz!}3F{N=d7SsXtJTtSbsF9;1D z9wJ*X7XMqai8CjV)qv8n1l`1uABfr5s)LOvLZMYmn|gI*#Brl^&cbN^&yQWcT5{}#{cFcAp(l835*3tEtDTA$Hg(K!e)G1)&QHFm3U;jH z{EEOaP&35r%$Q!p`IH|8U;Q+$MMGAa54pe`pJh6a2p<-oAR$M`PVd3q!;f;dUTIJJ zh|I*T)_7J%Vuroz?;Fu8~rPgN`c{NXgFjA5)hji4bJr~K|@>-$Di0H_6#z)fD@r4#H`_S z;lL-#V}~H5h8eg@s0xT&CMtuXuKWx&+yI6IVym!@S!4s@LS#{){;7Z?bWnqfv#SKf z$e3b?JS2y6HSiQziuv)f&-O^Dd~!MrtUWg88qQ<;6wV0Ev)VoxnU(dJnhZTJL(j|5 z^D^|j3_UMH&&$yBGW5I*JugGg%h2;O^t`;G=Vj=58G0V;+h#JQpKPTqAYLQMz{xO? z_5PqSnTCPpWD2N&(wqVU4zN`)=kd`p_w%CHx$^MN?D2b#&Bc}>rxq3$GR>u_mUsB} zomI9DSUmHc!?05QaXxg$W=$#*pJR8W8bv6kZvq>N4z6Mrs81i zteDs#G_i{GVLgqGndloc(J>PpGtn^<9W&7}6CE?rF%um#(J>PpGtn^<9W%iJ8<>fN ze3y@1&9D+_RZ4QAuzLDuN=UV%=u?q>0jDi73B+Bp^2)QX*`c89dGU1*-d$GWfEk1w zx`gY*?Lzlm@|^QH=)=Tlp)P8E{GloRR^jWWXsI za7qT8f>#Xv`V2TFg9)OZ7jN@m<9Sd9?9IcaJO{3hJ=(6RHe3uP`Sg5Dp4F2us2Z@KQFlU?L`gJ}2B zOUonu@v%Gy3$8ua`<>!SuSmIx&8tyv(^ShSPYdeU+~&m|{Ijp&gyGYm9gDfJ!U(MW zq$X)y5{QWh$ztZrVZ-=-*Q9Q)kd?DLcdi7`p>*qmdy$rxVE_5N&b6jHIN}SdUuw+F zz&h1w$DRORRTNxt5TiiSgO90H18~h{v zIc_`j0UHn0x12~H*2KoD87M=h1lR{mVM2IepiMNn=(_@n3AI$Iuz7yU3bdK4mcy}f zXs+J4qrx?t`Axl169KI9;wVlpDo*rsDB{kpu5>upDdn?zHnt?Yl5L*6Vvob}!=c#T zwtv?=%3A!C!UcLbJw4^Rjy~2x(ylXyQ*J0u)BOe==dMHy6x9JDmM-HYmY20aduzz` zd2oGxgX{BPyF6Gh53bLH>+|6HJh(m&uFr$(^WgeCxIPcA&x7mp3D@WG#^GL*b>?9j zFfl73%UR5at!NA8AqzMru0moou*h=sO;&SBgA9(OlENyJ&ItM-IR{@)uzLL|L-KqV zQWqPk;#g?xsGvxM6$BdGF}=O*@B~g~6nup<#oG0!_OWf=9A|Alc3qcuP>P)C_h<8} zCdxC*^M(?dlgD?q;SmTp)De*ghrX0sf^Dp$Is^_fkOPaD?Yw2wLvAKf-5aS%NTU_R za+ux25|mK&Ox=LO^b$6N-0bXZ4smY2u(WB)s|0$*Pi@`3x6G@uS3bCRUQ_+?g@tK5 zhIav#h>9(tvb4OFTf|lqlsLi#7a`1w$VbLmr?7RgYkRTa1Uz&N&bS({S7ur$n3L3P zvoMr-3FVI>XwBpWP9mm9xg7{_Gmf-4$R37gmP=t}M5sw-G1JAwr^0|?;zw|68He7N zO^Yha83!2@XjbYKD9otdnJdC%bsXjog{Y#>RdI%!5SF%fW34bZp5ta`Z@=kTd%8+` zwo^wT9`>;rBkeA#DP)#mZ2+vHBAE$wZ%+;74bLL zCJx?o$F1Y}5ggNIY=7~K?psA&l8G&i*xGC)F*iQRi++n^XE05Hj}W0?=CjPUE-<9C znx~;-#CF6kGY<=0gR=@0nM@4A;tTZ8RG(KJ*Vm(*7-syyFbp`Pz$0WP%XHCDN$rZ+ z2^W$x=2mcYSJgEIY?4K`MYcJI#}O0V$?;U?(9zx46l9p=z1g&yf#YY_#%D@SNe;xX z8dKAw@Fhg6-RoZb3O}>D-E-RAshS7=$>9v^i`-RM%1xFjF@`m5OtagdguOut8I@y%Un_3=s2|u>7BhAkqK6!ic z=d+)?(<_)t=q>g0uXXiGH|A0mrt~QW@M-A3Zz0}fL$9$4H5Rl^qHEm_g3a#t(C$IU){`+*8WpKpSkI;}!gdDtU`+E|pOv2>U<>~+WC0O& zcm;+iWQrxW@0mmCKO3J>Eu}coa-=vF;=BSJ|LWVY={VGT6n-##M9CKN>`YmFw@}1p zI{1!kN_wrD#fE7|f~rJu3g(w5kI;K?_C3yBU&oh?F|(?^jj;{~#}G#EOooH1=)*fY zJOtk`6IAgh>;mQE=3oxDz;$IezAyY>Trsd?%d6N(0gJgb4Gr-^I>+j8mLB zc=dHB_jTC3i~~2{d)uYIKb#3fJFu`$4`wH&>8t7YuuBVdJ#`k%9$Exg-VX-S!dXsmxCV2j@k@%JeramP(^B(phnNG~L?T$#OX265-uU9KM5vYUC=8p^4+b z6z(syT82Lj6E;+qwssNuFh|>yRaX>7=T}#zbhCBIwe8e=J0tT!Nytii8WCe-cGuBX zaj{oZ&>8l8VBe85K2y-PGJX&n+jFW>Xx4Fr2-fm6c^$QI&a;acW-sAVFH!l7^M;!+ zAQ;ikA*D0i);0Wlc=*Q#rAOKMETBri3j#5uL2CeWkX_hm!q`wQk4}u_P~h#(# z63x*|>1ld5T|G}O;P~!!uZYE)FTmElfbU&^t$P8s?giMo7hvmNfUSE0w(bSkx)-q4 zFTmEluwm<7fUSEWv2`zC!XL-7`#4zd577Q9+FwN*_bIdlWi~Kt!v>~ocMqPS6|^hs z_fZ2$*{KQanQ^qo+vn*7MtC9d9oXHQaQ7y*PyY?5#Dr^sEX+;pH)@{lPk!G^+19%A zV`+^K<}&{F$9^5?cI}nMe-Bhn#J7_WeYivac1e;INGN3IL0CbfaF97-wNa8E$>=83Q@7pV+=& zh&s0IENrk+v*|ul$cTIeuw0r5DOZ|}CCcu$lcDwcQ64g|hX`3RGz6O2aQd?gSmAk$ z5d%edsu=~?EQzmMh!=2Dp5lyves88f-GVXiM@Kt)NGw=@GqQ zo7jPh;qK)bHYU`h!FG^jstWb75$qwJ-C1j`jD}+`;<0PZtd#Rgw%x!Hn1Ux{ zTiyQ5Y15ckL8jNzCMKMmZ$`-G>$Q3rQQKTZBG&MN=v+#+g`@inWS{ zjGv7xrc$WXOqHrSHbIuM)1x_|RFdOzYihB99;srMOF3EArMOXuQ0r$2*^$l);w~I- zl!`IpW`3-AICInVBzJVAW>C>U7L2)K0wg~Q7gg0RHjz6;NiNFza3(TUMJ-eU6h5VF z1RHV67pgZ@ALl;ks5A+hzG~v=4TWO|6ysUZ3SNjZP+8^6(WL zYij0K8frG}t+1Rt%2y19)t=+L5^VouCy`s&qJe{xO&cngO6KUq81}IgbUWsB=we-Z zBdcULN5@7`lg0jnTY@iHsTd|3k_;#qgLS9igc2Mzjij~ec+791+#}Y==m;wNae#@c zMyT}x&*3)P@Pr@|+t=*6GK_i^;*~ofMjomr*tS$S2^Q-6x~k=h@P)7+hlf zZA&_p#?C&;>IC_1nM@Id59u(yRLM8f$VPG8#qZ*K4hptLD-qvAWLe%a9glr~l8;Iw zVVp%TbR_C5$#H0Jl}Ay^EOFTgxig&g%Xv{fA7a}N{)c}_ zzpnev8P1TyncZNcE?1A0b|uA0yc;RjV-<_EO2a5!yw80LD5+9K~|&z=(t*`J;=%DcW_^0PU)A00|o)3SbF>>T3J>oFBJx z8zW2b@b3NH-+i2W?z!il@BQ7IV#99}uuXY_KFhFgvY4s0j5X&g)fP@kD2xrU2YMhs z*i)PDX3Ke=L+D$$P@=iafsSeJZE9;cPrEw!s>N?wa!mOJTjvfxwo4$_v7lqo!j42H zuI_ts7~8pWI|{Lxftt?rb0U2cyG;3vCcVdD+1;J27t<``J8=A*%69Z|LQY#ZV7%*z zO>RQ@tyIBVkSMK*(pqASr7B%bW0TIzF!PC)YDXV85wwG9_JDhKmO9uKo$D=@fZ2d*?Xwv{e^kQRQa>=z7b<@uu_?y>~~18i;o=zZG$!T zVtgAnc$Txg)0~^eCb0y0SAF8QaJRHnV^lNR={O z|BMZ^Omiq%da1iF3H@1O%HICTFaGmqKYlB#jdFhbV^95)XFkrUZ00$`4K4pGmByuT zeLduX2<{K*q>jpUn8@!?!NSeQ)|$c^PNm(C!klXD%qPuxeqT(jr5+@gWM6?R&=gjY zI7jqx*iouh)Dc~l()9)Cw|rmMc!FI*+>@Uw{TKP7YPqhHy`3mu;{_{ULMT;2=&o6zI z&aul8W^>s@bMaY58(;5u?pNaHz8MF?>#0vsH}`hH5Jy=sq?sk$n(889$g2$dOm1dj zys?xn_TBi)&X|qm#jf7oJV!Jvr9OdS#l$+lGMjCx6#8%e6dH$(bc-F8u5zZ>=U$!T zI4pjYdLSvw{YUP73=icR6Pij%*a`{%d5)yY_J(6j~bFXZf12P;IHs z-A+;Hmzl+>Y;z^wcl1}&xcqvTyLu|^jjaPmqrV@&_E(&Q^)9X23=Qed?=15ceam4A zOjAAj=5Q-=jf%VH4-9NgUwqi3O>K#7ow~KqlwG>PIj19C?7aErdcJe@(4k5@w$9}A zXm{$Ru4+2pQEeM6jct`?Hzxq2I&*_Zdpg@wh3d?3 zrP_=2+fJXp^QMVZ>Z$HR?`BV1Prm=wiJyDsk=u$*`8!S=T258^_>5HfNpb(&H&X45 zA9MeZ%6y|aX+SBv$A^{a;gyYBHdksWxN=*jcK7L1x6E8j7xOKfAN^GL&QZZl*_CI% z_S`@AWb18imHKx2NBGJbda$tF+>Cr3xhaJ^^+*o~tqjo%Z1L{)XSX!h-rTxS&bB&k zwSZa+JAvEhW(D^7#BK~{QM&o$r@r*nFYInpP?`-9Mf5_d{n0P|n-`w8{@hyj{f3L_ zA6h2+U&r_m1IcEc0niShIMu9*>|uF(Q;KhL>%Z~Sg+{UePoe2Qyk6+eClZ~J6pB-Y zLLdIZOTYO!%N$Gnq~Q#Emi_^J^tQi`kAC-O;-jmn_ZxnNGh+XNyzcw^d41<+EFRtxQ{YN z%|3kQx?db`EElyJDhxsnin2Zo6IW=$2JTfeAuG*AqwXt>)vD}#%ytg+b{E_FdV5-1 ziXN&aQjqOip6F?;PA_&~Ocdcsxvh}vZSFZfiSlHxNtF{FTI+4&tc+04jB)mQRLZ6A zyQ_lzCd8$WKJw5bN13o|^9yUUb7$r~*&>C--PY83!!28f$2h+ybLY3&k(DW2 z{kf*O`pPEXUT4|wSDTyI+$bD5b?YthJ#cR+VYb}hPaKh zY4Xs~)v-)rVzRxnvoT-glltP=_)zoIZPShYeOrCwH_di_@W0ceH{Y|+RK0a`75VJA z_Cmwovd?Xm*)p*^hL{s-cp|dw79GOFu)JcoboaPL6xN5Un!S*^4Ri$Ykan=c!2>th z;PAV}E@q!Xrh9mzqczQSIKyL;!&$yeFSSi~ROqB!KD)ZslfuQ@J2cYS$f<-I`63`y zzOj8|sB2-RzP3I%u(GtUxH8bU$cdwj_e^8$hQq5%i;GLu$zwMkIqbGu^wD2k`xgzb zq+h1)?q<GNVCI>k3 zhr4bv-L**^)m*wVGBG~b$oG21(qy@-+cO8UD~BqLTyQct)?G~Xq`$)2oK~bu!-JiR zD~H#P_75IfT3A>e=wD_(s_VAQ=uJnWVSVGrZaP}06=`aBU#g7Xa+I&d5(Lrj#25zD zhqaA!;DKkQF-#f!AP27C%r{dV{k2v>@anOtwl3D)T|;eMV_f)C zKxHz~Vz~3yf4|3fUBi8YGaOW$Y8tJS`&i~SFRv}J4lP%1Twi4neemzXKFS^Y$j9!x zfz^GffNS^EF}Z&I-}4PuQnl3c>FLJt#^*D=nfJ2aXc})G%JtHW56+J4Y}to?HNSIYmT<6OsYvU7XC^X0DguKlhbSEeh!SouNs z>F#fIzu&Xn^Fi;4-sgLNRBhl>{nORYR9~!qtNLc&c>nzay#sd-{CMzlgBOMdhCVZN zd3b*K<>8;yPS>uCY>&J+njU><^arEwjh!ERZtPFSPmaGhb$a@9({IkyW{%B#a^|I( zKb?7dwrlqE?7yD9JXf6CpL=2MKhGEESLZ)6|J*`p;iK{M-Nk{$Pe(H`*{a`aNM&y8 z<;uC#zx5Uf@G34T<4#d`R9%Hu0j)CZ3c3WHi1?+5IehI6VvcZ!VTSuQzYAUGF1`%+ zH(q6AW$?{9zNVlB-sK`N4hP{{F5b#wm*k+Hu$D!BH=vynuCP|mGW*^Stp@EQ|15it zO*0rzhxn#Bi?tygi8P~8)>z~@5hYFqoo0t=7Q40`Iu|+2M@n!0$nq;)iE_O~B#Q^x zQVvHxN29D8BF%clY(Mn1s|IEj`g>p1Kh{h%-Nxa$0Fr; zJe`2I?5K%6r|2X6A@Ov9TV9*FCDn3|a7$-1{q=R|QEmif<4VM@U;7&2o38yjbR+UV z&W(<2Wr_Oi##?*jmZN7M3x3Q($rakdt*JTW=L)pI9k4m(+#P5e_nqe8zE8^$(*X~2 zfw<)0lxZsbcv6hsuSLvggq6u0wvPEs##_^zDVn2i zEO9<4_YV_Zj{H}Vha5fa)5EkYNB{YBD{|P5crE7~J@qzppO_Zfy8+EouNHdkRcP+o zdrBukddB84qt(eaR+Ihyf)(iizT!!LV7pth(8N9s`fu1Md#2<@a# ziy@Q6kjNr^XZ}6tha!D%xC)PpaNrVj5PlZvwSDL?Bd*v`i`+&cel*gLUHezWk4O9j z{3#-()?^B8S%g17fX*<=ib$;a&oLg0^sMz+h}xP*ILjUqTF?4pvZ{60Nsc*TO5~FUk(?C6`*k z)THY{H{$75H<%qNT=+#=DO65+hv?*;J(Qma7uK<}(*`p4yi1Y#6U* zDXr|aa|##ne0s!ndB?<&wTBe5+;856%=^8HO{PsCIsrtjKA#0*^fEOaEEPE*@<`pCB&@9l8@JREFdMk`Yv zaa(PSGIh8Nortg_z06p61L|94YI2dXo8e>!bLFehBI!Hg-45!d171xe zzrz!@q0{tc2W|Xw=v=(J5Y$oAL3_=A9hvFiuJ0?*ZTQf^ebiTIZHD@HqVFnDZ)opC zh7At}wFf(?|GUsB_}ob;Z$hnkCplk&t_R&CeHXb&m8dRCI0LO9?OoLKRj88RMQx2= zhf7`5;VLOA^nQhs3eXXHze0&`K#wqsRY>_7BTZT5E;nk@jVAmdR9)IlDd(WwQQPiCXpY?ku#AI`^VW--Qmqjoug$z0|~`E$3);Z}6~6ZfD_mmOQIy zB*S?w?Wm%$HlVGvrix^-I|4~L1MNV@s&L)-u1Hgfx4Pr4o`~rUS`FG4Irm5Ufyl=h zxk~HIO}$j5PL^d~SK*tbk0Be?&`Z_O>Q!p~Rbpo2=^S;ehIXnlPEEfQIjfzjp`G0A zx=+|~>N!~EzeaCVkwaU$5iwg)hwaE=m)2Cd->w(BPaFH-?Kh$FvoB_6?#P4NeIZMI zAt8M+BeQpwe(9qQ6{uEvKcnv|)X~=;J=hGCDOuzI(_ZTDI!}lCC%MOnk)^#1)!rW9tp7x=|2)B}R4XrP2j~Hj+8hrRm zsC=j)E9aq=c&j_|?1?nJ5mtg~$b$Jh3)g}(HER7m!ZrBgO^epV+SZVB^PG&B=_qkF zsGO-G=ic(Lh}}|SCi(;DYUERom?KfjI-IP5v6zptUBl|O&fAfvGjEN9+^xxDL3blY zIUj*1@~(jH9idM>y=j=gBmCs}wT2@hy(4h7m#{Ld4Q)!t*GNdzNLark$ki*fErV@8 z3ZFNju3tvs?GCgRZ8-{WE6{dw7)8d6?}#*=LHQ1r7&YoB_3+)^NLh_|MguW}5u?5x zr3TWG$VaU^$}Df5u31K@v-zljM|sD0=i=RYI5CR6nQ}2wE=71b=t{(_20avc*5j=; z?$I1Y_6pElV#b)svCfeS<_vx}p~Dg5JTeCNu0ov!#)4zq%EGuCgG;Z`>uT?D+CB`G z&*Rjy4t0(m$Nszub#za_&rN6!i(&#E9)`AE`wOVtn+R<@0k4c#M^2zurl4|Zg52xS zk$5`B95E4b6UbIOA!nrt_)vo`MVgg(>rl`mk$x@eupZ$%h@T97HHlujMA*4<5{+co z`DKze{t)WCJVjgHfNBFw(~2Fa*6(zTzG-B`aGsu>MncX&+mYUBc=A4!>s6u7Cew_a zC!qG>bnt2#-qZ>4})$2y4sDVkel}0A7e$R$lKwhvI1se+6SSavlph zj#mVkiu99_ekxMV(7&_T73QPuH`}lhR2jy?j&~17Sz8g_j+A@Qx#&%N+t_vJJ8Veq zj^(X6B>ythS#l0px(I!or}H62^GHjba69~&k5Mp>%sfrlRl__z;T@Ukka>EfAVwborKRhk0bow;Z|i$dzF&?RlR0u5vZcc=0Xgsd@TTs@|BVXQfJ- zcAnw&$Wu?qe0W0UkuJk}LKbMt2GmvH092s`gD!pV1_+H#A$Zw}5Li}0`lRi`b&L*LTsUZjQQGml&^@?#EKZr(KP zQ*Ab5O~1y9X%X(_q0VTFaL<(6@z(L6`_Luo?;Kyi+F7FJhUMWBwar7d4VI{tRFBpY zTr%t|wgj&XYq>4KAJe-!TZ+<`;LioZ$I)h~5mbpG1_3O)X;a8lT~`e^y+F)E3(|Fh?#EqW5Tl$R<>8+vF|F? ztF*@ON<7v2S`8`keq!sURIi3quhK8(c^pk^FYb^|&#G&i3ezc8N0e_txpnH=u2#sl#)%^%&kfb@n-^Evu8yMS8&8xCs@m9;Vm+4!Vwx z+6t-Of~y;Zoh7%(=L}R&!dA>FTky)T-jA&q>09Lg*MyZ%Pa*bQ*A!dPrY+X3mk947 zIosr4hnA7aZSw4bx*pmlx3kb`zIWIrpEJJe4^nl@;uRS zH|;&qa1V5c_*d9ncY>!U8+Lelvf(81!@b_*aI)c!pm*ZuJjuJpoFccA??}2`kd9evO-wjJvng@;Sf8N6^s{nFznL%m!OW;T|9EHLpMmXN3AYE zTak)Ar12_LZMjD&Z$q7H_K=@5OyyNpL<4{ z46$PeVX>F_gD}_yvpDBaWqhjx)H(^Lv48J72sa{kA3F$VNb`k*a2B2V^@DH|CH?!8 z5AW?gSUdCN!>1p9^vTB`++SH-US7WOlb_vx;>LKylmDCK{)hLUcjC zT{XGLtk-TyAK?9O-j@8&d%`Wae`S{}@ zEqQ8y+&uo^r}rp1BU?DXPx(rH{Na7$5-H^T%HUs$m{iAPq}-zH@25VRdIqLlXskCr z-}s%(OWAv~|DCVKH<})5`gYUbG+97quioLn~z!>_Nz`c?c+dspmE{_ArPwUdV;c3Qilbz*h;jl}7+cg5&L=v+&Q&WX(> zlJ`0_$Z;{&@v_=Eb}2A35i{|!VWdhQkVu(0nJAeUnFyKqnCO_;n8=v8n5dYTn24Bo zm}r<-m`Ip7m?)U&jx(+Jm*|(+m&lj6m#CMRmxz~mmuQz*mus8nXyp#AJ45SsLMrtx zif@T-=~Z*hCaxu_g4)I#3_-|0-VxgG0TtA>PqoEyqS%0B)a6vM`TG{NpG5%lK!O@q(Lcg z6jKwVOj!~~5=C;AqUSh4&y=>%IHXMKsb^GKeuz4LmO5=x2iLHySx75R)PnTALmBT< z20kjs6n_)Re&ax*FVZjis6>UtgiI+OBpM_Zq(&A8at)++Bv$XF(*vNq==Blz5%m%C z5%CcN9cGk(kRj35Qlv+&iSmf?i0~vc#wFUQT~?vCB0Khr{UN3!qN60Zt`y4=$!X$A zotz3h!Q)0tMR4@Bbws~9M~U4e{1UgZ?>2cuzu@LUUp-AfRp6Ct%Nl*-`lZ5bQICFc zM~!cp|7G&Gj+diV&Sr(+mw1e5Okf9;E)F9KqkQNg6MwOVu3gVEM%;IBmN9aIF(NiA zqNi_3={t|~p(lwKXAxy_6`mk08{uQtGa#~(=*lzv&-S1J_$!*C&6|u9{ajzA<|k-j zo)$V*PEd;(r0}Q5ic+}2>^Mb>4Y>|-C3Avt(nWvt(%0w7L4+h}=U`JuGEHi zUG04DzLl&0pPVTn_Rj@Uyg-{pK(qivKLYz8Ebbwf#XQVUyyLoLh;+D<=Pfkj+sKiv zMuUKG=wTJz(A&Qg+-(lIb3G|C>WcC#Ts=$rVK}O{TYQM|OiY4d><}vl^&M}ZVe0Tg zS=)zu8*pzXxR=a2%1QlT9J@9>kG$x`J4?H-*DI0l%j9Am-{p;7_*j7diI(&n9;M(} zxayt<@$$2b?z2e3vj>{;FQd*P58@7@4q^@>4&n`>4Qk4y{^AUJwx3J*M?RtpVhbV* zN&Wwn(qE+Be?XnT$J;NW9hLD7?Blagd;Mv8{khPP50JOmfyjZqFM7{NV+@NKB#1#S zN>h)B6eJ#&+0bhCNiqk&!ZZCIVguSN$(y81>d|Lc4!_#_ zYEpgqi7v5Cv*a*)AYbkyOEB{UbJC}*_SEC4jB07H`w6|Rzg};>EpsgEr`JEMkKUFz z+VsvRzIjk9_@D;TC$C3dZ?V2&z3O`6^)l&&xBS;a_d4eEzpGnJrPkz&c4F1QB0P?R zodX%$p-t{lIYT*GV(-J_M5E|q*TWuTj#}B1iD&(L#GZkdPr%1>@KF2j>F}jHuj)tF zi>?n{54!$yz32MQ^_=TB7wOk0?S6!M@IemiEteMw4|ZtxRPgwEoAr+C8`m?gUtF)a z-ld7~iR%&9AD&p?7m!BwDWQY(g6jj<64(Fj+F#$do^So$v63LH$6J55-fn%}db;&< z>*dzRt%qCxw%%=h56)})we4el+IqD0XY0+@mwjFSwfFF^l1d+TqT?=x_gecxOQ;U- zcMfD-3rPFIodU}G4zjZYSF|&nH{L}`w1SmJ5i@;Z_KR|Uo*2E%ParM&U9amRWn9nQ z)5Pq+Iknbx8-0_$*`X|Lb3M;xo+djm67)iUvvZ22CjDZGSKzr;xK@nzb{GAmt?hbB z*}Q^m{yCEO3NmOLKb*xJ&$dy7#1fP>E&V#}6J<_jtYo%w=f!2(mdxvVixXe5?Q)jV zPSWek?1UwxcR0~gdg1D{ODj&BInhmT6H0cM=nHm!&=0H~mFQvd1wFsc@Z4;~JQTSy zC+YKb78mucMW5*H)y~mZ>Il@!%W25WKk`Noum0VnuP?x>M8}CQJKn%&NUu$q=s3L% z&g_X@sTVitcSl3A4zsV5`3FqV@r~r`vDIIzw>BAzTDs0X_P4%R=N{@uIUn}7YqE1O zYLeZqjyrSI8>{!!mASLD`xMz1ON>5PJ+S&;wRZHq>Uq`gs@FAh@ZJUZ^>@7c+qB9) z*V~%t?=!UL4E^l9dgj3TP+tG~pg%XL^V#T2eX4p?weajYCB&T=UA%RcH~t%M*z3$Z z)YtQV)n$56^`GiJ)px4rG)0ViCH0(!-;_SlXR60kf2rP5eWiLz^^;~2?haXynP{9V;pt4QX>H95;o;Q3>3-P@;oVff#R$a`QuFB3 jOf1uj)UwI`!hf{IkAC`XWaKt}>ezGl@MJe+x#9l+3@y6* literal 0 HcmV?d00001 diff --git a/public/assets/mockup/js/testing.js b/public/assets/mockup/js/testing.js new file mode 100644 index 0000000..fcf1cb9 --- /dev/null +++ b/public/assets/mockup/js/testing.js @@ -0,0 +1 @@ +//alert('hi'); diff --git a/public/assets/prototype/ajax/maintenance_dash_main.js b/public/assets/prototype/ajax/maintenance_dash_main.js new file mode 100644 index 0000000..e358c0b --- /dev/null +++ b/public/assets/prototype/ajax/maintenance_dash_main.js @@ -0,0 +1,137 @@ +/* + Fluid Router Tool 2.0 ALPHA + Copyright 2016 Christopher Allen + */ +var the_tab; +maintenance_dash.prototype.main = function () { + return false; + the_tab = this.tab; + var dfd_MaintenanceDash_main = jQuery.Deferred(); + start_progress(); + $.when(this.load_left(), this.load_right()).done(function () { + stop_progress(); + debug_print('AJAX complete'); + dfd_MaintenanceDash_main.resolve("ajax_complete"); + }); + return dfd_MaintenanceDash_main.promise(); +}; + +maintenance_dash.prototype.load_left = function () { + var dfd_MaintenanceLeft = jQuery.Deferred(); + $("#main-container-left-body").addClass("loading"); + $("main-container-left-footer").html('  '); /* keep padding while loading */ + var atldhf = ajax_loader({id: this.id, filter: this.filter}, "app/maintenance/maintenance-left-header.php", "main-container-left-header"); + progress(); + var atldff = ajax_loader({id: this.id, filter: this.filter, selected: this.selected}, "app/maintenance/maintenance-left-footer.php", "main-container-left-footer"); + progress(); + var atldbf = ajax_loader({id: this.id, filter: this.filter, selected: this.selected}, "app/maintenance/maintenance-left-body.php", "main-container-left-body"); + progress(); + $.when(atldhf, atldff, atldbf).done(function () { + progress(); + $("#main-container-left-body").removeClass("loading"); + debug_print('Left'); + dfd_MaintenanceLeft.resolve("ajax_done_left"); + }); + return dfd_MaintenanceLeft.promise(); +}; + +maintenance_dash.prototype.load_right = function () { + var dfd_Maintenance = jQuery.Deferred(); + $("#main-container-right-body").addClass("loading"); + var atrdhf = ajax_loader({id: this.id, filter: this.filter, tab: this.tab}, "app/maintenance/maintenance-right-header-dash.php", "main-container-right-header"); + progress(); + var atrdff = ajax_loader({id: this.id, filter: this.filter, tab: this.tab}, "app/maintenance/maintenance-right-footer-dash.php", "main-container-right-footer"); + progress(); + var atrdbf = ajax_loader({id: this.id, filter: this.filter, tab: this.tab}, "app/maintenance/maintenance-right-body-dash.php", "main-container-right-body"); + if (the_tab == 'NewMaintenance') { + var atrdmm = ajax_loader({id: this.id, filter: this.filter, tab: this.tab }, "app/page/right-menu-containers.php", "ajax-menu-container-right-body"); + } + $.when(atrdhf, atrdff, atrdbf).done(function () { + progress(); + $("#main-container-right-body").removeClass("loading"); + debug_print('Right'); + dfd_Maintenance.resolve("ajax_done_right"); + }); + return dfd_Maintenance.promise(); +}; + +maintenance_dash.prototype.start_up = function () { + var filter = this.filter; /* This Filter is used for HASH router navigate */ + var user_id = this.user_id; /* This user ID is used for AJAX Save */ + + debug_print('StartUp'); + // Scrool to the top of left container onLoad + $("#main-container-left-body").scrollTop(-1); + // Activate the Dropdowns + $('.dropdown').dropdown(drop_effect); + + /* +// $('#filter, #sections').dropdown({action: 'select', on: 'hover'}); + $('#propertyTable').tablesort(); + $('#propertyTable').on('tablesort:start', function (event, tablesort) { + debug_print("Starting the sort..."); + showLoading(); + }); + $('#propertyTable').on('tablesort:complete', function (event, tablesort) { + debug_print("Sort finished!"); + done_loading(); + }); + $('#propertyTable').searchable({ + searchField: '#propertySearch', + searchType: 'fuzzy', + onSearchActive: function () { + $("#main-container-left-body").scrollTop(0); + $("#topSearch").css("display", "none"); + $("#topSearchClose").css("display", "inline-block"); + }, + onSearchEmpty: function (elem) { + $("#topSearchClose").css("display", "none"); + $("#topSearch").css("display", "inline-block"); + } + }); + + $('#propertyTable tr:last').after('No Tenants Found...'); + $("#propertySearch").on("keyup", function () { + + var activeRows = $('#propertyTable tr:not([style*="display: none"]):not(".noCount")').length; + var realRows = activeRows - 1; + $('#propertyCount').html(realRows); + if (activeRows == 1) { + $("#noResults").css("display", ""); + } else { + $("#noResults").css("display", "none"); + } + }); + + // Button Clear the search value + $("#topSearchClose").off("click"); + $("#topSearchClose").on("click", function () { + $("#propertySearch").val(""); + $("#propertySearch").keyup(); + $("#propertySearch").focus(); + }); + + // Row click function for Tenant Profile + $(".list-row").on("click", function () { + var id = $(this).data("id"); + // Profile the the Default route when you click a profile + router.navigate('Maintenance/' + filter + '/' + id + '/Profile'); + }); + // Activate Popups (There is a CSS version, update to that ASAP) + $('.item').popup({ + hoverable: true, + position: 'bottom center', + delay: { + show: 100, + hide: 0 + }, + transition: 'Vertical Flip' + }); + +*/ + done_loading(); + set_height(); + auto_right_menus(); + // $("#propertySearch").focus(); + +}; \ No newline at end of file diff --git a/public/assets/prototype/ajax/maintenance_dash_new_maintenance.js b/public/assets/prototype/ajax/maintenance_dash_new_maintenance.js new file mode 100644 index 0000000..749a609 --- /dev/null +++ b/public/assets/prototype/ajax/maintenance_dash_new_maintenance.js @@ -0,0 +1,68 @@ +maintenance_dash.prototype.new_maintenance = function () { + var tenant_id = this.id; /* This tenant ID is used by AJAX saves */ + var user_id = this.user_id; /* This User ID is used by AJAX saves */ + + // Add new tenant + $('#newTenant') + .form({ + inline: true, + on: 'blur', + onSuccess: function () { + debug_print('#newTenant Form Passed Validation'); + + // do what you like with the input + $input = $('').val(user_id); + $tenantInput = $('').val(tenant_id); + // append to the form + $('#newTenant').append($input); + $('#newTenant').append($tenantInput); + + $.ajax({ + beforeSend: saving_toast, + url: 'app/tenants/save-tenant.php', + type: 'GET', + data: $(this).serialize(), + success: function (response, status, xhr) { + if (!has_error(response, xhr)) { + saved_toast('tenant'); + /* Go straight to the new profile */ + router.navigate(response); + } // END if !ERROR + } + + }); + return false; + }, + fields: { + first_name: { + identifier: 'first_name', + rules: [ + { + type: 'empty', + prompt: 'Please enter the tenants first name' + } + ] + }, + last_name: { + identifier: 'last_name', + rules: [ + { + type: 'empty', + prompt: 'Please enter the tenants last name' + } + ] + }, + mainPhone: { + identifier: 'mainPhone', + rules: [ + { + type: 'empty', + prompt: 'Please enter the main phone number' + } + ] + } + + } + }); + +}; \ No newline at end of file diff --git a/public/assets/prototype/ajax/maintenance_main.js b/public/assets/prototype/ajax/maintenance_main.js new file mode 100644 index 0000000..5269511 --- /dev/null +++ b/public/assets/prototype/ajax/maintenance_main.js @@ -0,0 +1,70 @@ +/* + Fluid Router Tool 2.0 ALPHA + Copyright 2016 Christopher Allen + */ + +maintenance.prototype.main = function () { + return false; + var dfd_maintenance_main = jQuery.Deferred(); + start_progress(); + $.when(this.load_left(), this.load_right()).done(function () { + stop_progress(); + debug_print('AJAX complete'); + dfd_maintenance_main.resolve("ajax_complete"); + }); + return dfd_maintenance_main.promise(); +}; + +maintenance.prototype.load_left = function (callback) { + var dfd_maintenanceLeft = jQuery.Deferred(); + $("#main-container-left-body").addClass("loading"); + $("main-container-left-footer").html('  '); /* keep padding while loading */ + var atldhf = ajax_loader({id: this.id, filter: this.filter}, "app/maintenance/maintenance-left-header.php", "main-container-left-header"); + progress(); + var atldff = ajax_loader({id: this.id, filter: this.filter, selected: this.selected}, "app/maintenance/maintenance-left-footer.php", "main-container-left-footer"); + progress(); + var atldbf = ajax_loader({id: this.id, filter: this.filter, selected: this.selected}, "app/maintenance/maintenance-left-body.php", "main-container-left-body"); + progress(); + $.when(atldhf, atldff, atldbf).done(function () { + progress(); + $("#main-container-left-body").removeClass("loading"); + debug_print('Left'); + if (typeof callback !== 'undefined' && cloneObject[callback]) { + cloneObject[callback](); + } + dfd_maintenanceLeft.resolve("ajax_done_left"); + }); + return dfd_maintenanceLeft.promise(); +}; + +maintenance.prototype.load_right = function (callback) { + var dfd_maintenanceRight = jQuery.Deferred(); + $("#main-container-right-body").addClass("loading"); + var atrdhf = ajax_loader({id: this.id, filter: this.filter, tab: this.tab}, "app/maintenance/maintenance-right-header.php", "main-container-right-header"); + progress(); + var atrdff = ajax_loader({id: this.id, filter: this.filter, tab: this.tab}, "app/maintenance/maintenance-right-footer.php", "main-container-right-footer"); + progress(); + var atrdbf = ajax_loader({id: this.id, filter: this.filter, tab: this.tab}, "app/maintenance/maintenance-right-body.php", "main-container-right-body"); + $.when(atrdhf, atrdff, atrdbf).done(function () { + progress(); + $("#main-container-right-body").removeClass("loading"); + debug_print('Right'); + if (typeof callback !== 'undefined' && cloneObject[callback]) { + cloneObject[callback](); + } + dfd_maintenanceRight.resolve("ajax_done_right"); + }); + return dfd_maintenanceRight.promise(); +}; + +maintenance.prototype.start_up = function () { + var filter = this.filter; /* filter is used by HASH router navigate */ + var user_id = this.user_id; /* This user ID is used for AJAX save */ + + debug_print('start_up'); + $('.dropdown').dropdown(drop_effect); + + done_loading(); + set_height(); + auto_right_menus(); +}; \ No newline at end of file diff --git a/public/assets/prototype/ajax/page_not_found_main.js b/public/assets/prototype/ajax/page_not_found_main.js new file mode 100644 index 0000000..23db4f2 --- /dev/null +++ b/public/assets/prototype/ajax/page_not_found_main.js @@ -0,0 +1,13 @@ +page_not_found.prototype.main = function () { + $('#404-modal').modal('setting', 'closable', false).modal('show'); +}; + +function goto_dash() { + $('#404-modal').modal('hide'); + router.navigate('Tenants/Active/Dashboard'); +} + +function go_back() { + $('#404-modal').modal('hide'); + history.back(); +} \ No newline at end of file diff --git a/public/assets/prototype/ajax/properties_dash_main.js b/public/assets/prototype/ajax/properties_dash_main.js new file mode 100644 index 0000000..f52a87e --- /dev/null +++ b/public/assets/prototype/ajax/properties_dash_main.js @@ -0,0 +1,242 @@ +/* + Fluid Router Tool 2.0 ALPHA + Copyright 2016 Christopher Allen + */ + +properties_dash.prototype.main = function () { + var dfd_PropertiesDash_main = jQuery.Deferred(); + start_progress(); + $.when(this.load_left(), this.load_right()).done(function () { + stop_progress(); + debug_print('AJAX complete'); + dfd_PropertiesDash_main.resolve("ajax_complete"); + }); + return dfd_PropertiesDash_main.promise(); +}; + +properties_dash.prototype.load_left = function () { + var dfd_PropertiesLeft = jQuery.Deferred(); + $("#main-container-left-body").addClass("loading"); + $("main-container-left-footer").html('  '); /* keep padding while loading */ + var atldhf = ajax_loader({id: this.id, filter: this.filter}, "app/properties/properties-left-header.php", "main-container-left-header"); + progress(); + var atldff = ajax_loader({id: this.id, filter: this.filter, selected: this.selected}, "app/properties/properties-left-footer.php", "main-container-left-footer"); + progress(); + var atldbf = ajax_loader({id: this.id, filter: this.filter, selected: this.selected}, "app/properties/properties-left-body.php", "main-container-left-body"); + progress(); + $.when(atldhf, atldff, atldbf).done(function () { + progress(); + $("#main-container-left-body").removeClass("loading"); + debug_print('Left'); + dfd_PropertiesLeft.resolve("ajax_done_left"); + }); + return dfd_PropertiesLeft.promise(); +}; + +properties_dash.prototype.load_right = function () { + var dfd_Properties = jQuery.Deferred(); + $("#main-container-right-body").addClass("loading"); + var atrdhf = ajax_loader({id: this.id, filter: this.filter, tab: this.tab}, "app/properties/properties-right-header-dash.php", "main-container-right-header"); + progress(); + var atrdff = ajax_loader({id: this.id, filter: this.filter, tab: this.tab}, "app/properties/properties-right-footer-dash.php", "main-container-right-footer"); + progress(); + var atrdbf = ajax_loader({id: this.id, filter: this.filter, tab: this.tab}, "app/properties/properties-right-body-dash.php", "main-container-right-body"); + $.when(atrdhf, atrdff, atrdbf).done(function () { + /* Slide out right Effect for clicked profiles */ +// $('.rightSlide').css('opacity', '1'); +// $('.rightSlide') +// .transition('fade right', '0ms') +// .transition('fade right', '300ms'); + progress(); + $("#main-container-right-body").removeClass("loading"); + debug_print('Right'); + dfd_Properties.resolve("ajax_done_right"); + }); + return dfd_Properties.promise(); +}; + +properties_dash.prototype.start_up = function () { + var filter = this.filter; /* This Filter is used for HASH router navigate */ + var user_id = this.user_id; /* This user ID is used for AJAX Save */ + + debug_print('StartUp'); + // Scrool to the top of left container onLoad + $("#main-container-left-body").scrollTop(-1); + // Activate the Dropdowns + $('.dropdown').dropdown(drop_effect); +// $('#filter, #sections').dropdown({action: 'select', on: 'hover'}); + $('#propertyTable').tablesort(); + $('#propertyTable').on('tablesort:start', function (event, tablesort) { + debug_print("Starting the sort..."); + showLoading(); + }); + $('#propertyTable').on('tablesort:complete', function (event, tablesort) { + debug_print("Sort finished!"); + done_loading(); + }); + $('#propertyTable').searchable({ + searchField: '#propertySearch', + searchType: 'fuzzy', + onSearchActive: function () { + $("#main-container-left-body").scrollTop(0); + $("#topSearch").css("display", "none"); /* Added 1-16-18 */ + $("#topSearchClose").css("display", "inline-block"); /* Added 1-16-18 */ + }, + onSearchEmpty: function (elem) { + $("#topSearchClose").css("display", "none"); /* Added 1-16-18 */ + $("#topSearch").css("display", "inline-block"); /* Added 1-16-18 */ + } + }); + + $('#propertyTable tr:last').after('No Tenants Found...'); + $("#propertySearch").on("keyup", function () { /* Added 1-16-18 */ + /* Detect changes to search field to show no results box */ + var activeRows = $('#propertyTable tr:not([style*="display: none"]):not(".noCount")').length; + var realRows = activeRows - 1; + $('#propertyCount').html(realRows); + if (activeRows == 1) { + $("#noResults").css("display", ""); + } else { + $("#noResults").css("display", "none"); + } + }); + + // Button Clear the search value + $("#topSearchClose").off("click"); /* Added 1-16-18 */ + $("#topSearchClose").on("click", function () { + /* Clear The Search Field */ + $("#propertySearch").val(""); + $("#propertySearch").keyup(); + $("#propertySearch").focus(); + }); + + // Row click function for Tenant Profile + $(".list-row").on("click", function () { + var id = $(this).data("id"); + // Profile the the Default route when you click a profile + router.navigate('Properties/' + filter + '/' + id + '/Profile'); + }); + // Activate Popups (There is a CSS version, update to that ASAP) + $('.item').popup({ + hoverable: true, + position: 'bottom center', + delay: { + show: 100, + hide: 0 + }, + transition: 'Vertical Flip' + }); + + $('#newProp') + .form({ + inline: true, + on: 'blur', + onSuccess: function () { + + debug_print('#newProp Form Was Successfully Validated'); + + // do what you like with the input + $input = $('').val(user_id); + + // append to the form + $('#newProp').append($input); + + $.ajax({ + beforeSend: saving_toast, + url: 'app/properties/save-property.php', + type: 'POST', + data: $(this).serialize(), + success: function (response, status, xhr) { + if (!has_error(response, xhr)) { + saved_toast('property'); + // Go straight to the new profile + router.navigate(response); + } // END IF !ERROR + } + + }); + return false; + }, + fields: { + status: { + identifier: 'status', + rules: [ + { + type: 'empty', + prompt: 'Select Property Status' + } + ] + }, + entity: { + identifier: 'entity', + rules: [ + { + type: 'empty', + prompt: 'Select Entity Account' + } + ] + }, + rent: { + identifier: 'rent', + rules: [ + { + type: 'decimal', + prompt: 'Enter a valid decimal amount: e.g. $0.00' + } + ] + }, + deposit: { + identifier: 'deposit', + rules: [ + { + type: 'decimal', + prompt: 'Enter a valid decimal amount: e.g. $0.00' + } + ] + }, + houseNumber: { + identifier: 'houseNumber', + rules: [ + { + type: 'empty', + prompt: 'Enter House Number.' + } + ] + }, + streetName: { + identifier: 'streetName', + rules: [ + { + type: 'empty', + prompt: 'Enter Street Name.' + } + ] + }, + city: { + identifier: 'city', + rules: [ + { + type: 'empty', + prompt: 'Enter City Name' + } + ] + }, + zip: { + identifier: 'zip', + rules: [ + { + type: 'minLength[5]', + prompt: 'Enter 5 Digit ZIP Code' + } + ] + } + + } + }); + done_loading(); + set_height(); + auto_right_menus(); + + $("#propertySearch").focus(); + +}; \ No newline at end of file diff --git a/public/assets/prototype/ajax/properties_main.js b/public/assets/prototype/ajax/properties_main.js new file mode 100644 index 0000000..bad2678 --- /dev/null +++ b/public/assets/prototype/ajax/properties_main.js @@ -0,0 +1,114 @@ +/* + Fluid Router Tool 2.0 ALPHA + Copyright 2016 Christopher Allen + */ + +properties.prototype.main = function () { + var dfd_Properties_main = jQuery.Deferred(); + start_progress(); + $.when(this.load_left(), this.load_right()).done(function () { + stop_progress(); + debug_print('AJAX complete'); + dfd_Properties_main.resolve("ajax_complete"); + }); + return dfd_Properties_main.promise(); +}; + +properties.prototype.load_left = function (callback) { + var dfd_PropertiesLeft = jQuery.Deferred(); + $("#main-container-left-body").addClass("loading"); + $("main-container-left-footer").html('  '); /* keep padding while loading */ + var atldhf = ajax_loader({id: this.id, filter: this.filter}, "app/properties/properties-left-header.php", "main-container-left-header"); + progress(); + var atldff = ajax_loader({id: this.id, filter: this.filter, selected: this.selected}, "app/properties/properties-left-footer.php", "main-container-left-footer"); + progress(); + var atldbf = ajax_loader({id: this.id, filter: this.filter, selected: this.selected}, "app/properties/properties-left-body.php", "main-container-left-body"); + progress(); + $.when(atldhf, atldff, atldbf).done(function () { + progress(); + $("#main-container-left-body").removeClass("loading"); + debug_print('Left'); + if (typeof callback !== 'undefined' && cloneObject[callback]) { + cloneObject[callback](); + } + dfd_PropertiesLeft.resolve("ajax_done_left"); + }); + return dfd_PropertiesLeft.promise(); +}; + +properties.prototype.load_right = function (callback) { + var dfd_PropertiesRight = jQuery.Deferred(); + $("#main-container-right-body").addClass("loading"); + var atrdhf = ajax_loader({id: this.id, filter: this.filter, tab: this.tab}, "app/properties/properties-right-header.php", "main-container-right-header"); + progress(); + var atrdff = ajax_loader({id: this.id, filter: this.filter, tab: this.tab}, "app/properties/properties-right-footer.php", "main-container-right-footer"); + progress(); + var atrdbf = ajax_loader({id: this.id, filter: this.filter, tab: this.tab}, "app/properties/properties-right-body.php", "main-container-right-body"); + $.when(atrdhf, atrdff, atrdbf).done(function () { + /* Slide out right Effect for clicked profiles */ +// $('.rightSlide').css('opacity', '1'); +// $('.rightSlide') +// .transition('fade right', '0ms') +// .transition('fade right', '300ms'); + progress(); + $("#main-container-right-body").removeClass("loading"); + debug_print('Right'); + if (typeof callback !== 'undefined' && cloneObject[callback]) { + cloneObject[callback](); + } + dfd_PropertiesRight.resolve("ajax_done_right"); + }); + return dfd_PropertiesRight.promise(); +}; + +properties.prototype.start_up = function () { + var filter = this.filter; /* filter is used by HASH router navigate */ + var user_id = this.user_id; /* This user ID is used for AJAX save */ + + debug_print('StartUp'); + // Unbind left mouse enter + $("#main-container-left-body").off("mouseenter"); + // Hide search when in profile + $("#propertySearchContainer").css("display", "none"); + // Show go back button + $("#properties_back").css("display", "inline-block"); + // Unbind right mouse enter + $("#main-container-right-body").off("mouseenter"); + //$('#propertyTable').tablesort(); + $('.phoneNum').mask('(000) 000-0000'); + $('.money').mask('#,##0.00', {reverse: true}); + $('#propertyTable').on('tablesort:start', function (event, tablesort) { + debug_print("Starting the sort..."); + showLoading(); + }); + $('#propertyTable').on('tablesort:complete', function (event, tablesort) { + debug_print("Sort finished!"); + done_loading(); + }); + $('#propertyTable').searchable({ + searchField: '#propertySearch' + }); + $('.dropdown').dropdown(drop_effect); + // Row click function for Tenant Profile + $(".list-row").on("click", function () { + var id = $(this).data("id"); + // Profile the the Default route when you click a profile + router.navigate('Properties/' + filter + '/' + id + '/Profile'); + }); + $('.ui.accordion').accordion(); + // Activate Popups (There is a CSS version, update to that ASAP) + $('.item').popup({ + hoverable: true, + position: 'bottom center', + delay: { + show: 100, + hide: 0 + }, + transition: 'Vertical Flip' + }); + $("time.timeago").timeago(); + + done_loading(); + set_height(); + auto_right_menus(); +}; \ No newline at end of file diff --git a/public/assets/prototype/ajax/properties_notes.js b/public/assets/prototype/ajax/properties_notes.js new file mode 100644 index 0000000..a2ebbe9 --- /dev/null +++ b/public/assets/prototype/ajax/properties_notes.js @@ -0,0 +1,49 @@ +properties.prototype.notes = function () { + var user_id = this.user_id; /* This User ID is used by AJAX saves */ + var PropertiesID = this.id; /* This PropertiesID is used for AJAX save */ + +// Validation for #editProperty + $('#addNote') + .form({ + inline: false, + on: 'submit', + keyboardShortcuts: false, + onSuccess: function (e) { + e.preventDefault(); + debug_print('#addNote form has passed validation'); + debug_print("Adding note as user_id: " + user_id); + + var note = $("#note").val(); + + $.ajax({ + beforeSend: saving_toast, + url: 'app/properties/add-note.php', + type: 'GET', + data: {propertyID: PropertiesID, user_id: user_id, note: note}, + success: function (response, status, xhr) { + if (!has_error(response, xhr)) { + has_saved(response, xhr, 'note'); + var rside = cloneObject.loadRight('start_up'); + $.when( rside ).done(function () { + cloneObject.notes(); /* Must reload it-self to save another note */ + }); + } // END if !ERROR + } + }); // <-- END: .ajax() + }, + fields: { + note: { + identifier: 'note', + rules: [ + { + type: 'empty', + prompt: 'Error: Please enter your notes first then click the "Add Note" button.' + } + ] + } + + } // <-- END: fields + + }); // <-- END: #addNote + +}; // <-- END: code \ No newline at end of file diff --git a/public/assets/prototype/ajax/properties_profile.js b/public/assets/prototype/ajax/properties_profile.js new file mode 100644 index 0000000..f1f4be5 --- /dev/null +++ b/public/assets/prototype/ajax/properties_profile.js @@ -0,0 +1,137 @@ +properties.prototype.profile = function () { + var user_id = this.user_id; /* This user ID is used for AJAX save */ + + // NOTE: Always unbind the last events that bubbled up the DOM tree. + $(document).off('change enter', '.updateProperty'); + // Now bind the newly created event listeners. + $(document).on("change enter", ".updateProperty", function () { + // Get data attributes from the input that was changed. + var propertyid = $(this).attr('data-propertyID'); + var fieldname = $(this).attr('data-changed'); + var newvalue = $(this).val(); + makeChanges(propertyid, fieldname, newvalue); + }); // <-- END: onChane event (.updateProperty) + + $(document).off('change enter', '.updatePropertySelect'); + $(document).on("change enter", ".updatePropertySelect", function () { + // Get data attributes from the input that was changed. + var propertyid = $(this).find(':selected').attr('data-propertyID'); + var fieldname = $(this).find(':selected').attr('data-changed'); + var newvalue = $(this).find(':selected').val(); + makeChanges(propertyid, fieldname, newvalue); + }); // <-- END: onChane event (.updatePropertySelected) + + + function makeChanges(propertyid, fieldname, newvalue) { + // validate the form before we proccess it. + var validate = $('#editProperty').form('validate form'); + // Get the result of the validation. + var validateResult = $('#editProperty').form('is valid'); + // If the form passes validation the begin processing. + if (validateResult === true) { + // Get data attributes from the input that was changed. + debug_print("Data Passed to AJAX: propertyid=" + propertyid + "&fieldname=" + fieldname + "&newvalue=" + newvalue); + + // Save the data then run loadLeft() to refresh left side and re bind event listeners. + $.ajax({ + beforeSend: saving_toast, + url: 'app/properties/edit-property.php', + type: 'GET', + data: {id: propertyid, field: fieldname, val: newvalue, user_id: user_id}, + success: function (response, status, xhr) { + if (!has_error(response, xhr)) { + has_saved(response, xhr, fieldname); + + start_progress(); /* Restart percentage to 1 */ + cloneObject.load_left('start_up'); + + done_loading(); + } // END if !ERROR + }// <-- END: on success + + }); // <-- END: .ajax() + + } // <-- END: validate Results + } // End makeChanges() function + + + // Validation for #editProperty + $('#editProperty') + .form({ + inline: true, + on: 'submit', + keyboardShortcuts: false, + onSuccess: function () { + debug_print('#editProperty form has passed validation'); + + }, + fields: { + status: { + identifier: 'status', + rules: [ + { + type: 'empty', + prompt: 'Select Property Status' + } + ] + }, + entity: { + identifier: 'entity', + rules: [ + { + type: 'empty', + prompt: 'Select Entity Account' + } + ] + }, + rent: { + identifier: 'rent', + rules: [ + { + type: 'decimal', + prompt: 'Enter a valid decimal amount: e.g. $0.00' + } + ] + }, + deposit: { + identifier: 'deposit', + rules: [ + { + type: 'decimal', + prompt: 'Enter a valid decimal amount: e.g. $0.00' + } + ] + }, + name: { + identifier: 'street', + rules: [ + { + type: 'empty', + prompt: 'Enter Property Address.' + } + ] + }, + city: { + identifier: 'city', + rules: [ + { + type: 'empty', + prompt: 'Enter City Name' + } + ] + }, + zip: { + identifier: 'zip', + rules: [ + { + type: 'minLength[5]', + prompt: 'Enter 5 Digit ZIP Code' + } + ] + } + + } // <-- END: fields + + }); // <-- END: .form + +}; diff --git a/public/assets/prototype/ajax/settings_filters.css b/public/assets/prototype/ajax/settings_filters.css new file mode 100644 index 0000000..6e8a7c2 --- /dev/null +++ b/public/assets/prototype/ajax/settings_filters.css @@ -0,0 +1,36 @@ +body.dragging, body.dragging * { + cursor: move !important; +} +.dragged { + position: absolute; + opacity: 0.5; + z-index: 2000; +} +ol { + padding-left: 0; +} +ol.vertical li { + display: block; + margin: 5px; + padding: 5px; +} +ol.vertical li.placeholder { + position: relative; + /** More li styles **/ + margin: 0; + padding: 0; + border: none; +} +ol.vertical li.placeholder:before { + position: absolute; + /** Define arrowhead **/ + content: ""; + width: 0; + height: 0; + margin-top: -5px; + left: -5px; + top: -4px; + border: 5px solid transparent; + border-left-color: red; + border-right: none; +} \ No newline at end of file diff --git a/public/assets/prototype/ajax/settings_filters.js b/public/assets/prototype/ajax/settings_filters.js new file mode 100644 index 0000000..27eb3a4 --- /dev/null +++ b/public/assets/prototype/ajax/settings_filters.js @@ -0,0 +1,52 @@ +var myList; +var myOrder; + +settings.prototype.filters = function () { + +$('#main-container-left-header').html(' '); +$('#main-container-left-footer').html(' '); + +var aheader = ajax_loader({filter: this.filter, tab: this.tab}, "app/settings/settings-filter-right-header.php", "main-container-right-header"); +var abody = ajax_loader({filter: this.filter, tab: this.tab}, "app/settings/settings-filter-right-body.php", "main-container-right-body"); + + $.when(abody).then(function () { + /* Has plugin loaded yet */ + if(jQuery().sortable) { + if (typeof myList == 'object') { + myList.sortable("destroy"); + } + do_sort(); + } else { + $.getScript('assets/js/jquery-sortable-min.js') + .done(function (script, textStatus) { + do_sort(); + }); + } + }); +}; + +function do_sort() { + myList = $("#statusFilter-list").sortable({ + handle : '.handle', + onDrop: function ($item, container, _super) { + var data = myList.sortable("serialize").get(); + var order = ''; + var a = data[0]; + for (i = 0; i < a.length; i++) { + var item = a[i]; + var number = item.listitem; + order += 'listItem[]=' + number + '&'; + } + myOrder = order; + _super($item, container); + } + }); +} + +function save_order() { + if (myOrder != null) { + $.get("/dev/app/settings/settings-filter-order.php?"+myOrder, function(data, status) { + alert(data); + }); + } +} \ No newline at end of file diff --git a/public/assets/prototype/ajax/settings_main.js b/public/assets/prototype/ajax/settings_main.js new file mode 100644 index 0000000..95c879e --- /dev/null +++ b/public/assets/prototype/ajax/settings_main.js @@ -0,0 +1,61 @@ +settings.prototype.Main = function () { + var dfd_Settings_main = jQuery.Deferred(); + start_progress(); + $.when(this.load_left(), this.load_right()).then(function () { + stop_progress(); + debug_print('AJAX complete'); + dfd_Settings_main.resolve("ajax_complete"); + }); + return dfd_Settings_main.promise(); +}; + +settings.prototype.load_left = function (callback) { + var dfd_SettingsLeft = jQuery.Deferred(); + $("#main-container-left-body").addClass("loading"); + $("main-container-left-footer").html('  '); /* keep padding while loading */ + var atldhf = ajax_loader({tab: this.tab}, "app/tenants/tenants-left-header.php", "main-container-left-header"); + progress(); + var atldff = ajax_loader({tab: this.tab}, "app/tenants/tenants-left-footer.php", "main-container-left-footer"); + progress(); + var atldbf = ajax_loader({tab: this.tab}, "app/settings/settings-left-body.php", "main-container-left-body"); + progress(); + $.when(atldhf, atldff, atldbf).then(function () { + progress(); + $("#main-container-left-body").removeClass("loading"); + debug_print('Left'); + if (typeof callback !== 'undefined' && cloneObject[callback]) { + cloneObject[callback](); + } + dfd_SettingsLeft.resolve("ajax_done_left"); + }); + return dfd_SettingsLeft.promise(); +}; + +settings.prototype.load_right = function () { + var dfd_SettingsRight = jQuery.Deferred(); + $("#main-container-right-body").addClass("loading"); + var atrdhf = ajax_loader({id: this.id, tab: this.tab}, "app/tenants/tenants-right-header-dash.php", "main-container-right-header"); + progress(); + var atrdff = ajax_loader({id: this.id, tab: this.tab}, "app/tenants/tenants-right-footer-dash.php", "main-container-right-footer"); + progress(); + var atrdbf = ajax_loader({id: this.id, tab: this.tab}, "app/settings/settings-right-body-dash.php", "main-container-right-body"); + $.when(atrdhf, atrdff, atrdbf).then(function () { + /* Slide out right Effect for clicked profiles */ +// $('.rightSlide').css('opacity', '1'); +// $('.rightSlide') +// .transition('fade right', '0ms') +// .transition('fade right', '300ms'); + progress(); + $("#main-container-right-body").removeClass("loading"); + debug_print('Right'); + dfd_SettingsRight.resolve("ajax_done_right"); + }); + return dfd_SettingsRight.promise(); +}; + +settings.prototype.start_up = function () { + var filter = this.filter; /* This defines the filter for HASH navigate */ + debug_print('start_up'); + done_loading(); + $('.dropdown').dropdown(drop_effect); +}; \ No newline at end of file diff --git a/public/assets/prototype/ajax/settings_new_filter.js b/public/assets/prototype/ajax/settings_new_filter.js new file mode 100644 index 0000000..dfe6af4 --- /dev/null +++ b/public/assets/prototype/ajax/settings_new_filter.js @@ -0,0 +1,9 @@ +settings.prototype.new_filter = function () { + +$('#main-container-left-header').html(' '); +$('#main-container-left-footer').html(' '); +$('#main-container-right-header').html(' '); + +var atrdbf = ajax_loader({filter: this.filter, tab: this.tab}, "app/settings/settings-filter-new.php", "main-container-right-body"); + +}; \ No newline at end of file diff --git a/public/assets/prototype/ajax/settings_users.js b/public/assets/prototype/ajax/settings_users.js new file mode 100644 index 0000000..0f28123 --- /dev/null +++ b/public/assets/prototype/ajax/settings_users.js @@ -0,0 +1,10 @@ +settings.prototype.users = function () { + +$('#main-container-left-header').html(' '); +$('#main-container-left-footer').html(' '); + +var atrdbf = ajax_loader({filter: this.filter, tab: this.tab}, "app/settings/settings-admin-right-header.php", "main-container-right-header"); +var atrdbf = ajax_loader({filter: this.filter, tab: this.tab}, "app/settings/settings-admin-right-body.php", "main-container-right-body"); + + +}; \ No newline at end of file diff --git a/public/assets/prototype/ajax/tenants_dash_main.js b/public/assets/prototype/ajax/tenants_dash_main.js new file mode 100644 index 0000000..8d3d34f --- /dev/null +++ b/public/assets/prototype/ajax/tenants_dash_main.js @@ -0,0 +1,293 @@ +var the_tab; +tenants_dash.prototype.main = function () { + open = []; /* Tracks if menu item was already open */ + the_tab = this.tab; + var dfd_TenantsDash_main = jQuery.Deferred(); + start_progress(); + $.when(this.load_left(), this.load_right()).then(function () { + stop_progress(); + debug_print('AJAX complete'); + dfd_TenantsDash_main.resolve("ajax_complete"); + }).fail(function(msg) { + stop_progress(); + dfd_TenantsDash_main.reject("AJAX Failed loading..."); + }); + return dfd_TenantsDash_main.promise(); +}; + +tenants_dash.prototype.load_left = function (callback) { + var dfd_TenantsLeft = jQuery.Deferred(); + $("#main-container-left-body").addClass("loading"); + $("main-container-left-footer").html('  '); /* keep padding while loading */ + var atldhf = ajax_loader({filter: this.filter, selected: this.selected}, "tenants/header/left.html", "main-container-left-header"); + progress(); + var atldff = ajax_loader({filter: this.filter}, "tenants_dash/footer/left.html", "main-container-left-footer"); + progress(); + var atldbf = ajax_loader({filter: this.filter}, "tenants/tenants_list/view_for_json.html", "main-container-left-body"); + progress(); + $.when(atldhf, atldff, atldbf).then(function () { + progress(); + $("#main-container-left-body").removeClass("loading"); + debug_print('Left'); + + var fixed_th = ajax_loader({}, "tenants/header/fixed_th.html", "left-fixed-th-container"); + $.when(fixed_th).then(function () { + left_scroll(); + }); + if (typeof callback !== 'undefined' && cloneObject[callback]) { + cloneObject[callback](); + } + dfd_TenantsLeft.resolve("ajax_done_left"); + }).fail(function() { + $("#main-container-left-body").removeClass("loading"); + dfd_TenantsLeft.reject('load_left -> AJAX Failed loading...'); + }); + return dfd_TenantsLeft.promise(); +}; + +tenants_dash.prototype.load_right = function () { + var dfd_TenantsRight = jQuery.Deferred(); + $("#main-container-right-body").addClass("loading"); + var atrdhf = ajax_loader({filter: this.filter, tab: this.tab}, "tenants_dash/header/right.html", "main-container-right-header"); + progress(); + var atrdff = ajax_loader({filter: this.filter, tab: this.tab}, "tenants_dash/footer/right.html", "main-container-right-footer"); + progress(); + + /** Right Body defined here: */ + var right_body = 'tenants/notes/index.html'; + switch (the_tab) { + case 'Dashboard': + right_body = 'tenants_dash/dashboard/index.html'; + $.get("tenants/todays_transactions/index.html", {trans_day: ''}, function (data) { + $("#transactionHistory").html(data); + }); + break; + case 'Reports': right_body = 'tenants/report/index.html'; break; + case 'NewTenant': right_body = 'tenants/new_tenant/index.html'; break; + case 'Maintenance': right_body = 'maintenance/list/index.html'; break; + } + var atrdbf = ajax_loader({filter: this.filter, tab: this.tab}, right_body, "main-container-right-body"); + $.when(atrdhf, atrdff, atrdbf).then(function () { + progress(); + $("#main-container-right-body").removeClass("loading"); + debug_print('Right'); + dfd_TenantsRight.resolve("ajax_done_right"); + }).fail(function() { + $("#main-container-right-body").removeClass("loading"); + dfd_TenantsRight.reject('load_right -> AJAX Failed loading...'); + }); + return dfd_TenantsRight.promise(); +}; + +tenants_dash.prototype.refresh = function () { + +}; + +tenants_dash.prototype.start_up = function () { + var filter = this.filter; /* This defines the filter for HASH navigate */ + + // Restore scroll position + var scroll_pos = get_cookie('scrollPos'); + if (scroll_pos > 0) { + $('#main-container-left-body').scrollTop(scroll_pos); + } + + debug_print('CleanUp'); + $('.money').mask('#,##0.00', {reverse: true}); + $('.ui.accordion').accordion(); + $('.dropdown').dropdown(drop_effect); /* Keep towards top of start_up ! */ + $('#tenantTable').stupidtable(); + $('#tenantTable').on('tablesort:start', function (event, tablesort) { + debug_print("Starting the sort..."); + showLoading(); + }); + $('#tenantTable').on('tablesort:complete', function (event, tablesort) { + debug_print("Sort finished!"); + done_loading(); + }); + + $('#tenantTable').searchable({ + searchField: '#tenantSearch', + searchType: 'fuzzy', + onSearchActive: function () { + $("#main-container-left-body").scrollTop(0); + $("#defaultSearch").css("display", "none"); /* Added 1-16-18 */ + $("#closeSearch").css("display", "inline-block"); /* Added 1-16-18 */ + //debug_print("Search Input is active"); /* Added 1-16-18 */ + + }, + onSearchEmpty: function (elem) { + //debug_print("Search Input is empty"); /* Added 1-16-18 */ + $("#closeSearch").css("display", "none"); /* Added 1-16-18 */ + $("#defaultSearch").css("display", "inline-block"); /* Added 1-16-18 */ + } + }); + + $('#tenantTable tr:last').after('No Tenants Found...'); + $("#tenantSearch").on("keyup", function () { /* Added 1-16-18 */ + + /* Mark.js Added 1-31-18 */ + var keyword = $("#tenantSearch").val(); + if (keyword.length > 2) { + setTimeout(function() { + $('#tenantTable').unmark(); + $('#tenantTable').mark(keyword); + }, 90); + } else { + $('#tenantTable').unmark(); + } + + /* Detect changes to search field to show no results box */ + var activeRows = $('#tenantTable tr:not([style*="display: none"]):not(".noCount")').length; + var realRows = activeRows - 1; + $('#tenantCount').html(realRows); + if (activeRows == 1) { + //debug_print("No Results Found"); + $("#noResults").css("display", ""); + } else { + //debug_print("Results Found and showing"); + $("#noResults").css("display", "none"); + } + }); + + // Button Clear the search value + $("#closeSearch").off("click"); /* Added 1-16-18 */ + $("#closeSearch").on("click", function () { + /* Clear The Search Field */ + $("#tenantSearch").val(""); + $("#tenantSearch").keyup(); + $("#tenantSearch").focus(); + }); + + + $('.phoneNum').mask('(000) 000-0000'); + + // Row click function for Tenant Profile + $(".list-row").off("click"); /* Added 12-28-17 */ + $(".list-row").on("click", function(e) { + // Save Scroll Position + if (! $(e.target).parents().hasClass('exclude') ) { + var scroll_pos = $('#main-container-left-body').scrollTop(); + set_cookie('scrollPos', scroll_pos, 60); + var id = $(this).data("id"); + var lease_id = $(this).data("leaseid"); + filter = $('#filterStatus').dropdown('get value'); + router.navigate('Tenants/' + filter + '/' + id + '/Transactions/' + lease_id); + } + }); + + $(".view-trans").off("click"); + $(".view-trans").on("click", function() { + var id = $(this).data("id"); + var lease_id = $(this).data("leaseid"); + filter = $('#filterStatus').dropdown('get value'); + router.navigate('Tenants/' + filter + '/' + id + '/Transactions/' + lease_id); + }); + + $(".view-maintenance").off("click"); + $(".view-maintenance").on("click", function() { + var id = $(this).data("id"); + var lease_id = $(this).data("leaseid"); + router.navigate('Maintenance/' + id + '/New/' + lease_id); + }); + + +/* 7-7 New Feature to show alert on Inactive tenants + * + */ + $(".inactive-row").off("click"); + $(".inactive-row").on("click", function(e) { + var id = $(this).data("id"); + var LeaseID = $(this).data("leaseid"); + if (! $(e.target).parents().hasClass('exclude') ) { + $.confirm({ + container: "#main-container-left-body", + useBootstrap: false, + boxWidth: "80%", + position: 'sticky', + animation: 'bottom', + closeAnimation: 'bottom', + type: 'blue', + title: "Notice", + content: "This tenant is Inactive! Payments for this account is disabled.", + buttons: { + cancel: function() {}, + Proceed: { + text: "Continue", + btnClass: 'btn-blue', + action: function() { + filter = $('#filterStatus').dropdown('get value'); + router.navigate('Tenants/' + filter + '/' + id + '/Transactions/' + LeaseID); + } + } + } + }); + } + }); + + $(".trasactionClick").off("click"); + $("#main-container-right-body").on("click", ".trasactionClick", function () { + var id = $(this).data("id"); + var LeaseID = $(this).data("leaseid"); + /* Profile the the Default route when you click a profile */ + filter = $('#filterStatus').dropdown('get value'); + router.navigate('Tenants/' + filter + '/' + id + '/Transactions/' + LeaseID); + }); + + $("#transDay").off("change"); + $("#transDay").on("change", function () { + // Get the transaction ID + var trans_day = $(this).val(); + // Get transaction information + $.get("tenants/todays_transactions/index.html", {trans_day: trans_day}, function (data) { + $("#transactionHistory").html(data); + }); + }); + + $("#filterStatus").dropdown({ + on: 'hover', + onChange: function (val) { + var entity_text = $('#filterEntity').dropdown('get value'); + window.update_tenants_list(val, entity_text); + cloneObject.start_up(); + } + }); + + $("#filterEntity").dropdown({ + on: 'hover', + onChange: function (val) { + $.ajax({ + url: "app/home/set_entity.html", + type: 'GET', + data: {entity_id: val}, + async: true, + dataType: "html", + success: function (response) { + start_progress(); /* Restart percentage to 1 */ + var tenant_status_text = $('#filterStatus').dropdown('get value'); + window.update_tenants_list(tenant_status_text, val); + cloneObject.start_up(); + } + }); + } + }); + + $("#tenantSearch").focus(); + /** + var past_week = moment().subtract(7, 'days').format('MM/DD/YYYY'); + var yymd_today = moment().format('MM/DD/YYYY'); + */ + $('#transDay').daterangepicker({ + singleDatePicker: true, + showDropdowns: true, + autoApply: true, + opens: 'left', +// startDate: past_week, +// endDate: yymd_today + }, function(start, end, label) { + //console.log('New date range selected: ' + start.format('YYYY-MM-DD') + ' to ' + end.format('YYYY-MM-DD') + ' (predefined range: ' + label + ')'); + }); + + done_loading(); + +}; diff --git a/public/assets/prototype/ajax/tenants_dash_new_tenant.js b/public/assets/prototype/ajax/tenants_dash_new_tenant.js new file mode 100644 index 0000000..2339387 --- /dev/null +++ b/public/assets/prototype/ajax/tenants_dash_new_tenant.js @@ -0,0 +1,68 @@ +tenants_dash.prototype.new_tenant = function () { + var tenant_id = this.id; /* This tenant ID is used by AJAX saves */ + var user_id = this.user_id; /* This User ID is used by AJAX saves */ + + // Add new tenant + $('#newTenant') + .form({ + inline: true, + on: 'blur', + onSuccess: function () { + debug_print('#newTenant Form Passed Validation'); + + // do what you like with the input + $input = $('').val(user_id); + $tenantInput = $('').val(tenant_id); + // append to the form + $('#newTenant').append($input); + $('#newTenant').append($tenantInput); + + $.ajax({ + beforeSend: saving_toast, + url: 'app/tenants/save-tenant.php', + type: 'GET', + data: $(this).serialize(), + success: function (response, status, xhr) { + if (!has_error(response, xhr)) { + saved_toast('tenant'); + /* Go straight to the new profile */ + router.navigate(response); + } // END if !ERROR + } + + }); + return false; + }, + fields: { + first_name: { + identifier: 'first_name', + rules: [ + { + type: 'empty', + prompt: 'Please enter the tenants first name' + } + ] + }, + last_name: { + identifier: 'last_name', + rules: [ + { + type: 'empty', + prompt: 'Please enter the tenants last name' + } + ] + }, + mainPhone: { + identifier: 'mainPhone', + rules: [ + { + type: 'empty', + prompt: 'Please enter the main phone number' + } + ] + } + + } + }); + +}; \ No newline at end of file diff --git a/public/assets/prototype/ajax/tenants_dash_reports.js b/public/assets/prototype/ajax/tenants_dash_reports.js new file mode 100644 index 0000000..8a83ae5 --- /dev/null +++ b/public/assets/prototype/ajax/tenants_dash_reports.js @@ -0,0 +1,47 @@ +tenants_dash.prototype.reports = function () { + var user_id = this.user_id; /* This defines the User for AJAX Save */ + + $.get( "app/tenants/tenants-right-history-menu.php", function( data ) { + $( "#main-container-right-body-menu" ).html( data ); +// show_right_menu(true); + right_scroll(); + $('#testingdrop').dropdown(drop_effect); + }); + + $(".filterReportList").off("change"); + $(".filterReportList").on("change", function () { + var report_entity_filter = $('#report_entity_filter').val(); + var report_month_filter = $('#report_month_filter').val(); + var report_year_filter = $('#report_year_filter').val(); + var report_type_filter = $('#report_type').val(); + + if (report_type_filter == '') { + alert('Please first select Report Type!'); + } else { + // Get transaction information + $('#loadingReport').addClass('active'); + $.get("tenants/report/"+report_type_filter+".html", {entity_id: report_entity_filter, month: report_month_filter, year: report_year_filter}, function (data) { + $("#reportShell").html(data); + $('#loadingReport').removeClass('active'); + $('#printReport').removeClass('disabled'); + $('.filterReportList').removeClass('disabled'); + }); + } + }); + + $("#printReport").off("click"); + $("#printReport").on("click", function () { + var report_entity_filter = $('#report_entity_filter').val(); + var report_month_filter = $('#report_month_filter').val(); + var report_year_filter = $('#report_year_filter').val(); + print_reports(report_entity_filter, report_month_filter, report_year_filter); + }); + +}; + +function print_reports(entity_id, month, year) { + var frame_id = 'print_reports'; + var report_type_filter = $('#report_type').val(); + var src = 'tenants/report/'+report_type_filter+'.html?use_html=true&entity_id='+entity_id+'&month='+month+'&year='+year; + print_frame(frame_id, src); +} \ No newline at end of file diff --git a/public/assets/prototype/ajax/tenants_edit_transaction.js b/public/assets/prototype/ajax/tenants_edit_transaction.js new file mode 100644 index 0000000..df03d49 --- /dev/null +++ b/public/assets/prototype/ajax/tenants_edit_transaction.js @@ -0,0 +1,313 @@ +// Define Globals +var user_id; +var transtype; +var baltype; +var theTenant; +var theFilter; +var transType; +var transBal; +var trans_id; +var lease_id; + +tenants.prototype.edit_transaction = function () { + user_id = this.user_id; /* This defines the User for AJAX Save */ + transtype = this.transtype; + baltype = this.baltype; + theTenant = this.id; + theFilter = this.filter; + transType = transtype; + transBal = baltype; + trans_id = $('#last_transaction').val(); + lease_id = this.lease_id; + + $('#printReceiptBtn').prop("disabled", true); + $('#processTransaction').css('opacity', '0'); // hide submit on startup + + // New modal for creating transactions + $(".createTransaction").off("click"); + $(".createTransaction").on("click", function() { + var CTtransType = $(this).attr('data-transType'); + var CTtransBal = $(this).attr('data-transBal'); + router.navigate('Tenants/' + theFilter + '/' + theTenant + '/Transactions/'+lease_id+'/NewTransaction/Create/'+CTtransType+'/'+CTtransBal+'/Modal'); + }); + + // Create Transaction load form page + $.get("app/tenants/create-new-transaction.php", {transType: transType, transBal: transBal, trans_id: trans_id}, function (data) { + + $("#newTransactionForm").html(data); + cloneObject.actions(); + + }); // end of GET creat new trans + +}; + +tenants.prototype.actions = function () { + // Covert the HTML selects to semantic dropdowns (Added by Chris 8/15/2018) + // Selection will drop down and reset.... which sucks...but looks good. + $('#createNewTransaction select').dropdown(); + + $('#process-trans-type').html(transType); + $('#process-trans-bal').html(transBal); + + $('#process-amount').html($("#amount_tendered").val()); + if (transType == "Payment") { + $("#payment_method_text").text("Payment Method"); + $("#payment_method").html(""); + } else if (transType == "Receivable") { + $("#payment_method_text").text("Charge Type"); + $("#payment_method").html(""); + } + + // Start of Create Form + var counter_for_trans = 0; + $(document).off('blur', '#createNewTransaction'); + $('#createNewTransaction') + .form({ + inline: true, + on: 'blur', + onSuccess: function (e) { + e.stopImmediatePropagation(); + if (counter_for_trans === 0) { + counter_for_trans++; + } else { + throw "Duplicate!"; + } + + debug_print('#newTransaction Form Passed Validation'); + + // do what you like with the input + $input = $('').val(user_id); + + // append to the form + $('#createNewTransaction').append($input); + + $.ajax({ +// beforeSend: saving_toast, + url: 'app/tenants/new-transaction.php', + type: 'GET', + data: $('#include-ids, #createNewTransaction').serialize(), + success: function (response, status, xhr) { + if (!check_for_error('transaction-message',response, xhr)) { + did_save('transaction-message', response, xhr, 'transaction'); + console.log('Receipt trans_id#'+response.transaction_id); + $('#printReceiptBtn').attr('data-trans-id', response.transaction_id); + $('#printReceiptBtn').prop("disabled", false); + $('#printReceiptBtn').css('opacity', '1'); + + if ($('#checkboxReceipt').checkbox('is checked') === true) { + if (response.transaction_id > 0) { + print_frame('NewPrintReceipt', 'app/tenants/print-receipt.php?trans_id=' + response.transaction_id); + } + } + + } // END if !ERROR + } + + }); // END ajax call + return false; + }, + fields: { + trans_type: { + identifier: 'trans_type', + rules: [ { type: 'empty', prompt: 'Please select a transaction type' } ] + }, + balance_type: { + identifier: 'balance_type', + rules: [ { type: 'empty', prompt: 'Please select a balance type' } ] + }, + amount_tendered: { + identifier: 'amount_tendered', + rules: [ { type: 'decimalMoney', prompt: 'Please enter a decimal amount (Example: 100.00)' } ] + }, + payment_method: { + identifier: 'payment_method', + rules: [ { type: 'not[none]', prompt: 'Please select a payment method' } ] + } + }// END fields + }); // END #newTransaction form + + + // Make sure you cant select the wrong payment method + $("#trans_type").off('change'); + $("#trans_type").on("change", function (event) { + var val = $(this).val(); + $('#process-trans-type').html(val); // transType + // Only show the options that apply to the transaction type + if (val == "Payment") { + $("#payment_method_text").text("Payment Method"); + $("#payment_method").html(""); + checkForm(); + } else if (val == "Receivable") { + $("#payment_method_text").text("Charge Type"); + $("#payment_method").html(""); + checkForm(); + } else if (val == "Credit") { + $("#payment_method_text").text("Credit Type"); + $("#payment_method").html(""); + checkForm(); + } + }); + + $("#balance_type").off('change'); + $("#balance_type").on("change", function (event) { + var transBal = $("#balance_type").val(); + $('#process-trans-bal').html(transBal); + }); + + $("#amount_tendered").off('change'); + $("#amount_tendered").on("change", function (event) { + var amount = $("#amount_tendered").val(); + var decimal = amount.includes('.'); + if (decimal === false && amount > 9) { + $("#amount_tendered").val(String(amount) + '.00'); + $('#process-amount').html(String(amount) + '.00'); + } else { + $('#process-amount').html(amount); + } + // Check to see if form is valid + checkForm(); + }); + + $('#payment_method').off("change"); + $('#payment_method').on("change", function (event) { + // Check to see if form is valid + checkForm(); + }); + + $('#notes').off("change"); + $('#notes').on("change", function (event) { + // Check to see if form is valid + checkForm(); + }); + + $(document).off("click", "#printReceiptBtn"); + $(document).on("click", "#printReceiptBtn", function () { + var trans_id = $('#printReceiptBtn').attr('data-trans-id'); + console.log("Trans ID: " + trans_id); + print_frame('NewReceipt', 'app/tenants/print-receipt.php?trans_id=' + trans_id); + }); + + setTimeout(function (){ $('#amount_tendered').focus(); }, 1000); + + + $(document).off("click", ".trasactionItem"); + $(document).on("click", ".trasactionItem", function () { + $("#print_frame").remove(); + var trans_id = $(this).data("id"); + router.navigate('Tenants/' + theFilter + '/' + theTenant + '/Transactions/'+lease_id+'/ViewTransaction/Details/'+trans_id+'/Modal'); + }); + + $("#closeTransaction").off("click"); + $("#closeTransaction").on("click", function() { + //alert("Navigating..."); + $('#newTransactionModal').modal('hide'); + router.navigate('Tenants/' + theFilter + '/' + theTenant + '/Transactions'); + }); + + $(document).off("click", "#processTransaction"); + $(document).on("click", "#processTransaction", function (event) { + $('#createNewTransaction').form('submit'); + $('#createNewTransaction').form('reset'); + }); + + $(".closeTrans").off("click"); + $(".closeTrans").on("click", function () { + $('#transactionModal').modal('hide'); + }); + + $('.coupled.modal').modal({allowMultiple: true }); + + $(document).off("click", ".printRecipt"); + $(document).on("click", ".printRecipt", function () { + var trans_id = $('#modalTransID').val() + $('#modalTransID').val(trans_id); + $('#print_frame').attr('src', 'app/tenants/print-receipt.php?trans_id=' + trans_id + ''); + $("#print_frame").get(0).contentWindow.print(); + $('#modalTransID').val(''); + }); + + $(".filterTrans").off("change"); + $(".filterTrans").on("change", function () { + var lease_id = $('#lease_id').val(); + var trans_type_filter = $('#trans_type_filter').val(); + var balance_type_filter = $('#balance_type_filter').val(); + var date_filter = $('#date_filter').val(); + // Get transaction information + $.holdReady( true ); + $.get("app/tenants/view-transactions.php", {lease_id: lease_id, trans_type_filter: trans_type_filter, balance_type_filter: balance_type_filter, date_filter: date_filter}, function (data) { + $.holdReady( false ); + $("#transactionHistory").html(data); + }); + }); + + $(document).off("click", ".voidTransaction"); + $(document).on("click", ".voidTransaction", function () { + $('#voidModalTransID').val($('#modalTransID').val()); + $('#voidModal').modal('show'); + }); + + $(document).off("click", ".doVoid"); + $(document).on("click", ".doVoid", function () { + var void_id = $('#voidModalTransID').val(); + alert(void_id); + }); + + // hmm SHould be called EDIT... + $('#newTransactionModal').modal({ + centered: false, + closable: false + }).modal('setting', 'transition', 'vertical flip') + .modal('show'); + + +}; +// End of Actions + + +var vnotes = false; +function checkForm() { + var method = $("#payment_method").val(); + var notes = $("#notes").val(); + if (method == '' || method == 'Cash' || method == 'Charge' || method == 'Credit') { + var valid = true; + } else if (notes == '') { + var valid = false; + } else { + var valid = true; + } + if (valid === false) { + $('#createNewTransaction').form('add rule', 'notes', { identifier: 'notes', rules: [ { type: 'empty', prompt: 'Please enter reference#' } ] } ); + $('#createNewTransaction').form('validate field', 'notes'); + vnotes = true; + } else { + if (vnotes === true) { + $('#createNewTransaction').form('remove rule', 'notes'); + $('#createNewTransaction').form('validate field', 'notes'); + vnotes = false; + } + } + if ( valid === true && $('#createNewTransaction').form('is valid') ) { + console.log('Attempting to enable Process Transaction!'); + $('#processTransaction').removeClass('grey'); + $('#processTransaction').addClass('green'); + $('#processTransaction').removeClass('disabled'); + $('#processTransaction').css('opacity', '1'); // show + } else { + $('#processTransaction').addClass('grey'); + $('#processTransaction').removeClass('green'); + $('#processTransaction').addClass('disabled'); + $('#processTransaction').css('opacity', '0'); + } +} + +function print_ledger() { + var trans_type_filter = $('#trans_type_filter').val(); + var balance_type_filter = $('#balance_type_filter').val(); + var date_filter = $('#date_filter').val(); + var lease_id = $('#lease_id').val(); + var printTrans = $('#printTrans').val(); +// console.log('trans_type_filter: '+trans_type_filter+' balance_type_filter: '+balance_type_filter+' lease_id: '+lease_id+' printTrans: '+printTrans); + var frame_id = 'printTransReport'; + var src = 'app/tenants/print-transactions.php?lease_id=' + lease_id + '&trans_type_filter=' + trans_type_filter + '&balance_type_filter=' + balance_type_filter + '&date_filter=' + date_filter; + print_frame(frame_id, src); +} \ No newline at end of file diff --git a/public/assets/prototype/ajax/tenants_lease.js b/public/assets/prototype/ajax/tenants_lease.js new file mode 100644 index 0000000..8fa3f73 --- /dev/null +++ b/public/assets/prototype/ajax/tenants_lease.js @@ -0,0 +1,218 @@ +tenants.prototype.lease = function () { + var tenant_id = this.id; /* This tenant ID is used by AJAX saves */ + var user_id = this.user_id; /* This User ID is used by AJAX saves */ + +//alert("In the lease Tab"); + // Select from Available Properties + $("#availableSearch").on("change", function () { + var idProp = $(this).find(':selected').val(); + //alert(id); + property_id = idProp; + + // do what you like with the input + $hiddenPropertyID = $('').val(property_id); + + // append to the form + $('#newLease').append($hiddenPropertyID); + + //var address = $(this).data("address"); + var address = $(this).find(':selected').data('address'); + + // do what you like with the input + $hiddenAddress = $('').val(address); + + // append to the form + $('#newLease').append($hiddenAddress); + $('#no-lease').css('display', 'none'); + $('#no-lease').transition('slide down', '0ms') + .transition('slide down', 300, function () { + $('#no-lease').css('display', 'none'); + }); + $('#lease-form').show(); + }); + + $('#editLease') + .form({ + inline: true, + fields: { + rent: { + identifier: 'rent', + rules: [ { type: 'decimalMoney', prompt: 'Please enter a valid decmial number (Example: 100.00)'} ] + }, + deposit: { + identifer: 'deposit', + rules: [ { type: 'decimalMoney', prompt: 'Please enter a valid decmial number (Example: 100.00)' } ] + }, + } + }); + + // Validation for #addLease + $('#newLease') + .form({ + inline: true, + on: 'submit', + keyboardShortcuts: false, + onSuccess: function (e) { + e.preventDefault(); + debug_print('#newLease form has passed validation'); + debug_print("Adding Lease as user_id: " + user); + var property_id = $("#availableSearch").val(); + var property_address = $("#property_address").val(); + var occupants_num = $("#occupants_num").val(); + var list_occupants = $("#list_occupants").val(); + var billing_day = $("#billing_day").val(); + var water_payed_by = $("#water_payed_by").val(); + var consumers_payed_by = $("#consumers_payed_by").val(); + $.ajax({ + beforeSend: saving_toast, + url: 'app/tenants/add-lease.php', + type: 'GET', + async: true, + data: {tenant_id: tenant_id, property_id: property_id, user_id: user_id, occupants_num: occupants_num, list_occupants: list_occupants, billing_day: billing_day, property_address: property_address, water_payed_by: water_payed_by, consumers_payed_by: consumers_payed_by}, + success: function (response, status, xhr) { + if (!has_error(response, xhr)) { + start_progress(); /* Restart percentage to 1 */ + cloneObject.reload_right(); + cloneObject.load_left('start_up'); + has_saved(response, xhr, 'lease'); + + /* Make sure Lease was Created... */ + if (response.lease_id > 0) { + router.navigate('Tenants/Active/'+tenant_id+'/Profile/'+response.lease_id); + } + + } // END if !Error + } + }); // <-- END: .ajax() + + }, + fields: { + availableSearch: { + identifier: 'availableSearch', + rules: [ { type: 'empty', prompt: 'Please select a property to create a new lease.' } ] + }, + occupants_num: { + identifier: 'occupants_num', + rules: [ { type: 'empty', prompt: 'How many occupants are they?' } ] + }, + billing_day: { + identifier: 'billing_day', + rules: [ { type: 'empty', prompt: 'Select automatic rent billing date.' } ] + } + } // <-- END: fields + + }); // <-- END: #addLease + + +// UPDATE LEASE +// NOTE: Always unbind the last events that bubbled up the DOM tree. + $(document).off('change enter', '.updateLease'); +// Now bind the newly created event listeners. + $(document).on("change enter", ".updateLease", function () { + // Get data attributes from the input that was changed. + var leaseid = $(this).attr('data-leaseID'); + var fieldname = $(this).attr('data-changed'); + var newvalue = $(this).val(); + var tenantid = tenant_id; // Fixed on 12/19/2017 +// alert(tenantid+"-"+fieldname+"-"+newvalue); + + make_changes_lease(leaseid, fieldname, newvalue, tenantid); + }); // <-- END: onChane event (.updateLease) + + $(document).off('change enter', '.updateLeaseSelect'); + $(document).on("change enter", ".updateLeaseSelect", function () { + // Get data attributes from the input that was changed. + var leaseid = $(this).find(':selected').attr('data-leaseID'); + var fieldname = $(this).find(':selected').attr('data-changed'); + var newvalue = $(this).find(':selected').val(); + var tenantid = tenant_id; + make_changes_lease(leaseid, fieldname, newvalue, tenantid); + }); // <-- END: onChane event (.updateLeaseSelected) + + function make_changes_lease(leaseid, fieldname, newvalue, tenantid) { + var saving = ''; + // validate the form before we proccess it. + var validate = $('#editLease').form('validate form'); + // Get the result of the validation. + var validateResult = $('#editLease').form('is valid'); + // If the form passes validation the begin processing. + if (validateResult === true) { + + // Get data attributes from the input that was changed. + var leaseid = leaseid; + var fieldname = fieldname; + var newvalue = newvalue; + debug_print("Data Passed to AJAX: leaseid=" + leaseid + "&field=" + fieldname + "&newvalue=" + newvalue + "&tenant_id=" + tenantid); + $.ajax({ + beforeSend: saving_toast, + url: 'app/tenants/edit-lease.php', + type: 'GET', + async: true, + data: {id: leaseid, field: fieldname, val: newvalue, user_id: user_id, tenant_id: tenantid}, + success: function (response, status, xhr) { + if (!hasError(response, xhr)) { + hasSaved(response, xhr, fieldname); + + // Re load the right side without the animation for sticky message timestamp update + if (fieldname == "status_msg") { + start_progress(); /* Restart percentage to 1 */ + cloneObject.reloadRight(); + done_loading(); + } + } // END if !Error check + }// <-- END: on success + + }); // <-- END: .ajax() + + } // <-- END: validate Results + } // End makeChanges() function + +}; // END if Tab = Lease + +tenants.prototype.reload_right = function () { + var rside = cloneObject.load_right('StartUp'); + $.when( rside ).done(function () { + cloneObject.Lease(); /* RE-bind self */ + stop_progress(); /* Make readonly fields styles */ + }); +}; + +tenants.prototype.confirm_close = function (leaseID, property_id, address) { + var tenant_id = this.id; /* This tenant ID is used by AJAX saves */ + var user_id = this.user_id; /* This User ID is used by AJAX saves */ + + $.confirm({ + container: "#lease", + useBootstrap: false, + boxWidth: "80%", + position: 'sticky', + animation: 'bottom', + closeAnimation: 'bottom', + type: 'red', + title: "Terminate Lease", + content: "Are you sure you want to Terminate this lease for: " + address + "?", + buttons: { + cancel: function() {}, + terminate: { + text: "Terminiate Lease", + btnClass: 'btn-red', + action: function() { + debug_print('Termanited Tenant: leaseID=' + leaseID + ',user_id=' + user_id + ',tenant_id=' + tenant_id + ',property_id=' + property_id); + $.ajax({ + url: 'app/tenants/close-lease.php', + type: 'GET', + async: true, + data: {leaseID: leaseID, user_id: user_id, tenant_id: tenant_id, property_id: property_id}, + success: function (response, status, xhr) { + if (!has_error(response, xhr)) { + cloneObject.reload_right(); + cloneObject.loadLeft('start_up'); + has_saved(response, xhr, 'Terminated Lease'); + } + } + }); + } + } + } + }); +}; // end of function confirmClose \ No newline at end of file diff --git a/public/assets/prototype/ajax/tenants_main.js b/public/assets/prototype/ajax/tenants_main.js new file mode 100644 index 0000000..ae95eac --- /dev/null +++ b/public/assets/prototype/ajax/tenants_main.js @@ -0,0 +1,265 @@ +var the_tab; +tenants.prototype.main = function () { + open = []; /* Tracks if menu item was already open */ + the_tab = this.tab; + var dfd_Tenants_main = jQuery.Deferred(); + start_progress(); + $.when(this.load_left(), this.load_right()).done(function () { + stop_progress(); + debug_print('AJAX complete'); + dfd_Tenants_main.resolve("ajax_complete"); + }).fail(function(msg) { + stop_progress(); + dfd_Tenants_main.reject("AJAX Failed loading..."); + }); + + return dfd_Tenants_main.promise(); +}; + +tenants.prototype.load_left = function (callback) { + var RowID = this.id; /* This tenant Row ID is used by row selection function */ + var dfd_TenantsLeft = jQuery.Deferred(); + $("#main-container-left-body").addClass("loading"); + $("main-container-left-footer").html('  '); /* keep padding while loading */ + var atldhf = ajax_loader({id: this.id, filter: this.filter, selected: this.selected}, "tenants/header/left.html", "main-container-left-header"); + progress(); + var atldff = ajax_loader({id: this.id, filter: this.filter, tab: this.tab, selected: this.selected}, "tenants/footer/left.html", "main-container-left-footer"); + progress(); + var atldbf = ajax_loader({id: this.id, filter: this.filter, selected: this.selected, lease_id: this.lease_id}, "tenants/tenants_list/view_for_json.html", "main-container-left-body"); + progress(); + $.when(atldhf, atldff, atldbf).done(function () { + progress(); + $("#main-container-left-body").removeClass("loading"); + debug_print('Left'); + var fixed_th = ajax_loader({}, "tenants/header/fixed_th.html", "left-fixed-th-container"); + $.when(fixed_th).then(function () { + left_scroll(); + }); + if (typeof callback !== 'undefined' && cloneObject[callback]) { + cloneObject[callback](); + } + dfd_TenantsLeft.resolve("ajax_done_left"); + }).fail(function() { + $("#main-container-left-body").removeClass("loading"); + dfd_TenantsLeft.reject('load_left -> AJAX Failed loading...'); + }); + + return dfd_TenantsLeft.promise(); +}; + +tenants.prototype.load_right = function (callback) { + var dfd_TenantsRight = jQuery.Deferred(); + $("#main-container-right-body").addClass("loading"); + + var atrdhf = ajax_loader({id: this.id, filter: this.filter, tab: this.tab, lease_id: this.lease_id}, "tenants/header/right.html", "main-container-right-header"); + progress(); + var atrdff = ajax_loader({id: this.id, filter: this.filter, tab: this.tab, selected: "true"}, "tenants/footer/right.html", "main-container-right-footer"); + progress(); + + if (this.tab == 'Transactions' || this.tab == 'ViewTransaction') { + var atrdmm = ajax_loader({id: this.id, filter: this.filter, tab: this.tab, lease_id: this.lease_id, trans_id: this.trans_id, trans_type: this.trans_type, trans_bal: this.bal_type}, "tenants/containers/right_menu.html", "ajax-menu-container-right-body"); + } else { + var atrdmm = $.Deferred(); + atrdmm.resolve(); + } + + /** Right Body defined here: */ + var right_body = 'tenants/notes/index.html'; + switch (this.tab) { + case 'Profile': right_body = 'tenants/profile/index.html'; break; + case 'Notes': right_body = 'tenants/notes/index.html'; break; + case 'Lease': right_body = 'tenants/lease/index.html'; break; + case 'Activity': right_body = 'tenants/activity/index.html'; break; + case 'Transactions': right_body = 'tenants/transactions/index.html'; break; + case 'ViewTransaction': right_body = 'tenants/transactions/view_transaction.html'; break; + } + + var main_body_deferred = $.Deferred(); + var all_right_body_vars = {id: this.id, filter: this.filter, tab: this.tab, lease_id: this.lease_id, trans_id: this.trans_id, trans_type: this.trans_type, trans_bal: this.bal_type}; + $.when(atrdmm).done(function() { + atrdbf = ajax_loader(all_right_body_vars, right_body, "main-container-right-body"); + $.when(atrdbf).done(function() { + main_body_deferred.resolve(); + }); + }); + + $.when(main_body_deferred, atrdhf, atrdff).done(function () { + $('#main-container-right-body').scrollTop(0); + progress(); + $("#main-container-right-body").removeClass("loading"); + if (typeof callback !== 'undefined' && cloneObject[callback]) { + cloneObject[callback](); + } + debug_print('Right'); + dfd_TenantsRight.resolve("ajax_done_right"); + }).fail(function() { + $("#main-container-right-body").removeClass("loading"); + dfd_TenantsRight.reject('load_right -> AJAX Failed loading...'); + }); + + return dfd_TenantsRight.promise(); +}; + +tenants.prototype.start_up = function () { + right_scroll(); // Double check that height is correct here... + var filter = this.filter; /* This filter is used by HASH router navigate */ + $('.dropdown').dropdown(drop_effect); /* Keep towards top of start_up ! */ + debug_print('CleanUp FN - should be last now...'); + $('.ui.accordion').accordion(); + /* unbind the mouse enter left */ + $("#main-container-left-body").off("mouseenter"); + /* unbind the mouse enter right */ + $("#main-container-right-body").off("mouseenter"); + $('#tenantTable').stupidtable(); + $('.phoneNum').mask('(000) 000-0000'); + $('.money').mask('#,##0.00', {reverse: true}); + $('#tenantTable').on('tablesort:start', function (event, tablesort) { + debug_print("Starting the sort..."); + showLoading(); + }); + $('#tenantTable').on('tablesort:complete', function (event, tablesort) { + debug_print("Sort finished!"); + done_loading(); + }); + + $("#tenantSearch").on("keyup", function () { + /* Mark.js Added 1-31-18 */ + var keyword = $("#tenantSearch").val(); + if (keyword.length > 2) { + setTimeout(function() { + $('#tenantTable').unmark(); + $('#tenantTable').mark(keyword); + }, 90); + } else { + $('#tenantTable').unmark(); + } + }); + + $('#tenantTable').searchable({ + searchField: '#tenantSearch', + onSearchActive: function (term) { + $("#defaultSearch").css("display", "none"); /* Added 1-16-18 */ + $("#closeSearch").css("display", "inline-block"); /* Added 1-16-18 */ + }, + onSearchEmpty: function (elem) { + $("#closeSearch").css("display", "none"); /* Added 1-16-18 */ + $("#defaultSearch").css("display", "inline-block"); /* Added 1-16-18 */ + } + }); + + // Button Clear the search value + $(".closeSearch").off("click"); /* Added 1-16-18 */ + $(".closeSearch").on("click", function () { + /* Clear The Search Field */ + $("#tenantSearch").val(""); + $("#tenantSearch").keyup(); + $("#tenantSearch").focus(); + }); + + $('.closeTenant').off("click"); + $('.closeTenant').on("click", function() { + /* Init Balence counters: to nothing then force it to Zeros */ +// $('#right-secondary-content').html(''); +// var ajax_right_secondary_content = ajax_loader({id: this.id}, "app/tenants/tenants-right-secondary-content-transactions.php", "right-secondary-content"); + }); + + /* Row click function for Tenant Profile */ + $(".list-row").off("click"); + $(".list-row").on("click", function (e) { + var id = $(this).data("id"); + var lease_id = $(this).data("leaseid"); + if (! $(e.target).parents().hasClass('exclude') ) { + filter = $('#filterStatus').dropdown('get value'); + router.navigate('Tenants/' + filter + '/' + id + '/Transactions/' + lease_id); + } + }); + + $(".view-trans").off("click"); + $(".view-trans").on("click", function() { + var id = $(this).data("id"); + var lease_id = $(this).data("leaseid"); + filter = $('#filterStatus').dropdown('get value'); + router.navigate('Tenants/' + filter + '/' + id + '/Transactions/' + lease_id); + }); + + $(".view-maintenance").off("click"); + $(".view-maintenance").on("click", function() { + var id = $(this).data("id"); + var lease_id = $(this).data("leaseid"); + router.navigate('Maintenance/' + id + '/New/' + lease_id); + }); + +/* 7-7 New Feature to show alert on Inactive tenants + * + */ + $(".inactive-row").off("click"); + $(".inactive-row").on("click", function(e) { + var id = $(this).data("id"); + var lease_id = $(this).data("leaseid"); + if (! $(e.target).parents().hasClass('exclude') ) { + $.confirm({ + container: "#main-container-left-body", + useBootstrap: false, + boxWidth: "80%", + position: 'sticky', + animation: 'bottom', + closeAnimation: 'bottom', + type: 'blue', + title: "Notice", + content: "This tenant is Inactive! Payments for this account is disabled.", + buttons: { + cancel: function() {}, + Proceed: { + text: "Continue", + btnClass: 'btn-blue', + action: function() { + filter = $('#filterStatus').dropdown('get value'); + router.navigate('Tenants/' + filter + '/' + id + '/Transactions/' + lease_id); + } + } + } + }); + } + }); + + $("#filterStatus").dropdown({ + on: 'hover', + onChange: function (val) { + var entity_text = $('#filterEntity').dropdown('get value'); + window.update_tenants_list(val, entity_text); + cloneObject.start_up(); + } + }); + + $("#filterEntity").dropdown({ + on: 'hover', + onChange: function (val) { + $.ajax({ + url: "app/home/set_entity.html", + type: 'GET', + data: {entity_id: val}, + async: true, + dataType: "html", + success: function (response) { + start_progress(); /* Restart percentage to 1 */ + var tenant_status_text = $('#filterStatus').dropdown('get value'); + window.update_tenants_list(tenant_status_text, val); + cloneObject.start_up(); + } + }); + } + }); +/* + $('.ui.accordion').accordion({ + onChange: function () { + $('#main-container-right-body').perfectScrollbar('update'); // UPDATE .right-panel-scroll + } + }); +*/ + $("#tenantSearch").focus(); + done_loading(); + + auto_right_menus(); + /* Fixes postion for transactions right body */ + $('#main-container-right-body').css('margin-top', '0'); +}; diff --git a/public/assets/prototype/ajax/tenants_new_transaction.js b/public/assets/prototype/ajax/tenants_new_transaction.js new file mode 100644 index 0000000..6a9bf38 --- /dev/null +++ b/public/assets/prototype/ajax/tenants_new_transaction.js @@ -0,0 +1,275 @@ +// Define Globals +var user_id, transtype, baltype, the_tenant, the_filter, trans_type, trans_bal, trans_id, the_tab, lease_id; +var counter_for_trans = 0, reloadonNewTransaction = false; +tenants.prototype.new_transaction = function () { + counter_for_trans = 0; // Reenable submit + user_id = this.user_id; /* This defines the User for AJAX Save */ + transtype = this.transtype; + baltype = this.baltype; + the_tenant = this.id; + the_filter = this.filter; + the_tab = this.tab; + trans_id = this.transid; + lease_id = this.lease_id; + trans_type = transtype; + trans_bal = baltype; + + rem(); // Remind me if on Development Database...with a toast. + $('#process-trans-type').html(trans_type); + $('#process-trans-bal').html(trans_bal); + + $('#process-amount').html($("#amount_tendered").val()); + if (trans_type == "Payment") { + $('#checkboxReceipt').checkbox('check'); + $("#payment_method_text").text("Payment Method"); + $("#payment_method").html(""); + } else if (trans_type == "Receivable") { + $('#checkboxReceipt').checkbox('uncheck'); + $("#payment_method_text").text("Charge Type"); + $("#payment_method").html(""); + } + + // $('#createNewTransaction select').dropdown(drop_effect); + + var form_submit = function () { + if (counter_for_trans === 0) { + counter_for_trans++; + } else { + throw "Duplicate!"; + } + + debug_print('#newTransaction Form Passed Validation'); + // do what you like with the input + $input = $('').val(user_id); + + // append to the form + $('#createNewTransaction').append($input); + + $.ajax({ +// beforeSend: saving_toast, + url: 'app/tenants/new-transaction.php', + type: 'GET', + data: $('#include-ids, #createNewTransaction').serialize(), + success: function (response, status, xhr) { + if (!check_for_error('transaction-message',response, xhr)) { + did_save('transaction-message', response, xhr, 'transaction'); + console.log('Receipt TransID#'+response.transaction_id); + /* Check to make sure Transaction was error Free */ + if (response.transaction_id > 0) { + +// $('#printReceiptBtn').attr('data-trans-id', response.transaction_id); +// $('#printReceiptBtn').removeClass("disabled"); +// $('#printReceiptBtn').css('opacity', '1'); + $('#processNewTransaction').css('opacity', '0'); + $('#processNewTransaction').addClass('disabledHidden'); // Halfway is a css hack for btn opacity + + if ($('#checkboxReceipt').checkbox('is checked') === true) { + if (response.transaction_id > 0) { + print_frame('NewPrintReceipt', 'app/tenants/print-receipt.php?trans_id=' + response.transaction_id); + } + } + $('#createNewTransaction').form('reset'); + router.navigate('Tenants/' + the_filter + '/' + the_tenant + '/Transactions/'+lease_id+'/ViewTransaction/' + response.transaction_id + '/View'); + } + + + } // END if !ERROR + } + + }); // END ajax call + return false; + } + + // Start of Create Form + $(document).off('blur', '#createNewTransaction'); + $('#createNewTransaction') + .form({ + inline: true, + on: 'blur', + onSuccess: function (e) { + e.stopImmediatePropagation(); + }, + fields: { + trans_type: { + identifier: 'trans_type', + rules: [ { type: 'empty', prompt: 'Please select a transaction type' } ] + }, + balance_type: { + identifier: 'balance_type', + rules: [ { type: 'empty', prompt: 'Please select a balance type' } ] + }, + amount_tendered: { + identifier: 'amount_tendered', + rules: [ { type: 'decimalMoney', prompt: 'Please enter a decimal amount (Example: 100.00)' } ] + }, + payment_method: { + identifier: 'payment_method', + rules: [ { type: 'not[none]', prompt: 'Please select a payment method' } ] + } + }// END fields + }); // END #newTransaction form + + + // Make sure you cant select the wrong payment method + $("#trans_type").off('change'); + $("#trans_type").on("change", function (event) { + var val = $(this).val(); + $('#process-trans-type').html(val); // trans_type + // Only show the options that apply to the transaction type + if (val == "Payment") { + $('#amountTypeText').text('Payment Amount'); + //$('#checkboxReceipt').checkbox('check'); + $("#payment_method_text").text("Payment Method"); + $("#payment_method").html(""); + checkFormNewTransaction(); + } else if (val == "Receivable") { + $('#amountTypeText').text('Receivable Amount'); + //$('#checkboxReceipt').checkbox('uncheck'); + $("#payment_method_text").text("Charge Type"); + $("#payment_method").html(""); + checkFormNewTransaction(); + } else if (val == "Credit") { + $('#amountTypeText').text('Credit Amount'); + $("#payment_method_text").text("Credit Type"); + $("#payment_method").html(""); + checkFormNewTransaction(); + } + }); +/* + $("#balance_type").off('change'); + $("#balance_type").on("change", function (event) { + var trans_bal = $("#balance_type").val(); + $('#process-trans-bal').html(trans_bal); + }); +*/ + $("#amount_tendered").off('change'); + $("#amount_tendered").on("change", function (event) { + var amount = $("#amount_tendered").val(); + var decimal = amount.includes('.'); + if (decimal === false && amount > 9) { + $("#amount_tendered").val(String(amount) + '.00'); + $('#process-amount').html(String(amount) + '.00'); + } else { + $('#process-amount').html(amount); + } + // Check to see if form is valid + checkFormNewTransaction(); + }); + + $('#payment_method').off("change"); + $('#payment_method').on("change", function (event) { + if ($('#payment_method').val() == 'Cash') { + $('#refNumBlock').hide(); + } else { + $('#refNumBlock').show(); + + var method_text = ''; + switch($('#payment_method').val()) { + case 'Check': + method_text = 'Check'; + break; + case 'moneyOrder': + method_text = 'Money Order'; + break; + case 'moneyGram': + method_text = 'Money Gram'; + break; + case 'westernUnion': + method_text = 'Western Union'; + break; + case 'cashiersCheck': + method_text = 'Cashiers Check'; + break; + case 'directDeposit': + method_text = 'Direct Deposit'; + break; + } + + $('#refNumText').text(method_text + " #"); + $('#refrence_number').attr('placeholder', "Please enter the " + method_text + " #"); + } + // Check to see if form is valid + checkFormNewTransaction(); + }); + + $('#refrence_number').off("change"); + $('#refrence_number').on("change", function (event) { + // Check to see if form is valid + checkFormNewTransaction(); + }); + +// $(document).off("click", "#printReceiptBtn"); +// $(document).on("click", "#printReceiptBtn", function () { +// var trans_id = $('#printReceiptBtn').attr('data-trans-id'); +// if (trans_id == '0') { +// /** +// * @ todo: Build a retry event here +// */ +// console.log('Sorry, reciept generation error.') +// } else { +// console.log("Printing via Trans ID: " + trans_id); +// print_frame('NewReceipt', 'app/tenants/print-receipt.php?trans_id=' + trans_id); +// } +// }); + + $(document).off("click", "#closeTransaction"); + $(document).on("click", "#closeTransaction", function () { + router.navigate('Tenants/' + the_filter + '/' + the_tenant + '/Transactions/'+lease_id); + }); + + $(document).off("click", "#processNewTransaction"); + $(document).on("click", "#processNewTransaction", function (event) { + reloadonNewTransaction = true; + form_submit(); + }); + +}; + +var b_notes = false; +function checkFormNewTransaction() { + var method = $("#payment_method").val(); + var notes = $("#refrence_number").val(); + if (method == '' || method == 'Cash' || method == 'Charge' || method == 'Credit') { + var valid = true; + } else if (notes == '') { + var valid = false; + } else { + var valid = true; + } + + if (valid === false) { + $('#createNewTransaction').form('add rule', 'refrence_number', { identifier: 'refrence_number', rules: [ { type: 'empty', prompt: 'Please enter reference#' } ] } ); + $('#createNewTransaction').form('validate field', 'refrence_number'); + b_notes = true; + } else { + if (b_notes === true) { + $('#createNewTransaction').form('remove rule', 'refrence_number', ); + $('#createNewTransaction').form('validate field', 'refrence_number'); + b_notes = false; + } + } + if ( valid === true && $('#createNewTransaction').form('is valid') ) { + console.log('Attempting to enable Process Transaction!'); + // Validation Passed for New Transaction (Enabled the button) + if ( $('#processNewTransaction').hasClass("disabled") ) { + $('#processNewTransaction').removeClass('disabled'); + } + if ( $('#processNewTransaction').hasClass("grey") ) { + $('#processNewTransaction').removeClass('grey'); + } + if ( ! $('#processNewTransaction').hasClass("green") ) { + $('#processNewTransaction').addClass('green'); + $('#processNewTransaction').css('opacity', '1'); + } + } else { + // Validation Failed + if ( $('#processNewTransaction').hasClass("green") ) { + $('#processNewTransaction').removeClass('green'); + } + if ( ! $('#processNewTransaction').hasClass("grey") ) { + $('#processNewTransaction').addClass('grey'); + $('#processNewTransaction').addClass('disabled'); + $('#processNewTransaction').css('opacity', '0'); + } + } +} \ No newline at end of file diff --git a/public/assets/prototype/ajax/tenants_notes.js b/public/assets/prototype/ajax/tenants_notes.js new file mode 100644 index 0000000..63f0a3b --- /dev/null +++ b/public/assets/prototype/ajax/tenants_notes.js @@ -0,0 +1,53 @@ +tenants.prototype.notes = function () { + var tenant_id = this.id; /* This tenant ID is used for AJAX save */ + var user_id = this.user_id; /* This User is used for AJAX save */ + + //alert("In the Notes Tab"); + // Validation for #addNote + $('#addNote') + .form({ + inline: false, + on: 'submit', + keyboardShortcuts: false, + onSuccess: function (e) { + e.preventDefault(); + + debug_print('#addNote form has passed validation'); + var note = $("#note").val(); + var lease_id = $("#lease_id").val(); + + $.ajax({ + beforeSend: saving_toast, + url: 'app/tenants/add-note.php', + type: 'GET', + async: true, + data: {tenant_id: tenant_id, lease_id: lease_id, user_id: user_id, note: note}, + success: function (response, status, xhr) { + if (!has_error(response, xhr)) { + has_saved(response, xhr, 'note'); + start_progress(); /* Restart percentage to 1 */ + var rside = cloneObject.load_right('start_up'); + $.when( rside ).done(function () { + cloneObject.notes(); /* Reloaded, so add another note */ + }); + done_loading(); + } // END if !ERROR + } + }); // <-- END: .ajax() + }, + fields: { + note: { + identifier: 'note', + rules: [ + { + type: 'empty', + prompt: 'Error: Please enter your notes first then click the "Add Note" button.' + } + ] + } + + } // <-- END: fields + + }); // <-- END: #addNote + +}; \ No newline at end of file diff --git a/public/assets/prototype/ajax/tenants_profile.js b/public/assets/prototype/ajax/tenants_profile.js new file mode 100644 index 0000000..ec4b541 --- /dev/null +++ b/public/assets/prototype/ajax/tenants_profile.js @@ -0,0 +1,124 @@ +tenants.prototype.profile = function () { + var lease_id = this.lease_id; + // NOTE: Always unbind the last events that bubbled up the DOM tree. + $(document).off('change enter', '.updateTenant'); + // Now bind the newly created event listeners. + $(document).on("change enter", ".updateTenant", function () { + // Get data attributes from the input that was changed. + var fieldname = $(this).attr('data-changed'); + var newvalue = $(this).val(); + cloneObject.make_profile_changes(fieldname, newvalue); + }); // <-- END: onChane event (.updateTenant) + + $(document).off('change enter', '.updateTenantSelect'); + $(document).on("change enter", ".updateTenantSelect", function () { + // Get data attributes from the input that was changed. + var fieldname = $(this).find(':selected').attr('data-changed'); + var newvalue = $(this).find(':selected').val(); + cloneObject.make_profile_changes(fieldname, newvalue); + }); // <-- END: onChane event (.updateTenantSelected) + + // Validation for #editTenant + $('#editTenant') + .form({ + inline: true, + on: 'submit', + keyboardShortcuts: false, + onSuccess: function () { + debug_print('#editTenant form has passed validation'); + }, + fields: { + status: { + identifier: 'status', + rules: [ + { + type: 'empty', + prompt: 'Select Tenant Status' + } + ] + }, + first_name: { + identifier: 'first_name', + rules: [ + { + type: 'empty', + prompt: 'Please enter the tenants first name' + } + ] + }, + last_name: { + identifier: 'last_name', + rules: [ + { + type: 'empty', + prompt: 'Please enter the tenants last name' + } + ] + }, + mainPhone: { + identifier: 'mainPhone', + rules: [ + { + type: 'empty', + prompt: 'Please enter the primary phone number' + } + ] + } + + } // <-- END: fields + }); // <-- END: .form + +}; + +tenants.prototype.make_profile_changes = function (fieldname, newvalue) { + var filter = this.filter; /* This filter is used by HASH router navigate */ + var tenant_id = this.id; /* This tenant ID is used for AJAX save */ + var user_id = this.user_id; /* This defines the User for AJAX call */ + // validate the form before we proccess it. + var validate = $('#editTenant').form('validate form'); + // Get the result of the validation. + var validateResult = $('#editTenant').form('is valid'); + // If the form passes validation the begin processing. + if (validateResult === true) { + // Get data attributes from the input that was changed. + debug_print("Data Passed to AJAX: tenant_id=" + tenant_id + "&fieldname=" + fieldname + "&newvalue=" + newvalue); + $.ajax({ + beforeSend: saving_toast, + url: 'app/tenants/edit-tenant.php', + type: 'GET', + async: true, + data: {id: tenant_id, field: fieldname, val: newvalue, user_id: user_id}, + success: function (response, status, xhr) { + if (!has_error(response, xhr)) { + has_saved(response, xhr, fieldname); + + if (fieldname === "first_name" || fieldname === "last_name") { + window.setTimeout(function () { + document.location.reload(); + }, 3000); + return false; + } + + if (fieldname === "status") { + router.navigate('Tenants/' + newvalue + '/' + tenant_id + '/Profile/' + lease_id); + return false; + } + + cloneObject.load_left('start_up'); + + // Re load the right side without the animation for sticky message timstamp update + if (fieldname === "status_msg") { + var rside = cloneObject.load_right('start_up'); + $.when(rside).done(function () { + cloneObject.profile(); /* RE-bind self */ + }); + } + + done_loading(); + } // END if !ERROR + }// <-- END: on success + + }); // <-- END: .ajax() + + } // <-- END: validate Results +}; // End make_profile_changes() function diff --git a/public/assets/prototype/ajax/tenants_transactions.js b/public/assets/prototype/ajax/tenants_transactions.js new file mode 100644 index 0000000..7558a7e --- /dev/null +++ b/public/assets/prototype/ajax/tenants_transactions.js @@ -0,0 +1,102 @@ +var trans_type_filter='All', balance_type_filter='All', date_filter='All'; +tenants.prototype.transactions = function () { + var user_id = this.user_id; /* This defines the User for AJAX Save */ + var the_tenant = this.id; + var the_filter = this.filter; + var the_tab = this.tab; + var lease_id = this.lease_id; + + $('#allTransactions').tablesort(); +/* + * 12-11-2018 Old code to Dim or hide on data table + $("#right-secondary-menu").off("hover"); + $('#right-secondary-menu').hover(function() { + //$('#allTransactions').hide(); +// $('#allTransactions').css('opacity', '0.3'); +// $('#allTransactions').dimmer({opacity: 0.3}).dimmer('show'); + }); + + $("#right-secondary-menu").off("mouseleave"); + $('#right-secondary-menu').mouseleave(function() { + $('#allTransactions').show(); +// $('#allTransactions').css('opacity', '1'); +// $('#allTransactions').dimmer('hide'); + }); +*/ + $(document).off("click", ".createTransaction"); + $(document).on("click", ".createTransaction", function () { + var transType = $(this).attr('data-transType'); + var transBal = $(this).attr('data-transBal'); + router.navigate('Tenants/' + the_filter + '/' + the_tenant + '/Transactions/'+lease_id+'/NewTransaction/'+transType+'/'+transBal+'/New'); + }); + + $(document).off("click", ".trasactionItem"); + $(document).on("click", ".trasactionItem", function () { + var transID = $(this).data("id"); + var transType = $(this).data('transType'); + var transBal = $(this).data('transBal'); + router.navigate('Tenants/' + the_filter + '/' + the_tenant + '/Transactions/'+lease_id+'/ViewTransaction/'+transID+'/View'); + }); + + $(".filter-TransType").off("click"); + $(".filter-TransType").on("click", function () { + $(".iTransType").each(function() { + $(this).removeClass('check'); + $(this).addClass('lighter'); + }); + + trans_type_filter = $(this).attr('data-filterTransType'); + + $("#i"+trans_type_filter).addClass('check'); + $("#i"+trans_type_filter).removeClass('lighter'); + + view_trans(lease_id); + }); + + $(".filter-TransBal").off("click"); + $(".filter-TransBal").on("click", function () { + $(".iTransBal").each(function() { + $(this).removeClass('check'); + $(this).addClass('lighter'); + }); + + balance_type_filter = $(this).attr('data-filterBalType'); + + $("#ib"+balance_type_filter).addClass('check'); + $("#ib"+balance_type_filter).removeClass('lighter'); + + view_trans(lease_id); + }); + + $(".filter-transDates").off("click"); + $(".filter-transDates").on("click", function () { + $(".itransDates").each(function() { + $(this).removeClass('check'); + $(this).addClass('lighter'); + }); + + date_filter = $(this).attr('data-transDate'); + + $("#ic"+date_filter).addClass('check'); + $("#ic"+date_filter).removeClass('lighter'); + + view_trans(lease_id); + }); +}; + +function view_trans(lease_id) { + var view_params = { lease_id: lease_id, trans_type_filter: trans_type_filter, balance_type_filter: balance_type_filter, date_filter: date_filter }; + $.get("app/tenants/view-transactions.php", view_params, function (data) { + $("#transactionHistory").html(data); + }); +} + + +/* Note this function is called printLedger as it is needed by an on CLick Event */ +function print_ledger() { + var lease_id = $('#lease_id').val(); /* from hidden input on tab-tran..... */ + var frame_id = 'printTransReport'; + var src = 'app/tenants/print-transactions.php?lease_id=' + lease_id + '&trans_type_filter=' + trans_type_filter + '&balance_type_filter=' + balance_type_filter + '&date_filter=' + date_filter; + debug_print(src); + print_frame(frame_id, src); +} \ No newline at end of file diff --git a/public/assets/prototype/ajax/tenants_view_transaction.js b/public/assets/prototype/ajax/tenants_view_transaction.js new file mode 100644 index 0000000..7e296d7 --- /dev/null +++ b/public/assets/prototype/ajax/tenants_view_transaction.js @@ -0,0 +1,67 @@ +tenants.prototype.view_transaction = function () { + var user_id = this.user_id; //this.user_id; /* This defines the User for AJAX Save */ + var transtype = this.transtype; + var baltype = this.baltype; + var the_tenant = this.id; + var the_filter = this.filter; + var the_tab = this.tab; + var trans_id = this.transid; + var trans_type = transtype; + var trans_bal = baltype; + var lease_id = this.lease_id; + + $('#printReceiptBtn').prop("disabled", true); + + $('.edt').addClass('disabled'); + $('#editTransaction textarea').prop('disabled', true); + $('.dropdown').dropdown(drop_effect); /* Re-encode for new class...disabled */ + + $('#transactionNumber').text(trans_id); + + $('#hrefTenant').attr('href', "#Tenants/" + the_filter + "/" + the_tenant + "/Profile/" + lease_id); + $('#hrefLease').attr('href', '#Tenants/'+ the_filter + '/' + the_tenant + '/Lease/' + lease_id); + $('#hrefTransactions').attr('href', '#Tenants/'+ the_filter + '/' + the_tenant + '/Transactions/' + lease_id); + + $("#transDetailsClose").off("click"); + $("#transDetailsClose").on("click", function () { + router.navigate('Tenants/' + the_filter + '/' + the_tenant + '/Transactions/' + lease_id); + }); + + $(".editvTransaction").off('click'); + $(".editvTransaction").on("click", function () { + var val = $(this).attr("data-editType"); + if (val == 'void') { + alert(val); + } else if (val == 'transfer') { + $('.edt').removeClass('disabled'); + $('#editTransaction textarea').prop('disabled', false); + $('#editbtn').text('Save'); + $('.dropdown').dropdown(drop_effect); /* Re-encode for removed class of disabled */ + } + }); + + $(".printViewTransactions").off('click'); + $(".printViewTransactions").on("click", function () { + var val = $(this).attr("data-printCopy"); + var x = false; + switch(val) { + case 'both': x = 'both'; break; + case 'office': x = 'office'; break; + case 'tenant': x = 'tenant'; break; + } + if (x !== false) { + print_receipt_view_trans(trans_id, x); + } + }); + +}; + +function print_receipt_view_trans(transactionID, copy) { + if (transactionID == '0' || transactionID == null || transactionID === undefined) { + alert('Please close out and try again'); + } else { + var frameID = 'printTransDetails'; + var src = 'app/tenants/print-receipt.php?trans_id=' + transactionID + '©=' +copy; + print_frame(frameID, src); + } +} \ No newline at end of file diff --git a/public/assets/prototype/css/daterangepicker.css b/public/assets/prototype/css/daterangepicker.css new file mode 100644 index 0000000..73f36b0 --- /dev/null +++ b/public/assets/prototype/css/daterangepicker.css @@ -0,0 +1,388 @@ +.daterangepicker { + position: absolute; + color: inherit; + background-color: #fff; + border-radius: 4px; + border: 1px solid #ddd; + width: 278px; + max-width: none; + padding: 0; + margin-top: 7px; + top: 100px; + left: 20px; + z-index: 3001; + display: none; + font-family: arial; + font-size: 15px; + line-height: 1em; +} + +.daterangepicker:before, .daterangepicker:after { + position: absolute; + display: inline-block; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.daterangepicker:before { + top: -7px; + border-right: 7px solid transparent; + border-left: 7px solid transparent; + border-bottom: 7px solid #ccc; +} + +.daterangepicker:after { + top: -6px; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; +} + +.daterangepicker.opensleft:before { + right: 9px; +} + +.daterangepicker.opensleft:after { + right: 10px; +} + +.daterangepicker.openscenter:before { + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; +} + +.daterangepicker.openscenter:after { + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; +} + +.daterangepicker.opensright:before { + left: 9px; +} + +.daterangepicker.opensright:after { + left: 10px; +} + +.daterangepicker.drop-up { + margin-top: -7px; +} + +.daterangepicker.drop-up:before { + top: initial; + bottom: -7px; + border-bottom: initial; + border-top: 7px solid #ccc; +} + +.daterangepicker.drop-up:after { + top: initial; + bottom: -6px; + border-bottom: initial; + border-top: 6px solid #fff; +} + +.daterangepicker.single .daterangepicker .ranges, .daterangepicker.single .drp-calendar { + float: none; +} + +.daterangepicker.single .drp-selected { + display: none; +} + +.daterangepicker.show-calendar .drp-calendar { + display: block; +} + +.daterangepicker.show-calendar .drp-buttons { + display: block; +} + +.daterangepicker.auto-apply .drp-buttons { + display: none; +} + +.daterangepicker .drp-calendar { + display: none; + max-width: 270px; +} + +.daterangepicker .drp-calendar.left { + padding: 8px 0 8px 8px; +} + +.daterangepicker .drp-calendar.right { + padding: 8px; +} + +.daterangepicker .drp-calendar.single .calendar-table { + border: none; +} + +.daterangepicker .calendar-table .next span, .daterangepicker .calendar-table .prev span { + color: #fff; + border: solid black; + border-width: 0 2px 2px 0; + border-radius: 0; + display: inline-block; + padding: 3px; +} + +.daterangepicker .calendar-table .next span { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); +} + +.daterangepicker .calendar-table .prev span { + transform: rotate(135deg); + -webkit-transform: rotate(135deg); +} + +.daterangepicker .calendar-table th, .daterangepicker .calendar-table td { + white-space: nowrap; + text-align: center; + vertical-align: middle; + min-width: 32px; + width: 32px; + height: 24px; + line-height: 24px; + font-size: 12px; + border-radius: 4px; + border: 1px solid transparent; + white-space: nowrap; + cursor: pointer; +} + +.daterangepicker .calendar-table { + border: 1px solid #fff; + border-radius: 4px; + background-color: #fff; +} + +.daterangepicker .calendar-table table { + width: 100%; + margin: 0; + border-spacing: 0; + border-collapse: collapse; +} + +.daterangepicker td.available:hover, .daterangepicker th.available:hover { + background-color: #eee; + border-color: transparent; + color: inherit; +} + +.daterangepicker td.week, .daterangepicker th.week { + font-size: 80%; + color: #ccc; +} + +.daterangepicker td.off, .daterangepicker td.off.in-range, .daterangepicker td.off.start-date, .daterangepicker td.off.end-date { + background-color: #fff; + border-color: transparent; + color: #999; +} + +.daterangepicker td.in-range { + background-color: #ebf4f8; + border-color: transparent; + color: #000; + border-radius: 0; +} + +.daterangepicker td.start-date { + border-radius: 4px 0 0 4px; +} + +.daterangepicker td.end-date { + border-radius: 0 4px 4px 0; +} + +.daterangepicker td.start-date.end-date { + border-radius: 4px; +} + +.daterangepicker td.active, .daterangepicker td.active:hover { + background-color: #357ebd; + border-color: transparent; + color: #fff; +} + +.daterangepicker th.month { + width: auto; +} + +.daterangepicker td.disabled, .daterangepicker option.disabled { + color: #999; + cursor: not-allowed; + text-decoration: line-through; +} + +.daterangepicker select.monthselect, .daterangepicker select.yearselect { + font-size: 12px; + padding: 1px; + height: auto; + margin: 0; + cursor: default; +} + +.daterangepicker select.monthselect { + margin-right: 2%; + width: 56%; +} + +.daterangepicker select.yearselect { + width: 40%; +} + +.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect { + width: 50px; + margin: 0 auto; + background: #eee; + border: 1px solid #eee; + padding: 2px; + outline: 0; + font-size: 12px; +} + +.daterangepicker .calendar-time { + text-align: center; + margin: 4px auto 0 auto; + line-height: 30px; + position: relative; +} + +.daterangepicker .calendar-time select.disabled { + color: #ccc; + cursor: not-allowed; +} + +.daterangepicker .drp-buttons { + clear: both; + text-align: right; + padding: 8px; + border-top: 1px solid #ddd; + display: none; + line-height: 12px; + vertical-align: middle; +} + +.daterangepicker .drp-selected { + display: inline-block; + font-size: 12px; + padding-right: 8px; +} + +.daterangepicker .drp-buttons .btn { + margin-left: 8px; + font-size: 12px; + font-weight: bold; + padding: 4px 8px; +} + +.daterangepicker.show-ranges .drp-calendar.left { + border-left: 1px solid #ddd; +} + +.daterangepicker .ranges { + float: none; + text-align: left; + margin: 0; +} + +.daterangepicker.show-calendar .ranges { + margin-top: 8px; +} + +.daterangepicker .ranges ul { + list-style: none; + margin: 0 auto; + padding: 0; + width: 100%; +} + +.daterangepicker .ranges li { + font-size: 12px; + padding: 8px 12px; + cursor: pointer; +} + +.daterangepicker .ranges li:hover { + background-color: #eee; +} + +.daterangepicker .ranges li.active { + background-color: #08c; + color: #fff; +} + +/* Larger Screen Styling */ +@media (min-width: 564px) { + .daterangepicker { + width: auto; } + .daterangepicker .ranges ul { + width: 140px; } + .daterangepicker.single .ranges ul { + width: 100%; } + .daterangepicker.single .drp-calendar.left { + clear: none; } + .daterangepicker.single.ltr .ranges, .daterangepicker.single.ltr .drp-calendar { + float: left; } + .daterangepicker.single.rtl .ranges, .daterangepicker.single.rtl .drp-calendar { + float: right; } + .daterangepicker.ltr { + direction: ltr; + text-align: left; } + .daterangepicker.ltr .drp-calendar.left { + clear: left; + margin-right: 0; } + .daterangepicker.ltr .drp-calendar.left .calendar-table { + border-right: none; + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .daterangepicker.ltr .drp-calendar.right { + margin-left: 0; } + .daterangepicker.ltr .drp-calendar.right .calendar-table { + border-left: none; + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .daterangepicker.ltr .drp-calendar.left .calendar-table { + padding-right: 8px; } + .daterangepicker.ltr .ranges, .daterangepicker.ltr .drp-calendar { + float: left; } + .daterangepicker.rtl { + direction: rtl; + text-align: right; } + .daterangepicker.rtl .drp-calendar.left { + clear: right; + margin-left: 0; } + .daterangepicker.rtl .drp-calendar.left .calendar-table { + border-left: none; + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .daterangepicker.rtl .drp-calendar.right { + margin-right: 0; } + .daterangepicker.rtl .drp-calendar.right .calendar-table { + border-right: none; + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .daterangepicker.rtl .drp-calendar.left .calendar-table { + padding-left: 12px; } + .daterangepicker.rtl .ranges, .daterangepicker.rtl .drp-calendar { + text-align: right; + float: right; } } +@media (min-width: 730px) { + .daterangepicker .ranges { + width: auto; } + .daterangepicker.ltr .ranges { + float: left; } + .daterangepicker.rtl .ranges { + float: right; } + .daterangepicker .drp-calendar.left { + clear: none !important; } } diff --git a/public/assets/prototype/css/jquery-confirm.css b/public/assets/prototype/css/jquery-confirm.css new file mode 100644 index 0000000..e05a854 --- /dev/null +++ b/public/assets/prototype/css/jquery-confirm.css @@ -0,0 +1,976 @@ +/*! + * jquery-confirm v3.3.0 (http://craftpip.github.io/jquery-confirm/) + * Author: boniface pereira + * Website: www.craftpip.com + * Contact: hey@craftpip.com + * + * Copyright 2013-2017 jquery-confirm + * Licensed under MIT (https://github.com/craftpip/jquery-confirm/blob/master/LICENSE) + */ +@-webkit-keyframes jconfirm-spin { + from { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes jconfirm-spin { + from { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +body[class*=jconfirm-no-scroll-] { + overflow: hidden !important; +} +.jconfirm { +/* position: sticky;*/ + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 99999999; + font-family: inherit; + overflow: hidden; +} +.jconfirm .jconfirm-bg { + position: static; + top: 0; + left: 0; + right: 0; + bottom: 0; + -webkit-transition: opacity .4s; + transition: opacity .4s; +} +.jconfirm .jconfirm-bg.jconfirm-bg-h { + opacity: 0 !important; +} +.jconfirm .jconfirm-scrollpane { + -webkit-perspective: 200px; + perspective: 200px; + -webkit-perspective-origin: center; + perspective-origin: center; + display: table; + width: 100%; + height: 100%; +} +.jconfirm .jconfirm-row { + display: table-row; + width: 100%; +} +.jconfirm .jconfirm-cell { + display: table-cell; + vertical-align: middle; +} +.jconfirm .jconfirm-holder { + max-height: 100%; + padding: 10px 0; +} +.jconfirm .jconfirm-box-container { + -webkit-transition: -webkit-transform; + transition: -webkit-transform; + transition: transform; + transition: transform, -webkit-transform; +} +.jconfirm .jconfirm-box-container.jconfirm-no-transition { + -webkit-transition: none !important; + transition: none !important; +} +.jconfirm .jconfirm-box { + background: white; + border-radius: 4px; + position: relative; + outline: none; + padding: 15px 15px 0; + overflow: hidden; + margin-left: auto; + margin-right: auto; +} +@-webkit-keyframes type-blue { + 1%, + 100% { + border-color: #3498db; + } + 50% { + border-color: #5faee3; + } +} +@keyframes type-blue { + 1%, + 100% { + border-color: #3498db; + } + 50% { + border-color: #5faee3; + } +} +@-webkit-keyframes type-green { + 1%, + 100% { + border-color: #2ecc71; + } + 50% { + border-color: #54d98c; + } +} +@keyframes type-green { + 1%, + 100% { + border-color: #2ecc71; + } + 50% { + border-color: #54d98c; + } +} +@-webkit-keyframes type-red { + 1%, + 100% { + border-color: #e74c3c; + } + 50% { + border-color: #ed7669; + } +} +@keyframes type-red { + 1%, + 100% { + border-color: #e74c3c; + } + 50% { + border-color: #ed7669; + } +} +@-webkit-keyframes type-orange { + 1%, + 100% { + border-color: #f1c40f; + } + 50% { + border-color: #f4d03f; + } +} +@keyframes type-orange { + 1%, + 100% { + border-color: #f1c40f; + } + 50% { + border-color: #f4d03f; + } +} +@-webkit-keyframes type-purple { + 1%, + 100% { + border-color: #9b59b6; + } + 50% { + border-color: #b07cc6; + } +} +@keyframes type-purple { + 1%, + 100% { + border-color: #9b59b6; + } + 50% { + border-color: #b07cc6; + } +} +@-webkit-keyframes type-dark { + 1%, + 100% { + border-color: #34495e; + } + 50% { + border-color: #46627f; + } +} +@keyframes type-dark { + 1%, + 100% { + border-color: #34495e; + } + 50% { + border-color: #46627f; + } +} +.jconfirm .jconfirm-box.jconfirm-type-animated { + -webkit-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} +.jconfirm .jconfirm-box.jconfirm-type-blue { + border-top: solid 7px #3498db; + -webkit-animation-name: type-blue; + animation-name: type-blue; +} +.jconfirm .jconfirm-box.jconfirm-type-green { + border-top: solid 7px #2ecc71; + -webkit-animation-name: type-green; + animation-name: type-green; +} +.jconfirm .jconfirm-box.jconfirm-type-red { + border-top: solid 7px #e74c3c; + -webkit-animation-name: type-red; + animation-name: type-red; +} +.jconfirm .jconfirm-box.jconfirm-type-orange { + border-top: solid 7px #f1c40f; + -webkit-animation-name: type-orange; + animation-name: type-orange; +} +.jconfirm .jconfirm-box.jconfirm-type-purple { + border-top: solid 7px #9b59b6; + -webkit-animation-name: type-purple; + animation-name: type-purple; +} +.jconfirm .jconfirm-box.jconfirm-type-dark { + border-top: solid 7px #34495e; + -webkit-animation-name: type-dark; + animation-name: type-dark; +} +.jconfirm .jconfirm-box.loading { + height: 120px; +} +.jconfirm .jconfirm-box.loading:before { + content: ''; + position: absolute; + left: 0; + background: white; + right: 0; + top: 0; + bottom: 0; + border-radius: 10px; + z-index: 1; +} +.jconfirm .jconfirm-box.loading:after { + opacity: 0.6; + content: ''; + height: 30px; + width: 30px; + border: solid 3px transparent; + position: absolute; + left: 50%; + margin-left: -15px; + border-radius: 50%; + -webkit-animation: jconfirm-spin 1s infinite linear; + animation: jconfirm-spin 1s infinite linear; + border-bottom-color: dodgerblue; + top: 50%; + margin-top: -15px; + z-index: 2; +} +.jconfirm .jconfirm-box div.jconfirm-closeIcon { + height: 20px; + width: 20px; + position: absolute; + top: 10px; + right: 10px; + cursor: pointer; + opacity: .6; + text-align: center; + font-size: 27px !important; + line-height: 14px !important; + display: none; + z-index: 1; +} +.jconfirm .jconfirm-box div.jconfirm-closeIcon:empty { + display: none; +} +.jconfirm .jconfirm-box div.jconfirm-closeIcon .fa { + font-size: 16px; +} +.jconfirm .jconfirm-box div.jconfirm-closeIcon .glyphicon { + font-size: 16px; +} +.jconfirm .jconfirm-box div.jconfirm-closeIcon .zmdi { + font-size: 16px; +} +.jconfirm .jconfirm-box div.jconfirm-closeIcon:hover { + opacity: 1; +} +.jconfirm .jconfirm-box div.jconfirm-title-c { + display: block; + font-size: 22px; + line-height: 20px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: default; + padding-bottom: 15px; +} +.jconfirm .jconfirm-box div.jconfirm-title-c.jconfirm-hand { + cursor: move; +} +.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c { + font-size: inherit; + display: inline-block; + vertical-align: middle; +} +.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c i { + vertical-align: middle; +} +.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c:empty { + display: none; +} +.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + font-size: inherit; + font-family: inherit; + display: inline-block; + vertical-align: middle; +} +.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title:empty { + display: none; +} +.jconfirm .jconfirm-box div.jconfirm-content-pane { + margin-bottom: 15px; + height: auto; + -webkit-transition: height 0.4s ease-in; + transition: height 0.4s ease-in; + display: inline-block; + width: 100%; + position: relative; + overflow-x: hidden; + overflow-y: auto; +} +.jconfirm .jconfirm-box div.jconfirm-content-pane.no-scroll { + overflow-y: hidden; +} +.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar { + width: 3px; +} +.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0.1); +} +.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar-thumb { + background: #666; + border-radius: 3px; +} +.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content { + overflow: auto; +} +.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content img { + max-width: 100%; + height: auto; +} +.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content:empty { + display: none; +} +.jconfirm .jconfirm-box .jconfirm-buttons { + padding-bottom: 11px; +} +.jconfirm .jconfirm-box .jconfirm-buttons > button { + margin-bottom: 4px; + margin-left: 2px; + margin-right: 2px; +} +.jconfirm .jconfirm-box .jconfirm-buttons button { + display: inline-block; + padding: 6px 12px; + font-size: 14px; + font-weight: 400; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border-radius: 4px; + min-height: 1em; + -webkit-transition: opacity 0.1s ease, background-color 0.1s ease, color 0.1s ease, background 0.1s ease, -webkit-box-shadow 0.1s ease; + transition: opacity 0.1s ease, background-color 0.1s ease, color 0.1s ease, background 0.1s ease, -webkit-box-shadow 0.1s ease; + transition: opacity 0.1s ease, background-color 0.1s ease, color 0.1s ease, box-shadow 0.1s ease, background 0.1s ease; + transition: opacity 0.1s ease, background-color 0.1s ease, color 0.1s ease, box-shadow 0.1s ease, background 0.1s ease, -webkit-box-shadow 0.1s ease; + -webkit-tap-highlight-color: transparent; + border: none; + background-image: none; +} +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-blue { + background-color: #3498db; + color: #FFF; + text-shadow: none; + -webkit-transition: background .2s; + transition: background .2s; +} +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-blue:hover { + background-color: #2980b9; + color: #FFF; +} +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-green { + background-color: #2ecc71; + color: #FFF; + text-shadow: none; + -webkit-transition: background .2s; + transition: background .2s; +} +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-green:hover { + background-color: #27ae60; + color: #FFF; +} +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-red { + background-color: #e74c3c; + color: #FFF; + text-shadow: none; + -webkit-transition: background .2s; + transition: background .2s; +} +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-red:hover { + background-color: #c0392b; + color: #FFF; +} +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-orange { + background-color: #f1c40f; + color: #FFF; + text-shadow: none; + -webkit-transition: background .2s; + transition: background .2s; +} +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-orange:hover { + background-color: #f39c12; + color: #FFF; +} +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-default { + background-color: #ecf0f1; + color: #000; + text-shadow: none; + -webkit-transition: background .2s; + transition: background .2s; +} +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-default:hover { + background-color: #bdc3c7; + color: #000; +} +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-purple { + background-color: #9b59b6; + color: #FFF; + text-shadow: none; + -webkit-transition: background .2s; + transition: background .2s; +} +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-purple:hover { + background-color: #8e44ad; + color: #FFF; +} +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-dark { + background-color: #34495e; + color: #FFF; + text-shadow: none; + -webkit-transition: background .2s; + transition: background .2s; +} +.jconfirm .jconfirm-box .jconfirm-buttons button.btn-dark:hover { + background-color: #2c3e50; + color: #FFF; +} +.jconfirm .jconfirm-box.jconfirm-type-red .jconfirm-title-c .jconfirm-icon-c { + color: #e74c3c !important; +} +.jconfirm .jconfirm-box.jconfirm-type-blue .jconfirm-title-c .jconfirm-icon-c { + color: #3498db !important; +} +.jconfirm .jconfirm-box.jconfirm-type-green .jconfirm-title-c .jconfirm-icon-c { + color: #2ecc71 !important; +} +.jconfirm .jconfirm-box.jconfirm-type-purple .jconfirm-title-c .jconfirm-icon-c { + color: #9b59b6 !important; +} +.jconfirm .jconfirm-box.jconfirm-type-orange .jconfirm-title-c .jconfirm-icon-c { + color: #f1c40f !important; +} +.jconfirm .jconfirm-box.jconfirm-type-dark .jconfirm-title-c .jconfirm-icon-c { + color: #34495e !important; +} +.jconfirm .jconfirm-clear { + clear: both; +} +.jconfirm.jconfirm-rtl { + direction: rtl; +} +.jconfirm.jconfirm-rtl div.jconfirm-closeIcon { + left: 5px; + right: auto; +} +.jconfirm.jconfirm-white .jconfirm-bg, +.jconfirm.jconfirm-light .jconfirm-bg { +/* background-color: #444;*/ + background-color: transparent; + opacity: 1; +} +.jconfirm.jconfirm-white .jconfirm-box, +.jconfirm.jconfirm-light .jconfirm-box { + -webkit-box-shadow: 0 2px 6px rgba(0, 0, 0, 0.5); + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.5); + border-radius: 5px; +} +.jconfirm.jconfirm-white .jconfirm-box .jconfirm-title-c .jconfirm-icon-c, +.jconfirm.jconfirm-light .jconfirm-box .jconfirm-title-c .jconfirm-icon-c { + margin-right: 8px; + margin-left: 0px; +} +.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons, +.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons { + float: right; +} +.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button, +.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button { + text-transform: uppercase; + font-size: 14px; + font-weight: bold; + text-shadow: none; +} +.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button.btn-default, +.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button.btn-default { + -webkit-box-shadow: none; + box-shadow: none; + color: #333; +} +.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button.btn-default:hover, +.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button.btn-default:hover { + background: #ddd; +} +.jconfirm.jconfirm-white.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c, +.jconfirm.jconfirm-light.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c { + margin-left: 8px; + margin-right: 0px; +} +.jconfirm.jconfirm-black .jconfirm-bg, +.jconfirm.jconfirm-dark .jconfirm-bg { + background-color: darkslategray; + opacity: .4; +} +.jconfirm.jconfirm-black .jconfirm-box, +.jconfirm.jconfirm-dark .jconfirm-box { + -webkit-box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2); + background: #444; + border-radius: 5px; + color: white; +} +.jconfirm.jconfirm-black .jconfirm-box .jconfirm-title-c .jconfirm-icon-c, +.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-title-c .jconfirm-icon-c { + margin-right: 8px; + margin-left: 0px; +} +.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons, +.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons { + float: right; +} +.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button, +.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button { + border: none; + background-image: none; + text-transform: uppercase; + font-size: 14px; + font-weight: bold; + text-shadow: none; + -webkit-transition: background .1s; + transition: background .1s; + color: white; +} +.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button.btn-default, +.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button.btn-default { + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; + background: none; +} +.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button.btn-default:hover, +.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button.btn-default:hover { + background: #666; +} +.jconfirm.jconfirm-black.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c, +.jconfirm.jconfirm-dark.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c { + margin-left: 8px; + margin-right: 0px; +} +.jconfirm .jconfirm-box.hilight.jconfirm-hilight-shake { + -webkit-animation: shake 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; + animation: shake 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +.jconfirm .jconfirm-box.hilight.jconfirm-hilight-glow { + -webkit-animation: glow 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; + animation: glow 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +@-webkit-keyframes shake { + 10%, + 90% { + -webkit-transform: translate3d(-2px, 0, 0); + transform: translate3d(-2px, 0, 0); + } + 20%, + 80% { + -webkit-transform: translate3d(4px, 0, 0); + transform: translate3d(4px, 0, 0); + } + 30%, + 50%, + 70% { + -webkit-transform: translate3d(-8px, 0, 0); + transform: translate3d(-8px, 0, 0); + } + 40%, + 60% { + -webkit-transform: translate3d(8px, 0, 0); + transform: translate3d(8px, 0, 0); + } +} +@keyframes shake { + 10%, + 90% { + -webkit-transform: translate3d(-2px, 0, 0); + transform: translate3d(-2px, 0, 0); + } + 20%, + 80% { + -webkit-transform: translate3d(4px, 0, 0); + transform: translate3d(4px, 0, 0); + } + 30%, + 50%, + 70% { + -webkit-transform: translate3d(-8px, 0, 0); + transform: translate3d(-8px, 0, 0); + } + 40%, + 60% { + -webkit-transform: translate3d(8px, 0, 0); + transform: translate3d(8px, 0, 0); + } +} +@-webkit-keyframes glow { + 0%, + 100% { + -webkit-box-shadow: 0 0 0px red; + box-shadow: 0 0 0px red; + } + 50% { + -webkit-box-shadow: 0 0 30px red; + box-shadow: 0 0 30px red; + } +} +@keyframes glow { + 0%, + 100% { + -webkit-box-shadow: 0 0 0px red; + box-shadow: 0 0 0px red; + } + 50% { + -webkit-box-shadow: 0 0 30px red; + box-shadow: 0 0 30px red; + } +} +/*Transition rules*/ +.jconfirm { + -webkit-perspective: 400px; + perspective: 400px; +} +.jconfirm .jconfirm-box { + opacity: 1; + -webkit-transition-property: all; + transition-property: all; +} +.jconfirm .jconfirm-box.jconfirm-animation-top, +.jconfirm .jconfirm-box.jconfirm-animation-left, +.jconfirm .jconfirm-box.jconfirm-animation-right, +.jconfirm .jconfirm-box.jconfirm-animation-bottom, +.jconfirm .jconfirm-box.jconfirm-animation-opacity, +.jconfirm .jconfirm-box.jconfirm-animation-zoom, +.jconfirm .jconfirm-box.jconfirm-animation-scale, +.jconfirm .jconfirm-box.jconfirm-animation-none, +.jconfirm .jconfirm-box.jconfirm-animation-rotate, +.jconfirm .jconfirm-box.jconfirm-animation-rotatex, +.jconfirm .jconfirm-box.jconfirm-animation-rotatey, +.jconfirm .jconfirm-box.jconfirm-animation-scaley, +.jconfirm .jconfirm-box.jconfirm-animation-scalex { + opacity: 0; +} +.jconfirm .jconfirm-box.jconfirm-animation-rotate { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); +} +.jconfirm .jconfirm-box.jconfirm-animation-rotatex { + -webkit-transform: rotateX(90deg); + transform: rotateX(90deg); + -webkit-transform-origin: center; + transform-origin: center; +} +.jconfirm .jconfirm-box.jconfirm-animation-rotatexr { + -webkit-transform: rotateX(-90deg); + transform: rotateX(-90deg); + -webkit-transform-origin: center; + transform-origin: center; +} +.jconfirm .jconfirm-box.jconfirm-animation-rotatey { + -webkit-transform: rotatey(90deg); + transform: rotatey(90deg); + -webkit-transform-origin: center; + transform-origin: center; +} +.jconfirm .jconfirm-box.jconfirm-animation-rotateyr { + -webkit-transform: rotatey(-90deg); + transform: rotatey(-90deg); + -webkit-transform-origin: center; + transform-origin: center; +} +.jconfirm .jconfirm-box.jconfirm-animation-scaley { + -webkit-transform: scaley(1.5); + transform: scaley(1.5); + -webkit-transform-origin: center; + transform-origin: center; +} +.jconfirm .jconfirm-box.jconfirm-animation-scalex { + -webkit-transform: scalex(1.5); + transform: scalex(1.5); + -webkit-transform-origin: center; + transform-origin: center; +} +.jconfirm .jconfirm-box.jconfirm-animation-top { + -webkit-transform: translate(0px, -100px); + transform: translate(0px, -100px); +} +.jconfirm .jconfirm-box.jconfirm-animation-left { + -webkit-transform: translate(-100px, 0px); + transform: translate(-100px, 0px); +} +.jconfirm .jconfirm-box.jconfirm-animation-right { + -webkit-transform: translate(100px, 0px); + transform: translate(100px, 0px); +} +.jconfirm .jconfirm-box.jconfirm-animation-bottom { + -webkit-transform: translate(0px, 100px); + transform: translate(0px, 100px); +} +.jconfirm .jconfirm-box.jconfirm-animation-zoom { + -webkit-transform: scale(1.2); + transform: scale(1.2); +} +.jconfirm .jconfirm-box.jconfirm-animation-scale { + -webkit-transform: scale(0.5); + transform: scale(0.5); +} +.jconfirm .jconfirm-box.jconfirm-animation-none { + visibility: hidden; +} +.jconfirm.jconfirm-supervan .jconfirm-bg { + background-color: rgba(54, 70, 93, 0.95); +} +.jconfirm.jconfirm-supervan .jconfirm-box { + background-color: transparent; +} +.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-blue { + border: none; +} +.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-green { + border: none; +} +.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-red { + border: none; +} +.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-orange { + border: none; +} +.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-purple { + border: none; +} +.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-dark { + border: none; +} +.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-closeIcon { + color: white; +} +.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c { + text-align: center; + color: white; + font-size: 28px; + font-weight: normal; +} +.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c > * { + padding-bottom: 25px; +} +.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c { + margin-right: 8px; + margin-left: 0px; +} +.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-content-pane { + margin-bottom: 25px; +} +.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-content { + text-align: center; + color: white; +} +.jconfirm.jconfirm-supervan .jconfirm-box .jconfirm-buttons { + text-align: center; +} +.jconfirm.jconfirm-supervan .jconfirm-box .jconfirm-buttons button { + font-size: 16px; + border-radius: 2px; + background: #303f53; + text-shadow: none; + border: none; + color: white; + padding: 10px; + min-width: 100px; +} +.jconfirm.jconfirm-supervan.jconfirm-rtl .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c { + margin-left: 8px; + margin-right: 0px; +} +.jconfirm.jconfirm-material .jconfirm-bg { + background-color: rgba(0, 0, 0, 0.67); +} +.jconfirm.jconfirm-material .jconfirm-box { + background-color: white; + -webkit-box-shadow: 0 7px 8px -4px rgba(0, 0, 0, 0.2), 0 13px 19px 2px rgba(0, 0, 0, 0.14), 0 5px 24px 4px rgba(0, 0, 0, 0.12); + box-shadow: 0 7px 8px -4px rgba(0, 0, 0, 0.2), 0 13px 19px 2px rgba(0, 0, 0, 0.14), 0 5px 24px 4px rgba(0, 0, 0, 0.12); + padding: 30px 25px 10px 25px; +} +.jconfirm.jconfirm-material .jconfirm-box .jconfirm-title-c .jconfirm-icon-c { + margin-right: 8px; + margin-left: 0px; +} +.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-closeIcon { + color: rgba(0, 0, 0, 0.87); +} +.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-title-c { + color: rgba(0, 0, 0, 0.87); + font-size: 22px; + font-weight: bold; +} +.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-content { + color: rgba(0, 0, 0, 0.87); +} +.jconfirm.jconfirm-material .jconfirm-box .jconfirm-buttons { + text-align: right; +} +.jconfirm.jconfirm-material .jconfirm-box .jconfirm-buttons button { + text-transform: uppercase; + font-weight: 500; +} +.jconfirm.jconfirm-material.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c { + margin-left: 8px; + margin-right: 0px; +} +.jconfirm.jconfirm-bootstrap .jconfirm-bg { + background-color: rgba(0, 0, 0, 0.21); +} +.jconfirm.jconfirm-bootstrap .jconfirm-box { + background-color: white; + -webkit-box-shadow: 0 3px 8px 0px rgba(0, 0, 0, 0.2); + box-shadow: 0 3px 8px 0px rgba(0, 0, 0, 0.2); + border: solid 1px rgba(0, 0, 0, 0.4); + padding: 15px 0 0; +} +.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-title-c .jconfirm-icon-c { + margin-right: 8px; + margin-left: 0px; +} +.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-closeIcon { + color: rgba(0, 0, 0, 0.87); +} +.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-title-c { + color: rgba(0, 0, 0, 0.87); + font-size: 22px; + font-weight: bold; + padding-left: 15px; + padding-right: 15px; +} +.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-content { + color: rgba(0, 0, 0, 0.87); + padding: 0px 15px; +} +.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-buttons { + text-align: right; + padding: 10px; + margin: -5px 0 0px; + border-top: solid 1px #ddd; + overflow: hidden; + border-radius: 0 0 4px 4px; +} +.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-buttons button { + font-weight: 500; +} +.jconfirm.jconfirm-bootstrap.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c { + margin-left: 8px; + margin-right: 0px; +} +.jconfirm.jconfirm-modern .jconfirm-bg { + background-color: slategray; + opacity: .6; +} +.jconfirm.jconfirm-modern .jconfirm-box { + background-color: white; + -webkit-box-shadow: 0 7px 8px -4px rgba(0, 0, 0, 0.2), 0 13px 19px 2px rgba(0, 0, 0, 0.14), 0 5px 24px 4px rgba(0, 0, 0, 0.12); + box-shadow: 0 7px 8px -4px rgba(0, 0, 0, 0.2), 0 13px 19px 2px rgba(0, 0, 0, 0.14), 0 5px 24px 4px rgba(0, 0, 0, 0.12); + padding: 30px 30px 15px; +} +.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-closeIcon { + color: rgba(0, 0, 0, 0.87); + top: 15px; + right: 15px; +} +.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-title-c { + color: rgba(0, 0, 0, 0.87); + font-size: 24px; + font-weight: bold; + text-align: center; + margin-bottom: 10px; +} +.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c { + -webkit-transition: -webkit-transform .5s; + transition: -webkit-transform .5s; + transition: transform .5s; + transition: transform .5s, -webkit-transform .5s; + -webkit-transform: scale(0); + transform: scale(0); + display: block; + margin-right: 0px; + margin-left: 0px; + margin-bottom: 10px; + font-size: 69px; + color: #aaa; +} +.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-content { + text-align: center; + font-size: 15px; + color: #777; + margin-bottom: 25px; +} +.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons { + text-align: center; +} +.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons button { + font-weight: bold; + text-transform: uppercase; + -webkit-transition: background .1s; + transition: background .1s; + padding: 10px 20px; +} +.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons button + button { + margin-left: 4px; +} +.jconfirm.jconfirm-modern.jconfirm-open .jconfirm-box .jconfirm-title-c .jconfirm-icon-c { + -webkit-transform: scale(1); + transform: scale(1); +} diff --git a/public/assets/prototype/css/jquery-confirm.min.css b/public/assets/prototype/css/jquery-confirm.min.css new file mode 100644 index 0000000..c50503a --- /dev/null +++ b/public/assets/prototype/css/jquery-confirm.min.css @@ -0,0 +1,9 @@ +/*! + * jquery-confirm v3.3.0 (http://craftpip.github.io/jquery-confirm/) + * Author: boniface pereira + * Website: www.craftpip.com + * Contact: hey@craftpip.com + * + * Copyright 2013-2017 jquery-confirm + * Licensed under MIT (https://github.com/craftpip/jquery-confirm/blob/master/LICENSE) + */@-webkit-keyframes jconfirm-spin{from{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes jconfirm-spin{from{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}body[class*=jconfirm-no-scroll-]{overflow:hidden!important}.jconfirm{position:fixed;top:0;left:0;right:0;bottom:0;z-index:99999999;font-family:inherit;overflow:hidden}.jconfirm .jconfirm-bg{position:fixed;top:0;left:0;right:0;bottom:0;-webkit-transition:opacity .4s;transition:opacity .4s}.jconfirm .jconfirm-bg.jconfirm-bg-h{opacity:0!important}.jconfirm .jconfirm-scrollpane{-webkit-perspective:500px;perspective:500px;-webkit-perspective-origin:center;perspective-origin:center;display:table;width:100%;height:100%}.jconfirm .jconfirm-row{display:table-row;width:100%}.jconfirm .jconfirm-cell{display:table-cell;vertical-align:middle}.jconfirm .jconfirm-holder{max-height:100%;padding:50px 0}.jconfirm .jconfirm-box-container{-webkit-transition:-webkit-transform;transition:-webkit-transform;transition:transform;transition:transform,-webkit-transform}.jconfirm .jconfirm-box-container.jconfirm-no-transition{-webkit-transition:none!important;transition:none!important}.jconfirm .jconfirm-box{background:white;border-radius:4px;position:relative;outline:0;padding:15px 15px 0;overflow:hidden;margin-left:auto;margin-right:auto}@-webkit-keyframes type-blue{1%,100%{border-color:#3498db}50%{border-color:#5faee3}}@keyframes type-blue{1%,100%{border-color:#3498db}50%{border-color:#5faee3}}@-webkit-keyframes type-green{1%,100%{border-color:#2ecc71}50%{border-color:#54d98c}}@keyframes type-green{1%,100%{border-color:#2ecc71}50%{border-color:#54d98c}}@-webkit-keyframes type-red{1%,100%{border-color:#e74c3c}50%{border-color:#ed7669}}@keyframes type-red{1%,100%{border-color:#e74c3c}50%{border-color:#ed7669}}@-webkit-keyframes type-orange{1%,100%{border-color:#f1c40f}50%{border-color:#f4d03f}}@keyframes type-orange{1%,100%{border-color:#f1c40f}50%{border-color:#f4d03f}}@-webkit-keyframes type-purple{1%,100%{border-color:#9b59b6}50%{border-color:#b07cc6}}@keyframes type-purple{1%,100%{border-color:#9b59b6}50%{border-color:#b07cc6}}@-webkit-keyframes type-dark{1%,100%{border-color:#34495e}50%{border-color:#46627f}}@keyframes type-dark{1%,100%{border-color:#34495e}50%{border-color:#46627f}}.jconfirm .jconfirm-box.jconfirm-type-animated{-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.jconfirm .jconfirm-box.jconfirm-type-blue{border-top:solid 7px #3498db;-webkit-animation-name:type-blue;animation-name:type-blue}.jconfirm .jconfirm-box.jconfirm-type-green{border-top:solid 7px #2ecc71;-webkit-animation-name:type-green;animation-name:type-green}.jconfirm .jconfirm-box.jconfirm-type-red{border-top:solid 7px #e74c3c;-webkit-animation-name:type-red;animation-name:type-red}.jconfirm .jconfirm-box.jconfirm-type-orange{border-top:solid 7px #f1c40f;-webkit-animation-name:type-orange;animation-name:type-orange}.jconfirm .jconfirm-box.jconfirm-type-purple{border-top:solid 7px #9b59b6;-webkit-animation-name:type-purple;animation-name:type-purple}.jconfirm .jconfirm-box.jconfirm-type-dark{border-top:solid 7px #34495e;-webkit-animation-name:type-dark;animation-name:type-dark}.jconfirm .jconfirm-box.loading{height:120px}.jconfirm .jconfirm-box.loading:before{content:'';position:absolute;left:0;background:white;right:0;top:0;bottom:0;border-radius:10px;z-index:1}.jconfirm .jconfirm-box.loading:after{opacity:.6;content:'';height:30px;width:30px;border:solid 3px transparent;position:absolute;left:50%;margin-left:-15px;border-radius:50%;-webkit-animation:jconfirm-spin 1s infinite linear;animation:jconfirm-spin 1s infinite linear;border-bottom-color:dodgerblue;top:50%;margin-top:-15px;z-index:2}.jconfirm .jconfirm-box div.jconfirm-closeIcon{height:20px;width:20px;position:absolute;top:10px;right:10px;cursor:pointer;opacity:.6;text-align:center;font-size:27px!important;line-height:14px!important;display:none;z-index:1}.jconfirm .jconfirm-box div.jconfirm-closeIcon:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-closeIcon .fa{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon .glyphicon{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon .zmdi{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon:hover{opacity:1}.jconfirm .jconfirm-box div.jconfirm-title-c{display:block;font-size:22px;line-height:20px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;padding-bottom:15px}.jconfirm .jconfirm-box div.jconfirm-title-c.jconfirm-hand{cursor:move}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{font-size:inherit;display:inline-block;vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c i{vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:inherit;font-family:inherit;display:inline-block;vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-content-pane{margin-bottom:15px;height:auto;-webkit-transition:height .4s ease-in;transition:height .4s ease-in;display:inline-block;width:100%;position:relative;overflow-x:hidden;overflow-y:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane.no-scroll{overflow-y:hidden}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar{width:3px}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar-track{background:rgba(0,0,0,0.1)}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar-thumb{background:#666;border-radius:3px}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content{overflow:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content img{max-width:100%;height:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content:empty{display:none}.jconfirm .jconfirm-box .jconfirm-buttons{padding-bottom:11px}.jconfirm .jconfirm-box .jconfirm-buttons>button{margin-bottom:4px;margin-left:2px;margin-right:2px}.jconfirm .jconfirm-box .jconfirm-buttons button{display:inline-block;padding:6px 12px;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-radius:4px;min-height:1em;-webkit-transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease,-webkit-box-shadow .1s ease;-webkit-tap-highlight-color:transparent;border:0;background-image:none}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-blue{background-color:#3498db;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-blue:hover{background-color:#2980b9;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-green{background-color:#2ecc71;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-green:hover{background-color:#27ae60;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-red{background-color:#e74c3c;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-red:hover{background-color:#c0392b;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-orange{background-color:#f1c40f;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-orange:hover{background-color:#f39c12;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-default{background-color:#ecf0f1;color:#000;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-default:hover{background-color:#bdc3c7;color:#000}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-purple{background-color:#9b59b6;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-purple:hover{background-color:#8e44ad;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-dark{background-color:#34495e;color:#FFF;text-shadow:none;-webkit-transition:background .2s;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-dark:hover{background-color:#2c3e50;color:#FFF}.jconfirm .jconfirm-box.jconfirm-type-red .jconfirm-title-c .jconfirm-icon-c{color:#e74c3c!important}.jconfirm .jconfirm-box.jconfirm-type-blue .jconfirm-title-c .jconfirm-icon-c{color:#3498db!important}.jconfirm .jconfirm-box.jconfirm-type-green .jconfirm-title-c .jconfirm-icon-c{color:#2ecc71!important}.jconfirm .jconfirm-box.jconfirm-type-purple .jconfirm-title-c .jconfirm-icon-c{color:#9b59b6!important}.jconfirm .jconfirm-box.jconfirm-type-orange .jconfirm-title-c .jconfirm-icon-c{color:#f1c40f!important}.jconfirm .jconfirm-box.jconfirm-type-dark .jconfirm-title-c .jconfirm-icon-c{color:#34495e!important}.jconfirm .jconfirm-clear{clear:both}.jconfirm.jconfirm-rtl{direction:rtl}.jconfirm.jconfirm-rtl div.jconfirm-closeIcon{left:5px;right:auto}.jconfirm.jconfirm-white .jconfirm-bg,.jconfirm.jconfirm-light .jconfirm-bg{background-color:#444;opacity:.2}.jconfirm.jconfirm-white .jconfirm-box,.jconfirm.jconfirm-light .jconfirm-box{-webkit-box-shadow:0 2px 6px rgba(0,0,0,0.2);box-shadow:0 2px 6px rgba(0,0,0,0.2);border-radius:5px}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons{float:right}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button{text-transform:uppercase;font-size:14px;font-weight:bold;text-shadow:none}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button.btn-default,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button.btn-default{-webkit-box-shadow:none;box-shadow:none;color:#333}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button.btn-default:hover,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button.btn-default:hover{background:#ddd}.jconfirm.jconfirm-white.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-light.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-black .jconfirm-bg,.jconfirm.jconfirm-dark .jconfirm-bg{background-color:darkslategray;opacity:.4}.jconfirm.jconfirm-black .jconfirm-box,.jconfirm.jconfirm-dark .jconfirm-box{-webkit-box-shadow:0 2px 6px rgba(0,0,0,0.2);box-shadow:0 2px 6px rgba(0,0,0,0.2);background:#444;border-radius:5px;color:white}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons{float:right}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button{border:0;background-image:none;text-transform:uppercase;font-size:14px;font-weight:bold;text-shadow:none;-webkit-transition:background .1s;transition:background .1s;color:white}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button.btn-default,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button.btn-default{-webkit-box-shadow:none;box-shadow:none;color:#fff;background:0}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button.btn-default:hover,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button.btn-default:hover{background:#666}.jconfirm.jconfirm-black.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-dark.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm .jconfirm-box.hilight.jconfirm-hilight-shake{-webkit-animation:shake .82s cubic-bezier(0.36,0.07,0.19,0.97) both;animation:shake .82s cubic-bezier(0.36,0.07,0.19,0.97) both;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.jconfirm .jconfirm-box.hilight.jconfirm-hilight-glow{-webkit-animation:glow .82s cubic-bezier(0.36,0.07,0.19,0.97) both;animation:glow .82s cubic-bezier(0.36,0.07,0.19,0.97) both;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-webkit-keyframes shake{10%,90%{-webkit-transform:translate3d(-2px,0,0);transform:translate3d(-2px,0,0)}20%,80%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-8px,0,0);transform:translate3d(-8px,0,0)}40%,60%{-webkit-transform:translate3d(8px,0,0);transform:translate3d(8px,0,0)}}@keyframes shake{10%,90%{-webkit-transform:translate3d(-2px,0,0);transform:translate3d(-2px,0,0)}20%,80%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-8px,0,0);transform:translate3d(-8px,0,0)}40%,60%{-webkit-transform:translate3d(8px,0,0);transform:translate3d(8px,0,0)}}@-webkit-keyframes glow{0%,100%{-webkit-box-shadow:0 0 0 red;box-shadow:0 0 0 red}50%{-webkit-box-shadow:0 0 30px red;box-shadow:0 0 30px red}}@keyframes glow{0%,100%{-webkit-box-shadow:0 0 0 red;box-shadow:0 0 0 red}50%{-webkit-box-shadow:0 0 30px red;box-shadow:0 0 30px red}}.jconfirm{-webkit-perspective:400px;perspective:400px}.jconfirm .jconfirm-box{opacity:1;-webkit-transition-property:all;transition-property:all}.jconfirm .jconfirm-box.jconfirm-animation-top,.jconfirm .jconfirm-box.jconfirm-animation-left,.jconfirm .jconfirm-box.jconfirm-animation-right,.jconfirm .jconfirm-box.jconfirm-animation-bottom,.jconfirm .jconfirm-box.jconfirm-animation-opacity,.jconfirm .jconfirm-box.jconfirm-animation-zoom,.jconfirm .jconfirm-box.jconfirm-animation-scale,.jconfirm .jconfirm-box.jconfirm-animation-none,.jconfirm .jconfirm-box.jconfirm-animation-rotate,.jconfirm .jconfirm-box.jconfirm-animation-rotatex,.jconfirm .jconfirm-box.jconfirm-animation-rotatey,.jconfirm .jconfirm-box.jconfirm-animation-scaley,.jconfirm .jconfirm-box.jconfirm-animation-scalex{opacity:0}.jconfirm .jconfirm-box.jconfirm-animation-rotate{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.jconfirm .jconfirm-box.jconfirm-animation-rotatex{-webkit-transform:rotateX(90deg);transform:rotateX(90deg);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotatexr{-webkit-transform:rotateX(-90deg);transform:rotateX(-90deg);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotatey{-webkit-transform:rotatey(90deg);transform:rotatey(90deg);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotateyr{-webkit-transform:rotatey(-90deg);transform:rotatey(-90deg);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-scaley{-webkit-transform:scaley(1.5);transform:scaley(1.5);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-scalex{-webkit-transform:scalex(1.5);transform:scalex(1.5);-webkit-transform-origin:center;transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-top{-webkit-transform:translate(0px,-100px);transform:translate(0px,-100px)}.jconfirm .jconfirm-box.jconfirm-animation-left{-webkit-transform:translate(-100px,0px);transform:translate(-100px,0px)}.jconfirm .jconfirm-box.jconfirm-animation-right{-webkit-transform:translate(100px,0px);transform:translate(100px,0px)}.jconfirm .jconfirm-box.jconfirm-animation-bottom{-webkit-transform:translate(0px,100px);transform:translate(0px,100px)}.jconfirm .jconfirm-box.jconfirm-animation-zoom{-webkit-transform:scale(1.2);transform:scale(1.2)}.jconfirm .jconfirm-box.jconfirm-animation-scale{-webkit-transform:scale(0.5);transform:scale(0.5)}.jconfirm .jconfirm-box.jconfirm-animation-none{visibility:hidden}.jconfirm.jconfirm-supervan .jconfirm-bg{background-color:rgba(54,70,93,0.95)}.jconfirm.jconfirm-supervan .jconfirm-box{background-color:transparent}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-blue{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-green{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-red{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-orange{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-purple{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-dark{border:0}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-closeIcon{color:white}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c{text-align:center;color:white;font-size:28px;font-weight:normal}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c>*{padding-bottom:25px}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-content-pane{margin-bottom:25px}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-content{text-align:center;color:white}.jconfirm.jconfirm-supervan .jconfirm-box .jconfirm-buttons{text-align:center}.jconfirm.jconfirm-supervan .jconfirm-box .jconfirm-buttons button{font-size:16px;border-radius:2px;background:#303f53;text-shadow:none;border:0;color:white;padding:10px;min-width:100px}.jconfirm.jconfirm-supervan.jconfirm-rtl .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-material .jconfirm-bg{background-color:rgba(0,0,0,0.67)}.jconfirm.jconfirm-material .jconfirm-box{background-color:white;-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,0.2),0 13px 19px 2px rgba(0,0,0,0.14),0 5px 24px 4px rgba(0,0,0,0.12);box-shadow:0 7px 8px -4px rgba(0,0,0,0.2),0 13px 19px 2px rgba(0,0,0,0.14),0 5px 24px 4px rgba(0,0,0,0.12);padding:30px 25px 10px 25px}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,0.87)}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,0.87);font-size:22px;font-weight:bold}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-content{color:rgba(0,0,0,0.87)}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-buttons{text-align:right}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-buttons button{text-transform:uppercase;font-weight:500}.jconfirm.jconfirm-material.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-bootstrap .jconfirm-bg{background-color:rgba(0,0,0,0.21)}.jconfirm.jconfirm-bootstrap .jconfirm-box{background-color:white;-webkit-box-shadow:0 3px 8px 0 rgba(0,0,0,0.2);box-shadow:0 3px 8px 0 rgba(0,0,0,0.2);border:solid 1px rgba(0,0,0,0.4);padding:15px 0 0}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,0.87)}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,0.87);font-size:22px;font-weight:bold;padding-left:15px;padding-right:15px}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-content{color:rgba(0,0,0,0.87);padding:0 15px}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-buttons{text-align:right;padding:10px;margin:-5px 0 0;border-top:solid 1px #ddd;overflow:hidden;border-radius:0 0 4px 4px}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-buttons button{font-weight:500}.jconfirm.jconfirm-bootstrap.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-modern .jconfirm-bg{background-color:slategray;opacity:.6}.jconfirm.jconfirm-modern .jconfirm-box{background-color:white;-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,0.2),0 13px 19px 2px rgba(0,0,0,0.14),0 5px 24px 4px rgba(0,0,0,0.12);box-shadow:0 7px 8px -4px rgba(0,0,0,0.2),0 13px 19px 2px rgba(0,0,0,0.14),0 5px 24px 4px rgba(0,0,0,0.12);padding:30px 30px 15px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,0.87);top:15px;right:15px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,0.87);font-size:24px;font-weight:bold;text-align:center;margin-bottom:10px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{-webkit-transition:-webkit-transform .5s;transition:-webkit-transform .5s;transition:transform .5s;transition:transform .5s,-webkit-transform .5s;-webkit-transform:scale(0);transform:scale(0);display:block;margin-right:0;margin-left:0;margin-bottom:10px;font-size:69px;color:#aaa}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-content{text-align:center;font-size:15px;color:#777;margin-bottom:25px}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons{text-align:center}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons button{font-weight:bold;text-transform:uppercase;-webkit-transition:background .1s;transition:background .1s;padding:10px 20px}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons button+button{margin-left:4px}.jconfirm.jconfirm-modern.jconfirm-open .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{-webkit-transform:scale(1);transform:scale(1)} \ No newline at end of file diff --git a/public/assets/prototype/css/jquery.toast.css b/public/assets/prototype/css/jquery.toast.css new file mode 100644 index 0000000..54ddf67 --- /dev/null +++ b/public/assets/prototype/css/jquery.toast.css @@ -0,0 +1,28 @@ +/** + * jQuery toast plugin created by Kamran Ahmed copyright MIT license 2014 + */ +.jq-toast-wrap { display: block; position: fixed; width: 250px; pointer-events: none !important; margin: 0; padding: 0; letter-spacing: normal; z-index: 9000 !important; } +.jq-toast-wrap * { margin: 0; padding: 0; } + +.jq-toast-wrap.bottom-left { bottom: 20px; left: 20px; } +.jq-toast-wrap.bottom-right { bottom: 20px; right: 40px; } +.jq-toast-wrap.top-left { top: 20px; left: 20px; } +.jq-toast-wrap.top-right { top: 20px; right: 40px; } + +.jq-toast-single { display: block; width: 100%; padding: 10px; margin: 0px 0px 5px; border-radius: 4px; font-size: 12px; font-family: arial, sans-serif; line-height: 17px; position: relative; pointer-events: all !important; background-color: #444444; color: white; } + +.jq-toast-single h2 { font-family: arial, sans-serif; font-size: 14px; margin: 0px 0px 7px; background: none; color: inherit; line-height: inherit; letter-spacing: normal; } +.jq-toast-single a { color: #eee; text-decoration: none; font-weight: bold; border-bottom: 1px solid white; padding-bottom: 3px; font-size: 12px; } + +.jq-toast-single ul { margin: 0px 0px 0px 15px; background: none; padding:0px; } +.jq-toast-single ul li { list-style-type: disc !important; line-height: 17px; background: none; margin: 0; padding: 0; letter-spacing: normal; } + +.close-jq-toast-single { position: absolute; top: 3px; right: 7px; font-size: 14px; cursor: pointer; } + +.jq-toast-loader { display: block; position: absolute; top: -2px; height: 5px; width: 0%; left: 0; border-radius: 5px; background: red; } +.jq-toast-loaded { width: 100%; } +.jq-has-icon { padding: 10px 10px 10px 50px; background-repeat: no-repeat; background-position: 10px; } +.jq-icon-info { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII='); background-color: #31708f; color: #d9edf7; border-color: #bce8f1; } +.jq-icon-warning { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII='); background-color: #8a6d3b; color: #fcf8e3; border-color: #faebcc; } +.jq-icon-error { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII='); background-color: #a94442; color: #f2dede; border-color: #ebccd1; } +.jq-icon-success { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg=='); color: #dff0d8; background-color: #3c763d; border-color: #d6e9c6; } \ No newline at end of file diff --git a/public/assets/prototype/css/jquery.toast.min.css b/public/assets/prototype/css/jquery.toast.min.css new file mode 100644 index 0000000..cd7a293 --- /dev/null +++ b/public/assets/prototype/css/jquery.toast.min.css @@ -0,0 +1 @@ +.jq-toast-wrap,.jq-toast-wrap *{margin:0;padding:0}.jq-toast-wrap{display:block;position:fixed;width:250px;pointer-events:none!important;letter-spacing:normal;z-index:9000!important}.jq-toast-wrap.bottom-left{bottom:20px;left:20px}.jq-toast-wrap.bottom-right{bottom:20px;right:40px}.jq-toast-wrap.top-left{top:20px;left:20px}.jq-toast-wrap.top-right{top:20px;right:40px}.jq-toast-single{display:block;width:100%;padding:10px;margin:0 0 5px;border-radius:4px;font-size:12px;font-family:arial,sans-serif;line-height:17px;position:relative;pointer-events:all!important;background-color:#444;color:#fff}.jq-toast-single h2{font-family:arial,sans-serif;font-size:14px;margin:0 0 7px;background:0 0;color:inherit;line-height:inherit;letter-spacing:normal}.jq-toast-single a{color:#eee;text-decoration:none;font-weight:700;border-bottom:1px solid #fff;padding-bottom:3px;font-size:12px}.jq-toast-single ul{margin:0 0 0 15px;background:0 0;padding:0}.jq-toast-single ul li{list-style-type:disc!important;line-height:17px;background:0 0;margin:0;padding:0;letter-spacing:normal}.close-jq-toast-single{position:absolute;top:3px;right:7px;font-size:14px;cursor:pointer}.jq-toast-loader{display:block;position:absolute;top:-2px;height:5px;width:0;left:0;border-radius:5px;background:red}.jq-toast-loaded{width:100%}.jq-has-icon{padding:10px 10px 10px 50px;background-repeat:no-repeat;background-position:10px}.jq-icon-info{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=);background-color:#31708f;color:#d9edf7;border-color:#bce8f1}.jq-icon-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=);background-color:#8a6d3b;color:#fcf8e3;border-color:#faebcc}.jq-icon-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=);background-color:#a94442;color:#f2dede;border-color:#ebccd1}.jq-icon-success{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==);color:#dff0d8;background-color:#3c763d;border-color:#d6e9c6} \ No newline at end of file diff --git a/public/assets/prototype/css/main.css b/public/assets/prototype/css/main.css new file mode 100644 index 0000000..51adb82 --- /dev/null +++ b/public/assets/prototype/css/main.css @@ -0,0 +1,565 @@ +@import url(https://fonts.googleapis.com/css?family=Roboto:400,500,700,900);html{} +body{background:#D2D2C7; background: #EAEDED; background: #d4d4d4; font-size:14px;font-family:'Roboto', sans-serif!important; overflow-y: hidden;} +.dotLine{} +.ui.message.content{font-family:'Roboto', sans-serif!important;} +.ui.fluid.container{width:100%!important;} +.ui.table{font-size:15px;} +.ui.padded.table td, .ui.padded.table th{padding:0.91em;} +.ps-container > .ps-scrollbar-y-rail > .ps-scrollbar-y{position:absolute;background-color:#888;-webkit-border-radius:0px;-moz-border-radius:0px;border-radius:0px;-webkit-transition:background-color .2s linear;-moz-transition:background-color .2s linear;-o-transition:background-color .2s linear;transition:background-color .2s linear;right:0px;width:9px;} +.stabs{left:0px;margin:13px 0px 0px 14px;width:96%;} +.ui.segment[class*="bottom attached"]{border-radius:0px;} +.ui.top.attached.menu>.item:first-child{border-radius:0px!important;} +.ui.inverted.menu .active.item{background:rgba(255,255,255,.15);color:#fff!important;font-weight:800;} +.ui.menu>.item:first-child{border-radius:0px; padding-left: 15px;} +.ui.form .field>label{display:block;margin:0 0 .28571429rem;color:rgb(51, 51, 51);font-weight:800;text-transform:none;font-size:14px;} +.ui.menu .item>.input input{font-size:14px;font-weight:600;font-family:'Roboto', sans-serif;border-radius:0px;} +.ui.table td:first-child{padding-left:15px!important;} +.ui.table thead td:first-child{border-top:none;padding-left:15px!important;} +.ui.table thead tr:first-child>th:first-child{border-radius:0px;padding-left:15px;} +.leftMenu div span{display:inline-block;-webkit-transition:none;transition:none;font-weight:800!important;} +.ui.dropdown>.text{display:inline-block;-webkit-transition:none;transition:none;font-weight:normal;} +.ui.table thead th{cursor:auto;background:#f9fafb;text-align:inherit;color:#333;vertical-align:inherit;font-weight:800;text-transform:none;border-bottom:none!important;border-left:none;} +.main-ui{width:100%;z-index:1;padding-top:15px;} +#main-container-left-body{position:relative;overflow:auto;padding:0px;padding:0px 0px 0px 0px;} +.table{border:none;} +.table tr{cursor:pointer;} +.ui.dropdown>.dropdown.icon{position:relative;margin:0.2em 0 0 0.6em;} +.ui.dropdown>.dropdown.icon{font-family:Dropdown;line-height:1;height:1em;-webkit-backface-visibility:hidden;backface-visibility:hidden;font-weight:600;font-style:normal;text-align:center;width:auto;} +/*.tabHeight{margin-top:-10px;}*/ +.ui.top.attached.header{font-family:'Roboto', sans-serif;background:#1B1C1D;color:#E1E1E1;font-weight:800;border-radius:0px;height:44px;} +.ui.inverted.menu{border:0px;background:#1b1c1d;box-shadow:none;border-radius:0px;} +.ui.menu{font-family:'Roboto', sans-serif;} +.ui.menu .item{position:relative;vertical-align:middle;line-height:1em;text-decoration:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:0 0;text-transform:none;color:rgba(0,0,0,.87);font-weight:400;-webkit-transition:background .1s ease,box-shadow .1s ease,color .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease;font-weight:800;font-size:1.04em!important;font-size:1.035em!important;} +.ui.bottom.attached.header{background:#1B1C1D;color:#e1e1e1;border-radius:0px;font-weight:600!important;font-size:1.015em;} +.ui.top.left.pointing.dropdown>.menu{top:100%;bottom:auto;left:0;right:auto;margin:0.7em 0 0;} +#sections.ui.top.left.pointing.dropdown>.menu:after{top:-.25em;left:0.2em;right:auto;margin:0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);} +.home.icon{font-size:1.2em;margin-left:-1px!important;margin-right:8px!important;} +.home.icon{font-size:1.2em;vertical-align:middle;margin-left:-1px!important;margin-right:4px!important;line-height:0.8em;} +.ui.inverted.menu .item, .ui.inverted.menu .item>a:not(.ui){background:#1b1c1d;color:#e1e1e1;} +.ui.inverted.menu .item:hover, .ui.inverted.menu .item>a:not(.ui){background:#2d2e2f!important;color:#f9fafb!important;} +.dividerRight{margin:23px 0px 8px 0px;border-top:1px solid #fff;border-bottom:1px solid #eee;} +.dividerRightAlt{margin:15px 0px 15px 0px;border-top:1px solid #fff;border-bottom:1px solid #e4e5e5;} +.ui.breadcrumb .active.section{font-weight:700;color:rgb(136, 136, 136);} +.segmentRight{box-shadow:none!important;margin-top:10px!important;padding-top:0px!important;padding-bottom:2px!important;background:rgb(249, 250, 251)!important;border:1px solid #eeeeee!important;} +.ui.table{font-size:1em;} +.ui.table{width:100%;background:#fff;margin:0;border:none;box-shadow:none;border-radius:0;text-align:left;color:#252525;border-collapse:separate;border-spacing:0;font-size:14px;} +#main-container-right-header>.ui.inverted.menu .active.item{background:rgba(255,255,255,.15);background:#F9FAFB!important;color:#333!important;padding-left:10px;font-weight:800;font-size:14px;} +#main-container-right-header> .ui.inverted.menu .active.item:hover{color:#333!important;} +.ui.form input:not([type]), .ui.form input[type=text], .ui.form input[type=email], .ui.form input[type=search], .ui.form input[type=password], .ui.form input[type=date], .ui.form input[type=datetime-local], .ui.form input[type=tel], .ui.form input[type=time], .ui.form input[type=url], .ui.form input[type=number]{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;margin:0;outline:0;-webkit-appearance:none;tap-highlight-color:rgba(255,255,255,0);line-height:1.2142em;padding:.67861429em 1em;font-size:1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);border-radius:.28571429rem;box-shadow:0 0 0 0 transparent inset;-webkit-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease;font-family:'Roboto', sans-serif!important;font-weight:normal;} +.ui.table tr.active:hover{box-shadow:0 0 0 rgba(0,0,0,.87) inset;background:#555;color:#fff!important;} +.ui.selectable.table tr.active:hover, .ui.selectable.table tr:hover td.active{} +.ui.table tr.active{background:#f3f3f3;text-shadow:none;color:#252525;-webkit-border-top-right-radius:5px;-webkit-border-bottom-right-radius:5px;-moz-border-radius-topright:5px;-moz-border-radius-bottomright:5px;border-top-right-radius:5px;border-bottom-right-radius:5px;font-weight:700!important;text-decoration:underline dotted red;} +.ui.table tr.active .statusText{text-decoration:none!important;border-bottom:1px dotted #999;} +.ui.striped.selectable.selectable.selectable.table tbody tr.active:hover{background:#f3f3f3!important;color:#252525!important;} +.last-td{padding-right:15px!important;} +.tenant_status_green{color:#029224;} +.tenant_status_orange{color:orange;} +.tenant_status_grey{color:grey;} +.tenant_status_red{color:red;} +.list-row.active > td:last-of-type{-webkit-border-top-right-radius:5px;-webkit-border-bottom-right-radius:5px;-moz-border-radius-topright:5px;-moz-border-radius-bottomright:5px;border-top-right-radius:5px;border-bottom-right-radius:5px;} +.ui.table thead tr>th{color:#888;text-shadow:0px 1px 0px white;cursor:default;} +#main-container-left-header .ui.menu .dropdown.item .menu{left:0;min-width:calc(100% - 1px);background:#1b1c1d;margin:0;box-shadow:0 1px 3px 0 rgba(0,0,0,.08);margin-top:12px;border-radius:5px;} +#main-container-left-header .ui.pointing.dropdown>.menu:after{display:block;position:absolute;pointer-events:none;content:'';visibility:visible;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:1em;height:1em;box-shadow:-1px -1px 0 1px rgba(0,0,0,.1);background:#1b1c1d;z-index:2;top:-.5em;left:18px;margin:0 0 0 -.25em;} +#main-container-left-header .ui.menu .ui.dropdown .menu>.item{margin:0;font-size:1em!important;padding:.71428571em 1.14285714em!important;color:rgb(255, 255, 255)!important;text-transform:none!important;font-weight:600!important;box-shadow:none!important;-webkit-transition:none!important;transition:none!important;text-align:center;text-align:left;} +#main-container-left-header .ui.menu .ui.dropdown .menu>.item:hover{background:#3d3e3f!important;} +#main-container-left-header .ui.menu .ui.dropdown .menu .active.item, +#main-container-left-header .ui.menu .ui.dropdown .menu .active.item:hover{background:#555!important;font-weight:600!important;} +#main-container-left-header .ui.dropdown .menu>.divider{border-top:none;height:0;margin:.18em 0;padding:1px 0px 0px 10px;} +#main-container-left-header .menu2{margin-left:10px !important;} +#main-container-left-header .menu2:after{display:block;position:absolute;pointer-events:none;content:'';visibility:visible;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);width:1em;height:1em;box-shadow:none!important;border:none!important;background:#1b1c1d!important;z-index:2!important;top:8px!important;left:-2px!important;margin:0 0 0 -.25em;} +.ui.inverted.popup{background:#1b1c1d;color:#fff;border:none;box-shadow:none;font-weight:800;margin-top:25px;} +.ui.empty.circular.label, .ui.empty.circular.labels .label{min-width:0;min-height:0;overflow:hidden;width:.7em;height:.7em;vertical-align:middle;margin-right:9px!important;} +.ui.loading.segment:after{position:fixed;content:'';top:53%;left:25%;margin:-1.5em 0 0 -1.5em;width:3em;height:3em;-webkit-animation:segment-spin .6s linear;animation:segment-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 rgba(0,0,0,.1) rgba(0,0,0,.1);border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent;visibility:visible;z-index:101;} +.ui.loading.segment:before{position:absolute;content:'';top:0;left:0;background:rgba(249, 250, 251, 0);width:100%;height:800%;border-radius:.28571429rem;z-index:100;} +.ticker{width:100%;margin:0px 0px 0px 5px;font-family:'Roboto', sans-serif;font-weight:400;cursor:default;} +.ticker div{display:inline-block;word-wrap:break-word;} +.always-visible.ps-container > .ps-scrollbar-x-rail, +.always-visible.ps-container > .ps-scrollbar-y-rail{opacity:0.6;} +.ui.menu .item>i.icon{opacity:.9;float:none;margin:0 .35714286em 0 0;margin-left:4px;} +.closeTab{ +cursor: pointer; + position: absolute; + right: 0px; + line-height: 2.9em; + padding-left: 12px; + padding-right: 2px; + padding-bottom: 23px; + } +.closeTab:hover{background:#2d2e2f!important;color:#f9fafb!important;} +.saved{color:#039024;} +#rightFixed{height:42px;background:#f9fafb;position:fixed;box-shadow:0px 1px 0px #e4e5e5;} + +/* +.ui.dimmer{display:none;position:absolute;top:0!important;left:0!important;width:100%;height:100%;text-align:center;vertical-align:top;background-color:rgba(0, 0, 0, 0.96);opacity:0;line-height:1;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-transition:background-color .2s linear;transition:background-color .2s linear;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;will-change:opacity;z-index:1000;} + +.ui.modal { + display: none; + position: absolute; + z-index: 1001; + top: 57px; + right: 20px; + width: 48.6%!important; + text-align: left; + background: #fff; + box-shadow: 1px 3px 3px 0 rgba(0,0,0,.2), 1px 3px 15px 2px rgba(0,0,0,.2); + -webkit-transform-origin: 50% 25%; + -ms-transform-origin: 50% 25%; + transform-origin: 50% 25%; + border-radius: 6px; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + will-change: top,left,margin,transform,opacity; +} +*/ + +.ui.large.input{font-size:1.11em;} +.ui.modal>.actions{background:#eeeeee;padding:1rem;border-top:1px solid rgba(34,36,38,.15);text-align:right;} +.saveSelect{width:60px;position:relative;float:right;margin:-41px -12px 0px 0px;} +.ui.comments .reply.form textarea{font-size:1em;height:6em;} +.ui.comments .comment .metadata{margin:0px 0px 4px 0px!important;font-size:0.822em;font-weight:600;color:#999;text-shadow:0px 1px 0px white;} +.ui.comments .comment .author{font-size:1.094em;font-weight:600;text-shadow:0px 1px 0px #f5f5f5;} +.ui.comments .comment .date{font-weight:400!important;color:#898989;font-size:1.089em;cursor:help;} +.noteDivider{margin-bottom:-4px!important;margin-top:12px!important;border-top:1px dotted #c2c2c2!important;border-bottom:1px dotted #fff!important;} +.ui.header .ui.label{font-size:'';margin-left:0.45rem;vertical-align:bottom;margin-top:-2px;line-height:0.7em;} +.ui.grey.labels .label, .ui.grey.label{background-color:#696969!important;border-color:#f9fafb !important;color:#ffffff !important;} +.ui.white.labels .label, .ui.white.label{background-color:#e5e5e5!important;border-color:#eee !important;color:#ffffff !important;} +.ui.accordion .title:not(.ui){padding:0.1em 0em;font-size:0.96em;color:rgb(136, 136, 136);font-weight:500;} +.ui.sortable.table thead th{background: transparent!important; white-space:nowrap;border-left:none!important;color:#757575;opacity:1;} +.ui.sortable.table thead th.sorted:after{} +.ui.sortable.table thead th.sorted, +.ui.sortable.table thead th.sorted:hover, +.ui.sortable.table thead th:hover{background:none;color:rgb(117, 117, 117);} +#topSearchClose{display:none;font-size:1.19em;line-height:0.75em;margin-right:-3px;font-weight:400;} +.pac-container{margin-top:14px;margin-left:0px;box-shadow:0px;font-family:'Roboto', sans-serif!important;} +.pac-container, .pac-item{padding-top:2px;padding-bottom:2px;padding-left:5px;cursor:pointer;border-bottom:1px dotted #c2c2c2!important;border-top:none!important;} +.pac-item-query{color:#252525!important;font-size:1.23em!important;} +.stitle{font-size:1.19em!important;font-weight:800!important;color:#858585!important;padding-left:0px!important;margin-left:-2px!important;text-shadow:0px 1px 0px white;} +.stitle:hover{color:#777!important;} +.stitle i{font-size:1.22em!important;vertical-align:middle!important;} +.ui.form .field{clear:both;margin:0em 0em 0em;} +.sectiondrop{margin:0px 0px 0px -2px!important;} +#main-container-right-body.ui.loading.segment:after{position:fixed;content:'';left:74%;} +/**.ui.attached.menu:not(.tabular){background: #f9fafb;box-shadow: inset 0px -1px 0px 0px #ffffff;}**/ +.ui.disabled.input, .ui.input input[disabled]{opacity:9;} +.ui.mini.modal>.header:not(.ui),.ui.small.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767px){.ui.mini.modal{width:95%;margin:0 0 0 -47.5%}}@media only screen and (min-width:768px){.ui.mini.modal{width:35.2%;margin:0 0 0 -17.6%}}@media only screen and (min-width:992px){.ui.mini.modal{width:340px;margin:0 0 0 -170px}}@media only screen and (min-width:1200px){.ui.mini.modal{width:360px;margin:0 0 0 -180px}}@media only screen and (min-width:1920px){.ui.mini.modal{width:380px;margin:0 0 0 -190px}}@media only screen and (max-width:767px){.ui.tiny.modal{width:95%;margin:0 0 0 -47.5%}}@media only screen and (min-width:768px){.ui.tiny.modal{width:52.8%;margin:0 0 0 -26.4%}}@media only screen and (min-width:992px){.ui.tiny.modal{width:510px;margin:0 0 0 -255px}}@media only screen and (min-width:1200px){.ui.tiny.modal{width:540px;margin:0 0 0 -270px}}@media only screen and (min-width:1920px){.ui.tiny.modal{width:570px;margin:0 0 0 -285px}}@media only screen and (max-width:767px){.ui.small.modal{width:95%;margin:0 0 0 -47.5%}}@media only screen and (min-width:768px){.ui.small.modal{width:70.4%;margin:0 0 0 -35.2%}}@media only screen and (min-width:992px){.ui.small.modal{width:680px;margin:0 0 0 -340px}}@media only screen and (min-width:1200px){.ui.small.modal{width:720px;margin:0 0 0 -360px}}@media only screen and (min-width:1920px){.ui.small.modal{width:760px;margin:0 0 0 -380px}}.ui.large.modal>.header{font-size:1.6em}@media only screen and (max-width:767px){.ui.large.modal{width:95%;margin:0 0 0 -47.5%}}@media only screen and (min-width:768px){.ui.large.modal{width:88%;margin:0 0 0 -44%}}@media only screen and (min-width:992px){.ui.large.modal{width:1020px;margin:0 0 0 -510px}}@media only screen and (min-width:1200px){.ui.large.modal{width:1080px;margin:0 0 0 -540px}}@media only screen and (min-width:1920px){.ui.large.modal{width:1140px;margin:0 0 0 -570px}} + +.ui.attached.menu:not(.tabular) { + background: #F6F6F6; + background-color: #f9fafb; + border-bottom: 0px solid rgba(0,0,0,.25); + border-left: 1px solid #d4d4d5; + border-right: 1px solid #d4d4d5; +} + +.no-spin::-webkit-inner-spin-button { + -webkit-appearance: none; +} + +.no-spin::-webkit-clear-button { + display:none; + } +input[type=date] { +padding: 0px; +} + +.rightTable tbody tr:hover { + background: rgba(0, 0, 0, 0.04) !important; +} + +/*.ui.selectable.table tbody tr:hover, .ui.table tbody tr td.selectable:hover { + background: rgba(0, 0, 0, 0.05)!important; + color: rgba(0, 0, 0, 0.95); +}*/ + +.statusFilter:before { + box-shadow: 8px 0 0 blue; +} + + +.auto { cursor: auto; } +.default { cursor: default; } +.none { cursor: none; } +.context-menu { cursor: context-menu; } +.help { cursor: help; } +.pointer { cursor: pointer; } +.progress { cursor: progress; } +.wait { cursor: wait !important; } +.cell { cursor: cell; } +.crosshair { cursor: crosshair; } +.text { cursor: text; } +.vertical-text { cursor: vertical-text; } +.alias { cursor: alias; } +.copy { cursor: copy; } +.move { cursor: move; } +.no-drop { cursor: no-drop; } +.not-allowed { cursor: not-allowed; } +.all-scroll { cursor: all-scroll; } +.col-resize { cursor: col-resize; } +.row-resize { cursor: row-resize; } +.n-resize { cursor: n-resize; } +.e-resize { cursor: e-resize; } +.s-resize { cursor: s-resize; } +.w-resize { cursor: w-resize; } +.ns-resize { cursor: ns-resize; } +.ew-resize { cursor: ew-resize; } +.ne-resize { cursor: ne-resize; } +.nw-resize { cursor: nw-resize; } +.se-resize { cursor: se-resize; } +.sw-resize { cursor: sw-resize; } +.nesw-resize { cursor: nesw-resize; } +.nwse-resize { cursor: nwse-resize; } + + +/* Right Menu */ +#main-container-right-body-menu { + width: 100%; + margin-top: 0!important; + margin-bottom: 0; + border-radius: 0; + background: #f9fafb; + border: 0; + border-bottom: 1px solid #eeeeee; +} + +#main-container-right-body-menu #testingdrop .text { + cursor: pointer; + font-weight: 600; + color: rgb(117, 117, 117); +} + +.ui.menu .ui.dropdown .menu > .item { + cursor: pointer!important; + font-weight: 600!important; + color: rgb(117, 117, 117)!important; +} + +.ui.menu .item { + cursor: pointer; + font-weight: 600; + color: rgb(27, 28, 29); +} + +.ui.menu .item:before { + position: absolute; + content: ''; + top: 0%; + right: 0px; + height: 100%; + width: 1px; + background: -moz-linear-gradient(top, rgba(0,0,0,0) 15%, rgba(0,0,0,0.2) 50%, rgba(0,0,0,0) 85%); /* FF3.6-15 */ + background: -webkit-linear-gradient(top, rgba(0,0,0,0) 15%,rgba(0,0,0,0.2) 50%,rgba(0,0,0,0) 85%); /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to bottom, rgba(0,0,0,0) 15%,rgba(0,0,0,0.2) 50%,rgba(0,0,0,0) 85%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00000000', endColorstr='#00000000',GradientType=0 ); /* IE6-9 */ +} + +#allTransactionsFixed thead th { + background: #fdfdfd!important; + /**border-bottom: 1px solid rgba(0, 0, 0, 0.3)!important;**/ +} + +#allTransactions { + /* This removes the hidden thead */ + margin-top: -51px; +} + +.no-sort { + cursor: default!important; +} + +#transactionBreakdown { + background: #ffffff; + margin: 0px 0px 0px 0px; + padding: 2px 0px 1px 0px; + border: none; + border-bottom: 1px solid #d4d4d5; + border-bottom: 1px solid #e8e9e9; +} + +#transactionBreakdown .ui.basic.label { + -webkit-border-radius: 0px!important; + -moz-border-radius: 0px!important; + border-radius: 0px!important; +} + +.top-bar { + width: 100%; + height: 40px; + background: transparent; + color: #1b1c1d; + text-shadow: 0px 1px 0px #fdfdfd; + z-index: 2; +} + +#profile-menus .default.text{ + color: #1b1c1d; +} + +#clock { + line-height: 37px; +} + +#main-container-right-body { + /* + * Changed by Chris 12/27/2018 + * Previous Value: margin: -2px 0px 1px -1px; + * */ + margin: -2px 0px 1px -1px; + /* End Changes */ + border-top: 0px; + padding: 0px 0px 0px 0px; + cursor: default; +} + + +#right-secondary-menu, +#right-secondary-content, +#right-fixed-th { + +} + +#right-secondary-menu-container { + padding: 0; + border-bottom: 1px solid #e4e4e4; + border-top: none!important; + margin: -1px 0px 0px -1px; +} + +#right-secondary-menu { + border-top: none; +} + +#right-secondary-content { + padding: 0; +} + +#right-fixed-th { + margin: -2px 0px 2px -1px; + position: sticky; /* inherit */ + padding: 0px; + border-bottom: 1px solid #e4e5e5; +} + +#allTransactionsFixed { + /*border-bottom: 1px solid #dededf;*/ +} + +#newTransactionModal { + /*margin: 0rem 0rem 0rem auto !important;*/ + width: 96% !important; + margin-top: 0rem; + display: none; +} + +#newTransactionModal .header { + /* + background: #efefef; + padding: 14px 16px 13px 16px; + */ +} + +#transModalHeaderBreadcrums { + +} + + +.ui.mini.statistics .statistic > .value, .ui.mini.statistic > .value { + font-size: 1.5rem !important; + font-weight: 900; +} + +.ui.statistics .statistic > .label, .ui.statistic > .label { + font-size: 0.958em; + font-weight: 800; + color: rgb(117, 117, 117); + text-transform: uppercase; + text-align: center; +} + +.ui.green.statistics .statistic > .value, .ui.statistics .green.statistic > .value, .ui.green.statistic > .value { + color: #008000; +} + +#newTransactionDrop .text, +#sections .text, +#filter .text, +#filterEntity .text { + cursor: pointer; +} + +#transactions { + padding: 0px; + margin: 0px; +} + +#transactionHistory { + /** WTF!?? margin-top: -50px; **/ +} + +.ui.divided.grid:not([class*="vertically divided"]) > .column:not(.row), .ui.divided.grid:not([class*="vertically divided"]) > .row > .column { + box-shadow: none; +} + +#main-container-right-header { + position:inherit; +} + +.trasactionItem:hover > td a { + /* code */ + color: #252525!important; +} + +#login-prompt-box { + width: 600px !important; + box-shadow: rgb(12, 12, 12) -1px 4px 10px !important; + margin-left: 0%!important; + margin-top: -5rem!important; +} + +#tenantTable { + margin-top: -41px; +} + +#tenantTable thead tr { + opacity: 0; +} + +#left-fixed-th-container { + position: relative; + background: #f9fafb; +} + +#tenantTableHeader thead tr { +} + +#tenantTableHeader thead tr th { + box-shadow: inset 0px -1px 0px #dededf; +} + +#transInfo { + padding: 20px 8px 20px 8px!important; +} + +.ui.dropdown .menu > .divider { + border-top: 1px solid rgba(34, 36, 38, 0.1); + height: 0em; + margin: 0em 0em; +} + +.transDayContainer input { + text-align: center; + width: 19ch; + font-weight: 600; + color: #828482; +} + + +#printReceiptBtn.ui.disabled { + opacity: 0!important; +} + +.disabledHidden.button, .ui.disabledHidden.button, .ui.button.disabledHidden:disabled, .ui.disabledHidden.button:hover, .ui.disabledHidden.active.button { + cursor: default; + opacity: 0 !important; + background-image: none !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + pointer-events: none !important; +} + +#processTransaction { + padding-top: 15px; + padding-bottom: 15px; + padding-left: 3em; + padding-right: 3em; +} + +.lighter { + color: #bbb; +} + +.transMenuDropDimmer span { + cursor: pointer!important; +} + +#transactionModal { + /* margin: 0rem 0rem 0rem auto !important; */ + width: 96% !important; + margin-top: 0rem; +} + +#right-menu-container { + z-index: 1; +} + +/* +@media screen and (min-width: 800px) { + body { + background-color: blue !important; + } +} + +@media screen and (min-width: 600px) { + body { + background-color: red !important; + } +} +*/ + +.trns-th { + width: auto; /* Transaction table TH Type */ +} + +.tth { + width: 16ch; /* Transaction table TH Balences */ +} + +.date-th { + width: 13ch; /* Transaction table TH Date */ +} + +#right-secondary-breadcrumbs { + padding: 12px 0px 15px 16px; + font-weight: 800; +} + +.left-list-amount-box-positive { + color: #fefefe; + background: #008000!important; + padding: 3px 6px; + border-radius: 10px; + font-size: 0.95em +} + +.left-list-amount-box-negative { + color: #fefefe; + background: #DB2828!important; + padding: 3px 6px; + border-radius: 10px; + font-size: 0.95em +} + +.left-list-amount-box-zero { + color: #767676; + background: none!important; + padding: 3px 6px; + border-radius: 10px; + font-size: 0.95em +} + +.ui.statistics .statistic > .value, .ui.statistic > .value { + color: inherit; /* Allows money colors below to Work! */ +} + +.money-negitive { + color: #DB2828; +} + +.money-positive { + color: #008000; +} + +.money-zero { + color: #767676; +} diff --git a/public/assets/prototype/css/paper.css b/public/assets/prototype/css/paper.css new file mode 100644 index 0000000..b39cee0 --- /dev/null +++ b/public/assets/prototype/css/paper.css @@ -0,0 +1,56 @@ +@page { margin: 0 } + +section.sheet { + margin: 0cm 0cm 0cm 0cm; + page-break-before: avoid; + page-break-after: always; + page-break-inside: avoid; + + overflow: hidden; + position: relative; + box-sizing: border-box; +} + +/** Paper sizes **/ +body.A3 .sheet { width: 297mm; height: 419mm } +body.A3.landscape .sheet { width: 420mm; height: 296mm } +body.A4 .sheet { width: 210mm; height: 296mm } +body.A4.landscape .sheet { width: 297mm; height: 209mm } +body.A5 .sheet { width: 148mm; height: 209mm } +body.A5.landscape .sheet { width: 210mm; height: 147mm } +body.letter .sheet { width: 216mm; height: 279mm } +body.letter.landscape .sheet { width: 280mm; height: 215mm } +body.legal .sheet { width: 216mm; height: 356mm } +body.legal.landscape .sheet { width: 357mm; height: 215mm } +body.receipt .sheet { width: 79mm; height: 180mm; } +body.receipt.landscape .sheet { width: 179mm; height: 78mm; } + +/** Padding area **/ +.sheet.padding-5mm { padding: 5mm } +.sheet.padding-10mm { padding: 10mm } +.sheet.padding-15mm { padding: 15mm } +.sheet.padding-20mm { padding: 20mm } +.sheet.padding-25mm { padding: 25mm } + +/** For screen preview **/ +@media screen { + body { background: #e0e0e0 } + .sheet { + background: white; + box-shadow: 0 .5mm 2mm rgba(0,0,0,.3); + margin: 5mm auto; + } +} + +/** Fix for Chrome issue #273306 **/ +@media print { + body.A3.landscape { width: 420mm } + body.A3, body.A4.landscape { width: 297mm } + body.A4, body.A5.landscape { width: 210mm } + body.A5 { width: 148mm } + body.letter, body.legal { width: 216mm } + body.letter.landscape { width: 280mm } + body.legal.landscape { width: 357mm } + body.receipt { width: 79mm } + body.receipt.landscape { width: 179mm } +} diff --git a/public/assets/prototype/css/perfect-scrollbar.css b/public/assets/prototype/css/perfect-scrollbar.css new file mode 100644 index 0000000..81c0eff --- /dev/null +++ b/public/assets/prototype/css/perfect-scrollbar.css @@ -0,0 +1,25 @@ +.ps-container{-ms-touch-action:none;touch-action:none;overflow:hidden !important;-ms-overflow-style:none;} + +@media screen and (-ms-high-contrast:active), (-ms-high-contrast:none){.ps-container{overflow:auto !important;}} +.ps-container.ps-active-x > .ps-scrollbar-x-rail, +.ps-container.ps-active-y > .ps-scrollbar-y-rail{display:block;background-color:transparent;} +.ps-container.ps-in-scrolling{pointer-events:none;} +.ps-container.ps-in-scrolling.ps-x > .ps-scrollbar-x-rail{background-color:#eee;opacity:0.9;} +.ps-container.ps-in-scrolling.ps-x > .ps-scrollbar-x-rail > .ps-scrollbar-x{background-color:#999;} +.ps-container.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail{background-color:#eee;opacity:0.9;} +.ps-container.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail > .ps-scrollbar-y{background-color:#999;} +.ps-container > .ps-scrollbar-x-rail{display:none;position:absolute;-webkit-border-radius:0px;-moz-border-radius:0px;border-radius:0px;opacity:0;-webkit-transition:background-color .2s linear, opacity .2s linear;-moz-transition:background-color .2s linear, opacity .2s linear;-o-transition:background-color .2s linear, opacity .2s linear;transition:background-color .2s linear, opacity .2s linear;bottom:3px;height:8px;} +.ps-container > .ps-scrollbar-x-rail > .ps-scrollbar-x{position:absolute;background-color:#aaa;-webkit-border-radius:0px;-moz-border-radius:0px;border-radius:0px;-webkit-transition:background-color .2s linear;-moz-transition:background-color .2s linear;-o-transition:background-color .2s linear;transition:background-color .2s linear;bottom:0;height:8px;} +.ps-container > .ps-scrollbar-y-rail{display:none;position:absolute;-webkit-border-radius:0px;-moz-border-radius:0px;border-radius:0px;opacity:0;-webkit-transition:background-color .2s linear, opacity .2s linear;-moz-transition:background-color .2s linear, opacity .2s linear;-o-transition:background-color .2s linear, opacity .2s linear;transition:background-color .2s linear, opacity .2s linear;right:0px;width:9px;} +.ps-container > .ps-scrollbar-y-rail > .ps-scrollbar-y{position:absolute;background-color:#888;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;-webkit-transition:background-color .2s linear;-moz-transition:background-color .2s linear;-o-transition:background-color .2s linear;transition:background-color .2s linear;right:0px;width:9px;} +.ps-container:hover.ps-in-scrolling{pointer-events:none;} +.ps-container:hover.ps-in-scrolling.ps-x > .ps-scrollbar-x-rail{background-color:#eee;opacity:0.9;} +.ps-container:hover.ps-in-scrolling.ps-x > .ps-scrollbar-x-rail > .ps-scrollbar-x{background-color:#999;} +.ps-container:hover.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail{background-color:#eee;opacity:0.9;} +.ps-container:hover.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail > .ps-scrollbar-y{background-color:#999;} +.ps-container:hover > .ps-scrollbar-x-rail, +.ps-container:hover > .ps-scrollbar-y-rail{opacity:0.6;} +.ps-container:hover > .ps-scrollbar-x-rail:hover{background-color:#eee;opacity:0.9;} +.ps-container:hover > .ps-scrollbar-x-rail:hover > .ps-scrollbar-x{background-color:#999;} +.ps-container:hover > .ps-scrollbar-y-rail:hover{background-color:#eee;opacity:0.9;} +.ps-container:hover > .ps-scrollbar-y-rail:hover > .ps-scrollbar-y{background-color:#999;} \ No newline at end of file diff --git a/public/assets/prototype/css/perfect-scrollbar.min.css b/public/assets/prototype/css/perfect-scrollbar.min.css new file mode 100644 index 0000000..5c90214 --- /dev/null +++ b/public/assets/prototype/css/perfect-scrollbar.min.css @@ -0,0 +1,2 @@ + +.ps-container{-ms-touch-action:none;touch-action:none;overflow:hidden!important;-ms-overflow-style:none}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.ps-container{overflow:auto!important}}.ps-container.ps-active-x>.ps-scrollbar-x-rail,.ps-container.ps-active-y>.ps-scrollbar-y-rail{display:block;background-color:transparent}.ps-container.ps-in-scrolling{pointer-events:none}.ps-container.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail{background-color:#eee;opacity:.9}.ps-container.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail>.ps-scrollbar-x{background-color:#999}.ps-container.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail{background-color:#eee;opacity:.9}.ps-container.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail>.ps-scrollbar-y{background-color:#999}.ps-container>.ps-scrollbar-x-rail{display:none;position:absolute;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;opacity:0;-webkit-transition:background-color .2s linear,opacity .2s linear;-moz-transition:background-color .2s linear,opacity .2s linear;-o-transition:background-color .2s linear,opacity .2s linear;transition:background-color .2s linear,opacity .2s linear;bottom:3px;height:8px}.ps-container>.ps-scrollbar-x-rail>.ps-scrollbar-x{position:absolute;background-color:#aaa;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-transition:background-color .2s linear;-moz-transition:background-color .2s linear;-o-transition:background-color .2s linear;transition:background-color .2s linear;bottom:0;height:8px}.ps-container>.ps-scrollbar-y-rail{display:none;position:absolute;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;opacity:0;-webkit-transition:background-color .2s linear,opacity .2s linear;-moz-transition:background-color .2s linear,opacity .2s linear;-o-transition:background-color .2s linear,opacity .2s linear;transition:background-color .2s linear,opacity .2s linear;right:0;width:9px}.ps-container>.ps-scrollbar-y-rail>.ps-scrollbar-y{position:absolute;background-color:#888;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;-webkit-transition:background-color .2s linear;-moz-transition:background-color .2s linear;-o-transition:background-color .2s linear;transition:background-color .2s linear;right:0;width:9px}.ps-container:hover.ps-in-scrolling{pointer-events:none}.ps-container:hover.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail{background-color:#eee;opacity:.9}.ps-container:hover.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail>.ps-scrollbar-x{background-color:#999}.ps-container:hover.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail{background-color:#eee;opacity:.9}.ps-container:hover.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail>.ps-scrollbar-y{background-color:#999}.ps-container:hover>.ps-scrollbar-x-rail,.ps-container:hover>.ps-scrollbar-y-rail{opacity:.6}.ps-container:hover>.ps-scrollbar-x-rail:hover{background-color:#eee;opacity:.9}.ps-container:hover>.ps-scrollbar-x-rail:hover>.ps-scrollbar-x{background-color:#999}.ps-container:hover>.ps-scrollbar-y-rail:hover{background-color:#eee;opacity:.9}.ps-container:hover>.ps-scrollbar-y-rail:hover>.ps-scrollbar-y{background-color:#999} \ No newline at end of file diff --git a/public/assets/prototype/fonts/JennaSue.ttf b/public/assets/prototype/fonts/JennaSue.ttf new file mode 100644 index 0000000000000000000000000000000000000000..667a55112dd47eed376f983864a2f9a703eed3a6 GIT binary patch literal 42948 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 literal 0 HcmV?d00001 diff --git a/public/assets/prototype/images/drag.png b/public/assets/prototype/images/drag.png new file mode 100644 index 0000000000000000000000000000000000000000..fdb574bb91c4c773cbff99ec2a06919f480da20e GIT binary patch literal 4340 zcmcIo3s92j8vadBTAN)?oh)13Jk{>Drsa0=q!8PhOJ&-XwM0X=^|Wq*DWC}mWoL4B z>||FgZ`d~8@The(2@%LOvtorp@rHoyR;-wy!Y?W!=c6rW+-ldwIn4aS4D<25@B4i3 z^E~hOf43_H?L5m<1 z2%1~4ZOi6;$FqACJ|Uh57B)n+cAX2n^nRCHS6;w|HCMmGR$SnmUFajG*sr>yJUL^R zSIPoJ?U`ojFR*ECL%r8S8jenutd%@teX=p_FCfPM^V63>(Ab?wOUR_0c<<+{&hv*G zn(ZNoMoyUlEu9OhJsCL-a&njteYW%pD81GJn(Oo-bmFr$c96pxOCt5_`{orgGmr>G zWes5i-C{Ntqi?UH+Yhga{o{YXJ-~i%*H{nKsZ!}NL4nGcnwrXN?e{&KjDnqTQpzH> z%29|`o%8*ZiH?UNl_zq7IT@i5D7OOlCl&4V#ub_M`e^T$0ah(cgV$6Fq`EqnF6YT1 zFuw6PNQ&?KH}tpiZD@31|Iz_^~_7@lj=g6Da1{yM%6 z)>d^VV_s&#tirRd8M1Gai0uhDMVO^wL?Y!f+$`+|0b7$z9OmhXGTkZL+o(aX8t+j~ zFd^}w`NRxul0|6{WHlnfxW7##;omw>WCk1iv_w)7qzc2C!=L{owa`byVGE3)ueXCf zTy6_fM4DO+Q>_^sZc4!TwRY&o_$2K=o2nwzpC0ZJQaS#w(BQIr3hRoGS1uvX&17#< zKly7?-R~0m-ThV@kDRqva>s$N;ntUQrO=mOehW08K|o0ShN9|G;G2j5_r1?LZ|Z`K zcB+QOW+`TN`4>hMwC>WzcRO{TCT<|J=dV;U~_T~hV#%3cayb^TXy-zG(o{i#PJCZm*_)fnwt zB#91JX!A*0Sex*48@+d=dzW7;#ox48E-k@If+Rb!J&dvuZl$1HbH>6V?l!wOrr>;R zO&~B%K4@*`OQOCS28;5qo#cwgZHF`otMjeQ&bPuV7R#HG!09vWOy!;eAW_0A;LU#8Om^Uu30s z1DuhR$MU-_Y4yeNzqA>brT1?%mZo0oPA0|)871y~gU){0famnzbEXOPO)#(8_{Ybw zL=JT&etx+hKGduH2w?9)zr>0d`9tE>`C$HxWlP;I zWSAm>!9Liw2TtNE=Uf+`M-aejtua<641jgwDR`4;t(aN0K9sXxPxQ?S({IwL(78`r z*~Ej@J%s^qQK@=a*qi|Pn;v06w*X!fZqSd!5!b^`G<$meAI<`A7HsAH{tzT&>91j| z&f&E;XL2aBz4!UT(5i(%KXb6U)ZOZ>?!G`lK{M^`-)=z(Az|j98$rgyu5w8WjG@Mp zOGq*+FGA$9+oxz30KyRf;bl7qZtX+42uis}$>oI7!&^WT7o#J;7~F2boyk=w9$@fZ<(nk5&V&xNzl#IwusxL3W|u>tvl9Hb}#o-inX(hltll5 z<-!CrsmMJ?)S@qtR2))qYRb48J<*#L1gng|?D>cl~dfSvd`R0#*bge@N}rsn}?qk9tTumGdyiXgr`_6ZHU0mvT*JEc~#Ha<2cl?emYu z4(fUz>{eh@yh<|9%k~okx(H=Nzr@l5sGsIB;m3_v9H+G39SfVlLk*gXh%{!9#ds^h zYL>nCvQLSg+s>_GN2u!vaD^UEUW>~QXq&~NHXh(Nbj5nV`tOls4;n`K)*IynW=-(z z@q6iwYzlPSVgAwcYO1Ed9TIp>2{cQT-29^b@2Ik-W_#LhnWWyb^B)&&zZblRtrgCc z-+i(=m=)9@h)s%U2X|I964$lE_IktHzH+7^Wol_m^Gaw;Wb=J#%=!68avz8Pgv49l PFKi18*;4j-WXk^l5NppT literal 0 HcmV?d00001 diff --git a/public/assets/prototype/js/ajax-loaders.js b/public/assets/prototype/js/ajax-loaders.js new file mode 100644 index 0000000..4cce42b --- /dev/null +++ b/public/assets/prototype/js/ajax-loaders.js @@ -0,0 +1,144 @@ +function ajax_failed(msg) { + $.toast({ + heading: 'Fail to load!', + showHideTransition: 'slide', + text: msg, + icon: 'error', + position: { + right: 35, + bottom: 65 + }, + hideAfter: 8000 // in milli seconds + }); +} + +function ajax_status(response) { + if (response.status >= 200 && response.status < 300) { + return Promise.resolve( response ); + } else { + return Promise.reject(new Error(response.statusText)); + } +} + +function ajax_content(response) { + return response.text(); +} + +function ajax_loader(mydata, url, id) { + if ( empty(url) ) { + return Promise.reject('No URL given!'); + } + + var request = $.ajax({ + url: url, + type: 'POST', + data: mydata, + global: false, + async: true, + cache: false, + dataType: "html", + }); + request.done(function (data) { + $(function() { + $("#" + id).html(data); + }); + }).fail(function (err) { + var d = JSON.stringify(mydata, null); + console.log('data=' + d + ';url=' + url + ';id=' + id); + console.log('AJAX Load Error: ' + err.status + " " + err.statusText); + }); + return request; +} + +function ajax_failed(msg) { + $.toast({ + heading: 'Fail to load!', + showHideTransition: 'slide', + text: msg, + icon: 'error', + position: { + right: 35, + bottom: 65 + }, + hideAfter: 8000 // in milli seconds + }); +} + +function ajax_get_loader(mydata, url, id) { + + var query = ""; + var alc = 0; + for (key in mydata) { + if (alc !== 0) { + url += "&"; + } + url += encodeURIComponent(key)+"="+encodeURIComponent(mydata[key]); + alc++; + } + + var promise = new Promise(function(resolve, reject) { + + fetch(url, { + method: 'GET', + mode: 'cors', + credentials: 'include', //'same-origin', + headers: { + "Content-type": "application/x-www-form-urlencoded; charset=UTF-8", + 'accept': 'text/html' + }, + }) + .then(ajax_status) + .then(ajax_content) + .then(htmlText => { + $(function() { + $("#" + id).html(htmlText); + }); + }) + .then(function() { + return resolve('worked'); + }) + .catch(err => { + console.log("\r\nAJAX Alert: \r\n"); + console.warn("AJAX Loader URL: " + url); + console.error(err); + + ajax_failed("Refresh this page!"); + + return reject(err); + }); + + }); // End of promise... + + return promise; +} + + +function get_json_data(mydata, url) { + var promise = new Promise(function(resolve, reject) { + + var myHeaders = new Headers({ + "Content-Type": "application/json", + }); + + fetch(url, { + method: 'POST', + credentials: 'omit', // Only will work with omit credentials!!! +// mode: 'no-cors', + headers: myHeaders, + body: JSON.stringify(mydata) + }) + .then(response => response.json()) + .then(data => { + return resolve(data); + }) + .catch(err => { + console.log("\r\n JSON Alert: \r\n"); + console.warn("URL Failed: " + url); + console.error(err); + return reject(err); + }); + + }); // End of promise... + + return promise; +} \ No newline at end of file diff --git a/public/assets/prototype/js/countUp.js b/public/assets/prototype/js/countUp.js new file mode 100644 index 0000000..a85feee --- /dev/null +++ b/public/assets/prototype/js/countUp.js @@ -0,0 +1,261 @@ + +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + define(factory); + } else if (typeof exports === 'object') { + module.exports = factory(require, exports, module); + } else { + root.CountUp = factory(); + } +}(this, function(require, exports, module) { + +/* + + countUp.js + by @inorganik + +*/ + +// target = id of html element or var of previously selected html element where counting occurs +// startVal = the value you want to begin at +// endVal = the value you want to arrive at +// decimals = number of decimal places, default 0 +// duration = duration of animation in seconds, default 2 +// options = optional object of options (see below) + +var CountUp = function(target, startVal, endVal, decimals, duration, options) { + + var self = this; + self.version = function () { return '1.9.3'; }; + + // default options + self.options = { + useEasing: true, // toggle easing + useGrouping: true, // 1,000,000 vs 1000000 + separator: ',', // character to use as a separator + decimal: '.', // character to use as a decimal + easingFn: easeOutExpo, // optional custom easing function, default is Robert Penner's easeOutExpo + formattingFn: formatNumber, // optional custom formatting function, default is formatNumber above + prefix: '', // optional text before the result + suffix: '', // optional text after the result + numerals: [] // optionally pass an array of custom numerals for 0-9 + }; + + // extend default options with passed options object + if (options && typeof options === 'object') { + for (var key in self.options) { + if (options.hasOwnProperty(key) && options[key] !== null) { + self.options[key] = options[key]; + } + } + } + + if (self.options.separator === '') { + self.options.useGrouping = false; + } + else { + // ensure the separator is a string (formatNumber assumes this) + self.options.separator = '' + self.options.separator; + } + + // make sure requestAnimationFrame and cancelAnimationFrame are defined + // polyfill for browsers without native support + // by Opera engineer Erik Möller + var lastTime = 0; + var vendors = ['webkit', 'moz', 'ms', 'o']; + for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { + window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; + window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame']; + } + if (!window.requestAnimationFrame) { + window.requestAnimationFrame = function(callback, element) { + var currTime = new Date().getTime(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); + var id = window.setTimeout(function() { callback(currTime + timeToCall); }, timeToCall); + lastTime = currTime + timeToCall; + return id; + }; + } + if (!window.cancelAnimationFrame) { + window.cancelAnimationFrame = function(id) { + clearTimeout(id); + }; + } + + function formatNumber(num) { + var neg = (num < 0), + x, x1, x2, x3, i, len; + num = Math.abs(num).toFixed(self.decimals); + num += ''; + x = num.split('.'); + x1 = x[0]; + x2 = x.length > 1 ? self.options.decimal + x[1] : ''; + if (self.options.useGrouping) { + x3 = ''; + for (i = 0, len = x1.length; i < len; ++i) { + if (i !== 0 && ((i % 3) === 0)) { + x3 = self.options.separator + x3; + } + x3 = x1[len - i - 1] + x3; + } + x1 = x3; + } + // optional numeral substitution + if (self.options.numerals.length) { + x1 = x1.replace(/[0-9]/g, function(w) { + return self.options.numerals[+w]; + }) + x2 = x2.replace(/[0-9]/g, function(w) { + return self.options.numerals[+w]; + }) + } + return (neg ? '-' : '') + self.options.prefix + x1 + x2 + self.options.suffix; + } + // Robert Penner's easeOutExpo + function easeOutExpo(t, b, c, d) { + return c * (-Math.pow(2, -10 * t / d) + 1) * 1024 / 1023 + b; + } + function ensureNumber(n) { + return (typeof n === 'number' && !isNaN(n)); + } + + self.initialize = function() { + if (self.initialized) return true; + + self.error = ''; + self.d = (typeof target === 'string') ? document.getElementById(target) : target; + if (!self.d) { + self.error = '[CountUp] target is null or undefined' + return false; + } + self.startVal = Number(startVal); + self.endVal = Number(endVal); + // error checks + if (ensureNumber(self.startVal) && ensureNumber(self.endVal)) { + self.decimals = Math.max(0, decimals || 0); + self.dec = Math.pow(10, self.decimals); + self.duration = Number(duration) * 1000 || 2000; + self.countDown = (self.startVal > self.endVal); + self.frameVal = self.startVal; + self.initialized = true; + return true; + } + else { + self.error = '[CountUp] startVal ('+startVal+') or endVal ('+endVal+') is not a number'; + return false; + } + }; + + // Print value to target + self.printValue = function(value) { + var result = self.options.formattingFn(value); + + if (self.d.tagName === 'INPUT') { + this.d.value = result; + } + else if (self.d.tagName === 'text' || self.d.tagName === 'tspan') { + this.d.textContent = result; + } + else { + this.d.innerHTML = result; + } + }; + + self.count = function(timestamp) { + + if (!self.startTime) { self.startTime = timestamp; } + + self.timestamp = timestamp; + var progress = timestamp - self.startTime; + self.remaining = self.duration - progress; + + // to ease or not to ease + if (self.options.useEasing) { + if (self.countDown) { + self.frameVal = self.startVal - self.options.easingFn(progress, 0, self.startVal - self.endVal, self.duration); + } else { + self.frameVal = self.options.easingFn(progress, self.startVal, self.endVal - self.startVal, self.duration); + } + } else { + if (self.countDown) { + self.frameVal = self.startVal - ((self.startVal - self.endVal) * (progress / self.duration)); + } else { + self.frameVal = self.startVal + (self.endVal - self.startVal) * (progress / self.duration); + } + } + + // don't go past endVal since progress can exceed duration in the last frame + if (self.countDown) { + self.frameVal = (self.frameVal < self.endVal) ? self.endVal : self.frameVal; + } else { + self.frameVal = (self.frameVal > self.endVal) ? self.endVal : self.frameVal; + } + + // decimal + self.frameVal = Math.round(self.frameVal*self.dec)/self.dec; + + // format and print value + self.printValue(self.frameVal); + + // whether to continue + if (progress < self.duration) { + self.rAF = requestAnimationFrame(self.count); + } else { + if (self.callback) self.callback(); + } + }; + // start your animation + self.start = function(callback) { + if (!self.initialize()) return; + self.callback = callback; + self.rAF = requestAnimationFrame(self.count); + }; + // toggles pause/resume animation + self.pauseResume = function() { + if (!self.paused) { + self.paused = true; + cancelAnimationFrame(self.rAF); + } else { + self.paused = false; + delete self.startTime; + self.duration = self.remaining; + self.startVal = self.frameVal; + requestAnimationFrame(self.count); + } + }; + // reset to startVal so animation can be run again + self.reset = function() { + self.paused = false; + delete self.startTime; + self.initialized = false; + if (self.initialize()) { + cancelAnimationFrame(self.rAF); + self.printValue(self.startVal); + } + }; + // pass a new endVal and start animation + self.update = function (newEndVal) { + if (!self.initialize()) return; + newEndVal = Number(newEndVal); + if (!ensureNumber(newEndVal)) { + self.error = '[CountUp] update() - new endVal is not a number: '+newEndVal; + return; + } + self.error = ''; + if (newEndVal === self.frameVal) return; + cancelAnimationFrame(self.rAF); + self.paused = false; + delete self.startTime; + self.startVal = self.frameVal; + self.endVal = newEndVal; + self.countDown = (self.startVal > self.endVal); + self.rAF = requestAnimationFrame(self.count); + }; + + // format startVal on initialization + if (self.initialize()) self.printValue(self.startVal); +}; + +return CountUp; + +})); \ No newline at end of file diff --git a/public/assets/prototype/js/countUp.min.js b/public/assets/prototype/js/countUp.min.js new file mode 100644 index 0000000..c17c47b --- /dev/null +++ b/public/assets/prototype/js/countUp.min.js @@ -0,0 +1 @@ +!function(a,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n(require,exports,module):a.CountUp=n()}(this,function(a,n,t){return function(a,n,t,e,i,r){var u=this;if(u.version=function(){return"1.9.3"},u.options={useEasing:!0,useGrouping:!0,separator:",",decimal:".",easingFn:function(a,n,t,e){return t*(1-Math.pow(2,-10*a/e))*1024/1023+n},formattingFn:function(a){var n,t,e,i,r,o,s=a<0;if(a=Math.abs(a).toFixed(u.decimals),n=(a+="").split("."),t=n[0],e=1u.endVal,u.frameVal=u.startVal,u.initialized=!0):(u.error="[CountUp] startVal ("+n+") or endVal ("+t+") is not a number",!1)):!(u.error="[CountUp] target is null or undefined"))},u.printValue=function(a){var n=u.options.formattingFn(a);"INPUT"===u.d.tagName?this.d.value=n:"text"===u.d.tagName||"tspan"===u.d.tagName?this.d.textContent=n:this.d.innerHTML=n},u.count=function(a){u.startTime||(u.startTime=a);var n=(u.timestamp=a)-u.startTime;u.remaining=u.duration-n,u.options.useEasing?u.countDown?u.frameVal=u.startVal-u.options.easingFn(n,0,u.startVal-u.endVal,u.duration):u.frameVal=u.options.easingFn(n,u.startVal,u.endVal-u.startVal,u.duration):u.countDown?u.frameVal=u.startVal-(u.startVal-u.endVal)*(n/u.duration):u.frameVal=u.startVal+(u.endVal-u.startVal)*(n/u.duration),u.countDown?u.frameVal=u.frameValu.endVal?u.endVal:u.frameVal,u.frameVal=Math.round(u.frameVal*u.dec)/u.dec,u.printValue(u.frameVal),nu.endVal,u.rAF=requestAnimationFrame(u.count))):u.error="[CountUp] update() - new endVal is not a number: "+a)},u.initialize()&&u.printValue(u.startVal)}}); \ No newline at end of file diff --git a/public/assets/prototype/js/daterangepicker.js b/public/assets/prototype/js/daterangepicker.js new file mode 100644 index 0000000..2279f75 --- /dev/null +++ b/public/assets/prototype/js/daterangepicker.js @@ -0,0 +1,1525 @@ +/** +* @version: 3.0.3 +* @author: Dan Grossman http://www.dangrossman.info/ +* @copyright: Copyright (c) 2012-2018 Dan Grossman. All rights reserved. +* @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php +* @website: http://www.daterangepicker.com/ +*/ +// Following the UMD template https://github.com/umdjs/umd/blob/master/templates/returnExportsGlobal.js +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Make globaly available as well + define(['moment', 'jquery'], function (moment, jquery) { + if (!jquery.fn) jquery.fn = {}; // webpack server rendering + return factory(moment, jquery); + }); + } else if (typeof module === 'object' && module.exports) { + // Node / Browserify + //isomorphic issue + var jQuery = (typeof window != 'undefined') ? window.jQuery : undefined; + if (!jQuery) { + jQuery = require('jquery'); + if (!jQuery.fn) jQuery.fn = {}; + } + var moment = (typeof window != 'undefined' && typeof window.moment != 'undefined') ? window.moment : require('moment'); + module.exports = factory(moment, jQuery); + } else { + // Browser globals + root.daterangepicker = factory(root.moment, root.jQuery); + } +}(this, function(moment, $) { + var DateRangePicker = function(element, options, cb) { + + //default settings for options + this.parentEl = 'body'; + this.element = $(element); + this.startDate = moment().startOf('day'); + this.endDate = moment().endOf('day'); + this.minDate = false; + this.maxDate = false; + this.maxSpan = false; + this.autoApply = false; + this.singleDatePicker = false; + this.showDropdowns = false; + this.minYear = moment().subtract(100, 'year').format('YYYY'); + this.maxYear = moment().add(100, 'year').format('YYYY'); + this.showWeekNumbers = false; + this.showISOWeekNumbers = false; + this.showCustomRangeLabel = true; + this.timePicker = false; + this.timePicker24Hour = false; + this.timePickerIncrement = 1; + this.timePickerSeconds = false; + this.linkedCalendars = true; + this.autoUpdateInput = true; + this.alwaysShowCalendars = false; + this.ranges = {}; + + this.opens = 'right'; + if (this.element.hasClass('pull-right')) + this.opens = 'left'; + + this.drops = 'down'; + if (this.element.hasClass('dropup')) + this.drops = 'up'; + + this.buttonClasses = 'btn btn-sm'; + this.applyButtonClasses = 'btn-primary'; + this.cancelButtonClasses = 'btn-default'; + + this.locale = { + direction: 'ltr', + format: moment.localeData().longDateFormat('L'), + separator: ' - ', + applyLabel: 'Apply', + cancelLabel: 'Cancel', + weekLabel: 'W', + customRangeLabel: 'Custom Range', + daysOfWeek: moment.weekdaysMin(), + monthNames: moment.monthsShort(), + firstDay: moment.localeData().firstDayOfWeek() + }; + + this.callback = function() { }; + + //some state information + this.isShowing = false; + this.leftCalendar = {}; + this.rightCalendar = {}; + + //custom options from user + if (typeof options !== 'object' || options === null) + options = {}; + + //allow setting options with data attributes + //data-api options will be overwritten with custom javascript options + options = $.extend(this.element.data(), options); + + //html template for the picker UI + if (typeof options.template !== 'string' && !(options.template instanceof $)) + options.template = + '

    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '' + + '' + + ' ' + + '
    ' + + '
    '; + + this.parentEl = (options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl); + this.container = $(options.template).appendTo(this.parentEl); + + // + // handle all the possible options overriding defaults + // + + if (typeof options.locale === 'object') { + + if (typeof options.locale.direction === 'string') + this.locale.direction = options.locale.direction; + + if (typeof options.locale.format === 'string') + this.locale.format = options.locale.format; + + if (typeof options.locale.separator === 'string') + this.locale.separator = options.locale.separator; + + if (typeof options.locale.daysOfWeek === 'object') + this.locale.daysOfWeek = options.locale.daysOfWeek.slice(); + + if (typeof options.locale.monthNames === 'object') + this.locale.monthNames = options.locale.monthNames.slice(); + + if (typeof options.locale.firstDay === 'number') + this.locale.firstDay = options.locale.firstDay; + + if (typeof options.locale.applyLabel === 'string') + this.locale.applyLabel = options.locale.applyLabel; + + if (typeof options.locale.cancelLabel === 'string') + this.locale.cancelLabel = options.locale.cancelLabel; + + if (typeof options.locale.weekLabel === 'string') + this.locale.weekLabel = options.locale.weekLabel; + + if (typeof options.locale.customRangeLabel === 'string'){ + //Support unicode chars in the custom range name. + var elem = document.createElement('textarea'); + elem.innerHTML = options.locale.customRangeLabel; + var rangeHtml = elem.value; + this.locale.customRangeLabel = rangeHtml; + } + } + this.container.addClass(this.locale.direction); + + if (typeof options.startDate === 'string') + this.startDate = moment(options.startDate, this.locale.format); + + if (typeof options.endDate === 'string') + this.endDate = moment(options.endDate, this.locale.format); + + if (typeof options.minDate === 'string') + this.minDate = moment(options.minDate, this.locale.format); + + if (typeof options.maxDate === 'string') + this.maxDate = moment(options.maxDate, this.locale.format); + + if (typeof options.startDate === 'object') + this.startDate = moment(options.startDate); + + if (typeof options.endDate === 'object') + this.endDate = moment(options.endDate); + + if (typeof options.minDate === 'object') + this.minDate = moment(options.minDate); + + if (typeof options.maxDate === 'object') + this.maxDate = moment(options.maxDate); + + // sanity check for bad options + if (this.minDate && this.startDate.isBefore(this.minDate)) + this.startDate = this.minDate.clone(); + + // sanity check for bad options + if (this.maxDate && this.endDate.isAfter(this.maxDate)) + this.endDate = this.maxDate.clone(); + + if (typeof options.applyButtonClasses === 'string') + this.applyButtonClasses = options.applyButtonClasses; + + if (typeof options.applyClass === 'string') //backwards compat + this.applyButtonClasses = options.applyClass; + + if (typeof options.cancelButtonClasses === 'string') + this.cancelButtonClasses = options.cancelButtonClasses; + + if (typeof options.cancelClass === 'string') //backwards compat + this.cancelButtonClasses = options.cancelClass; + + if (typeof options.maxSpan === 'object') + this.maxSpan = options.maxSpan; + + if (typeof options.dateLimit === 'object') //backwards compat + this.maxSpan = options.dateLimit; + + if (typeof options.opens === 'string') + this.opens = options.opens; + + if (typeof options.drops === 'string') + this.drops = options.drops; + + if (typeof options.showWeekNumbers === 'boolean') + this.showWeekNumbers = options.showWeekNumbers; + + if (typeof options.showISOWeekNumbers === 'boolean') + this.showISOWeekNumbers = options.showISOWeekNumbers; + + if (typeof options.buttonClasses === 'string') + this.buttonClasses = options.buttonClasses; + + if (typeof options.buttonClasses === 'object') + this.buttonClasses = options.buttonClasses.join(' '); + + if (typeof options.showDropdowns === 'boolean') + this.showDropdowns = options.showDropdowns; + + if (typeof options.minYear === 'number') + this.minYear = options.minYear; + + if (typeof options.maxYear === 'number') + this.maxYear = options.maxYear; + + if (typeof options.showCustomRangeLabel === 'boolean') + this.showCustomRangeLabel = options.showCustomRangeLabel; + + if (typeof options.singleDatePicker === 'boolean') { + this.singleDatePicker = options.singleDatePicker; + if (this.singleDatePicker) + this.endDate = this.startDate.clone(); + } + + if (typeof options.timePicker === 'boolean') + this.timePicker = options.timePicker; + + if (typeof options.timePickerSeconds === 'boolean') + this.timePickerSeconds = options.timePickerSeconds; + + if (typeof options.timePickerIncrement === 'number') + this.timePickerIncrement = options.timePickerIncrement; + + if (typeof options.timePicker24Hour === 'boolean') + this.timePicker24Hour = options.timePicker24Hour; + + if (typeof options.autoApply === 'boolean') + this.autoApply = options.autoApply; + + if (typeof options.autoUpdateInput === 'boolean') + this.autoUpdateInput = options.autoUpdateInput; + + if (typeof options.linkedCalendars === 'boolean') + this.linkedCalendars = options.linkedCalendars; + + if (typeof options.isInvalidDate === 'function') + this.isInvalidDate = options.isInvalidDate; + + if (typeof options.isCustomDate === 'function') + this.isCustomDate = options.isCustomDate; + + if (typeof options.alwaysShowCalendars === 'boolean') + this.alwaysShowCalendars = options.alwaysShowCalendars; + + // update day names order to firstDay + if (this.locale.firstDay != 0) { + var iterator = this.locale.firstDay; + while (iterator > 0) { + this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()); + iterator--; + } + } + + var start, end, range; + + //if no start/end dates set, check if an input element contains initial values + if (typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') { + if ($(this.element).is(':text')) { + var val = $(this.element).val(), + split = val.split(this.locale.separator); + + start = end = null; + + if (split.length == 2) { + start = moment(split[0], this.locale.format); + end = moment(split[1], this.locale.format); + } else if (this.singleDatePicker && val !== "") { + start = moment(val, this.locale.format); + end = moment(val, this.locale.format); + } + if (start !== null && end !== null) { + this.setStartDate(start); + this.setEndDate(end); + } + } + } + + if (typeof options.ranges === 'object') { + for (range in options.ranges) { + + if (typeof options.ranges[range][0] === 'string') + start = moment(options.ranges[range][0], this.locale.format); + else + start = moment(options.ranges[range][0]); + + if (typeof options.ranges[range][1] === 'string') + end = moment(options.ranges[range][1], this.locale.format); + else + end = moment(options.ranges[range][1]); + + // If the start or end date exceed those allowed by the minDate or maxSpan + // options, shorten the range to the allowable period. + if (this.minDate && start.isBefore(this.minDate)) + start = this.minDate.clone(); + + var maxDate = this.maxDate; + if (this.maxSpan && maxDate && start.clone().add(this.maxSpan).isAfter(maxDate)) + maxDate = start.clone().add(this.maxSpan); + if (maxDate && end.isAfter(maxDate)) + end = maxDate.clone(); + + // If the end of the range is before the minimum or the start of the range is + // after the maximum, don't display this range option at all. + if ((this.minDate && end.isBefore(this.minDate, this.timepicker ? 'minute' : 'day')) + || (maxDate && start.isAfter(maxDate, this.timepicker ? 'minute' : 'day'))) + continue; + + //Support unicode chars in the range names. + var elem = document.createElement('textarea'); + elem.innerHTML = range; + var rangeHtml = elem.value; + + this.ranges[rangeHtml] = [start, end]; + } + + var list = '
      '; + for (range in this.ranges) { + list += '
    • ' + range + '
    • '; + } + if (this.showCustomRangeLabel) { + list += '
    • ' + this.locale.customRangeLabel + '
    • '; + } + list += '
    '; + this.container.find('.ranges').prepend(list); + } + + if (typeof cb === 'function') { + this.callback = cb; + } + + if (!this.timePicker) { + this.startDate = this.startDate.startOf('day'); + this.endDate = this.endDate.endOf('day'); + this.container.find('.calendar-time').hide(); + } + + //can't be used together for now + if (this.timePicker && this.autoApply) + this.autoApply = false; + + if (this.autoApply) { + this.container.addClass('auto-apply'); + } + + if (typeof options.ranges === 'object') + this.container.addClass('show-ranges'); + + if (this.singleDatePicker) { + this.container.addClass('single'); + this.container.find('.drp-calendar.left').addClass('single'); + this.container.find('.drp-calendar.left').show(); + this.container.find('.drp-calendar.right').hide(); + if (!this.timePicker) { + this.container.addClass('auto-apply'); + } + } + + if ((typeof options.ranges === 'undefined' && !this.singleDatePicker) || this.alwaysShowCalendars) { + this.container.addClass('show-calendar'); + } + + this.container.addClass('opens' + this.opens); + + //apply CSS classes and labels to buttons + this.container.find('.applyBtn, .cancelBtn').addClass(this.buttonClasses); + if (this.applyButtonClasses.length) + this.container.find('.applyBtn').addClass(this.applyButtonClasses); + if (this.cancelButtonClasses.length) + this.container.find('.cancelBtn').addClass(this.cancelButtonClasses); + this.container.find('.applyBtn').html(this.locale.applyLabel); + this.container.find('.cancelBtn').html(this.locale.cancelLabel); + + // + // event listeners + // + + this.container.find('.drp-calendar') + .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, this)) + .on('click.daterangepicker', '.next', $.proxy(this.clickNext, this)) + .on('mousedown.daterangepicker', 'td.available', $.proxy(this.clickDate, this)) + .on('mouseenter.daterangepicker', 'td.available', $.proxy(this.hoverDate, this)) + .on('change.daterangepicker', 'select.yearselect', $.proxy(this.monthOrYearChanged, this)) + .on('change.daterangepicker', 'select.monthselect', $.proxy(this.monthOrYearChanged, this)) + .on('change.daterangepicker', 'select.hourselect,select.minuteselect,select.secondselect,select.ampmselect', $.proxy(this.timeChanged, this)) + + this.container.find('.ranges') + .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this)) + + this.container.find('.drp-buttons') + .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this)) + .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this)) + + if (this.element.is('input') || this.element.is('button')) { + this.element.on({ + 'click.daterangepicker': $.proxy(this.show, this), + 'focus.daterangepicker': $.proxy(this.show, this), + 'keyup.daterangepicker': $.proxy(this.elementChanged, this), + 'keydown.daterangepicker': $.proxy(this.keydown, this) //IE 11 compatibility + }); + } else { + this.element.on('click.daterangepicker', $.proxy(this.toggle, this)); + this.element.on('keydown.daterangepicker', $.proxy(this.toggle, this)); + } + + // + // if attached to a text input, set the initial value + // + + this.updateElement(); + + }; + + DateRangePicker.prototype = { + + constructor: DateRangePicker, + + setStartDate: function(startDate) { + if (typeof startDate === 'string') + this.startDate = moment(startDate, this.locale.format); + + if (typeof startDate === 'object') + this.startDate = moment(startDate); + + if (!this.timePicker) + this.startDate = this.startDate.startOf('day'); + + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + + if (this.minDate && this.startDate.isBefore(this.minDate)) { + this.startDate = this.minDate.clone(); + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + } + + if (this.maxDate && this.startDate.isAfter(this.maxDate)) { + this.startDate = this.maxDate.clone(); + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.floor(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + } + + if (!this.isShowing) + this.updateElement(); + + this.updateMonthsInView(); + }, + + setEndDate: function(endDate) { + if (typeof endDate === 'string') + this.endDate = moment(endDate, this.locale.format); + + if (typeof endDate === 'object') + this.endDate = moment(endDate); + + if (!this.timePicker) + this.endDate = this.endDate.add(1,'d').startOf('day').subtract(1,'second'); + + if (this.timePicker && this.timePickerIncrement) + this.endDate.minute(Math.round(this.endDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + + if (this.endDate.isBefore(this.startDate)) + this.endDate = this.startDate.clone(); + + if (this.maxDate && this.endDate.isAfter(this.maxDate)) + this.endDate = this.maxDate.clone(); + + if (this.maxSpan && this.startDate.clone().add(this.maxSpan).isBefore(this.endDate)) + this.endDate = this.startDate.clone().add(this.maxSpan); + + this.previousRightTime = this.endDate.clone(); + + this.container.find('.drp-selected').html(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format)); + + if (!this.isShowing) + this.updateElement(); + + this.updateMonthsInView(); + }, + + isInvalidDate: function() { + return false; + }, + + isCustomDate: function() { + return false; + }, + + updateView: function() { + if (this.timePicker) { + this.renderTimePicker('left'); + this.renderTimePicker('right'); + if (!this.endDate) { + this.container.find('.right .calendar-time select').attr('disabled', 'disabled').addClass('disabled'); + } else { + this.container.find('.right .calendar-time select').removeAttr('disabled').removeClass('disabled'); + } + } + if (this.endDate) + this.container.find('.drp-selected').html(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format)); + this.updateMonthsInView(); + this.updateCalendars(); + this.updateFormInputs(); + }, + + updateMonthsInView: function() { + if (this.endDate) { + + //if both dates are visible already, do nothing + if (!this.singleDatePicker && this.leftCalendar.month && this.rightCalendar.month && + (this.startDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.startDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM')) + && + (this.endDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.endDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM')) + ) { + return; + } + + this.leftCalendar.month = this.startDate.clone().date(2); + if (!this.linkedCalendars && (this.endDate.month() != this.startDate.month() || this.endDate.year() != this.startDate.year())) { + this.rightCalendar.month = this.endDate.clone().date(2); + } else { + this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month'); + } + + } else { + if (this.leftCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM') && this.rightCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM')) { + this.leftCalendar.month = this.startDate.clone().date(2); + this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month'); + } + } + if (this.maxDate && this.linkedCalendars && !this.singleDatePicker && this.rightCalendar.month > this.maxDate) { + this.rightCalendar.month = this.maxDate.clone().date(2); + this.leftCalendar.month = this.maxDate.clone().date(2).subtract(1, 'month'); + } + }, + + updateCalendars: function() { + + if (this.timePicker) { + var hour, minute, second; + if (this.endDate) { + hour = parseInt(this.container.find('.left .hourselect').val(), 10); + minute = parseInt(this.container.find('.left .minuteselect').val(), 10); + second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0; + if (!this.timePicker24Hour) { + var ampm = this.container.find('.left .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + } else { + hour = parseInt(this.container.find('.right .hourselect').val(), 10); + minute = parseInt(this.container.find('.right .minuteselect').val(), 10); + second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0; + if (!this.timePicker24Hour) { + var ampm = this.container.find('.right .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + } + this.leftCalendar.month.hour(hour).minute(minute).second(second); + this.rightCalendar.month.hour(hour).minute(minute).second(second); + } + + this.renderCalendar('left'); + this.renderCalendar('right'); + + //highlight any predefined range matching the current start and end dates + this.container.find('.ranges li').removeClass('active'); + if (this.endDate == null) return; + + this.calculateChosenLabel(); + }, + + renderCalendar: function(side) { + + // + // Build the matrix of dates that will populate the calendar + // + + var calendar = side == 'left' ? this.leftCalendar : this.rightCalendar; + var month = calendar.month.month(); + var year = calendar.month.year(); + var hour = calendar.month.hour(); + var minute = calendar.month.minute(); + var second = calendar.month.second(); + var daysInMonth = moment([year, month]).daysInMonth(); + var firstDay = moment([year, month, 1]); + var lastDay = moment([year, month, daysInMonth]); + var lastMonth = moment(firstDay).subtract(1, 'month').month(); + var lastYear = moment(firstDay).subtract(1, 'month').year(); + var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth(); + var dayOfWeek = firstDay.day(); + + //initialize a 6 rows x 7 columns array for the calendar + var calendar = []; + calendar.firstDay = firstDay; + calendar.lastDay = lastDay; + + for (var i = 0; i < 6; i++) { + calendar[i] = []; + } + + //populate the calendar with date objects + var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1; + if (startDay > daysInLastMonth) + startDay -= 7; + + if (dayOfWeek == this.locale.firstDay) + startDay = daysInLastMonth - 6; + + var curDate = moment([lastYear, lastMonth, startDay, 12, minute, second]); + + var col, row; + for (var i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add(24, 'hour')) { + if (i > 0 && col % 7 === 0) { + col = 0; + row++; + } + calendar[row][col] = curDate.clone().hour(hour).minute(minute).second(second); + curDate.hour(12); + + if (this.minDate && calendar[row][col].format('YYYY-MM-DD') == this.minDate.format('YYYY-MM-DD') && calendar[row][col].isBefore(this.minDate) && side == 'left') { + calendar[row][col] = this.minDate.clone(); + } + + if (this.maxDate && calendar[row][col].format('YYYY-MM-DD') == this.maxDate.format('YYYY-MM-DD') && calendar[row][col].isAfter(this.maxDate) && side == 'right') { + calendar[row][col] = this.maxDate.clone(); + } + + } + + //make the calendar object available to hoverDate/clickDate + if (side == 'left') { + this.leftCalendar.calendar = calendar; + } else { + this.rightCalendar.calendar = calendar; + } + + // + // Display the calendar + // + + var minDate = side == 'left' ? this.minDate : this.startDate; + var maxDate = this.maxDate; + var selected = side == 'left' ? this.startDate : this.endDate; + var arrow = this.locale.direction == 'ltr' ? {left: 'chevron-left', right: 'chevron-right'} : {left: 'chevron-right', right: 'chevron-left'}; + + var html = ''; + html += ''; + html += ''; + + // add empty cell for week number + if (this.showWeekNumbers || this.showISOWeekNumbers) + html += ''; + + if ((!minDate || minDate.isBefore(calendar.firstDay)) && (!this.linkedCalendars || side == 'left')) { + html += ''; + } else { + html += ''; + } + + var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(" YYYY"); + + if (this.showDropdowns) { + var currentMonth = calendar[1][1].month(); + var currentYear = calendar[1][1].year(); + var maxYear = (maxDate && maxDate.year()) || (this.maxYear); + var minYear = (minDate && minDate.year()) || (this.minYear); + var inMinYear = currentYear == minYear; + var inMaxYear = currentYear == maxYear; + + var monthHtml = '"; + + var yearHtml = ''; + + dateHtml = monthHtml + yearHtml; + } + + html += ''; + if ((!maxDate || maxDate.isAfter(calendar.lastDay)) && (!this.linkedCalendars || side == 'right' || this.singleDatePicker)) { + html += ''; + } else { + html += ''; + } + + html += ''; + html += ''; + + // add week number label + if (this.showWeekNumbers || this.showISOWeekNumbers) + html += ''; + + $.each(this.locale.daysOfWeek, function(index, dayOfWeek) { + html += ''; + }); + + html += ''; + html += ''; + html += ''; + + //adjust maxDate to reflect the maxSpan setting in order to + //grey out end dates beyond the maxSpan + if (this.endDate == null && this.maxSpan) { + var maxLimit = this.startDate.clone().add(this.maxSpan).endOf('day'); + if (!maxDate || maxLimit.isBefore(maxDate)) { + maxDate = maxLimit; + } + } + + for (var row = 0; row < 6; row++) { + html += ''; + + // add week number + if (this.showWeekNumbers) + html += ''; + else if (this.showISOWeekNumbers) + html += ''; + + for (var col = 0; col < 7; col++) { + + var classes = []; + + //highlight today's date + if (calendar[row][col].isSame(new Date(), "day")) + classes.push('today'); + + //highlight weekends + if (calendar[row][col].isoWeekday() > 5) + classes.push('weekend'); + + //grey out the dates in other months displayed at beginning and end of this calendar + if (calendar[row][col].month() != calendar[1][1].month()) + classes.push('off'); + + //don't allow selection of dates before the minimum date + if (this.minDate && calendar[row][col].isBefore(this.minDate, 'day')) + classes.push('off', 'disabled'); + + //don't allow selection of dates after the maximum date + if (maxDate && calendar[row][col].isAfter(maxDate, 'day')) + classes.push('off', 'disabled'); + + //don't allow selection of date if a custom function decides it's invalid + if (this.isInvalidDate(calendar[row][col])) + classes.push('off', 'disabled'); + + //highlight the currently selected start date + if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD')) + classes.push('active', 'start-date'); + + //highlight the currently selected end date + if (this.endDate != null && calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD')) + classes.push('active', 'end-date'); + + //highlight dates in-between the selected dates + if (this.endDate != null && calendar[row][col] > this.startDate && calendar[row][col] < this.endDate) + classes.push('in-range'); + + //apply custom classes for this date + var isCustom = this.isCustomDate(calendar[row][col]); + if (isCustom !== false) { + if (typeof isCustom === 'string') + classes.push(isCustom); + else + Array.prototype.push.apply(classes, isCustom); + } + + var cname = '', disabled = false; + for (var i = 0; i < classes.length; i++) { + cname += classes[i] + ' '; + if (classes[i] == 'disabled') + disabled = true; + } + if (!disabled) + cname += 'available'; + + html += ''; + + } + html += ''; + } + + html += ''; + html += '
    ' + dateHtml + '
    ' + this.locale.weekLabel + '' + dayOfWeek + '
    ' + calendar[row][0].week() + '' + calendar[row][0].isoWeek() + '' + calendar[row][col].date() + '
    '; + + this.container.find('.drp-calendar.' + side + ' .calendar-table').html(html); + + }, + + renderTimePicker: function(side) { + + // Don't bother updating the time picker if it's currently disabled + // because an end date hasn't been clicked yet + if (side == 'right' && !this.endDate) return; + + var html, selected, minDate, maxDate = this.maxDate; + + if (this.maxSpan && (!this.maxDate || this.startDate.clone().add(this.maxSpan).isAfter(this.maxDate))) + maxDate = this.startDate.clone().add(this.maxSpan); + + if (side == 'left') { + selected = this.startDate.clone(); + minDate = this.minDate; + } else if (side == 'right') { + selected = this.endDate.clone(); + minDate = this.startDate; + + //Preserve the time already selected + var timeSelector = this.container.find('.drp-calendar.right .calendar-time'); + if (timeSelector.html() != '') { + + selected.hour(selected.hour() || timeSelector.find('.hourselect option:selected').val()); + selected.minute(selected.minute() || timeSelector.find('.minuteselect option:selected').val()); + selected.second(selected.second() || timeSelector.find('.secondselect option:selected').val()); + + if (!this.timePicker24Hour) { + var ampm = timeSelector.find('.ampmselect option:selected').val(); + if (ampm === 'PM' && selected.hour() < 12) + selected.hour(selected.hour() + 12); + if (ampm === 'AM' && selected.hour() === 12) + selected.hour(0); + } + + } + + if (selected.isBefore(this.startDate)) + selected = this.startDate.clone(); + + if (maxDate && selected.isAfter(maxDate)) + selected = maxDate.clone(); + + } + + // + // hours + // + + html = ' '; + + // + // minutes + // + + html += ': '; + + // + // seconds + // + + if (this.timePickerSeconds) { + html += ': '; + } + + // + // AM/PM + // + + if (!this.timePicker24Hour) { + html += ''; + } + + this.container.find('.drp-calendar.' + side + ' .calendar-time').html(html); + + }, + + updateFormInputs: function() { + + if (this.singleDatePicker || (this.endDate && (this.startDate.isBefore(this.endDate) || this.startDate.isSame(this.endDate)))) { + this.container.find('button.applyBtn').removeAttr('disabled'); + } else { + this.container.find('button.applyBtn').attr('disabled', 'disabled'); + } + + }, + + move: function() { + var parentOffset = { top: 0, left: 0 }, + containerTop; + var parentRightEdge = $(window).width(); + if (!this.parentEl.is('body')) { + parentOffset = { + top: this.parentEl.offset().top - this.parentEl.scrollTop(), + left: this.parentEl.offset().left - this.parentEl.scrollLeft() + }; + parentRightEdge = this.parentEl[0].clientWidth + this.parentEl.offset().left; + } + + if (this.drops == 'up') + containerTop = this.element.offset().top - this.container.outerHeight() - parentOffset.top; + else + containerTop = this.element.offset().top + this.element.outerHeight() - parentOffset.top; + this.container[this.drops == 'up' ? 'addClass' : 'removeClass']('drop-up'); + + if (this.opens == 'left') { + this.container.css({ + top: containerTop, + right: parentRightEdge - this.element.offset().left - this.element.outerWidth(), + left: 'auto' + }); + if (this.container.offset().left < 0) { + this.container.css({ + right: 'auto', + left: 9 + }); + } + } else if (this.opens == 'center') { + this.container.css({ + top: containerTop, + left: this.element.offset().left - parentOffset.left + this.element.outerWidth() / 2 + - this.container.outerWidth() / 2, + right: 'auto' + }); + if (this.container.offset().left < 0) { + this.container.css({ + right: 'auto', + left: 9 + }); + } + } else { + this.container.css({ + top: containerTop, + left: this.element.offset().left - parentOffset.left, + right: 'auto' + }); + if (this.container.offset().left + this.container.outerWidth() > $(window).width()) { + this.container.css({ + left: 'auto', + right: 0 + }); + } + } + }, + + show: function(e) { + if (this.isShowing) return; + + // Create a click proxy that is private to this instance of datepicker, for unbinding + this._outsideClickProxy = $.proxy(function(e) { this.outsideClick(e); }, this); + + // Bind global datepicker mousedown for hiding and + $(document) + .on('mousedown.daterangepicker', this._outsideClickProxy) + // also support mobile devices + .on('touchend.daterangepicker', this._outsideClickProxy) + // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them + .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy) + // and also close when focus changes to outside the picker (eg. tabbing between controls) + .on('focusin.daterangepicker', this._outsideClickProxy); + + // Reposition the picker if the window is resized while it's open + $(window).on('resize.daterangepicker', $.proxy(function(e) { this.move(e); }, this)); + + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + this.previousRightTime = this.endDate.clone(); + + this.updateView(); + this.container.show(); + this.move(); + this.element.trigger('show.daterangepicker', this); + this.isShowing = true; + }, + + hide: function(e) { + if (!this.isShowing) return; + + //incomplete date selection, revert to last values + if (!this.endDate) { + this.startDate = this.oldStartDate.clone(); + this.endDate = this.oldEndDate.clone(); + } + + //if a new date range was selected, invoke the user callback function + if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) + this.callback(this.startDate.clone(), this.endDate.clone(), this.chosenLabel); + + //if picker is attached to a text input, update it + this.updateElement(); + + $(document).off('.daterangepicker'); + $(window).off('.daterangepicker'); + this.container.hide(); + this.element.trigger('hide.daterangepicker', this); + this.isShowing = false; + }, + + toggle: function(e) { + if (this.isShowing) { + this.hide(); + } else { + this.show(); + } + }, + + outsideClick: function(e) { + var target = $(e.target); + // if the page is clicked anywhere except within the daterangerpicker/button + // itself then call this.hide() + if ( + // ie modal dialog fix + e.type == "focusin" || + target.closest(this.element).length || + target.closest(this.container).length || + target.closest('.calendar-table').length + ) return; + this.hide(); + this.element.trigger('outsideClick.daterangepicker', this); + }, + + showCalendars: function() { + this.container.addClass('show-calendar'); + this.move(); + this.element.trigger('showCalendar.daterangepicker', this); + }, + + hideCalendars: function() { + this.container.removeClass('show-calendar'); + this.element.trigger('hideCalendar.daterangepicker', this); + }, + + clickRange: function(e) { + var label = e.target.getAttribute('data-range-key'); + this.chosenLabel = label; + if (label == this.locale.customRangeLabel) { + this.showCalendars(); + } else { + var dates = this.ranges[label]; + this.startDate = dates[0]; + this.endDate = dates[1]; + + if (!this.timePicker) { + this.startDate.startOf('day'); + this.endDate.endOf('day'); + } + + if (!this.alwaysShowCalendars) + this.hideCalendars(); + this.clickApply(); + } + }, + + clickPrev: function(e) { + var cal = $(e.target).parents('.drp-calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.subtract(1, 'month'); + if (this.linkedCalendars) + this.rightCalendar.month.subtract(1, 'month'); + } else { + this.rightCalendar.month.subtract(1, 'month'); + } + this.updateCalendars(); + }, + + clickNext: function(e) { + var cal = $(e.target).parents('.drp-calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.add(1, 'month'); + } else { + this.rightCalendar.month.add(1, 'month'); + if (this.linkedCalendars) + this.leftCalendar.month.add(1, 'month'); + } + this.updateCalendars(); + }, + + hoverDate: function(e) { + + //ignore dates that can't be selected + if (!$(e.target).hasClass('available')) return; + + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.drp-calendar'); + var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col]; + + //highlight the dates between the start date and the date being hovered as a potential end date + var leftCalendar = this.leftCalendar; + var rightCalendar = this.rightCalendar; + var startDate = this.startDate; + if (!this.endDate) { + this.container.find('.drp-calendar tbody td').each(function(index, el) { + + //skip week numbers, only look at dates + if ($(el).hasClass('week')) return; + + var title = $(el).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(el).parents('.drp-calendar'); + var dt = cal.hasClass('left') ? leftCalendar.calendar[row][col] : rightCalendar.calendar[row][col]; + + if ((dt.isAfter(startDate) && dt.isBefore(date)) || dt.isSame(date, 'day')) { + $(el).addClass('in-range'); + } else { + $(el).removeClass('in-range'); + } + + }); + } + + }, + + clickDate: function(e) { + + if (!$(e.target).hasClass('available')) return; + + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.drp-calendar'); + var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col]; + + // + // this function needs to do a few things: + // * alternate between selecting a start and end date for the range, + // * if the time picker is enabled, apply the hour/minute/second from the select boxes to the clicked date + // * if autoapply is enabled, and an end date was chosen, apply the selection + // * if single date picker mode, and time picker isn't enabled, apply the selection immediately + // * if one of the inputs above the calendars was focused, cancel that manual input + // + + if (this.endDate || date.isBefore(this.startDate, 'day')) { //picking start + if (this.timePicker) { + var hour = parseInt(this.container.find('.left .hourselect').val(), 10); + if (!this.timePicker24Hour) { + var ampm = this.container.find('.left .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + var minute = parseInt(this.container.find('.left .minuteselect').val(), 10); + var second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0; + date = date.clone().hour(hour).minute(minute).second(second); + } + this.endDate = null; + this.setStartDate(date.clone()); + } else if (!this.endDate && date.isBefore(this.startDate)) { + //special case: clicking the same date for start/end, + //but the time of the end date is before the start date + this.setEndDate(this.startDate.clone()); + } else { // picking end + if (this.timePicker) { + var hour = parseInt(this.container.find('.right .hourselect').val(), 10); + if (!this.timePicker24Hour) { + var ampm = this.container.find('.right .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + var minute = parseInt(this.container.find('.right .minuteselect').val(), 10); + var second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0; + date = date.clone().hour(hour).minute(minute).second(second); + } + this.setEndDate(date.clone()); + if (this.autoApply) { + this.calculateChosenLabel(); + this.clickApply(); + } + } + + if (this.singleDatePicker) { + this.setEndDate(this.startDate); + if (!this.timePicker) + this.clickApply(); + } + + this.updateView(); + + //This is to cancel the blur event handler if the mouse was in one of the inputs + e.stopPropagation(); + + }, + + calculateChosenLabel: function () { + var customRange = true; + var i = 0; + for (var range in this.ranges) { + if (this.timePicker) { + var format = this.timePickerSeconds ? "YYYY-MM-DD hh:mm:ss" : "YYYY-MM-DD hh:mm"; + //ignore times when comparing dates if time picker seconds is not enabled + if (this.startDate.format(format) == this.ranges[range][0].format(format) && this.endDate.format(format) == this.ranges[range][1].format(format)) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').attr('data-range-key'); + break; + } + } else { + //ignore times when comparing dates if time picker is not enabled + if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').attr('data-range-key'); + break; + } + } + i++; + } + if (customRange) { + if (this.showCustomRangeLabel) { + this.chosenLabel = this.container.find('.ranges li:last').addClass('active').attr('data-range-key'); + } else { + this.chosenLabel = null; + } + this.showCalendars(); + } + }, + + clickApply: function(e) { + this.hide(); + this.element.trigger('apply.daterangepicker', this); + }, + + clickCancel: function(e) { + this.startDate = this.oldStartDate; + this.endDate = this.oldEndDate; + this.hide(); + this.element.trigger('cancel.daterangepicker', this); + }, + + monthOrYearChanged: function(e) { + var isLeft = $(e.target).closest('.drp-calendar').hasClass('left'), + leftOrRight = isLeft ? 'left' : 'right', + cal = this.container.find('.drp-calendar.'+leftOrRight); + + // Month must be Number for new moment versions + var month = parseInt(cal.find('.monthselect').val(), 10); + var year = cal.find('.yearselect').val(); + + if (!isLeft) { + if (year < this.startDate.year() || (year == this.startDate.year() && month < this.startDate.month())) { + month = this.startDate.month(); + year = this.startDate.year(); + } + } + + if (this.minDate) { + if (year < this.minDate.year() || (year == this.minDate.year() && month < this.minDate.month())) { + month = this.minDate.month(); + year = this.minDate.year(); + } + } + + if (this.maxDate) { + if (year > this.maxDate.year() || (year == this.maxDate.year() && month > this.maxDate.month())) { + month = this.maxDate.month(); + year = this.maxDate.year(); + } + } + + if (isLeft) { + this.leftCalendar.month.month(month).year(year); + if (this.linkedCalendars) + this.rightCalendar.month = this.leftCalendar.month.clone().add(1, 'month'); + } else { + this.rightCalendar.month.month(month).year(year); + if (this.linkedCalendars) + this.leftCalendar.month = this.rightCalendar.month.clone().subtract(1, 'month'); + } + this.updateCalendars(); + }, + + timeChanged: function(e) { + + var cal = $(e.target).closest('.drp-calendar'), + isLeft = cal.hasClass('left'); + + var hour = parseInt(cal.find('.hourselect').val(), 10); + var minute = parseInt(cal.find('.minuteselect').val(), 10); + var second = this.timePickerSeconds ? parseInt(cal.find('.secondselect').val(), 10) : 0; + + if (!this.timePicker24Hour) { + var ampm = cal.find('.ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + + if (isLeft) { + var start = this.startDate.clone(); + start.hour(hour); + start.minute(minute); + start.second(second); + this.setStartDate(start); + if (this.singleDatePicker) { + this.endDate = this.startDate.clone(); + } else if (this.endDate && this.endDate.format('YYYY-MM-DD') == start.format('YYYY-MM-DD') && this.endDate.isBefore(start)) { + this.setEndDate(start.clone()); + } + } else if (this.endDate) { + var end = this.endDate.clone(); + end.hour(hour); + end.minute(minute); + end.second(second); + this.setEndDate(end); + } + + //update the calendars so all clickable dates reflect the new time component + this.updateCalendars(); + + //update the form inputs above the calendars with the new time + this.updateFormInputs(); + + //re-render the time pickers because changing one selection can affect what's enabled in another + this.renderTimePicker('left'); + this.renderTimePicker('right'); + + }, + + elementChanged: function() { + if (!this.element.is('input')) return; + if (!this.element.val().length) return; + + var dateString = this.element.val().split(this.locale.separator), + start = null, + end = null; + + if (dateString.length === 2) { + start = moment(dateString[0], this.locale.format); + end = moment(dateString[1], this.locale.format); + } + + if (this.singleDatePicker || start === null || end === null) { + start = moment(this.element.val(), this.locale.format); + end = start; + } + + if (!start.isValid() || !end.isValid()) return; + + this.setStartDate(start); + this.setEndDate(end); + this.updateView(); + }, + + keydown: function(e) { + //hide on tab or enter + if ((e.keyCode === 9) || (e.keyCode === 13)) { + this.hide(); + } + + //hide on esc and prevent propagation + if (e.keyCode === 27) { + e.preventDefault(); + e.stopPropagation(); + + this.hide(); + } + }, + + updateElement: function() { + if (this.element.is('input') && this.autoUpdateInput) { + var newValue = this.startDate.format(this.locale.format); + if (!this.singleDatePicker) { + newValue += this.locale.separator + this.endDate.format(this.locale.format); + } + if (newValue !== this.element.val()) { + this.element.val(newValue).trigger('change'); + } + } + }, + + remove: function() { + this.container.remove(); + this.element.off('.daterangepicker'); + this.element.removeData(); + } + + }; + + $.fn.daterangepicker = function(options, callback) { + var implementOptions = $.extend(true, {}, $.fn.daterangepicker.defaultOptions, options); + this.each(function() { + var el = $(this); + if (el.data('daterangepicker')) + el.data('daterangepicker').remove(); + el.data('daterangepicker', new DateRangePicker(el, implementOptions, callback)); + }); + return this; + }; + + return DateRangePicker; + +})); diff --git a/public/assets/prototype/js/edison.js b/public/assets/prototype/js/edison.js new file mode 100644 index 0000000..08fb4c9 --- /dev/null +++ b/public/assets/prototype/js/edison.js @@ -0,0 +1,2028 @@ + +// Underscore.js 1.5.2 +// http://underscorejs.org +// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +(function() { + + // Baseline setup + // -------------- + + // Establish the root object, `window` in the browser, or `exports` on the server. + var root = this; + + // Save the previous value of the `_` variable. + var previousUnderscore = root._; + + // Establish the object that gets returned to break out of a loop iteration. + var breaker = {}; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; + + // Create quick reference variables for speed access to core prototypes. + var + push = ArrayProto.push, + slice = ArrayProto.slice, + concat = ArrayProto.concat, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // All **ECMAScript 5** native function implementations that we hope to use + // are declared here. + var + nativeForEach = ArrayProto.forEach, + nativeMap = ArrayProto.map, + nativeReduce = ArrayProto.reduce, + nativeReduceRight = ArrayProto.reduceRight, + nativeFilter = ArrayProto.filter, + nativeEvery = ArrayProto.every, + nativeSome = ArrayProto.some, + nativeIndexOf = ArrayProto.indexOf, + nativeLastIndexOf = ArrayProto.lastIndexOf, + nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeBind = FuncProto.bind; + + // Create a safe reference to the Underscore object for use below. + var _ = function(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; + }; + + // Export the Underscore object for **Node.js**, with + // backwards-compatibility for the old `require()` API. If we're in + // the browser, add `_` as a global object via a string identifier, + // for Closure Compiler "advanced" mode. + if (typeof exports !== 'undefined') { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = _; + } + exports._ = _; + } else { + root._ = _; + } + + // Current version. + _.VERSION = '1.5.2'; + + // Collection Functions + // -------------------- + + // The cornerstone, an `each` implementation, aka `forEach`. + // Handles objects with the built-in `forEach`, arrays, and raw objects. + // Delegates to **ECMAScript 5**'s native `forEach` if available. + var each = _.each = _.forEach = function(obj, iterator, context) { + if (obj == null) return; + if (nativeForEach && obj.forEach === nativeForEach) { + obj.forEach(iterator, context); + } else if (obj.length === +obj.length) { + for (var i = 0, length = obj.length; i < length; i++) { + if (iterator.call(context, obj[i], i, obj) === breaker) return; + } + } else { + var keys = _.keys(obj); + for (var i = 0, length = keys.length; i < length; i++) { + if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return; + } + } + }; + + // Return the results of applying the iterator to each element. + // Delegates to **ECMAScript 5**'s native `map` if available. + _.map = _.collect = function(obj, iterator, context) { + var results = []; + if (obj == null) return results; + if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); + each(obj, function(value, index, list) { + results.push(iterator.call(context, value, index, list)); + }); + return results; + }; + + var reduceError = 'Reduce of empty array with no initial value'; + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available. + _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) { + var initial = arguments.length > 2; + if (obj == null) obj = []; + if (nativeReduce && obj.reduce === nativeReduce) { + if (context) iterator = _.bind(iterator, context); + return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); + } + each(obj, function(value, index, list) { + if (!initial) { + memo = value; + initial = true; + } else { + memo = iterator.call(context, memo, value, index, list); + } + }); + if (!initial) throw new TypeError(reduceError); + return memo; + }; + + // The right-associative version of reduce, also known as `foldr`. + // Delegates to **ECMAScript 5**'s native `reduceRight` if available. + _.reduceRight = _.foldr = function(obj, iterator, memo, context) { + var initial = arguments.length > 2; + if (obj == null) obj = []; + if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { + if (context) iterator = _.bind(iterator, context); + return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator); + } + var length = obj.length; + if (length !== +length) { + var keys = _.keys(obj); + length = keys.length; + } + each(obj, function(value, index, list) { + index = keys ? keys[--length] : --length; + if (!initial) { + memo = obj[index]; + initial = true; + } else { + memo = iterator.call(context, memo, obj[index], index, list); + } + }); + if (!initial) throw new TypeError(reduceError); + return memo; + }; + + // Return the first value which passes a truth test. Aliased as `detect`. + _.find = _.detect = function(obj, iterator, context) { + var result; + any(obj, function(value, index, list) { + if (iterator.call(context, value, index, list)) { + result = value; + return true; + } + }); + return result; + }; + + // Return all the elements that pass a truth test. + // Delegates to **ECMAScript 5**'s native `filter` if available. + // Aliased as `select`. + _.filter = _.select = function(obj, iterator, context) { + var results = []; + if (obj == null) return results; + if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context); + each(obj, function(value, index, list) { + if (iterator.call(context, value, index, list)) results.push(value); + }); + return results; + }; + + // Return all the elements for which a truth test fails. + _.reject = function(obj, iterator, context) { + return _.filter(obj, function(value, index, list) { + return !iterator.call(context, value, index, list); + }, context); + }; + + // Determine whether all of the elements match a truth test. + // Delegates to **ECMAScript 5**'s native `every` if available. + // Aliased as `all`. + _.every = _.all = function(obj, iterator, context) { + iterator || (iterator = _.identity); + var result = true; + if (obj == null) return result; + if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context); + each(obj, function(value, index, list) { + if (!(result = result && iterator.call(context, value, index, list))) return breaker; + }); + return !!result; + }; + + // Determine if at least one element in the object matches a truth test. + // Delegates to **ECMAScript 5**'s native `some` if available. + // Aliased as `any`. + var any = _.some = _.any = function(obj, iterator, context) { + iterator || (iterator = _.identity); + var result = false; + if (obj == null) return result; + if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context); + each(obj, function(value, index, list) { + if (result || (result = iterator.call(context, value, index, list))) return breaker; + }); + return !!result; + }; + + // Determine if the array or object contains a given value (using `===`). + // Aliased as `include`. + _.contains = _.include = function(obj, target) { + if (obj == null) return false; + if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; + return any(obj, function(value) { + return value === target; + }); + }; + + // Invoke a method (with arguments) on every item in a collection. + _.invoke = function(obj, method) { + var args = slice.call(arguments, 2); + var isFunc = _.isFunction(method); + return _.map(obj, function(value) { + return (isFunc ? method : value[method]).apply(value, args); + }); + }; + + // Convenience version of a common use case of `map`: fetching a property. + _.pluck = function(obj, key) { + return _.map(obj, function(value){ return value[key]; }); + }; + + // Convenience version of a common use case of `filter`: selecting only objects + // containing specific `key:value` pairs. + _.where = function(obj, attrs, first) { + if (_.isEmpty(attrs)) return first ? void 0 : []; + return _[first ? 'find' : 'filter'](obj, function(value) { + for (var key in attrs) { + if (attrs[key] !== value[key]) return false; + } + return true; + }); + }; + + // Convenience version of a common use case of `find`: getting the first object + // containing specific `key:value` pairs. + _.findWhere = function(obj, attrs) { + return _.where(obj, attrs, true); + }; + + // Return the maximum element or (element-based computation). + // Can't optimize arrays of integers longer than 65,535 elements. + // See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797) + _.max = function(obj, iterator, context) { + if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { + return Math.max.apply(Math, obj); + } + if (!iterator && _.isEmpty(obj)) return -Infinity; + var result = {computed : -Infinity, value: -Infinity}; + each(obj, function(value, index, list) { + var computed = iterator ? iterator.call(context, value, index, list) : value; + computed > result.computed && (result = {value : value, computed : computed}); + }); + return result.value; + }; + + // Return the minimum element (or element-based computation). + _.min = function(obj, iterator, context) { + if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { + return Math.min.apply(Math, obj); + } + if (!iterator && _.isEmpty(obj)) return Infinity; + var result = {computed : Infinity, value: Infinity}; + each(obj, function(value, index, list) { + var computed = iterator ? iterator.call(context, value, index, list) : value; + computed < result.computed && (result = {value : value, computed : computed}); + }); + return result.value; + }; + + // Shuffle an array, using the modern version of the + // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + _.shuffle = function(obj) { + var rand; + var index = 0; + var shuffled = []; + each(obj, function(value) { + rand = _.random(index++); + shuffled[index - 1] = shuffled[rand]; + shuffled[rand] = value; + }); + return shuffled; + }; + + // Sample **n** random values from an array. + // If **n** is not specified, returns a single random element from the array. + // The internal `guard` argument allows it to work with `map`. + _.sample = function(obj, n, guard) { + if (arguments.length < 2 || guard) { + return obj[_.random(obj.length - 1)]; + } + return _.shuffle(obj).slice(0, Math.max(0, n)); + }; + + // An internal function to generate lookup iterators. + var lookupIterator = function(value) { + return _.isFunction(value) ? value : function(obj){ return obj[value]; }; + }; + + // Sort the object's values by a criterion produced by an iterator. + _.sortBy = function(obj, value, context) { + var iterator = lookupIterator(value); + return _.pluck(_.map(obj, function(value, index, list) { + return { + value: value, + index: index, + criteria: iterator.call(context, value, index, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + }; + + // An internal function used for aggregate "group by" operations. + var group = function(behavior) { + return function(obj, value, context) { + var result = {}; + var iterator = value == null ? _.identity : lookupIterator(value); + each(obj, function(value, index) { + var key = iterator.call(context, value, index, obj); + behavior(result, key, value); + }); + return result; + }; + }; + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + _.groupBy = group(function(result, key, value) { + (_.has(result, key) ? result[key] : (result[key] = [])).push(value); + }); + + // Indexes the object's values by a criterion, similar to `groupBy`, but for + // when you know that your index values will be unique. + _.indexBy = group(function(result, key, value) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + _.countBy = group(function(result, key) { + _.has(result, key) ? result[key]++ : result[key] = 1; + }); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + _.sortedIndex = function(array, obj, iterator, context) { + iterator = iterator == null ? _.identity : lookupIterator(iterator); + var value = iterator.call(context, obj); + var low = 0, high = array.length; + while (low < high) { + var mid = (low + high) >>> 1; + iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid; + } + return low; + }; + + // Safely create a real, live array from anything iterable. + _.toArray = function(obj) { + if (!obj) return []; + if (_.isArray(obj)) return slice.call(obj); + if (obj.length === +obj.length) return _.map(obj, _.identity); + return _.values(obj); + }; + + // Return the number of elements in an object. + _.size = function(obj) { + if (obj == null) return 0; + return (obj.length === +obj.length) ? obj.length : _.keys(obj).length; + }; + + // Array Functions + // --------------- + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. Aliased as `head` and `take`. The **guard** check + // allows it to work with `_.map`. + _.first = _.head = _.take = function(array, n, guard) { + if (array == null) return void 0; + return (n == null) || guard ? array[0] : slice.call(array, 0, n); + }; + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. The **guard** check allows it to work with + // `_.map`. + _.initial = function(array, n, guard) { + return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n)); + }; + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. The **guard** check allows it to work with `_.map`. + _.last = function(array, n, guard) { + if (array == null) return void 0; + if ((n == null) || guard) { + return array[array.length - 1]; + } else { + return slice.call(array, Math.max(array.length - n, 0)); + } + }; + + // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. + // Especially useful on the arguments object. Passing an **n** will return + // the rest N values in the array. The **guard** + // check allows it to work with `_.map`. + _.rest = _.tail = _.drop = function(array, n, guard) { + return slice.call(array, (n == null) || guard ? 1 : n); + }; + + // Trim out all falsy values from an array. + _.compact = function(array) { + return _.filter(array, _.identity); + }; + + // Internal implementation of a recursive `flatten` function. + var flatten = function(input, shallow, output) { + if (shallow && _.every(input, _.isArray)) { + return concat.apply(output, input); + } + each(input, function(value) { + if (_.isArray(value) || _.isArguments(value)) { + shallow ? push.apply(output, value) : flatten(value, shallow, output); + } else { + output.push(value); + } + }); + return output; + }; + + // Flatten out an array, either recursively (by default), or just one level. + _.flatten = function(array, shallow) { + return flatten(array, shallow, []); + }; + + // Return a version of the array that does not contain the specified value(s). + _.without = function(array) { + return _.difference(array, slice.call(arguments, 1)); + }; + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // Aliased as `unique`. + _.uniq = _.unique = function(array, isSorted, iterator, context) { + if (_.isFunction(isSorted)) { + context = iterator; + iterator = isSorted; + isSorted = false; + } + var initial = iterator ? _.map(array, iterator, context) : array; + var results = []; + var seen = []; + each(initial, function(value, index) { + if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) { + seen.push(value); + results.push(array[index]); + } + }); + return results; + }; + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + _.union = function() { + return _.uniq(_.flatten(arguments, true)); + }; + + // Produce an array that contains every item shared between all the + // passed-in arrays. + _.intersection = function(array) { + var rest = slice.call(arguments, 1); + return _.filter(_.uniq(array), function(item) { + return _.every(rest, function(other) { + return _.indexOf(other, item) >= 0; + }); + }); + }; + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + _.difference = function(array) { + var rest = concat.apply(ArrayProto, slice.call(arguments, 1)); + return _.filter(array, function(value){ return !_.contains(rest, value); }); + }; + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + _.zip = function() { + var length = _.max(_.pluck(arguments, "length").concat(0)); + var results = new Array(length); + for (var i = 0; i < length; i++) { + results[i] = _.pluck(arguments, '' + i); + } + return results; + }; + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. + _.object = function(list, values) { + if (list == null) return {}; + var result = {}; + for (var i = 0, length = list.length; i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + }; + + // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**), + // we need this function. Return the position of the first occurrence of an + // item in an array, or -1 if the item is not included in the array. + // Delegates to **ECMAScript 5**'s native `indexOf` if available. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + _.indexOf = function(array, item, isSorted) { + if (array == null) return -1; + var i = 0, length = array.length; + if (isSorted) { + if (typeof isSorted == 'number') { + i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted); + } else { + i = _.sortedIndex(array, item); + return array[i] === item ? i : -1; + } + } + if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted); + for (; i < length; i++) if (array[i] === item) return i; + return -1; + }; + + // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available. + _.lastIndexOf = function(array, item, from) { + if (array == null) return -1; + var hasIndex = from != null; + if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) { + return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item); + } + var i = (hasIndex ? from : array.length); + while (i--) if (array[i] === item) return i; + return -1; + }; + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](http://docs.python.org/library/functions.html#range). + _.range = function(start, stop, step) { + if (arguments.length <= 1) { + stop = start || 0; + start = 0; + } + step = arguments[2] || 1; + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var idx = 0; + var range = new Array(length); + + while(idx < length) { + range[idx++] = start; + start += step; + } + + return range; + }; + + // Function (ahem) Functions + // ------------------ + + // Reusable constructor function for prototype setting. + var ctor = function(){}; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if + // available. + _.bind = function(func, context) { + var args, bound; + if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); + if (!_.isFunction(func)) throw new TypeError; + args = slice.call(arguments, 2); + return bound = function() { + if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); + ctor.prototype = func.prototype; + var self = new ctor; + ctor.prototype = null; + var result = func.apply(self, args.concat(slice.call(arguments))); + if (Object(result) === result) return result; + return self; + }; + }; + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. + _.partial = function(func) { + var args = slice.call(arguments, 1); + return function() { + return func.apply(this, args.concat(slice.call(arguments))); + }; + }; + + // Bind all of an object's methods to that object. Useful for ensuring that + // all callbacks defined on an object belong to it. + _.bindAll = function(obj) { + var funcs = slice.call(arguments, 1); + if (funcs.length === 0) throw new Error("bindAll must be passed function names"); + each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); + return obj; + }; + + // Memoize an expensive function by storing its results. + _.memoize = function(func, hasher) { + var memo = {}; + hasher || (hasher = _.identity); + return function() { + var key = hasher.apply(this, arguments); + return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments)); + }; + }; + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + _.delay = function(func, wait) { + var args = slice.call(arguments, 2); + return setTimeout(function(){ return func.apply(null, args); }, wait); + }; + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + _.defer = function(func) { + return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); + }; + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + _.throttle = function(func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + options || (options = {}); + var later = function() { + previous = options.leading === false ? 0 : new Date; + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date; + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }; + + // Returns a function, that, as long as it continues to be invoked, will not + // be triggered. The function will be called after it stops being called for + // N milliseconds. If `immediate` is passed, trigger the function on the + // leading edge, instead of the trailing. + _.debounce = function(func, wait, immediate) { + var timeout, args, context, timestamp, result; + return function() { + context = this; + args = arguments; + timestamp = new Date(); + var later = function() { + var last = (new Date()) - timestamp; + if (last < wait) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + } + }; + var callNow = immediate && !timeout; + if (!timeout) { + timeout = setTimeout(later, wait); + } + if (callNow) result = func.apply(context, args); + return result; + }; + }; + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + _.once = function(func) { + var ran = false, memo; + return function() { + if (ran) return memo; + ran = true; + memo = func.apply(this, arguments); + func = null; + return memo; + }; + }; + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + _.wrap = function(func, wrapper) { + return function() { + var args = [func]; + push.apply(args, arguments); + return wrapper.apply(this, args); + }; + }; + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + _.compose = function() { + var funcs = arguments; + return function() { + var args = arguments; + for (var i = funcs.length - 1; i >= 0; i--) { + args = [funcs[i].apply(this, args)]; + } + return args[0]; + }; + }; + + // Returns a function that will only be executed after being called N times. + _.after = function(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + }; + + // Object Functions + // ---------------- + + // Retrieve the names of an object's properties. + // Delegates to **ECMAScript 5**'s native `Object.keys` + _.keys = nativeKeys || function(obj) { + if (obj !== Object(obj)) throw new TypeError('Invalid object'); + var keys = []; + for (var key in obj) if (_.has(obj, key)) keys.push(key); + return keys; + }; + + // Retrieve the values of an object's properties. + _.values = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var values = new Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[keys[i]]; + } + return values; + }; + + // Convert an object into a list of `[key, value]` pairs. + _.pairs = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var pairs = new Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [keys[i], obj[keys[i]]]; + } + return pairs; + }; + + // Invert the keys and values of an object. The values must be serializable. + _.invert = function(obj) { + var result = {}; + var keys = _.keys(obj); + for (var i = 0, length = keys.length; i < length; i++) { + result[obj[keys[i]]] = keys[i]; + } + return result; + }; + + // Return a sorted list of the function names available on the object. + // Aliased as `methods` + _.functions = _.methods = function(obj) { + var names = []; + for (var key in obj) { + if (_.isFunction(obj[key])) names.push(key); + } + return names.sort(); + }; + + // Extend a given object with all the properties in passed-in object(s). + _.extend = function(obj) { + each(slice.call(arguments, 1), function(source) { + if (source) { + for (var prop in source) { + obj[prop] = source[prop]; + } + } + }); + return obj; + }; + + // Return a copy of the object only containing the whitelisted properties. + _.pick = function(obj) { + var copy = {}; + var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); + each(keys, function(key) { + if (key in obj) copy[key] = obj[key]; + }); + return copy; + }; + + // Return a copy of the object without the blacklisted properties. + _.omit = function(obj) { + var copy = {}; + var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); + for (var key in obj) { + if (!_.contains(keys, key)) copy[key] = obj[key]; + } + return copy; + }; + + // Fill in a given object with default properties. + _.defaults = function(obj) { + each(slice.call(arguments, 1), function(source) { + if (source) { + for (var prop in source) { + if (obj[prop] === void 0) obj[prop] = source[prop]; + } + } + }); + return obj; + }; + + // Create a (shallow-cloned) duplicate of an object. + _.clone = function(obj) { + if (!_.isObject(obj)) return obj; + return _.isArray(obj) ? obj.slice() : _.extend({}, obj); + }; + + // Invokes interceptor with the obj, and then returns obj. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + _.tap = function(obj, interceptor) { + interceptor(obj); + return obj; + }; + + // Internal recursive comparison function for `isEqual`. + var eq = function(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a == 1 / b; + // A strict comparison is necessary because `null == undefined`. + if (a == null || b == null) return a === b; + // Unwrap any wrapped objects. + if (a instanceof _) a = a._wrapped; + if (b instanceof _) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className != toString.call(b)) return false; + switch (className) { + // Strings, numbers, dates, and booleans are compared by value. + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return a == String(b); + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for + // other numeric values. + return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b); + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a == +b; + // RegExps are compared by their source patterns and flags. + case '[object RegExp]': + return a.source == b.source && + a.global == b.global && + a.multiline == b.multiline && + a.ignoreCase == b.ignoreCase; + } + if (typeof a != 'object' || typeof b != 'object') return false; + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] == a) return bStack[length] == b; + } + // Objects with different constructors are not equivalent, but `Object`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) && + _.isFunction(bCtor) && (bCtor instanceof bCtor))) { + return false; + } + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + var size = 0, result = true; + // Recursively compare objects and arrays. + if (className == '[object Array]') { + // Compare array lengths to determine if a deep comparison is necessary. + size = a.length; + result = size == b.length; + if (result) { + // Deep compare the contents, ignoring non-numeric properties. + while (size--) { + if (!(result = eq(a[size], b[size], aStack, bStack))) break; + } + } + } else { + // Deep compare objects. + for (var key in a) { + if (_.has(a, key)) { + // Count the expected number of properties. + size++; + // Deep compare each member. + if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break; + } + } + // Ensure that both objects contain the same number of properties. + if (result) { + for (key in b) { + if (_.has(b, key) && !(size--)) break; + } + result = !size; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return result; + }; + + // Perform a deep comparison to check if two objects are equal. + _.isEqual = function(a, b) { + return eq(a, b, [], []); + }; + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + _.isEmpty = function(obj) { + if (obj == null) return true; + if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; + for (var key in obj) if (_.has(obj, key)) return false; + return true; + }; + + // Is a given value a DOM element? + _.isElement = function(obj) { + return !!(obj && obj.nodeType === 1); + }; + + // Is a given value an array? + // Delegates to ECMA5's native Array.isArray + _.isArray = nativeIsArray || function(obj) { + return toString.call(obj) == '[object Array]'; + }; + + // Is a given variable an object? + _.isObject = function(obj) { + return obj === Object(obj); + }; + + // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp. + each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) { + _['is' + name] = function(obj) { + return toString.call(obj) == '[object ' + name + ']'; + }; + }); + + // Define a fallback version of the method in browsers (ahem, IE), where + // there isn't any inspectable "Arguments" type. + if (!_.isArguments(arguments)) { + _.isArguments = function(obj) { + return !!(obj && _.has(obj, 'callee')); + }; + } + + // Optimize `isFunction` if appropriate. + if (typeof (/./) !== 'function') { + _.isFunction = function(obj) { + return typeof obj === 'function'; + }; + } + + // Is a given object a finite number? + _.isFinite = function(obj) { + return isFinite(obj) && !isNaN(parseFloat(obj)); + }; + + // Is the given value `NaN`? (NaN is the only number which does not equal itself). + _.isNaN = function(obj) { + return _.isNumber(obj) && obj != +obj; + }; + + // Is a given value a boolean? + _.isBoolean = function(obj) { + return obj === true || obj === false || toString.call(obj) == '[object Boolean]'; + }; + + // Is a given value equal to null? + _.isNull = function(obj) { + return obj === null; + }; + + // Is a given variable undefined? + _.isUndefined = function(obj) { + return obj === void 0; + }; + + // Shortcut function for checking if an object has a given property directly + // on itself (in other words, not on a prototype). + _.has = function(obj, key) { + return hasOwnProperty.call(obj, key); + }; + + // Utility Functions + // ----------------- + + // Run Underscore.js in *noConflict* mode, returning the `_` variable to its + // previous owner. Returns a reference to the Underscore object. + _.noConflict = function() { + root._ = previousUnderscore; + return this; + }; + + // Keep the identity function around for default iterators. + _.identity = function(value) { + return value; + }; + + // Run a function **n** times. + _.times = function(n, iterator, context) { + var accum = Array(Math.max(0, n)); + for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i); + return accum; + }; + + // Return a random integer between min and max (inclusive). + _.random = function(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + }; + + // List of HTML entities for escaping. + var entityMap = { + escape: { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + } + }; + entityMap.unescape = _.invert(entityMap.escape); + + // Regexes containing the keys and values listed immediately above. + var entityRegexes = { + escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'), + unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g') + }; + + // Functions for escaping and unescaping strings to/from HTML interpolation. + _.each(['escape', 'unescape'], function(method) { + _[method] = function(string) { + if (string == null) return ''; + return ('' + string).replace(entityRegexes[method], function(match) { + return entityMap[method][match]; + }); + }; + }); + + // If the value of the named `property` is a function then invoke it with the + // `object` as context; otherwise, return it. + _.result = function(object, property) { + if (object == null) return void 0; + var value = object[property]; + return _.isFunction(value) ? value.call(object) : value; + }; + + // Add your own custom functions to the Underscore object. + _.mixin = function(obj) { + each(_.functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return result.call(this, func.apply(_, args)); + }; + }); + }; + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + _.uniqueId = function(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + }; + + // By default, Underscore uses ERB-style template delimiters, change the + // following template settings to use alternative delimiters. + _.templateSettings = { + evaluate : /<%([\s\S]+?)%>/g, + interpolate : /<%=([\s\S]+?)%>/g, + escape : /<%-([\s\S]+?)%>/g + }; + + // When customizing `templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\t': 't', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + _.template = function(text, data, settings) { + var render; + settings = _.defaults({}, settings, _.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = new RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset) + .replace(escaper, function(match) { return '\\' + escapes[match]; }); + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } + if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } + if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + index = offset + match.length; + return match; + }); + source += "';\n"; + + // If a variable is not specified, place data values in local scope. + if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + "return __p;\n"; + + try { + render = new Function(settings.variable || 'obj', '_', source); + } catch (e) { + e.source = source; + throw e; + } + + if (data) return render(data, _); + var template = function(data) { + return render.call(this, data, _); + }; + + // Provide the compiled function source as a convenience for precompilation. + template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}'; + + return template; + }; + + // Add a "chain" function, which will delegate to the wrapper. + _.chain = function(obj) { + return _(obj).chain(); + }; + + // OOP + // --------------- + // If Underscore is called as a function, it returns a wrapped object that + // can be used OO-style. This wrapper holds altered versions of all the + // underscore functions. Wrapped objects may be chained. + + // Helper function to continue chaining intermediate results. + var result = function(obj) { + return this._chain ? _(obj).chain() : obj; + }; + + // Add all of the Underscore functions to the wrapper object. + _.mixin(_); + + // Add all mutator Array functions to the wrapper. + each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + var obj = this._wrapped; + method.apply(obj, arguments); + if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0]; + return result.call(this, obj); + }; + }); + + // Add all accessor Array functions to the wrapper. + each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + return result.call(this, method.apply(this._wrapped, arguments)); + }; + }); + + _.extend(_.prototype, { + + // Start chaining a wrapped Underscore object. + chain: function() { + this._chain = true; + return this; + }, + + // Extracts the result from a wrapped and chained object. + value: function() { + return this._wrapped; + } + + }); + +}).call(this); + +define("underscore", (function (global) { + return function () { + var ret, fn; + return ret || global._; + }; +}(this))); + +define('edison/lib/microevent',[], function() { + + /** + * MicroEvent - to make any js object an event emitter (server or browser) + * + * - pure javascript - server compatible, browser compatible + * - dont rely on the browser doms + * - super simple - you get it immediatly, no mistery, no magic involved + * + * - create a MicroEventDebug with goodies to debug + * - make it safer to use + */ + var MicroEvent = function(){}; + MicroEvent.prototype = { + bind : function(event, fct){ + this._events = this._events || {}; + this._events[event] = this._events[event] || []; + this._events[event].push(fct); + }, + unbind : function(event, fct){ + this._events = this._events || {}; + if( event in this._events === false ) return; + this._events[event].splice(this._events[event].indexOf(fct), 1); + }, + trigger : function(event /* , args... */){ + this._events = this._events || {}; + if( event in this._events === false ) return; + for(var i = 0; i < this._events[event].length; i++){ + this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1)); + } + } + }; + + /** + * mixin will delegate all MicroEvent.js function in the destination object + * + * - require('MicroEvent').mixin(Foobar) will make Foobar able to use MicroEvent + * + * @param {Object} the object which will support MicroEvent + */ + MicroEvent.mixin = function(destObject){ + var props = ['bind', 'unbind', 'trigger']; + for(var i = 0; i < props.length; i ++){ + if( typeof destObject === 'function' ){ + destObject.prototype[props[i]] = MicroEvent.prototype[props[i]]; + }else{ + destObject[props[i]] = MicroEvent.prototype[props[i]]; + } + } + } + + return MicroEvent; + +}); + +define('edison/lib/sandbox',['require','underscore','./microevent'],function(require) { + + var _ = require('underscore'), + MicroEvent = require('./microevent'); + + var Sandbox = function(route) { + this.route = route; + }; + + _.extend(Sandbox.prototype, { + + 'get': function(name) { + name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); + var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), + results = regex.exec(window.location.hash); + return results == null ? null : decodeURIComponent(results[1].replace(/\+/g, " ")); + } + + }); + + MicroEvent.mixin(Sandbox.prototype); + + return Sandbox; + +}); + +define('edison/lib/route',['require','underscore','./sandbox'],function(require) { + + var _ = require('underscore'), + Sandbox = require('./sandbox'); + + /** + * @class Route + */ + var Route = function(options, section, edison) { + + _.defaults(options, { + 'init': function(fn) { + fn(); + } + }); + + var self = this; + self.title = null; + self.name = options.name; + self.section = section; + self.callback = options.callback; + self.extensions = options.extend; + self.template = options.template || "
    "; + self.cleanup = options.cleanup; + + self.log = function() { + if ( !edison.getDebug() ) { + return; + } + console.log(arguments); + }; + + /** + * Returns a string indicating the name of the section + this route. + */ + self.getPath = function() { + return section.getName() + '/' + self.name; + }; + + self.log('New route defined: ' + self.getPath()); + + _.each(edison.getRouteExtensions(), function(ext) { + _.extend(Sandbox.prototype, ext); + }); + + self.sandbox = new Sandbox(); + self.sandbox.section = section.getSandbox(); + + self.init = function(id, fn) { + options.init.call(self.sandbox, function() { + if ( edison.getActiveSection() !== self.section ) { + // The user is making their first entry into this section. + self.log('Initial entry into section: ' + section.getName()); + self.section.loadTemplate(); + self.section.runCallback(); + Sandbox.prototype.container = document.getElementById('route'); + self.loadTemplate(); + } else { + // The user is navigating within the same section. + Sandbox.prototype.container = document.getElementById('route'); + self.loadTemplate(); + } + edison.setActiveSection(self.section); + edison.setActiveRoute(self.api); + self.callback.call(self.sandbox, id); + fn(); + }); + }; + + _.each(self.extensions, function(fnc, extname) { + self.sandbox[extname] = function() { + fnc.apply(self.sandbox, arguments); + }; + }); + + self.loadTemplate = function() { + var tpl = document.createElement('div'); + tpl.innerHTML = self.template; + tpl.setAttribute('id', 'section_' + self.section.getName() + '_route_' + self.name); + tpl.className = 'route'; + edison.insertTemplate(tpl); + }; + + /** + * Public Interface + */ + self.api = { + getCallback: function() { + return self.callback; + }, + getSandbox: function() { + return self.sandbox; + }, + getName: function() { + return self.name; + }, + init: function() { + self.init.apply(self, arguments); + }, + getTitle: function() { + return self.title; + }, + getFullPath: function() { + return this.getFullPath.apply(self, arguments); + }, + cleanup: function() { + if ( _.isFunction(self.cleanup) ) { + self.cleanup.call(self.sandbox); + } + } + }; + + return self.api; + + }; + + _.extend(Route.prototype, { + + /** + * Returns the hashbang path at which this route can be accessed: section_name/route_name + */ + 'getFullPath': function() { + return this.section.getName() + '/' + this.name; + } + + }); + + return Route; + +}); + +define('edison/lib/section',['require','underscore','./route','./sandbox'],function(require) { + + var _ = require('underscore'), + Route = require('./route'), + Sandbox = require('./sandbox'); + + /** + * @class Section + */ + var Section = function(options, edison) { + + var self = this; + self.edison = edison; + self.name = options.name; + self.controller = options.controller; + self.callback = options.callback; + self.extensions = options.extend; + self.parent_section = options.parent_section; + self.template = options.template || "
    "; + self.templateData = options.templateData; + self.cleanup = options.cleanup; + self.routes = {}; + + self.createRoute = function(options) { + options = options || {}; + _.defaults(options, { + 'name': null, + 'callback': null, + 'extend': {}, + 'cleanup': null + }); + if ( !_.isString(options.name) || options.name === '' ) { + throw 'Invalid `name` specified.'; + } + var name_check = options.name.replace(/\W/g, ''); + if ( name_check !== options.name ) { + throw 'Invalid `name` specified.'; + } + if ( !_.isFunction(options.callback) && !_.isNull(options.callback) ) { + throw 'Invalid `callback` specified.'; + } + if ( !_.isObject(options.extend) ) { + throw 'Invalid `extend` value specified.'; + } + if ( !_.isNull(options.cleanup) && !_.isFunction(options.cleanup) ) { + throw 'Invalid `cleanup` value specified.'; + } + options.template_container_selector = '.route'; + var route = new Route(options, self.api, edison); + self.routes[options.name] = route; + return route; + }; + + self.log = function() { + if ( !edison.getDebug() ) { + return; + } + console.log(arguments); + }; + + _.each(edison.getRouteExtensions(), function(ext) { + _.extend(Sandbox.prototype, ext); + }); + + _.extend(Sandbox.prototype, self.extensions); + + self.sandbox = new Sandbox(this); + + self.loadTemplate = function() { + var tpl = document.createElement('div'); + tpl.innerHTML = self.template; + tpl.setAttribute('id', 'edison_section'); + tpl.className = 'section'; + edison.insertSectionTemplate(tpl); + }; + + self.api = { + createRoute: self.createRoute.bind(self), + getRoutes: function() { + return self.routes; + }, + hasRoute: function(name) { + if ( _.isUndefined(self.routes[name]) ) { + return false; + } + return true; + }, + getRoute: function(name) { + return self.routes[name]; + }, + getDefaultRoute: function() { + var routes = _.keys(self.routes); + var route_name = routes[0]; + return self.routes[route_name]; + }, + getName: function() { + return self.name; + }, + getController: function() { + return self.controller; + }, + runCallback: function() { + self.loadTemplate(); + self.callback.call(self.sandbox); + }, + getParentSection: function() { + return self.parent_section; + }, + cleanup: function() { + if ( _.isFunction(self.cleanup) ) { + self.cleanup.call(self.sandbox); + } + }, + getSandbox: function() { + return self.sandbox; + }, + loadTemplate: function() { + return self.loadTemplate(); + } + }; + + return self.api; + + }; + + return Section; + +}); + +define('edison/lib/router',['require','underscore','./microevent'],function(require) { + + var _ = require('underscore'), + MicroEvent = require('./microevent'); + + /** + * @class Router + */ + var Router = function(edison) { + this.init.apply(this, _.toArray(arguments)); + /* + return { + 'bind': this.bind.apply(this) + }; + */ + }; + + MicroEvent.mixin(Router.prototype); + + _.extend(Router.prototype, { + + 'edison': null, + + 'listening': false, + + 'init': function(edison) { + this.edison = edison; + }, + + 'listen': function() { + var self = this; + if ( this.listening ) { + return; + } + this.listening = true; + this.bind('hash_change', function(data) { + self.onHashChange(data); + }); + this.watchURL(); + }, + + 'watchURL': function() { + window.onhashchange = this.processHashChange.bind(this); + if ( window.location.hash ) { + this.processHashChange(); + } + }, + + 'processHashChange': function() { + this.trigger('hash_change', { + 'hash': window.location.hash + }); + }, + + 'onHashChange': function(data) { + var processed; + data = data || {}; + _.defaults(data, { + 'hash': null + }); + if ( !data.hash ) { + return; + } + try { + processed = this.processHash(data.hash); + } catch(e) { + return; + } + this.trigger('on_route', processed); + }, + + 'processHash': function(hash) { + if ( hash.indexOf('#') === 0 && hash.indexOf('!') === 1 ) { + hash = hash.substring(2); + } + if ( hash === '' ) { + throw 'Invalid hash.'; + } + var address = null, + tmp = hash.split('?'), + section_name = null, + route_name = null, + route_id = null; + if ( tmp.length === 1 ) { + address = tmp.pop(); + } else { + address = tmp.shift(); + } + if ( address.indexOf('/') < 0 ) { + section_name = address; + } else { + tmp = address.split('/'); + switch ( tmp.length ) { + case 1: + section_name = tmp.pop(); + break; + case 2: + section_name = tmp.shift(); + route_name = tmp.shift(); + break; + case 3: + section_name = tmp.shift(); + route_name = tmp.shift(); + route_id = tmp.shift(); + break; + } + } + var params = {}; + return { + 'section_name': section_name, + 'route_name': route_name, + 'route_id': route_id + }; + } + + }); + + return Router; + +}); + +define('edison/lib/util',[], function() { + + return { + + /** + * Returns true / false as to whether the browser supports the HTML5 History API + */ + 'supportsHistoryAPI': function() { + return !!(window.history && history.pushState); + } + + }; + +}); + +define('edison/lib/edison',['require','underscore','./section','./route','./router','./util'],function(require) { + + var _ = require('underscore'), + Section = require('./section'), + Route = require('./route'), + Router = require('./router'), + util = require('./util'); + + var Edison = function() { + this.init.apply(this, _.toArray(arguments)); + return { + 'createSection': this.createSection.bind(this), + 'initRoutes': this.initRoutes.bind(this), + 'extend': this.extend.bind(this), + 'extendCleanup': this.extendCleanup.bind(this) + }; + }; + + _.extend(Edison.prototype, { + + 'init': function(options) { + options = options || {}; + _.defaults(options, this.options); + this.options = options; + if ( !_.isBoolean(options.pushState) ) { + options.pushState = false; + } + if ( !options.container ) { + throw 'A value must be specified for `container.`'; + } else { + this.route_container = document.getElementById(options.container); + if ( ! this.route_container ) { + throw 'Specified route container does not exist: `' + options.container + '.`'; + } + if ( options.pushState && util.supportsHistoryAPI() ) { + this.enablePushState = true; + } + } + }, + + 'options': { + 'container': null, + 'pushState': false + }, + + 'debug': false, + + 'enablePushState': false, + + 'routes_initialized': false, + + 'sections': {}, + + 'active_parent_section': null, + + 'active_section': null, + + 'active_section_intervals': [], + + 'active_parent_section_intervals': [], + + 'active_route': null, + + 'Routes': null, + + 'route_extensions': [], + + 'log': function() { + if ( !this.debug ) { + return; + } + console.log(arguments); + }, + + 'createSection': function(options) { + options = options || {}; + _.defaults(options, { + 'name': null, + 'callback': null, + 'extend': {}, + 'cleanup': null + }); + if ( !_.isString(options.name) || options.name === '' ) { + throw 'Invalid `name` specified.'; + } + var name_check = options.name.replace(/\W/g, ''); + if ( name_check !== options.name ) { + throw 'Invalid `name` specified.'; + } + if ( !_.isFunction(options.callback) && !_.isNull(options.callback) ) { + throw 'Invalid `callback` specified.'; + } + if ( !_.isObject(options.extend) ) { + throw 'Invalid `extend` value specified.'; + } + if ( !_.isNull(options.cleanup) && !_.isFunction(options.cleanup) ) { + throw 'Invalid `cleanup` value specified.'; + } + this.sections[options.name] = new Section(options, this); + return this.sections[options.name]; + }, + + 'checkParentSection': function(section_name) { + if ( _.isString(this.sections[section_name].getParentSection()) ) { + if ( this.active_parent_section !== this.sections[section_name].getParentSection() ) { + if ( !_.empty(this.active_parent_section) ) { + this.active_parent_section.cleanup(); + this.clearParentSectionIntervals(); + } + this.active_parent_section = this.sections[section_name].getParentSection(); + var parentSection = this.sections[section_name].getParentSection(); + this.sections[parentSection].runCallback(); + } + } else { + this.active_parent_section = null; + this.clearParentSectionIntervals(); + } + }, + + 'clearParentSectionIntervals': function() { + _.each(this.active_parent_section_intervals, function(interval_id) { + clearInterval(interval_id); + }); + }, + + 'initRoutes': function() { + var self = this; + this.log('Initializing routes...'); + if ( this.routes_initialized ) { + return; + } + this.routes_initialized = true; + this.router = new Router(this); + this.router.bind('on_route', this.onRoute.bind(this)); + this.router.listen(); + }, + + 'onRoute': function(data) { + this.log('onRoute', data); + var self = this; + if ( !this.sections[data.section_name] ) { + return; + } + var section = this.sections[data.section_name], + route; + if ( !data.route_name ) { + route = section.getDefaultRoute(); + } else { + route = section.getRoute(data.route_name); + } + if ( !route ) { + return; + } + + _.each(self.active_section_intervals, function(interval_id) { + clearInterval(interval_id); + }); + + var previousRoute = this.getActiveRoute(); + if ( previousRoute ) { + previousRoute.cleanup(); + _.each(this.cleanupExtenders, function(ce) { + ce.call(previousRoute.getSandbox()); + }); + } + + var previousSection = this.getActiveSection(); + if ( previousSection ) { + if ( previousSection.getName() !== data.section_name ) { + previousSection.cleanup(); + } + } + + this.checkParentSection(data.section_name); + route.init(data.route_id, function(err) { + if ( err ) { + // todo - ? + } + }); + }, + + 'navigate': function(route, leave_history) { + var opts = { + trigger: true, + replace : leave_history + }; + this.Routes.navigate(route, opts); + }, + + 'setActiveSection': function(section) { + this.active_section = section; + }, + + 'setActiveRoute': function(route) { + this.active_route = route; + }, + + 'getDebug': function() { + return this.debug; + }, + + 'getActiveSection': function() { + return this.active_section; + }, + + 'getActiveRoute': function() { + return this.active_route; + }, + + 'createSectionInterval': function(fn, interval) { + this.active_section_intervals.push(setInterval(fn, interval)); + }, + + 'createParentSectionInterval': function(fn, interval) { + this.active_parent_section_intervals.push(setInterval(fn, interval)); + }, + + 'getRoutes': function() { + return this.Routes; + }, + + 'insertSectionTemplate': function(template) { + this.route_container.innerHTML = ''; + this.route_container.appendChild(template); + }, + + 'insertTemplate': function(template) { + var container = document.getElementById('route'); + container.innerHTML = ''; + container.appendChild(template); + }, + + 'extend': function(ext) { + if ( !_.isObject(ext) ) { + throw 'Invalid extension(s) specified: expected an object.'; + } + this.route_extensions.push(ext); + }, + + 'getRouteExtensions': function() { + return this.route_extensions; + }, + + 'cleanupExtenders': [], + + 'extendCleanup': function(fn) { + if ( !_.isFunction(fn) ) { + throw 'extendCleanup expects a single parameter: a callback function.'; + } + this.cleanupExtenders.push(fn); + } + + }); + + return Edison; + +}); + +/** + * @package Edison + */ +define('edison', ['require','./lib/edison'],function(require) { + return require('./lib/edison'); +}); + +define("edison/main", function(){}); diff --git a/public/assets/prototype/js/edison.min.js b/public/assets/prototype/js/edison.min.js new file mode 100644 index 0000000..2743c15 --- /dev/null +++ b/public/assets/prototype/js/edison.min.js @@ -0,0 +1,6 @@ +// Underscore.js 1.5.2 +// http://underscorejs.org +// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +(function(){var e=this,t=e._,n={},r=Array.prototype,i=Object.prototype,s=Function.prototype,o=r.push,u=r.slice,a=r.concat,f=i.toString,l=i.hasOwnProperty,c=r.forEach,h=r.map,p=r.reduce,d=r.reduceRight,v=r.filter,m=r.every,g=r.some,y=r.indexOf,b=r.lastIndexOf,w=Array.isArray,E=Object.keys,S=s.bind,x=function(e){if(e instanceof x)return e;if(!(this instanceof x))return new x(e);this._wrapped=e};typeof exports!="undefined"?(typeof module!="undefined"&&module.exports&&(exports=module.exports=x),exports._=x):e._=x,x.VERSION="1.5.2";var T=x.each=x.forEach=function(e,t,r){if(e==null)return;if(c&&e.forEach===c)e.forEach(t,r);else if(e.length===+e.length){for(var i=0,s=e.length;i2;e==null&&(e=[]);if(p&&e.reduce===p)return r&&(t=x.bind(t,r)),i?e.reduce(t,n):e.reduce(t);T(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError(N);return n},x.reduceRight=x.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(d&&e.reduceRight===d)return r&&(t=x.bind(t,r)),i?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=x.keys(e);s=o.length}T(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError(N);return n},x.find=x.detect=function(e,t,n){var r;return C(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},x.filter=x.select=function(e,t,n){var r=[];return e==null?r:v&&e.filter===v?e.filter(t,n):(T(e,function(e,i,s){t.call(n,e,i,s)&&r.push(e)}),r)},x.reject=function(e,t,n){return x.filter(e,function(e,r,i){return!t.call(n,e,r,i)},n)},x.every=x.all=function(e,t,r){t||(t=x.identity);var i=!0;return e==null?i:m&&e.every===m?e.every(t,r):(T(e,function(e,s,o){if(!(i=i&&t.call(r,e,s,o)))return n}),!!i)};var C=x.some=x.any=function(e,t,r){t||(t=x.identity);var i=!1;return e==null?i:g&&e.some===g?e.some(t,r):(T(e,function(e,s,o){if(i||(i=t.call(r,e,s,o)))return n}),!!i)};x.contains=x.include=function(e,t){return e==null?!1:y&&e.indexOf===y?e.indexOf(t)!=-1:C(e,function(e){return e===t})},x.invoke=function(e,t){var n=u.call(arguments,2),r=x.isFunction(t);return x.map(e,function(e){return(r?t:e[t]).apply(e,n)})},x.pluck=function(e,t){return x.map(e,function(e){return e[t]})},x.where=function(e,t,n){return x.isEmpty(t)?n?void 0:[]:x[n?"find":"filter"](e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},x.findWhere=function(e,t){return x.where(e,t,!0)},x.max=function(e,t,n){if(!t&&x.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&x.isEmpty(e))return-Infinity;var r={computed:-Infinity,value:-Infinity};return T(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>r.computed&&(r={value:e,computed:o})}),r.value},x.min=function(e,t,n){if(!t&&x.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&x.isEmpty(e))return Infinity;var r={computed:Infinity,value:Infinity};return T(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;or||n===void 0)return 1;if(n>>1;n.call(r,e[u])=0})})},x.difference=function(e){var t=a.apply(r,u.call(arguments,1));return x.filter(e,function(e){return!x.contains(t,e)})},x.zip=function(){var e=x.max(x.pluck(arguments,"length").concat(0)),t=new Array(e);for(var n=0;n=0;n--)t=[e[n].apply(this,t)];return t[0]}},x.after=function(e,t){return function(){if(--e<1)return t.apply(this,arguments)}},x.keys=E||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)x.has(e,n)&&t.push(n);return t},x.values=function(e){var t=x.keys(e),n=t.length,r=new Array(n);for(var i=0;i":">",'"':""","'":"'"}};_.unescape=x.invert(_.escape);var D={escape:new RegExp("["+x.keys(_.escape).join("")+"]","g"),unescape:new RegExp("("+x.keys(_.unescape).join("|")+")","g")};x.each(["escape","unescape"],function(e){x[e]=function(t){return t==null?"":(""+t).replace(D[e],function(t){return _[e][t]})}}),x.result=function(e,t){if(e==null)return void 0;var n=e[t];return x.isFunction(n)?n.call(e):n},x.mixin=function(e){T(x.functions(e),function(t){var n=x[t]=e[t];x.prototype[t]=function(){var e=[this._wrapped];return o.apply(e,arguments),F.call(this,n.apply(x,e))}})};var P=0;x.uniqueId=function(e){var t=++P+"";return e?e+t:t},x.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var H=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},j=/\\|'|\r|\n|\t|\u2028|\u2029/g;x.template=function(e,t,n){var r;n=x.defaults({},n,x.templateSettings);var i=new RegExp([(n.escape||H).source,(n.interpolate||H).source,(n.evaluate||H).source].join("|")+"|$","g"),s=0,o="__p+='";e.replace(i,function(t,n,r,i,u){return o+=e.slice(s,u).replace(j,function(e){return"\\"+B[e]}),n&&(o+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'"),r&&(o+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),i&&(o+="';\n"+i+"\n__p+='"),s=u+t.length,t}),o+="';\n",n.variable||(o="with(obj||{}){\n"+o+"}\n"),o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{r=new Function(n.variable||"obj","_",o)}catch(u){throw u.source=o,u}if(t)return r(t,x);var a=function(e){return r.call(this,e,x)};return a.source="function("+(n.variable||"obj")+"){\n"+o+"}",a},x.chain=function(e){return x(e).chain()};var F=function(e){return this._chain?x(e).chain():e};x.mixin(x),T(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=r[e];x.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],F.call(this,n)}}),T(["concat","join","slice"],function(e){var t=r[e];x.prototype[e]=function(){return F.call(this,t.apply(this._wrapped,arguments))}}),x.extend(x.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this),define("underscore",function(e){return function(){var t,n;return t||e._}}(this)),define("edison/lib/microevent",[],function(){var e=function(){};return e.prototype={bind:function(e,t){this._events=this._events||{},this._events[e]=this._events[e]||[],this._events[e].push(t)},unbind:function(e,t){this._events=this._events||{};if(e in this._events==0)return;this._events[e].splice(this._events[e].indexOf(t),1)},trigger:function(e){this._events=this._events||{};if(e in this._events==0)return;for(var t=0;t",s.cleanup=e.cleanup,s.log=function(){if(!i.getDebug())return;console.log(arguments)},s.getPath=function(){return r.getName()+"/"+s.name},s.log("New route defined: "+s.getPath()),t.each(i.getRouteExtensions(),function(e){t.extend(n.prototype,e)}),s.sandbox=new n,s.sandbox.section=r.getSandbox(),s.init=function(t,o){e.init.call(s.sandbox,function(){i.getActiveSection()!==s.section?(s.log("Initial entry into section: "+r.getName()),s.section.loadTemplate(),s.section.runCallback(),n.prototype.container=document.getElementById("route"),s.loadTemplate()):(n.prototype.container=document.getElementById("route"),s.loadTemplate()),i.setActiveSection(s.section),i.setActiveRoute(s.api),s.callback.call(s.sandbox,t),o()})},t.each(s.extensions,function(e,t){s.sandbox[t]=function(){e.apply(s.sandbox,arguments)}}),s.loadTemplate=function(){var e=document.createElement("div");e.innerHTML=s.template,e.setAttribute("id","section_"+s.section.getName()+"_route_"+s.name),e.className="route",i.insertTemplate(e)},s.api={getCallback:function(){return s.callback},getSandbox:function(){return s.sandbox},getName:function(){return s.name},init:function(){s.init.apply(s,arguments)},getTitle:function(){return s.title},getFullPath:function(){return this.getFullPath.apply(s,arguments)},cleanup:function(){t.isFunction(s.cleanup)&&s.cleanup.call(s.sandbox)}},s.api};return t.extend(r.prototype,{getFullPath:function(){return this.section.getName()+"/"+this.name}}),r}),define("edison/lib/section",["require","underscore","./route","./sandbox"],function(e){var t=e("underscore"),n=e("./route"),r=e("./sandbox"),i=function(e,i){var s=this;return s.edison=i,s.name=e.name,s.controller=e.controller,s.callback=e.callback,s.extensions=e.extend,s.parent_section=e.parent_section,s.template=e.template||"
    ",s.templateData=e.templateData,s.cleanup=e.cleanup,s.routes={},s.createRoute=function(e){e=e||{},t.defaults(e,{name:null,callback:null,extend:{},cleanup:null});if(!t.isString(e.name)||e.name==="")throw"Invalid `name` specified.";var r=e.name.replace(/\W/g,"");if(r!==e.name)throw"Invalid `name` specified.";if(!t.isFunction(e.callback)&&!t.isNull(e.callback))throw"Invalid `callback` specified.";if(!t.isObject(e.extend))throw"Invalid `extend` value specified.";if(!t.isNull(e.cleanup)&&!t.isFunction(e.cleanup))throw"Invalid `cleanup` value specified.";e.template_container_selector=".route";var o=new n(e,s.api,i);return s.routes[e.name]=o,o},s.log=function(){if(!i.getDebug())return;console.log(arguments)},t.each(i.getRouteExtensions(),function(e){t.extend(r.prototype,e)}),t.extend(r.prototype,s.extensions),s.sandbox=new r(this),s.loadTemplate=function(){var e=document.createElement("div");e.innerHTML=s.template,e.setAttribute("id","edison_section"),e.className="section",i.insertSectionTemplate(e)},s.api={createRoute:s.createRoute.bind(s),getRoutes:function(){return s.routes},hasRoute:function(e){return t.isUndefined(s.routes[e])?!1:!0},getRoute:function(e){return s.routes[e]},getDefaultRoute:function(){var e=t.keys(s.routes),n=e[0];return s.routes[n]},getName:function(){return s.name},getController:function(){return s.controller},runCallback:function(){s.loadTemplate(),s.callback.call(s.sandbox)},getParentSection:function(){return s.parent_section},cleanup:function(){t.isFunction(s.cleanup)&&s.cleanup.call(s.sandbox)},getSandbox:function(){return s.sandbox},loadTemplate:function(){return s.loadTemplate()}},s.api};return i}),define("edison/lib/router",["require","underscore","./microevent"],function(e){var t=e("underscore"),n=e("./microevent"),r=function(e){this.init.apply(this,t.toArray(arguments))};return n.mixin(r.prototype),t.extend(r.prototype,{edison:null,listening:!1,init:function(e){this.edison=e},listen:function(){var e=this;if(this.listening)return;this.listening=!0,this.bind("hash_change",function(t){e.onHashChange(t)}),this.watchURL()},watchURL:function(){window.onhashchange=this.processHashChange.bind(this),window.location.hash&&this.processHashChange()},processHashChange:function(){this.trigger("hash_change",{hash:window.location.hash})},onHashChange:function(e){var n;e=e||{},t.defaults(e,{hash:null});if(!e.hash)return;try{n=this.processHash(e.hash)}catch(r){return}this.trigger("on_route",n)},processHash:function(e){e.indexOf("#")===0&&e.indexOf("!")===1&&(e=e.substring(2));if(e==="")throw"Invalid hash.";var t=null,n=e.split("?"),r=null,i=null,s=null;n.length===1?t=n.pop():t=n.shift();if(t.indexOf("/")<0)r=t;else{n=t.split("/");switch(n.length){case 1:r=n.pop();break;case 2:r=n.shift(),i=n.shift();break;case 3:r=n.shift(),i=n.shift(),s=n.shift()}}var o={};return{section_name:r,route_name:i,route_id:s}}}),r}),define("edison/lib/util",[],function(){return{supportsHistoryAPI:function(){return!!window.history&&!!history.pushState}}}),define("edison/lib/edison",["require","underscore","./section","./route","./router","./util"],function(e){var t=e("underscore"),n=e("./section"),r=e("./route"),i=e("./router"),s=e("./util"),o=function(){return this.init.apply(this,t.toArray(arguments)),{createSection:this.createSection.bind(this),initRoutes:this.initRoutes.bind(this),extend:this.extend.bind(this),extendCleanup:this.extendCleanup.bind(this)}};return t.extend(o.prototype,{init:function(e){e=e||{},t.defaults(e,this.options),this.options=e,t.isBoolean(e.pushState)||(e.pushState=!1);if(!e.container)throw"A value must be specified for `container.`";this.route_container=document.getElementById(e.container);if(!this.route_container)throw"Specified route container does not exist: `"+e.container+".`";e.pushState&&s.supportsHistoryAPI()&&(this.enablePushState=!0)},options:{container:null,pushState:!1},debug:!1,enablePushState:!1,routes_initialized:!1,sections:{},active_parent_section:null,active_section:null,active_section_intervals:[],active_parent_section_intervals:[],active_route:null,Routes:null,route_extensions:[],log:function(){if(!this.debug)return;console.log(arguments)},createSection:function(e){e=e||{},t.defaults(e,{name:null,callback:null,extend:{},cleanup:null});if(!t.isString(e.name)||e.name==="")throw"Invalid `name` specified.";var r=e.name.replace(/\W/g,"");if(r!==e.name)throw"Invalid `name` specified.";if(!t.isFunction(e.callback)&&!t.isNull(e.callback))throw"Invalid `callback` specified.";if(!t.isObject(e.extend))throw"Invalid `extend` value specified.";if(!t.isNull(e.cleanup)&&!t.isFunction(e.cleanup))throw"Invalid `cleanup` value specified.";return this.sections[e.name]=new n(e,this),this.sections[e.name]},checkParentSection:function(e){if(t.isString(this.sections[e].getParentSection())){if(this.active_parent_section!==this.sections[e].getParentSection()){t.empty(this.active_parent_section)||(this.active_parent_section.cleanup(),this.clearParentSectionIntervals()),this.active_parent_section=this.sections[e].getParentSection();var n=this.sections[e].getParentSection();this.sections[n].runCallback()}}else this.active_parent_section=null,this.clearParentSectionIntervals()},clearParentSectionIntervals:function(){t.each(this.active_parent_section_intervals,function(e){clearInterval(e)})},initRoutes:function(){var e=this;this.log("Initializing routes...");if(this.routes_initialized)return;this.routes_initialized=!0,this.router=new i(this),this.router.bind("on_route",this.onRoute.bind(this)),this.router.listen()},onRoute:function(e){this.log("onRoute",e);var n=this;if(!this.sections[e.section_name])return;var r=this.sections[e.section_name],i;e.route_name?i=r.getRoute(e.route_name):i=r.getDefaultRoute();if(!i)return;t.each(n.active_section_intervals,function(e){clearInterval(e)});var s=this.getActiveRoute();s&&(s.cleanup(),t.each(this.cleanupExtenders,function(e){e.call(s.getSandbox())}));var o=this.getActiveSection();o&&o.getName()!==e.section_name&&o.cleanup(),this.checkParentSection(e.section_name),i.init(e.route_id,function(e){e})},navigate:function(e,t){var n={trigger:!0,replace:t};this.Routes.navigate(e,n)},setActiveSection:function(e){this.active_section=e},setActiveRoute:function(e){this.active_route=e},getDebug:function(){return this.debug},getActiveSection:function(){return this.active_section},getActiveRoute:function(){return this.active_route},createSectionInterval:function(e,t){this.active_section_intervals.push(setInterval(e,t))},createParentSectionInterval:function(e,t){this.active_parent_section_intervals.push(setInterval(e,t))},getRoutes:function(){return this.Routes},insertSectionTemplate:function(e){this.route_container.innerHTML="",this.route_container.appendChild(e)},insertTemplate:function(e){var t=document.getElementById("route");t.innerHTML="",t.appendChild(e)},extend:function(e){if(!t.isObject(e))throw"Invalid extension(s) specified: expected an object.";this.route_extensions.push(e)},getRouteExtensions:function(){return this.route_extensions},cleanupExtenders:[],extendCleanup:function(e){if(!t.isFunction(e))throw"extendCleanup expects a single parameter: a callback function.";this.cleanupExtenders.push(e)}}),o}),define("edison",["require","./lib/edison"],function(e){return e("./lib/edison")}),define("edison/main",function(){}); \ No newline at end of file diff --git a/public/assets/prototype/js/grapnel.js b/public/assets/prototype/js/grapnel.js new file mode 100644 index 0000000..c7ce2ee --- /dev/null +++ b/public/assets/prototype/js/grapnel.js @@ -0,0 +1,424 @@ +/**** + * Grapnel + * https://github.com/bytecipher/grapnel + * + * @author Greg Sabia Tucker + * @link http://bytecipher.io + * @version 0.6.3 + * + * Released under MIT License. See LICENSE.txt or http://opensource.org/licenses/MIT +*/ + +!(function(root) { + + function Grapnel(opts) { + "use strict"; + + var self = this; // Scope reference + this.events = {}; // Event Listeners + this.state = null; // Router state object + this.options = opts || {}; // Options + this.options.env = this.options.env || (!!(Object.keys(root).length === 0 && process && process.browser !== true) ? 'server' : 'client'); + this.options.mode = this.options.mode || (!!(this.options.env !== 'server' && this.options.pushState && root.history && root.history.pushState) ? 'pushState' : 'hashchange'); + this.version = '0.6.3'; // Version + + if ('function' === typeof root.addEventListener) { + root.addEventListener('hashchange', function() { + self.trigger('hashchange'); + }); + + root.addEventListener('popstate', function(e) { + // Make sure popstate doesn't run on init -- this is a common issue with Safari and old versions of Chrome + if (self.state && self.state.previousState === null) return false; + + self.trigger('navigate'); + }); + } + + return this; + }; + /** + * Create a RegExp Route from a string + * This is the heart of the router and I've made it as small as possible! + * + * @param {String} Path of route + * @param {Array} Array of keys to fill + * @param {Bool} Case sensitive comparison + * @param {Bool} Strict mode + */ + Grapnel.regexRoute = function(path, keys, sensitive, strict) { + if (path instanceof RegExp) return path; + if (path instanceof Array) path = '(' + path.join('|') + ')'; + // Build route RegExp + path = path.concat(strict ? '' : '/?') + .replace(/\/\(/g, '(?:/') + .replace(/\+/g, '__plus__') + .replace(/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?/g, function(_, slash, format, key, capture, optional) { + keys.push({ + name: key, + optional: !!optional + }); + slash = slash || ''; + + return '' + (optional ? '' : slash) + '(?:' + (optional ? slash : '') + (format || '') + (capture || (format && '([^/.]+?)' || '([^/]+?)')) + ')' + (optional || ''); + }) + .replace(/([\/.])/g, '\\$1') + .replace(/__plus__/g, '(.+)') + .replace(/\*/g, '(.*)'); + + return new RegExp('^' + path + '$', sensitive ? '' : 'i'); + }; + /** + * ForEach workaround utility + * + * @param {Array} to iterate + * @param {Function} callback + */ + Grapnel._forEach = function(a, callback) { + if (typeof Array.prototype.forEach === 'function') return Array.prototype.forEach.call(a, callback); + // Replicate forEach() + return function(c, next) { + for (var i = 0, n = this.length; i < n; ++i) { + c.call(next, this[i], i, this); + } + }.call(a, callback); + }; + /** + * Add an route and handler + * + * @param {String|RegExp} route name + * @return {self} Router + */ + Grapnel.prototype.get = Grapnel.prototype.add = function(route) { + var self = this, + middleware = Array.prototype.slice.call(arguments, 1, -1), + handler = Array.prototype.slice.call(arguments, -1)[0], + request = new Request(route); + + var invoke = function RouteHandler() { + // Build request parameters + var req = request.parse(self.path()); + // Check if matches are found + if (req.match) { + // Match found + var extra = { + route: route, + params: req.params, + req: req, + regex: req.match + }; + // Create call stack -- add middleware first, then handler + var stack = new CallStack(self, extra).enqueue(middleware.concat(handler)); + // Trigger main event + self.trigger('match', stack, req); + // Continue? + if (!stack.runCallback) return self; + // Previous state becomes current state + stack.previousState = self.state; + // Save new state + self.state = stack; + // Prevent this handler from being called if parent handler in stack has instructed not to propagate any more events + if (stack.parent() && stack.parent().propagateEvent === false) { + stack.propagateEvent = false; + return self; + } + // Call handler + stack.callback(); + } + // Returns self + return self; + }; + // Event name + var eventName = (self.options.mode !== 'pushState' && self.options.env !== 'server') ? 'hashchange' : 'navigate'; + // Invoke when route is defined, and once again when app navigates + return invoke().on(eventName, invoke); + }; + /** + * Fire an event listener + * + * @param {String} event name + * @param {Mixed} [attributes] Parameters that will be applied to event handler + * @return {self} Router + */ + Grapnel.prototype.trigger = function(event) { + var self = this, + params = Array.prototype.slice.call(arguments, 1); + // Call matching events + if (this.events[event]) { + Grapnel._forEach(this.events[event], function(fn) { + fn.apply(self, params); + }); + } + + return this; + }; + /** + * Add an event listener + * + * @param {String} event name (multiple events can be called when separated by a space " ") + * @param {Function} callback + * @return {self} Router + */ + Grapnel.prototype.on = Grapnel.prototype.bind = function(event, handler) { + var self = this, + events = event.split(' '); + + Grapnel._forEach(events, function(event) { + if (self.events[event]) { + self.events[event].push(handler); + } else { + self.events[event] = [handler]; + } + }); + + return this; + }; + /** + * Allow event to be called only once + * + * @param {String} event name(s) + * @param {Function} callback + * @return {self} Router + */ + Grapnel.prototype.once = function(event, handler) { + var ran = false; + + return this.on(event, function() { + if (ran) return false; + ran = true; + handler.apply(this, arguments); + handler = null; + return true; + }); + }; + /** + * @param {String} Route context (without trailing slash) + * @param {[Function]} Middleware (optional) + * @return {Function} Adds route to context + */ + Grapnel.prototype.context = function(context) { + var self = this, + middleware = Array.prototype.slice.call(arguments, 1); + + return function() { + var value = arguments[0], + submiddleware = (arguments.length > 2) ? Array.prototype.slice.call(arguments, 1, -1) : [], + handler = Array.prototype.slice.call(arguments, -1)[0], + prefix = (context.slice(-1) !== '/' && value !== '/' && value !== '') ? context + '/' : context, + path = (value.substr(0, 1) !== '/') ? value : value.substr(1), + pattern = prefix + path; + + return self.add.apply(self, [pattern].concat(middleware).concat(submiddleware).concat([handler])); + } + }; + /** + * Navigate through history API + * + * @param {String} Pathname + * @return {self} Router + */ + Grapnel.prototype.navigate = function(path) { + return this.path(path).trigger('navigate'); + }; + + Grapnel.prototype.path = function(pathname) { + var self = this, + frag; + + if ('string' === typeof pathname) { + // Set path + if (self.options.mode === 'pushState') { + frag = (self.options.root) ? (self.options.root + pathname) : pathname; + root.history.pushState({}, null, frag); + } else if (root.location) { + root.location.hash = (self.options.hashBang ? '!' : '') + pathname; + } else { + root._pathname = pathname || ''; + } + + return this; + } else if ('undefined' === typeof pathname) { + // Get path + if (self.options.mode === 'pushState') { + frag = root.location.pathname.replace(self.options.root, ''); + } else if (self.options.mode !== 'pushState' && root.location) { + frag = (root.location.hash) ? root.location.hash.split((self.options.hashBang ? '#!' : '#'))[1] : ''; + } else { + frag = root._pathname || ''; + } + + return frag; + } else if (pathname === false) { + // Clear path + if (self.options.mode === 'pushState') { + root.history.pushState({}, null, self.options.root || '/'); + } else if (root.location) { + root.location.hash = (self.options.hashBang) ? '!' : ''; + } + + return self; + } + }; + /** + * Create routes based on an object + * + * @param {Object} [Options, Routes] + * @param {Object Routes} + * @return {self} Router + */ + Grapnel.listen = function() { + var opts, routes; + if (arguments[0] && arguments[1]) { + opts = arguments[0]; + routes = arguments[1]; + } else { + routes = arguments[0]; + } + // Return a new Grapnel instance + return (function() { + // TODO: Accept multi-level routes + for (var key in routes) { + this.add.call(this, key, routes[key]); + } + + return this; + }).call(new Grapnel(opts || {})); + }; + /** + * Create a call stack that can be enqueued by handlers and middleware + * + * @param {Object} Router + * @param {Object} Extend + * @return {self} CallStack + */ + function CallStack(router, extendObj) { + this.stack = CallStack.global.slice(0); + this.router = router; + this.runCallback = true; + this.callbackRan = false; + this.propagateEvent = true; + this.value = router.path(); + + for (var key in extendObj) { + this[key] = extendObj[key]; + } + + return this; + }; + /** + * Build request parameters and allow them to be checked against a string (usually the current path) + * + * @param {String} Route + * @return {self} Request + */ + function Request(route) { + this.route = route; + this.keys = []; + this.regex = Grapnel.regexRoute(route, this.keys); + }; + // This allows global middleware + CallStack.global = []; + /** + * Prevent a callback from being called + * + * @return {self} CallStack + */ + CallStack.prototype.preventDefault = function() { + this.runCallback = false; + }; + /** + * Prevent any future callbacks from being called + * + * @return {self} CallStack + */ + CallStack.prototype.stopPropagation = function() { + this.propagateEvent = false; + }; + /** + * Get parent state + * + * @return {Object} Previous state + */ + CallStack.prototype.parent = function() { + var hasParentEvents = !!(this.previousState && this.previousState.value && this.previousState.value == this.value); + return (hasParentEvents) ? this.previousState : false; + }; + /** + * Run a callback (calls to next) + * + * @return {self} CallStack + */ + CallStack.prototype.callback = function() { + this.callbackRan = true; + this.timeStamp = Date.now(); + this.next(); + }; + /** + * Add handler or middleware to the stack + * + * @param {Function|Array} Handler or a array of handlers + * @param {Int} Index to start inserting + * @return {self} CallStack + */ + CallStack.prototype.enqueue = function(handler, atIndex) { + var handlers = (!Array.isArray(handler)) ? [handler] : ((atIndex < handler.length) ? handler.reverse() : handler); + + while (handlers.length) { + this.stack.splice(atIndex || this.stack.length + 1, 0, handlers.shift()); + } + + return this; + }; + /** + * Call to next item in stack -- this adds the `req`, `event`, and `next()` arguments to all middleware + * + * @return {self} CallStack + */ + CallStack.prototype.next = function() { + var self = this; + + return this.stack.shift().call(this.router, this.req, this, function next() { + self.next.call(self); + }); + }; + /** + * Match a path string -- returns a request object if there is a match -- returns false otherwise + * + * @return {Object} req + */ + Request.prototype.parse = function(path) { + var match = path.match(this.regex), + self = this; + + var req = { + params: {}, + keys: this.keys, + matches: (match || []).slice(1), + match: match + }; + // Build parameters + Grapnel._forEach(req.matches, function(value, i) { + var key = (self.keys[i] && self.keys[i].name) ? self.keys[i].name : i; + // Parameter key will be its key or the iteration index. This is useful if a wildcard (*) is matched + req.params[key] = (value) ? decodeURIComponent(value) : undefined; + }); + + return req; + }; + + // Append utility constructors to Grapnel + Grapnel.CallStack = CallStack; + Grapnel.Request = Request; + + if ('function' === typeof root.define && !root.define.amd.grapnel) { + root.define(function(require, exports, module) { + root.define.amd.grapnel = true; + return Grapnel; + }); + } else if ('object' === typeof module && 'object' === typeof module.exports) { + module.exports = exports = Grapnel; + } else { + root.Grapnel = Grapnel; + } + +}).call({}, ('object' === typeof window) ? window : this); diff --git a/public/assets/prototype/js/grapnel.min.js b/public/assets/prototype/js/grapnel.min.js new file mode 100644 index 0000000..0ddf82a --- /dev/null +++ b/public/assets/prototype/js/grapnel.min.js @@ -0,0 +1,12 @@ +/**** + * Grapnel + * https://github.com/baseprime/grapnel + * + * @author Greg Sabia Tucker + * @link http://basepri.me + * @version 0.6.4 + * + * Released under MIT License. See LICENSE.txt or http://opensource.org/licenses/MIT +*/ + +!function(a){function b(b){"use strict";var c=this;return this.events={},this.state=null,this.options=b||{},this.options.env=this.options.env||(0===Object.keys(a).length&&process&&process.browser!==!0?"server":"client"),this.options.mode=this.options.mode||("server"!==this.options.env&&this.options.pushState&&a.history&&a.history.pushState?"pushState":"hashchange"),this.version="0.6.4","function"==typeof a.addEventListener&&(a.addEventListener("hashchange",function(){c.trigger("hashchange")}),a.addEventListener("popstate",function(a){return(!c.state||null!==c.state.previousState)&&void c.trigger("navigate")})),this}function c(a,b){this.stack=c.global.slice(0),this.router=a,this.runCallback=!0,this.callbackRan=!1,this.propagateEvent=!0,this.value=a.path();for(var d in b)this[d]=b[d];return this}function d(a){this.route=a,this.keys=[],this.regex=b.regexRoute(a,this.keys)}b.regexRoute=function(a,b,c,d){return a instanceof RegExp?a:(a instanceof Array&&(a="("+a.join("|")+")"),a=a.concat(d?"":"/?").replace(/\/\(/g,"(?:/").replace(/\+/g,"__plus__").replace(/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?/g,function(a,c,d,e,f,g){return b.push({name:e,optional:!!g}),c=c||"",""+(g?"":c)+"(?:"+(g?c:"")+(d||"")+(f||d&&"([^/.]+?)"||"([^/]+?)")+")"+(g||"")}).replace(/([\/.])/g,"\\$1").replace(/__plus__/g,"(.+)").replace(/\*/g,"(.*)"),new RegExp("^"+a+"$",c?"":"i"))},b._forEach=function(a,b){return"function"==typeof Array.prototype.forEach?Array.prototype.forEach.call(a,b):function(a,b){for(var c=0,d=this.length;c2?Array.prototype.slice.call(arguments,1,-1):[],f=Array.prototype.slice.call(arguments,-1)[0],g="/"!==a.slice(-1)&&"/"!==d&&""!==d?a+"/":a,h="/"!==d.substr(0,1)?d:d.substr(1),i=g+h;return b.add.apply(b,[i].concat(c).concat(e).concat([f]))}},b.prototype.navigate=function(a){return this.path(a).trigger("navigate")},b.prototype.path=function(b){var c,d=this;return"string"==typeof b?("pushState"===d.options.mode?(c=d.options.root?d.options.root+b:b,a.history.pushState({},null,c)):a.location?a.location.hash=(d.options.hashBang?"!":"")+b:a._pathname=b||"",this):"undefined"==typeof b?c="pushState"===d.options.mode?a.location.pathname.replace(d.options.root,""):"pushState"!==d.options.mode&&a.location?a.location.hash?a.location.hash.split(d.options.hashBang?"#!":"#")[1]:"":a._pathname||"":b===!1?("pushState"===d.options.mode?a.history.pushState({},null,d.options.root||"/"):a.location&&(a.location.hash=d.options.hashBang?"!":""),d):void 0},b.listen=function(){var a,c;return arguments[0]&&arguments[1]?(a=arguments[0],c=arguments[1]):c=arguments[0],function(){for(var a in c)this.add.call(this,a,c[a]);return this}.call(new b(a||{}))},c.global=[],c.prototype.preventDefault=function(){this.runCallback=!1},c.prototype.stopPropagation=function(){this.propagateEvent=!1},c.prototype.parent=function(){var a=!(!this.previousState||!this.previousState.value||this.previousState.value!=this.value);return!!a&&this.previousState},c.prototype.callback=function(){this.callbackRan=!0,this.timeStamp=Date.now(),this.next()},c.prototype.enqueue=function(a,b){for(var c=Array.isArray(a)?b= 2.0.0-beta.1', + 7: '>= 4.0.0' + }; + + exports.REVISION_CHANGES = REVISION_CHANGES; + var objectType = '[object Object]'; + + function HandlebarsEnvironment(helpers, partials, decorators) { + this.helpers = helpers || {}; + this.partials = partials || {}; + this.decorators = decorators || {}; + + _helpers.registerDefaultHelpers(this); + _decorators.registerDefaultDecorators(this); + } + + HandlebarsEnvironment.prototype = { + constructor: HandlebarsEnvironment, + + logger: _logger2['default'], + log: _logger2['default'].log, + + registerHelper: function registerHelper(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple helpers'); + } + _utils.extend(this.helpers, name); + } else { + this.helpers[name] = fn; + } + }, + unregisterHelper: function unregisterHelper(name) { + delete this.helpers[name]; + }, + + registerPartial: function registerPartial(name, partial) { + if (_utils.toString.call(name) === objectType) { + _utils.extend(this.partials, name); + } else { + if (typeof partial === 'undefined') { + throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined'); + } + this.partials[name] = partial; + } + }, + unregisterPartial: function unregisterPartial(name) { + delete this.partials[name]; + }, + + registerDecorator: function registerDecorator(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple decorators'); + } + _utils.extend(this.decorators, name); + } else { + this.decorators[name] = fn; + } + }, + unregisterDecorator: function unregisterDecorator(name) { + delete this.decorators[name]; + } + }; + + var log = _logger2['default'].log; + + exports.log = log; + exports.createFrame = _utils.createFrame; + exports.logger = _logger2['default']; + +/***/ }, +/* 5 */ +/***/ function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + exports.extend = extend; + exports.indexOf = indexOf; + exports.escapeExpression = escapeExpression; + exports.isEmpty = isEmpty; + exports.createFrame = createFrame; + exports.blockParams = blockParams; + exports.appendContextPath = appendContextPath; + var escape = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`', + '=': '=' + }; + + var badChars = /[&<>"'`=]/g, + possible = /[&<>"'`=]/; + + function escapeChar(chr) { + return escape[chr]; + } + + function extend(obj /* , ...source */) { + for (var i = 1; i < arguments.length; i++) { + for (var key in arguments[i]) { + if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { + obj[key] = arguments[i][key]; + } + } + } + + return obj; + } + + var toString = Object.prototype.toString; + + exports.toString = toString; + // Sourced from lodash + // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt + /* eslint-disable func-style */ + var isFunction = function isFunction(value) { + return typeof value === 'function'; + }; + // fallback for older versions of Chrome and Safari + /* istanbul ignore next */ + if (isFunction(/x/)) { + exports.isFunction = isFunction = function (value) { + return typeof value === 'function' && toString.call(value) === '[object Function]'; + }; + } + exports.isFunction = isFunction; + + /* eslint-enable func-style */ + + /* istanbul ignore next */ + var isArray = Array.isArray || function (value) { + return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; + }; + + exports.isArray = isArray; + // Older IE versions do not directly support indexOf so we must implement our own, sadly. + + function indexOf(array, value) { + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + return -1; + } + + function escapeExpression(string) { + if (typeof string !== 'string') { + // don't escape SafeStrings, since they're already safe + if (string && string.toHTML) { + return string.toHTML(); + } else if (string == null) { + return ''; + } else if (!string) { + return string + ''; + } + + // Force a string conversion as this will be done by the append regardless and + // the regex test will do this transparently behind the scenes, causing issues if + // an object's to string has escaped characters in it. + string = '' + string; + } + + if (!possible.test(string)) { + return string; + } + return string.replace(badChars, escapeChar); + } + + function isEmpty(value) { + if (!value && value !== 0) { + return true; + } else if (isArray(value) && value.length === 0) { + return true; + } else { + return false; + } + } + + function createFrame(object) { + var frame = extend({}, object); + frame._parent = object; + return frame; + } + + function blockParams(params, ids) { + params.path = ids; + return params; + } + + function appendContextPath(contextPath, id) { + return (contextPath ? contextPath + '.' : '') + id; + } + +/***/ }, +/* 6 */ +/***/ function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; + + function Exception(message, node) { + var loc = node && node.loc, + line = undefined, + column = undefined; + if (loc) { + line = loc.start.line; + column = loc.start.column; + + message += ' - ' + line + ':' + column; + } + + var tmp = Error.prototype.constructor.call(this, message); + + // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. + for (var idx = 0; idx < errorProps.length; idx++) { + this[errorProps[idx]] = tmp[errorProps[idx]]; + } + + /* istanbul ignore else */ + if (Error.captureStackTrace) { + Error.captureStackTrace(this, Exception); + } + + if (loc) { + this.lineNumber = line; + this.column = column; + } + } + + Exception.prototype = new Error(); + + exports['default'] = Exception; + module.exports = exports['default']; + +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.registerDefaultHelpers = registerDefaultHelpers; + + var _helpersBlockHelperMissing = __webpack_require__(8); + + var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing); + + var _helpersEach = __webpack_require__(9); + + var _helpersEach2 = _interopRequireDefault(_helpersEach); + + var _helpersHelperMissing = __webpack_require__(10); + + var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing); + + var _helpersIf = __webpack_require__(11); + + var _helpersIf2 = _interopRequireDefault(_helpersIf); + + var _helpersLog = __webpack_require__(12); + + var _helpersLog2 = _interopRequireDefault(_helpersLog); + + var _helpersLookup = __webpack_require__(13); + + var _helpersLookup2 = _interopRequireDefault(_helpersLookup); + + var _helpersWith = __webpack_require__(14); + + var _helpersWith2 = _interopRequireDefault(_helpersWith); + + function registerDefaultHelpers(instance) { + _helpersBlockHelperMissing2['default'](instance); + _helpersEach2['default'](instance); + _helpersHelperMissing2['default'](instance); + _helpersIf2['default'](instance); + _helpersLog2['default'](instance); + _helpersLookup2['default'](instance); + _helpersWith2['default'](instance); + } + +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + exports['default'] = function (instance) { + instance.registerHelper('blockHelperMissing', function (context, options) { + var inverse = options.inverse, + fn = options.fn; + + if (context === true) { + return fn(this); + } else if (context === false || context == null) { + return inverse(this); + } else if (_utils.isArray(context)) { + if (context.length > 0) { + if (options.ids) { + options.ids = [options.name]; + } + + return instance.helpers.each(context, options); + } else { + return inverse(this); + } + } else { + if (options.data && options.ids) { + var data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); + options = { data: data }; + } + + return fn(context, options); + } + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('each', function (context, options) { + if (!options) { + throw new _exception2['default']('Must pass iterator to #each'); + } + + var fn = options.fn, + inverse = options.inverse, + i = 0, + ret = '', + data = undefined, + contextPath = undefined; + + if (options.data && options.ids) { + contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; + } + + if (_utils.isFunction(context)) { + context = context.call(this); + } + + if (options.data) { + data = _utils.createFrame(options.data); + } + + function execIteration(field, index, last) { + if (data) { + data.key = field; + data.index = index; + data.first = index === 0; + data.last = !!last; + + if (contextPath) { + data.contextPath = contextPath + field; + } + } + + ret = ret + fn(context[field], { + data: data, + blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) + }); + } + + if (context && typeof context === 'object') { + if (_utils.isArray(context)) { + for (var j = context.length; i < j; i++) { + if (i in context) { + execIteration(i, i, i === context.length - 1); + } + } + } else { + var priorKey = undefined; + + for (var key in context) { + if (context.hasOwnProperty(key)) { + // We're running the iterations one step out of sync so we can detect + // the last iteration without have to scan the object twice and create + // an itermediate keys array. + if (priorKey !== undefined) { + execIteration(priorKey, i - 1); + } + priorKey = key; + i++; + } + } + if (priorKey !== undefined) { + execIteration(priorKey, i - 1, true); + } + } + } + + if (i === 0) { + ret = inverse(this); + } + + return ret; + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('helperMissing', function () /* [args, ]options */{ + if (arguments.length === 1) { + // A missing field in a {{foo}} construct. + return undefined; + } else { + // Someone is actually trying to call something, blow up. + throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); + } + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 11 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + exports['default'] = function (instance) { + instance.registerHelper('if', function (conditional, options) { + if (_utils.isFunction(conditional)) { + conditional = conditional.call(this); + } + + // Default behavior is to render the positive path if the value is truthy and not empty. + // The `includeZero` option may be set to treat the condtional as purely not empty based on the + // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. + if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { + return options.inverse(this); + } else { + return options.fn(this); + } + }); + + instance.registerHelper('unless', function (conditional, options) { + return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 12 */ +/***/ function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (instance) { + instance.registerHelper('log', function () /* message, options */{ + var args = [undefined], + options = arguments[arguments.length - 1]; + for (var i = 0; i < arguments.length - 1; i++) { + args.push(arguments[i]); + } + + var level = 1; + if (options.hash.level != null) { + level = options.hash.level; + } else if (options.data && options.data.level != null) { + level = options.data.level; + } + args[0] = level; + + instance.log.apply(instance, args); + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 13 */ +/***/ function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (instance) { + instance.registerHelper('lookup', function (obj, field) { + return obj && obj[field]; + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 14 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + exports['default'] = function (instance) { + instance.registerHelper('with', function (context, options) { + if (_utils.isFunction(context)) { + context = context.call(this); + } + + var fn = options.fn; + + if (!_utils.isEmpty(context)) { + var data = options.data; + if (options.data && options.ids) { + data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); + } + + return fn(context, { + data: data, + blockParams: _utils.blockParams([context], [data && data.contextPath]) + }); + } else { + return options.inverse(this); + } + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 15 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.registerDefaultDecorators = registerDefaultDecorators; + + var _decoratorsInline = __webpack_require__(16); + + var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline); + + function registerDefaultDecorators(instance) { + _decoratorsInline2['default'](instance); + } + +/***/ }, +/* 16 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + exports['default'] = function (instance) { + instance.registerDecorator('inline', function (fn, props, container, options) { + var ret = fn; + if (!props.partials) { + props.partials = {}; + ret = function (context, options) { + // Create a new partials stack frame prior to exec. + var original = container.partials; + container.partials = _utils.extend({}, original, props.partials); + var ret = fn(context, options); + container.partials = original; + return ret; + }; + } + + props.partials[options.args[0]] = options.fn; + + return ret; + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 17 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + var logger = { + methodMap: ['debug', 'info', 'warn', 'error'], + level: 'info', + + // Maps a given level value to the `methodMap` indexes above. + lookupLevel: function lookupLevel(level) { + if (typeof level === 'string') { + var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase()); + if (levelMap >= 0) { + level = levelMap; + } else { + level = parseInt(level, 10); + } + } + + return level; + }, + + // Can be overridden in the host environment + log: function log(level) { + level = logger.lookupLevel(level); + + if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) { + var method = logger.methodMap[level]; + if (!console[method]) { + // eslint-disable-line no-console + method = 'log'; + } + + for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + message[_key - 1] = arguments[_key]; + } + + console[method].apply(console, message); // eslint-disable-line no-console + } + } + }; + + exports['default'] = logger; + module.exports = exports['default']; + +/***/ }, +/* 18 */ +/***/ function(module, exports) { + + // Build out our basic SafeString type + 'use strict'; + + exports.__esModule = true; + function SafeString(string) { + this.string = string; + } + + SafeString.prototype.toString = SafeString.prototype.toHTML = function () { + return '' + this.string; + }; + + exports['default'] = SafeString; + module.exports = exports['default']; + +/***/ }, +/* 19 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireWildcard = __webpack_require__(3)['default']; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.checkRevision = checkRevision; + exports.template = template; + exports.wrapProgram = wrapProgram; + exports.resolvePartial = resolvePartial; + exports.invokePartial = invokePartial; + exports.noop = noop; + + var _utils = __webpack_require__(5); + + var Utils = _interopRequireWildcard(_utils); + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + var _base = __webpack_require__(4); + + function checkRevision(compilerInfo) { + var compilerRevision = compilerInfo && compilerInfo[0] || 1, + currentRevision = _base.COMPILER_REVISION; + + if (compilerRevision !== currentRevision) { + if (compilerRevision < currentRevision) { + var runtimeVersions = _base.REVISION_CHANGES[currentRevision], + compilerVersions = _base.REVISION_CHANGES[compilerRevision]; + throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); + } else { + // Use the embedded version info since the runtime doesn't know about this revision yet + throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); + } + } + } + + function template(templateSpec, env) { + /* istanbul ignore next */ + if (!env) { + throw new _exception2['default']('No environment passed to template'); + } + if (!templateSpec || !templateSpec.main) { + throw new _exception2['default']('Unknown template object: ' + typeof templateSpec); + } + + templateSpec.main.decorator = templateSpec.main_d; + + // Note: Using env.VM references rather than local var references throughout this section to allow + // for external users to override these as psuedo-supported APIs. + env.VM.checkRevision(templateSpec.compiler); + + function invokePartialWrapper(partial, context, options) { + if (options.hash) { + context = Utils.extend({}, context, options.hash); + if (options.ids) { + options.ids[0] = true; + } + } + + partial = env.VM.resolvePartial.call(this, partial, context, options); + var result = env.VM.invokePartial.call(this, partial, context, options); + + if (result == null && env.compile) { + options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); + result = options.partials[options.name](context, options); + } + if (result != null) { + if (options.indent) { + var lines = result.split('\n'); + for (var i = 0, l = lines.length; i < l; i++) { + if (!lines[i] && i + 1 === l) { + break; + } + + lines[i] = options.indent + lines[i]; + } + result = lines.join('\n'); + } + return result; + } else { + throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); + } + } + + // Just add water + var container = { + strict: function strict(obj, name) { + if (!(name in obj)) { + throw new _exception2['default']('"' + name + '" not defined in ' + obj); + } + return obj[name]; + }, + lookup: function lookup(depths, name) { + var len = depths.length; + for (var i = 0; i < len; i++) { + if (depths[i] && depths[i][name] != null) { + return depths[i][name]; + } + } + }, + lambda: function lambda(current, context) { + return typeof current === 'function' ? current.call(context) : current; + }, + + escapeExpression: Utils.escapeExpression, + invokePartial: invokePartialWrapper, + + fn: function fn(i) { + var ret = templateSpec[i]; + ret.decorator = templateSpec[i + '_d']; + return ret; + }, + + programs: [], + program: function program(i, data, declaredBlockParams, blockParams, depths) { + var programWrapper = this.programs[i], + fn = this.fn(i); + if (data || depths || blockParams || declaredBlockParams) { + programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); + } else if (!programWrapper) { + programWrapper = this.programs[i] = wrapProgram(this, i, fn); + } + return programWrapper; + }, + + data: function data(value, depth) { + while (value && depth--) { + value = value._parent; + } + return value; + }, + merge: function merge(param, common) { + var obj = param || common; + + if (param && common && param !== common) { + obj = Utils.extend({}, common, param); + } + + return obj; + }, + + noop: env.VM.noop, + compilerInfo: templateSpec.compiler + }; + + function ret(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var data = options.data; + + ret._setup(options); + if (!options.partial && templateSpec.useData) { + data = initData(context, data); + } + var depths = undefined, + blockParams = templateSpec.useBlockParams ? [] : undefined; + if (templateSpec.useDepths) { + if (options.depths) { + depths = context !== options.depths[0] ? [context].concat(options.depths) : options.depths; + } else { + depths = [context]; + } + } + + function main(context /*, options*/) { + return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths); + } + main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams); + return main(context, options); + } + ret.isTop = true; + + ret._setup = function (options) { + if (!options.partial) { + container.helpers = container.merge(options.helpers, env.helpers); + + if (templateSpec.usePartial) { + container.partials = container.merge(options.partials, env.partials); + } + if (templateSpec.usePartial || templateSpec.useDecorators) { + container.decorators = container.merge(options.decorators, env.decorators); + } + } else { + container.helpers = options.helpers; + container.partials = options.partials; + container.decorators = options.decorators; + } + }; + + ret._child = function (i, data, blockParams, depths) { + if (templateSpec.useBlockParams && !blockParams) { + throw new _exception2['default']('must pass block params'); + } + if (templateSpec.useDepths && !depths) { + throw new _exception2['default']('must pass parent depths'); + } + + return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); + }; + return ret; + } + + function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { + function prog(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var currentDepths = depths; + if (depths && context !== depths[0]) { + currentDepths = [context].concat(depths); + } + + return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths); + } + + prog = executeDecorators(fn, prog, container, depths, data, blockParams); + + prog.program = i; + prog.depth = depths ? depths.length : 0; + prog.blockParams = declaredBlockParams || 0; + return prog; + } + + function resolvePartial(partial, context, options) { + if (!partial) { + if (options.name === '@partial-block') { + partial = options.data['partial-block']; + } else { + partial = options.partials[options.name]; + } + } else if (!partial.call && !options.name) { + // This is a dynamic partial that returned a string + options.name = partial; + partial = options.partials[partial]; + } + return partial; + } + + function invokePartial(partial, context, options) { + options.partial = true; + if (options.ids) { + options.data.contextPath = options.ids[0] || options.data.contextPath; + } + + var partialBlock = undefined; + if (options.fn && options.fn !== noop) { + options.data = _base.createFrame(options.data); + partialBlock = options.data['partial-block'] = options.fn; + + if (partialBlock.partials) { + options.partials = Utils.extend({}, options.partials, partialBlock.partials); + } + } + + if (partial === undefined && partialBlock) { + partial = partialBlock; + } + + if (partial === undefined) { + throw new _exception2['default']('The partial ' + options.name + ' could not be found'); + } else if (partial instanceof Function) { + return partial(context, options); + } + } + + function noop() { + return ''; + } + + function initData(context, data) { + if (!data || !('root' in data)) { + data = data ? _base.createFrame(data) : {}; + data.root = context; + } + return data; + } + + function executeDecorators(fn, prog, container, depths, data, blockParams) { + if (fn.decorator) { + var props = {}; + prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths); + Utils.extend(prog, props); + } + return prog; + } + +/***/ }, +/* 20 */ +/***/ function(module, exports) { + + /* WEBPACK VAR INJECTION */(function(global) {/* global window */ + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (Handlebars) { + /* istanbul ignore next */ + var root = typeof global !== 'undefined' ? global : window, + $Handlebars = root.Handlebars; + /* istanbul ignore next */ + Handlebars.noConflict = function () { + if (root.Handlebars === Handlebars) { + root.Handlebars = $Handlebars; + } + return Handlebars; + }; + }; + + module.exports = exports['default']; + /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) + +/***/ }, +/* 21 */ +/***/ function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + var AST = { + // Public API used to evaluate derived attributes regarding AST nodes + helpers: { + // a mustache is definitely a helper if: + // * it is an eligible helper, and + // * it has at least one parameter or hash segment + helperExpression: function helperExpression(node) { + return node.type === 'SubExpression' || (node.type === 'MustacheStatement' || node.type === 'BlockStatement') && !!(node.params && node.params.length || node.hash); + }, + + scopedId: function scopedId(path) { + return (/^\.|this\b/.test(path.original) + ); + }, + + // an ID is simple if it only has one part, and that part is not + // `..` or `this`. + simpleId: function simpleId(path) { + return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth; + } + } + }; + + // Must be exported as an object rather than the root of the module as the jison lexer + // must modify the object to operate properly. + exports['default'] = AST; + module.exports = exports['default']; + +/***/ }, +/* 22 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + var _interopRequireWildcard = __webpack_require__(3)['default']; + + exports.__esModule = true; + exports.parse = parse; + + var _parser = __webpack_require__(23); + + var _parser2 = _interopRequireDefault(_parser); + + var _whitespaceControl = __webpack_require__(24); + + var _whitespaceControl2 = _interopRequireDefault(_whitespaceControl); + + var _helpers = __webpack_require__(26); + + var Helpers = _interopRequireWildcard(_helpers); + + var _utils = __webpack_require__(5); + + exports.parser = _parser2['default']; + + var yy = {}; + _utils.extend(yy, Helpers); + + function parse(input, options) { + // Just return if an already-compiled AST was passed in. + if (input.type === 'Program') { + return input; + } + + _parser2['default'].yy = yy; + + // Altering the shared object here, but this is ok as parser is a sync operation + yy.locInfo = function (locInfo) { + return new yy.SourceLocation(options && options.srcName, locInfo); + }; + + var strip = new _whitespaceControl2['default'](options); + return strip.accept(_parser2['default'].parse(input)); + } + +/***/ }, +/* 23 */ +/***/ function(module, exports) { + + /* istanbul ignore next */ + /* Jison generated parser */ + "use strict"; + + var handlebars = (function () { + var parser = { trace: function trace() {}, + yy: {}, + symbols_: { "error": 2, "root": 3, "program": 4, "EOF": 5, "program_repetition0": 6, "statement": 7, "mustache": 8, "block": 9, "rawBlock": 10, "partial": 11, "partialBlock": 12, "content": 13, "COMMENT": 14, "CONTENT": 15, "openRawBlock": 16, "rawBlock_repetition_plus0": 17, "END_RAW_BLOCK": 18, "OPEN_RAW_BLOCK": 19, "helperName": 20, "openRawBlock_repetition0": 21, "openRawBlock_option0": 22, "CLOSE_RAW_BLOCK": 23, "openBlock": 24, "block_option0": 25, "closeBlock": 26, "openInverse": 27, "block_option1": 28, "OPEN_BLOCK": 29, "openBlock_repetition0": 30, "openBlock_option0": 31, "openBlock_option1": 32, "CLOSE": 33, "OPEN_INVERSE": 34, "openInverse_repetition0": 35, "openInverse_option0": 36, "openInverse_option1": 37, "openInverseChain": 38, "OPEN_INVERSE_CHAIN": 39, "openInverseChain_repetition0": 40, "openInverseChain_option0": 41, "openInverseChain_option1": 42, "inverseAndProgram": 43, "INVERSE": 44, "inverseChain": 45, "inverseChain_option0": 46, "OPEN_ENDBLOCK": 47, "OPEN": 48, "mustache_repetition0": 49, "mustache_option0": 50, "OPEN_UNESCAPED": 51, "mustache_repetition1": 52, "mustache_option1": 53, "CLOSE_UNESCAPED": 54, "OPEN_PARTIAL": 55, "partialName": 56, "partial_repetition0": 57, "partial_option0": 58, "openPartialBlock": 59, "OPEN_PARTIAL_BLOCK": 60, "openPartialBlock_repetition0": 61, "openPartialBlock_option0": 62, "param": 63, "sexpr": 64, "OPEN_SEXPR": 65, "sexpr_repetition0": 66, "sexpr_option0": 67, "CLOSE_SEXPR": 68, "hash": 69, "hash_repetition_plus0": 70, "hashSegment": 71, "ID": 72, "EQUALS": 73, "blockParams": 74, "OPEN_BLOCK_PARAMS": 75, "blockParams_repetition_plus0": 76, "CLOSE_BLOCK_PARAMS": 77, "path": 78, "dataName": 79, "STRING": 80, "NUMBER": 81, "BOOLEAN": 82, "UNDEFINED": 83, "NULL": 84, "DATA": 85, "pathSegments": 86, "SEP": 87, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 5: "EOF", 14: "COMMENT", 15: "CONTENT", 18: "END_RAW_BLOCK", 19: "OPEN_RAW_BLOCK", 23: "CLOSE_RAW_BLOCK", 29: "OPEN_BLOCK", 33: "CLOSE", 34: "OPEN_INVERSE", 39: "OPEN_INVERSE_CHAIN", 44: "INVERSE", 47: "OPEN_ENDBLOCK", 48: "OPEN", 51: "OPEN_UNESCAPED", 54: "CLOSE_UNESCAPED", 55: "OPEN_PARTIAL", 60: "OPEN_PARTIAL_BLOCK", 65: "OPEN_SEXPR", 68: "CLOSE_SEXPR", 72: "ID", 73: "EQUALS", 75: "OPEN_BLOCK_PARAMS", 77: "CLOSE_BLOCK_PARAMS", 80: "STRING", 81: "NUMBER", 82: "BOOLEAN", 83: "UNDEFINED", 84: "NULL", 85: "DATA", 87: "SEP" }, + productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [13, 1], [10, 3], [16, 5], [9, 4], [9, 4], [24, 6], [27, 6], [38, 6], [43, 2], [45, 3], [45, 1], [26, 3], [8, 5], [8, 5], [11, 5], [12, 3], [59, 5], [63, 1], [63, 1], [64, 5], [69, 1], [71, 3], [74, 3], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [56, 1], [56, 1], [79, 2], [78, 1], [86, 3], [86, 1], [6, 0], [6, 2], [17, 1], [17, 2], [21, 0], [21, 2], [22, 0], [22, 1], [25, 0], [25, 1], [28, 0], [28, 1], [30, 0], [30, 2], [31, 0], [31, 1], [32, 0], [32, 1], [35, 0], [35, 2], [36, 0], [36, 1], [37, 0], [37, 1], [40, 0], [40, 2], [41, 0], [41, 1], [42, 0], [42, 1], [46, 0], [46, 1], [49, 0], [49, 2], [50, 0], [50, 1], [52, 0], [52, 2], [53, 0], [53, 1], [57, 0], [57, 2], [58, 0], [58, 1], [61, 0], [61, 2], [62, 0], [62, 1], [66, 0], [66, 2], [67, 0], [67, 1], [70, 1], [70, 2], [76, 1], [76, 2]], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$ + /**/) { + + var $0 = $$.length - 1; + switch (yystate) { + case 1: + return $$[$0 - 1]; + break; + case 2: + this.$ = yy.prepareProgram($$[$0]); + break; + case 3: + this.$ = $$[$0]; + break; + case 4: + this.$ = $$[$0]; + break; + case 5: + this.$ = $$[$0]; + break; + case 6: + this.$ = $$[$0]; + break; + case 7: + this.$ = $$[$0]; + break; + case 8: + this.$ = $$[$0]; + break; + case 9: + this.$ = { + type: 'CommentStatement', + value: yy.stripComment($$[$0]), + strip: yy.stripFlags($$[$0], $$[$0]), + loc: yy.locInfo(this._$) + }; + + break; + case 10: + this.$ = { + type: 'ContentStatement', + original: $$[$0], + value: $$[$0], + loc: yy.locInfo(this._$) + }; + + break; + case 11: + this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$); + break; + case 12: + this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] }; + break; + case 13: + this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$); + break; + case 14: + this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$); + break; + case 15: + this.$ = { open: $$[$0 - 5], path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; + break; + case 16: + this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; + break; + case 17: + this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; + break; + case 18: + this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] }; + break; + case 19: + var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$), + program = yy.prepareProgram([inverse], $$[$0 - 1].loc); + program.chained = true; + + this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true }; + + break; + case 20: + this.$ = $$[$0]; + break; + case 21: + this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) }; + break; + case 22: + this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); + break; + case 23: + this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); + break; + case 24: + this.$ = { + type: 'PartialStatement', + name: $$[$0 - 3], + params: $$[$0 - 2], + hash: $$[$0 - 1], + indent: '', + strip: yy.stripFlags($$[$0 - 4], $$[$0]), + loc: yy.locInfo(this._$) + }; + + break; + case 25: + this.$ = yy.preparePartialBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$); + break; + case 26: + this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 4], $$[$0]) }; + break; + case 27: + this.$ = $$[$0]; + break; + case 28: + this.$ = $$[$0]; + break; + case 29: + this.$ = { + type: 'SubExpression', + path: $$[$0 - 3], + params: $$[$0 - 2], + hash: $$[$0 - 1], + loc: yy.locInfo(this._$) + }; + + break; + case 30: + this.$ = { type: 'Hash', pairs: $$[$0], loc: yy.locInfo(this._$) }; + break; + case 31: + this.$ = { type: 'HashPair', key: yy.id($$[$0 - 2]), value: $$[$0], loc: yy.locInfo(this._$) }; + break; + case 32: + this.$ = yy.id($$[$0 - 1]); + break; + case 33: + this.$ = $$[$0]; + break; + case 34: + this.$ = $$[$0]; + break; + case 35: + this.$ = { type: 'StringLiteral', value: $$[$0], original: $$[$0], loc: yy.locInfo(this._$) }; + break; + case 36: + this.$ = { type: 'NumberLiteral', value: Number($$[$0]), original: Number($$[$0]), loc: yy.locInfo(this._$) }; + break; + case 37: + this.$ = { type: 'BooleanLiteral', value: $$[$0] === 'true', original: $$[$0] === 'true', loc: yy.locInfo(this._$) }; + break; + case 38: + this.$ = { type: 'UndefinedLiteral', original: undefined, value: undefined, loc: yy.locInfo(this._$) }; + break; + case 39: + this.$ = { type: 'NullLiteral', original: null, value: null, loc: yy.locInfo(this._$) }; + break; + case 40: + this.$ = $$[$0]; + break; + case 41: + this.$ = $$[$0]; + break; + case 42: + this.$ = yy.preparePath(true, $$[$0], this._$); + break; + case 43: + this.$ = yy.preparePath(false, $$[$0], this._$); + break; + case 44: + $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2]; + break; + case 45: + this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }]; + break; + case 46: + this.$ = []; + break; + case 47: + $$[$0 - 1].push($$[$0]); + break; + case 48: + this.$ = [$$[$0]]; + break; + case 49: + $$[$0 - 1].push($$[$0]); + break; + case 50: + this.$ = []; + break; + case 51: + $$[$0 - 1].push($$[$0]); + break; + case 58: + this.$ = []; + break; + case 59: + $$[$0 - 1].push($$[$0]); + break; + case 64: + this.$ = []; + break; + case 65: + $$[$0 - 1].push($$[$0]); + break; + case 70: + this.$ = []; + break; + case 71: + $$[$0 - 1].push($$[$0]); + break; + case 78: + this.$ = []; + break; + case 79: + $$[$0 - 1].push($$[$0]); + break; + case 82: + this.$ = []; + break; + case 83: + $$[$0 - 1].push($$[$0]); + break; + case 86: + this.$ = []; + break; + case 87: + $$[$0 - 1].push($$[$0]); + break; + case 90: + this.$ = []; + break; + case 91: + $$[$0 - 1].push($$[$0]); + break; + case 94: + this.$ = []; + break; + case 95: + $$[$0 - 1].push($$[$0]); + break; + case 98: + this.$ = [$$[$0]]; + break; + case 99: + $$[$0 - 1].push($$[$0]); + break; + case 100: + this.$ = [$$[$0]]; + break; + case 101: + $$[$0 - 1].push($$[$0]); + break; + } + }, + table: [{ 3: 1, 4: 2, 5: [2, 46], 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: 11, 14: [1, 12], 15: [1, 20], 16: 17, 19: [1, 23], 24: 15, 27: 16, 29: [1, 21], 34: [1, 22], 39: [2, 2], 44: [2, 2], 47: [2, 2], 48: [1, 13], 51: [1, 14], 55: [1, 18], 59: 19, 60: [1, 24] }, { 1: [2, 1] }, { 5: [2, 47], 14: [2, 47], 15: [2, 47], 19: [2, 47], 29: [2, 47], 34: [2, 47], 39: [2, 47], 44: [2, 47], 47: [2, 47], 48: [2, 47], 51: [2, 47], 55: [2, 47], 60: [2, 47] }, { 5: [2, 3], 14: [2, 3], 15: [2, 3], 19: [2, 3], 29: [2, 3], 34: [2, 3], 39: [2, 3], 44: [2, 3], 47: [2, 3], 48: [2, 3], 51: [2, 3], 55: [2, 3], 60: [2, 3] }, { 5: [2, 4], 14: [2, 4], 15: [2, 4], 19: [2, 4], 29: [2, 4], 34: [2, 4], 39: [2, 4], 44: [2, 4], 47: [2, 4], 48: [2, 4], 51: [2, 4], 55: [2, 4], 60: [2, 4] }, { 5: [2, 5], 14: [2, 5], 15: [2, 5], 19: [2, 5], 29: [2, 5], 34: [2, 5], 39: [2, 5], 44: [2, 5], 47: [2, 5], 48: [2, 5], 51: [2, 5], 55: [2, 5], 60: [2, 5] }, { 5: [2, 6], 14: [2, 6], 15: [2, 6], 19: [2, 6], 29: [2, 6], 34: [2, 6], 39: [2, 6], 44: [2, 6], 47: [2, 6], 48: [2, 6], 51: [2, 6], 55: [2, 6], 60: [2, 6] }, { 5: [2, 7], 14: [2, 7], 15: [2, 7], 19: [2, 7], 29: [2, 7], 34: [2, 7], 39: [2, 7], 44: [2, 7], 47: [2, 7], 48: [2, 7], 51: [2, 7], 55: [2, 7], 60: [2, 7] }, { 5: [2, 8], 14: [2, 8], 15: [2, 8], 19: [2, 8], 29: [2, 8], 34: [2, 8], 39: [2, 8], 44: [2, 8], 47: [2, 8], 48: [2, 8], 51: [2, 8], 55: [2, 8], 60: [2, 8] }, { 5: [2, 9], 14: [2, 9], 15: [2, 9], 19: [2, 9], 29: [2, 9], 34: [2, 9], 39: [2, 9], 44: [2, 9], 47: [2, 9], 48: [2, 9], 51: [2, 9], 55: [2, 9], 60: [2, 9] }, { 20: 25, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 36, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 37, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 4: 38, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 13: 40, 15: [1, 20], 17: 39 }, { 20: 42, 56: 41, 64: 43, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 45, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 5: [2, 10], 14: [2, 10], 15: [2, 10], 18: [2, 10], 19: [2, 10], 29: [2, 10], 34: [2, 10], 39: [2, 10], 44: [2, 10], 47: [2, 10], 48: [2, 10], 51: [2, 10], 55: [2, 10], 60: [2, 10] }, { 20: 46, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 47, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 48, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 42, 56: 49, 64: 43, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [2, 78], 49: 50, 65: [2, 78], 72: [2, 78], 80: [2, 78], 81: [2, 78], 82: [2, 78], 83: [2, 78], 84: [2, 78], 85: [2, 78] }, { 23: [2, 33], 33: [2, 33], 54: [2, 33], 65: [2, 33], 68: [2, 33], 72: [2, 33], 75: [2, 33], 80: [2, 33], 81: [2, 33], 82: [2, 33], 83: [2, 33], 84: [2, 33], 85: [2, 33] }, { 23: [2, 34], 33: [2, 34], 54: [2, 34], 65: [2, 34], 68: [2, 34], 72: [2, 34], 75: [2, 34], 80: [2, 34], 81: [2, 34], 82: [2, 34], 83: [2, 34], 84: [2, 34], 85: [2, 34] }, { 23: [2, 35], 33: [2, 35], 54: [2, 35], 65: [2, 35], 68: [2, 35], 72: [2, 35], 75: [2, 35], 80: [2, 35], 81: [2, 35], 82: [2, 35], 83: [2, 35], 84: [2, 35], 85: [2, 35] }, { 23: [2, 36], 33: [2, 36], 54: [2, 36], 65: [2, 36], 68: [2, 36], 72: [2, 36], 75: [2, 36], 80: [2, 36], 81: [2, 36], 82: [2, 36], 83: [2, 36], 84: [2, 36], 85: [2, 36] }, { 23: [2, 37], 33: [2, 37], 54: [2, 37], 65: [2, 37], 68: [2, 37], 72: [2, 37], 75: [2, 37], 80: [2, 37], 81: [2, 37], 82: [2, 37], 83: [2, 37], 84: [2, 37], 85: [2, 37] }, { 23: [2, 38], 33: [2, 38], 54: [2, 38], 65: [2, 38], 68: [2, 38], 72: [2, 38], 75: [2, 38], 80: [2, 38], 81: [2, 38], 82: [2, 38], 83: [2, 38], 84: [2, 38], 85: [2, 38] }, { 23: [2, 39], 33: [2, 39], 54: [2, 39], 65: [2, 39], 68: [2, 39], 72: [2, 39], 75: [2, 39], 80: [2, 39], 81: [2, 39], 82: [2, 39], 83: [2, 39], 84: [2, 39], 85: [2, 39] }, { 23: [2, 43], 33: [2, 43], 54: [2, 43], 65: [2, 43], 68: [2, 43], 72: [2, 43], 75: [2, 43], 80: [2, 43], 81: [2, 43], 82: [2, 43], 83: [2, 43], 84: [2, 43], 85: [2, 43], 87: [1, 51] }, { 72: [1, 35], 86: 52 }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 52: 53, 54: [2, 82], 65: [2, 82], 72: [2, 82], 80: [2, 82], 81: [2, 82], 82: [2, 82], 83: [2, 82], 84: [2, 82], 85: [2, 82] }, { 25: 54, 38: 56, 39: [1, 58], 43: 57, 44: [1, 59], 45: 55, 47: [2, 54] }, { 28: 60, 43: 61, 44: [1, 59], 47: [2, 56] }, { 13: 63, 15: [1, 20], 18: [1, 62] }, { 15: [2, 48], 18: [2, 48] }, { 33: [2, 86], 57: 64, 65: [2, 86], 72: [2, 86], 80: [2, 86], 81: [2, 86], 82: [2, 86], 83: [2, 86], 84: [2, 86], 85: [2, 86] }, { 33: [2, 40], 65: [2, 40], 72: [2, 40], 80: [2, 40], 81: [2, 40], 82: [2, 40], 83: [2, 40], 84: [2, 40], 85: [2, 40] }, { 33: [2, 41], 65: [2, 41], 72: [2, 41], 80: [2, 41], 81: [2, 41], 82: [2, 41], 83: [2, 41], 84: [2, 41], 85: [2, 41] }, { 20: 65, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 66, 47: [1, 67] }, { 30: 68, 33: [2, 58], 65: [2, 58], 72: [2, 58], 75: [2, 58], 80: [2, 58], 81: [2, 58], 82: [2, 58], 83: [2, 58], 84: [2, 58], 85: [2, 58] }, { 33: [2, 64], 35: 69, 65: [2, 64], 72: [2, 64], 75: [2, 64], 80: [2, 64], 81: [2, 64], 82: [2, 64], 83: [2, 64], 84: [2, 64], 85: [2, 64] }, { 21: 70, 23: [2, 50], 65: [2, 50], 72: [2, 50], 80: [2, 50], 81: [2, 50], 82: [2, 50], 83: [2, 50], 84: [2, 50], 85: [2, 50] }, { 33: [2, 90], 61: 71, 65: [2, 90], 72: [2, 90], 80: [2, 90], 81: [2, 90], 82: [2, 90], 83: [2, 90], 84: [2, 90], 85: [2, 90] }, { 20: 75, 33: [2, 80], 50: 72, 63: 73, 64: 76, 65: [1, 44], 69: 74, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 72: [1, 80] }, { 23: [2, 42], 33: [2, 42], 54: [2, 42], 65: [2, 42], 68: [2, 42], 72: [2, 42], 75: [2, 42], 80: [2, 42], 81: [2, 42], 82: [2, 42], 83: [2, 42], 84: [2, 42], 85: [2, 42], 87: [1, 51] }, { 20: 75, 53: 81, 54: [2, 84], 63: 82, 64: 76, 65: [1, 44], 69: 83, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 84, 47: [1, 67] }, { 47: [2, 55] }, { 4: 85, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 47: [2, 20] }, { 20: 86, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 87, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 26: 88, 47: [1, 67] }, { 47: [2, 57] }, { 5: [2, 11], 14: [2, 11], 15: [2, 11], 19: [2, 11], 29: [2, 11], 34: [2, 11], 39: [2, 11], 44: [2, 11], 47: [2, 11], 48: [2, 11], 51: [2, 11], 55: [2, 11], 60: [2, 11] }, { 15: [2, 49], 18: [2, 49] }, { 20: 75, 33: [2, 88], 58: 89, 63: 90, 64: 76, 65: [1, 44], 69: 91, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 65: [2, 94], 66: 92, 68: [2, 94], 72: [2, 94], 80: [2, 94], 81: [2, 94], 82: [2, 94], 83: [2, 94], 84: [2, 94], 85: [2, 94] }, { 5: [2, 25], 14: [2, 25], 15: [2, 25], 19: [2, 25], 29: [2, 25], 34: [2, 25], 39: [2, 25], 44: [2, 25], 47: [2, 25], 48: [2, 25], 51: [2, 25], 55: [2, 25], 60: [2, 25] }, { 20: 93, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 31: 94, 33: [2, 60], 63: 95, 64: 76, 65: [1, 44], 69: 96, 70: 77, 71: 78, 72: [1, 79], 75: [2, 60], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 33: [2, 66], 36: 97, 63: 98, 64: 76, 65: [1, 44], 69: 99, 70: 77, 71: 78, 72: [1, 79], 75: [2, 66], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 22: 100, 23: [2, 52], 63: 101, 64: 76, 65: [1, 44], 69: 102, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 33: [2, 92], 62: 103, 63: 104, 64: 76, 65: [1, 44], 69: 105, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 106] }, { 33: [2, 79], 65: [2, 79], 72: [2, 79], 80: [2, 79], 81: [2, 79], 82: [2, 79], 83: [2, 79], 84: [2, 79], 85: [2, 79] }, { 33: [2, 81] }, { 23: [2, 27], 33: [2, 27], 54: [2, 27], 65: [2, 27], 68: [2, 27], 72: [2, 27], 75: [2, 27], 80: [2, 27], 81: [2, 27], 82: [2, 27], 83: [2, 27], 84: [2, 27], 85: [2, 27] }, { 23: [2, 28], 33: [2, 28], 54: [2, 28], 65: [2, 28], 68: [2, 28], 72: [2, 28], 75: [2, 28], 80: [2, 28], 81: [2, 28], 82: [2, 28], 83: [2, 28], 84: [2, 28], 85: [2, 28] }, { 23: [2, 30], 33: [2, 30], 54: [2, 30], 68: [2, 30], 71: 107, 72: [1, 108], 75: [2, 30] }, { 23: [2, 98], 33: [2, 98], 54: [2, 98], 68: [2, 98], 72: [2, 98], 75: [2, 98] }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 73: [1, 109], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 23: [2, 44], 33: [2, 44], 54: [2, 44], 65: [2, 44], 68: [2, 44], 72: [2, 44], 75: [2, 44], 80: [2, 44], 81: [2, 44], 82: [2, 44], 83: [2, 44], 84: [2, 44], 85: [2, 44], 87: [2, 44] }, { 54: [1, 110] }, { 54: [2, 83], 65: [2, 83], 72: [2, 83], 80: [2, 83], 81: [2, 83], 82: [2, 83], 83: [2, 83], 84: [2, 83], 85: [2, 83] }, { 54: [2, 85] }, { 5: [2, 13], 14: [2, 13], 15: [2, 13], 19: [2, 13], 29: [2, 13], 34: [2, 13], 39: [2, 13], 44: [2, 13], 47: [2, 13], 48: [2, 13], 51: [2, 13], 55: [2, 13], 60: [2, 13] }, { 38: 56, 39: [1, 58], 43: 57, 44: [1, 59], 45: 112, 46: 111, 47: [2, 76] }, { 33: [2, 70], 40: 113, 65: [2, 70], 72: [2, 70], 75: [2, 70], 80: [2, 70], 81: [2, 70], 82: [2, 70], 83: [2, 70], 84: [2, 70], 85: [2, 70] }, { 47: [2, 18] }, { 5: [2, 14], 14: [2, 14], 15: [2, 14], 19: [2, 14], 29: [2, 14], 34: [2, 14], 39: [2, 14], 44: [2, 14], 47: [2, 14], 48: [2, 14], 51: [2, 14], 55: [2, 14], 60: [2, 14] }, { 33: [1, 114] }, { 33: [2, 87], 65: [2, 87], 72: [2, 87], 80: [2, 87], 81: [2, 87], 82: [2, 87], 83: [2, 87], 84: [2, 87], 85: [2, 87] }, { 33: [2, 89] }, { 20: 75, 63: 116, 64: 76, 65: [1, 44], 67: 115, 68: [2, 96], 69: 117, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 118] }, { 32: 119, 33: [2, 62], 74: 120, 75: [1, 121] }, { 33: [2, 59], 65: [2, 59], 72: [2, 59], 75: [2, 59], 80: [2, 59], 81: [2, 59], 82: [2, 59], 83: [2, 59], 84: [2, 59], 85: [2, 59] }, { 33: [2, 61], 75: [2, 61] }, { 33: [2, 68], 37: 122, 74: 123, 75: [1, 121] }, { 33: [2, 65], 65: [2, 65], 72: [2, 65], 75: [2, 65], 80: [2, 65], 81: [2, 65], 82: [2, 65], 83: [2, 65], 84: [2, 65], 85: [2, 65] }, { 33: [2, 67], 75: [2, 67] }, { 23: [1, 124] }, { 23: [2, 51], 65: [2, 51], 72: [2, 51], 80: [2, 51], 81: [2, 51], 82: [2, 51], 83: [2, 51], 84: [2, 51], 85: [2, 51] }, { 23: [2, 53] }, { 33: [1, 125] }, { 33: [2, 91], 65: [2, 91], 72: [2, 91], 80: [2, 91], 81: [2, 91], 82: [2, 91], 83: [2, 91], 84: [2, 91], 85: [2, 91] }, { 33: [2, 93] }, { 5: [2, 22], 14: [2, 22], 15: [2, 22], 19: [2, 22], 29: [2, 22], 34: [2, 22], 39: [2, 22], 44: [2, 22], 47: [2, 22], 48: [2, 22], 51: [2, 22], 55: [2, 22], 60: [2, 22] }, { 23: [2, 99], 33: [2, 99], 54: [2, 99], 68: [2, 99], 72: [2, 99], 75: [2, 99] }, { 73: [1, 109] }, { 20: 75, 63: 126, 64: 76, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 23], 14: [2, 23], 15: [2, 23], 19: [2, 23], 29: [2, 23], 34: [2, 23], 39: [2, 23], 44: [2, 23], 47: [2, 23], 48: [2, 23], 51: [2, 23], 55: [2, 23], 60: [2, 23] }, { 47: [2, 19] }, { 47: [2, 77] }, { 20: 75, 33: [2, 72], 41: 127, 63: 128, 64: 76, 65: [1, 44], 69: 129, 70: 77, 71: 78, 72: [1, 79], 75: [2, 72], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 24], 14: [2, 24], 15: [2, 24], 19: [2, 24], 29: [2, 24], 34: [2, 24], 39: [2, 24], 44: [2, 24], 47: [2, 24], 48: [2, 24], 51: [2, 24], 55: [2, 24], 60: [2, 24] }, { 68: [1, 130] }, { 65: [2, 95], 68: [2, 95], 72: [2, 95], 80: [2, 95], 81: [2, 95], 82: [2, 95], 83: [2, 95], 84: [2, 95], 85: [2, 95] }, { 68: [2, 97] }, { 5: [2, 21], 14: [2, 21], 15: [2, 21], 19: [2, 21], 29: [2, 21], 34: [2, 21], 39: [2, 21], 44: [2, 21], 47: [2, 21], 48: [2, 21], 51: [2, 21], 55: [2, 21], 60: [2, 21] }, { 33: [1, 131] }, { 33: [2, 63] }, { 72: [1, 133], 76: 132 }, { 33: [1, 134] }, { 33: [2, 69] }, { 15: [2, 12] }, { 14: [2, 26], 15: [2, 26], 19: [2, 26], 29: [2, 26], 34: [2, 26], 47: [2, 26], 48: [2, 26], 51: [2, 26], 55: [2, 26], 60: [2, 26] }, { 23: [2, 31], 33: [2, 31], 54: [2, 31], 68: [2, 31], 72: [2, 31], 75: [2, 31] }, { 33: [2, 74], 42: 135, 74: 136, 75: [1, 121] }, { 33: [2, 71], 65: [2, 71], 72: [2, 71], 75: [2, 71], 80: [2, 71], 81: [2, 71], 82: [2, 71], 83: [2, 71], 84: [2, 71], 85: [2, 71] }, { 33: [2, 73], 75: [2, 73] }, { 23: [2, 29], 33: [2, 29], 54: [2, 29], 65: [2, 29], 68: [2, 29], 72: [2, 29], 75: [2, 29], 80: [2, 29], 81: [2, 29], 82: [2, 29], 83: [2, 29], 84: [2, 29], 85: [2, 29] }, { 14: [2, 15], 15: [2, 15], 19: [2, 15], 29: [2, 15], 34: [2, 15], 39: [2, 15], 44: [2, 15], 47: [2, 15], 48: [2, 15], 51: [2, 15], 55: [2, 15], 60: [2, 15] }, { 72: [1, 138], 77: [1, 137] }, { 72: [2, 100], 77: [2, 100] }, { 14: [2, 16], 15: [2, 16], 19: [2, 16], 29: [2, 16], 34: [2, 16], 44: [2, 16], 47: [2, 16], 48: [2, 16], 51: [2, 16], 55: [2, 16], 60: [2, 16] }, { 33: [1, 139] }, { 33: [2, 75] }, { 33: [2, 32] }, { 72: [2, 101], 77: [2, 101] }, { 14: [2, 17], 15: [2, 17], 19: [2, 17], 29: [2, 17], 34: [2, 17], 39: [2, 17], 44: [2, 17], 47: [2, 17], 48: [2, 17], 51: [2, 17], 55: [2, 17], 60: [2, 17] }], + defaultActions: { 4: [2, 1], 55: [2, 55], 57: [2, 20], 61: [2, 57], 74: [2, 81], 83: [2, 85], 87: [2, 18], 91: [2, 89], 102: [2, 53], 105: [2, 93], 111: [2, 19], 112: [2, 77], 117: [2, 97], 120: [2, 63], 123: [2, 69], 124: [2, 12], 136: [2, 75], 137: [2, 32] }, + parseError: function parseError(str, hash) { + throw new Error(str); + }, + parse: function parse(input) { + var self = this, + stack = [0], + vstack = [null], + lstack = [], + table = this.table, + yytext = "", + yylineno = 0, + yyleng = 0, + recovering = 0, + TERROR = 2, + EOF = 1; + this.lexer.setInput(input); + this.lexer.yy = this.yy; + this.yy.lexer = this.lexer; + this.yy.parser = this; + if (typeof this.lexer.yylloc == "undefined") this.lexer.yylloc = {}; + var yyloc = this.lexer.yylloc; + lstack.push(yyloc); + var ranges = this.lexer.options && this.lexer.options.ranges; + if (typeof this.yy.parseError === "function") this.parseError = this.yy.parseError; + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + function lex() { + var token; + token = self.lexer.lex() || 1; + if (typeof token !== "number") { + token = self.symbols_[token] || token; + } + return token; + } + var symbol, + preErrorSymbol, + state, + action, + a, + r, + yyval = {}, + p, + len, + newState, + expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + if (!recovering) { + expected = []; + for (p in table[state]) if (this.terminals_[p] && p > 2) { + expected.push("'" + this.terminals_[p] + "'"); + } + if (this.lexer.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1 ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected }); + } + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(this.lexer.yytext); + lstack.push(this.lexer.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = this.lexer.yyleng; + yytext = this.lexer.yytext; + yylineno = this.lexer.yylineno; + yyloc = this.lexer.yylloc; + if (recovering > 0) recovering--; + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column }; + if (ranges) { + yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; + } + r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + } + }; + /* Jison generated lexer */ + var lexer = (function () { + var lexer = { EOF: 1, + parseError: function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + setInput: function setInput(input) { + this._input = input; + this._more = this._less = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ''; + this.conditionStack = ['INITIAL']; + this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }; + if (this.options.ranges) this.yylloc.range = [0, 0]; + this.offset = 0; + return this; + }, + input: function input() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) this.yylloc.range[1]++; + + this._input = this._input.slice(1); + return ch; + }, + unput: function unput(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len - 1); + //this.yyleng -= len; + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + + if (lines.length - 1) this.yylineno -= lines.length - 1; + var r = this.yylloc.range; + + this.yylloc = { first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + return this; + }, + more: function more() { + this._more = true; + return this; + }, + less: function less(n) { + this.unput(this.match.slice(n)); + }, + pastInput: function pastInput() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\n/g, ""); + }, + upcomingInput: function upcomingInput() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); + }, + showPosition: function showPosition() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, + next: function next() { + if (this.done) { + return this.EOF; + } + if (!this._input) this.done = true; + + var token, match, tempMatch, index, col, lines; + if (!this._more) { + this.yytext = ''; + this.match = ''; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (!this.options.flex) break; + } + } + if (match) { + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) this.yylineno += lines.length; + this.yylloc = { first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) this.done = false; + if (token) return token;else return; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { text: "", token: null, line: this.yylineno }); + } + }, + lex: function lex() { + var r = this.next(); + if (typeof r !== 'undefined') { + return r; + } else { + return this.lex(); + } + }, + begin: function begin(condition) { + this.conditionStack.push(condition); + }, + popState: function popState() { + return this.conditionStack.pop(); + }, + _currentRules: function _currentRules() { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + }, + topState: function topState() { + return this.conditionStack[this.conditionStack.length - 2]; + }, + pushState: function begin(condition) { + this.begin(condition); + } }; + lexer.options = {}; + lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START + /**/) { + + function strip(start, end) { + return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng - end); + } + + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + if (yy_.yytext.slice(-2) === "\\\\") { + strip(0, 1); + this.begin("mu"); + } else if (yy_.yytext.slice(-1) === "\\") { + strip(0, 1); + this.begin("emu"); + } else { + this.begin("mu"); + } + if (yy_.yytext) return 15; + + break; + case 1: + return 15; + break; + case 2: + this.popState(); + return 15; + + break; + case 3: + this.begin('raw');return 15; + break; + case 4: + this.popState(); + // Should be using `this.topState()` below, but it currently + // returns the second top instead of the first top. Opened an + // issue about it at https://github.com/zaach/jison/issues/291 + if (this.conditionStack[this.conditionStack.length - 1] === 'raw') { + return 15; + } else { + yy_.yytext = yy_.yytext.substr(5, yy_.yyleng - 9); + return 'END_RAW_BLOCK'; + } + + break; + case 5: + return 15; + break; + case 6: + this.popState(); + return 14; + + break; + case 7: + return 65; + break; + case 8: + return 68; + break; + case 9: + return 19; + break; + case 10: + this.popState(); + this.begin('raw'); + return 23; + + break; + case 11: + return 55; + break; + case 12: + return 60; + break; + case 13: + return 29; + break; + case 14: + return 47; + break; + case 15: + this.popState();return 44; + break; + case 16: + this.popState();return 44; + break; + case 17: + return 34; + break; + case 18: + return 39; + break; + case 19: + return 51; + break; + case 20: + return 48; + break; + case 21: + this.unput(yy_.yytext); + this.popState(); + this.begin('com'); + + break; + case 22: + this.popState(); + return 14; + + break; + case 23: + return 48; + break; + case 24: + return 73; + break; + case 25: + return 72; + break; + case 26: + return 72; + break; + case 27: + return 87; + break; + case 28: + // ignore whitespace + break; + case 29: + this.popState();return 54; + break; + case 30: + this.popState();return 33; + break; + case 31: + yy_.yytext = strip(1, 2).replace(/\\"/g, '"');return 80; + break; + case 32: + yy_.yytext = strip(1, 2).replace(/\\'/g, "'");return 80; + break; + case 33: + return 85; + break; + case 34: + return 82; + break; + case 35: + return 82; + break; + case 36: + return 83; + break; + case 37: + return 84; + break; + case 38: + return 81; + break; + case 39: + return 75; + break; + case 40: + return 77; + break; + case 41: + return 72; + break; + case 42: + yy_.yytext = yy_.yytext.replace(/\\([\\\]])/g, '$1');return 72; + break; + case 43: + return 'INVALID'; + break; + case 44: + return 5; + break; + } + }; + lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/, /^(?:[^\x00]+)/, /^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/, /^(?:\{\{\{\{(?=[^/]))/, /^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/, /^(?:[^\x00]*?(?=(\{\{\{\{)))/, /^(?:[\s\S]*?--(~)?\}\})/, /^(?:\()/, /^(?:\))/, /^(?:\{\{\{\{)/, /^(?:\}\}\}\})/, /^(?:\{\{(~)?>)/, /^(?:\{\{(~)?#>)/, /^(?:\{\{(~)?#\*?)/, /^(?:\{\{(~)?\/)/, /^(?:\{\{(~)?\^\s*(~)?\}\})/, /^(?:\{\{(~)?\s*else\s*(~)?\}\})/, /^(?:\{\{(~)?\^)/, /^(?:\{\{(~)?\s*else\b)/, /^(?:\{\{(~)?\{)/, /^(?:\{\{(~)?&)/, /^(?:\{\{(~)?!--)/, /^(?:\{\{(~)?![\s\S]*?\}\})/, /^(?:\{\{(~)?\*?)/, /^(?:=)/, /^(?:\.\.)/, /^(?:\.(?=([=~}\s\/.)|])))/, /^(?:[\/.])/, /^(?:\s+)/, /^(?:\}(~)?\}\})/, /^(?:(~)?\}\})/, /^(?:"(\\["]|[^"])*")/, /^(?:'(\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\s)])))/, /^(?:false(?=([~}\s)])))/, /^(?:undefined(?=([~}\s)])))/, /^(?:null(?=([~}\s)])))/, /^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/, /^(?:as\s+\|)/, /^(?:\|)/, /^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/, /^(?:\[(\\\]|[^\]])*\])/, /^(?:.)/, /^(?:$)/]; + lexer.conditions = { "mu": { "rules": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44], "inclusive": false }, "emu": { "rules": [2], "inclusive": false }, "com": { "rules": [6], "inclusive": false }, "raw": { "rules": [3, 4, 5], "inclusive": false }, "INITIAL": { "rules": [0, 1, 44], "inclusive": true } }; + return lexer; + })(); + parser.lexer = lexer; + function Parser() { + this.yy = {}; + }Parser.prototype = parser;parser.Parser = Parser; + return new Parser(); + })();exports.__esModule = true; + exports['default'] = handlebars; + +/***/ }, +/* 24 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _visitor = __webpack_require__(25); + + var _visitor2 = _interopRequireDefault(_visitor); + + function WhitespaceControl() { + var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + this.options = options; + } + WhitespaceControl.prototype = new _visitor2['default'](); + + WhitespaceControl.prototype.Program = function (program) { + var doStandalone = !this.options.ignoreStandalone; + + var isRoot = !this.isRootSeen; + this.isRootSeen = true; + + var body = program.body; + for (var i = 0, l = body.length; i < l; i++) { + var current = body[i], + strip = this.accept(current); + + if (!strip) { + continue; + } + + var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot), + _isNextWhitespace = isNextWhitespace(body, i, isRoot), + openStandalone = strip.openStandalone && _isPrevWhitespace, + closeStandalone = strip.closeStandalone && _isNextWhitespace, + inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace; + + if (strip.close) { + omitRight(body, i, true); + } + if (strip.open) { + omitLeft(body, i, true); + } + + if (doStandalone && inlineStandalone) { + omitRight(body, i); + + if (omitLeft(body, i)) { + // If we are on a standalone node, save the indent info for partials + if (current.type === 'PartialStatement') { + // Pull out the whitespace from the final line + current.indent = /([ \t]+$)/.exec(body[i - 1].original)[1]; + } + } + } + if (doStandalone && openStandalone) { + omitRight((current.program || current.inverse).body); + + // Strip out the previous content node if it's whitespace only + omitLeft(body, i); + } + if (doStandalone && closeStandalone) { + // Always strip the next node + omitRight(body, i); + + omitLeft((current.inverse || current.program).body); + } + } + + return program; + }; + + WhitespaceControl.prototype.BlockStatement = WhitespaceControl.prototype.DecoratorBlock = WhitespaceControl.prototype.PartialBlockStatement = function (block) { + this.accept(block.program); + this.accept(block.inverse); + + // Find the inverse program that is involed with whitespace stripping. + var program = block.program || block.inverse, + inverse = block.program && block.inverse, + firstInverse = inverse, + lastInverse = inverse; + + if (inverse && inverse.chained) { + firstInverse = inverse.body[0].program; + + // Walk the inverse chain to find the last inverse that is actually in the chain. + while (lastInverse.chained) { + lastInverse = lastInverse.body[lastInverse.body.length - 1].program; + } + } + + var strip = { + open: block.openStrip.open, + close: block.closeStrip.close, + + // Determine the standalone candiacy. Basically flag our content as being possibly standalone + // so our parent can determine if we actually are standalone + openStandalone: isNextWhitespace(program.body), + closeStandalone: isPrevWhitespace((firstInverse || program).body) + }; + + if (block.openStrip.close) { + omitRight(program.body, null, true); + } + + if (inverse) { + var inverseStrip = block.inverseStrip; + + if (inverseStrip.open) { + omitLeft(program.body, null, true); + } + + if (inverseStrip.close) { + omitRight(firstInverse.body, null, true); + } + if (block.closeStrip.open) { + omitLeft(lastInverse.body, null, true); + } + + // Find standalone else statments + if (!this.options.ignoreStandalone && isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) { + omitLeft(program.body); + omitRight(firstInverse.body); + } + } else if (block.closeStrip.open) { + omitLeft(program.body, null, true); + } + + return strip; + }; + + WhitespaceControl.prototype.Decorator = WhitespaceControl.prototype.MustacheStatement = function (mustache) { + return mustache.strip; + }; + + WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) { + /* istanbul ignore next */ + var strip = node.strip || {}; + return { + inlineStandalone: true, + open: strip.open, + close: strip.close + }; + }; + + function isPrevWhitespace(body, i, isRoot) { + if (i === undefined) { + i = body.length; + } + + // Nodes that end with newlines are considered whitespace (but are special + // cased for strip operations) + var prev = body[i - 1], + sibling = body[i - 2]; + if (!prev) { + return isRoot; + } + + if (prev.type === 'ContentStatement') { + return (sibling || !isRoot ? /\r?\n\s*?$/ : /(^|\r?\n)\s*?$/).test(prev.original); + } + } + function isNextWhitespace(body, i, isRoot) { + if (i === undefined) { + i = -1; + } + + var next = body[i + 1], + sibling = body[i + 2]; + if (!next) { + return isRoot; + } + + if (next.type === 'ContentStatement') { + return (sibling || !isRoot ? /^\s*?\r?\n/ : /^\s*?(\r?\n|$)/).test(next.original); + } + } + + // Marks the node to the right of the position as omitted. + // I.e. {{foo}}' ' will mark the ' ' node as omitted. + // + // If i is undefined, then the first child will be marked as such. + // + // If mulitple is truthy then all whitespace will be stripped out until non-whitespace + // content is met. + function omitRight(body, i, multiple) { + var current = body[i == null ? 0 : i + 1]; + if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) { + return; + } + + var original = current.value; + current.value = current.value.replace(multiple ? /^\s+/ : /^[ \t]*\r?\n?/, ''); + current.rightStripped = current.value !== original; + } + + // Marks the node to the left of the position as omitted. + // I.e. ' '{{foo}} will mark the ' ' node as omitted. + // + // If i is undefined then the last child will be marked as such. + // + // If mulitple is truthy then all whitespace will be stripped out until non-whitespace + // content is met. + function omitLeft(body, i, multiple) { + var current = body[i == null ? body.length - 1 : i - 1]; + if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) { + return; + } + + // We omit the last node if it's whitespace only and not preceeded by a non-content node. + var original = current.value; + current.value = current.value.replace(multiple ? /\s+$/ : /[ \t]+$/, ''); + current.leftStripped = current.value !== original; + return current.leftStripped; + } + + exports['default'] = WhitespaceControl; + module.exports = exports['default']; + +/***/ }, +/* 25 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + function Visitor() { + this.parents = []; + } + + Visitor.prototype = { + constructor: Visitor, + mutating: false, + + // Visits a given value. If mutating, will replace the value if necessary. + acceptKey: function acceptKey(node, name) { + var value = this.accept(node[name]); + if (this.mutating) { + // Hacky sanity check: This may have a few false positives for type for the helper + // methods but will generally do the right thing without a lot of overhead. + if (value && !Visitor.prototype[value.type]) { + throw new _exception2['default']('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type); + } + node[name] = value; + } + }, + + // Performs an accept operation with added sanity check to ensure + // required keys are not removed. + acceptRequired: function acceptRequired(node, name) { + this.acceptKey(node, name); + + if (!node[name]) { + throw new _exception2['default'](node.type + ' requires ' + name); + } + }, + + // Traverses a given array. If mutating, empty respnses will be removed + // for child elements. + acceptArray: function acceptArray(array) { + for (var i = 0, l = array.length; i < l; i++) { + this.acceptKey(array, i); + + if (!array[i]) { + array.splice(i, 1); + i--; + l--; + } + } + }, + + accept: function accept(object) { + if (!object) { + return; + } + + /* istanbul ignore next: Sanity code */ + if (!this[object.type]) { + throw new _exception2['default']('Unknown type: ' + object.type, object); + } + + if (this.current) { + this.parents.unshift(this.current); + } + this.current = object; + + var ret = this[object.type](object); + + this.current = this.parents.shift(); + + if (!this.mutating || ret) { + return ret; + } else if (ret !== false) { + return object; + } + }, + + Program: function Program(program) { + this.acceptArray(program.body); + }, + + MustacheStatement: visitSubExpression, + Decorator: visitSubExpression, + + BlockStatement: visitBlock, + DecoratorBlock: visitBlock, + + PartialStatement: visitPartial, + PartialBlockStatement: function PartialBlockStatement(partial) { + visitPartial.call(this, partial); + + this.acceptKey(partial, 'program'); + }, + + ContentStatement: function ContentStatement() /* content */{}, + CommentStatement: function CommentStatement() /* comment */{}, + + SubExpression: visitSubExpression, + + PathExpression: function PathExpression() /* path */{}, + + StringLiteral: function StringLiteral() /* string */{}, + NumberLiteral: function NumberLiteral() /* number */{}, + BooleanLiteral: function BooleanLiteral() /* bool */{}, + UndefinedLiteral: function UndefinedLiteral() /* literal */{}, + NullLiteral: function NullLiteral() /* literal */{}, + + Hash: function Hash(hash) { + this.acceptArray(hash.pairs); + }, + HashPair: function HashPair(pair) { + this.acceptRequired(pair, 'value'); + } + }; + + function visitSubExpression(mustache) { + this.acceptRequired(mustache, 'path'); + this.acceptArray(mustache.params); + this.acceptKey(mustache, 'hash'); + } + function visitBlock(block) { + visitSubExpression.call(this, block); + + this.acceptKey(block, 'program'); + this.acceptKey(block, 'inverse'); + } + function visitPartial(partial) { + this.acceptRequired(partial, 'name'); + this.acceptArray(partial.params); + this.acceptKey(partial, 'hash'); + } + + exports['default'] = Visitor; + module.exports = exports['default']; + +/***/ }, +/* 26 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.SourceLocation = SourceLocation; + exports.id = id; + exports.stripFlags = stripFlags; + exports.stripComment = stripComment; + exports.preparePath = preparePath; + exports.prepareMustache = prepareMustache; + exports.prepareRawBlock = prepareRawBlock; + exports.prepareBlock = prepareBlock; + exports.prepareProgram = prepareProgram; + exports.preparePartialBlock = preparePartialBlock; + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + function validateClose(open, close) { + close = close.path ? close.path.original : close; + + if (open.path.original !== close) { + var errorNode = { loc: open.path.loc }; + + throw new _exception2['default'](open.path.original + " doesn't match " + close, errorNode); + } + } + + function SourceLocation(source, locInfo) { + this.source = source; + this.start = { + line: locInfo.first_line, + column: locInfo.first_column + }; + this.end = { + line: locInfo.last_line, + column: locInfo.last_column + }; + } + + function id(token) { + if (/^\[.*\]$/.test(token)) { + return token.substr(1, token.length - 2); + } else { + return token; + } + } + + function stripFlags(open, close) { + return { + open: open.charAt(2) === '~', + close: close.charAt(close.length - 3) === '~' + }; + } + + function stripComment(comment) { + return comment.replace(/^\{\{~?\!-?-?/, '').replace(/-?-?~?\}\}$/, ''); + } + + function preparePath(data, parts, loc) { + loc = this.locInfo(loc); + + var original = data ? '@' : '', + dig = [], + depth = 0, + depthString = ''; + + for (var i = 0, l = parts.length; i < l; i++) { + var part = parts[i].part, + + // If we have [] syntax then we do not treat path references as operators, + // i.e. foo.[this] resolves to approximately context.foo['this'] + isLiteral = parts[i].original !== part; + original += (parts[i].separator || '') + part; + + if (!isLiteral && (part === '..' || part === '.' || part === 'this')) { + if (dig.length > 0) { + throw new _exception2['default']('Invalid path: ' + original, { loc: loc }); + } else if (part === '..') { + depth++; + depthString += '../'; + } + } else { + dig.push(part); + } + } + + return { + type: 'PathExpression', + data: data, + depth: depth, + parts: dig, + original: original, + loc: loc + }; + } + + function prepareMustache(path, params, hash, open, strip, locInfo) { + // Must use charAt to support IE pre-10 + var escapeFlag = open.charAt(3) || open.charAt(2), + escaped = escapeFlag !== '{' && escapeFlag !== '&'; + + var decorator = /\*/.test(open); + return { + type: decorator ? 'Decorator' : 'MustacheStatement', + path: path, + params: params, + hash: hash, + escaped: escaped, + strip: strip, + loc: this.locInfo(locInfo) + }; + } + + function prepareRawBlock(openRawBlock, contents, close, locInfo) { + validateClose(openRawBlock, close); + + locInfo = this.locInfo(locInfo); + var program = { + type: 'Program', + body: contents, + strip: {}, + loc: locInfo + }; + + return { + type: 'BlockStatement', + path: openRawBlock.path, + params: openRawBlock.params, + hash: openRawBlock.hash, + program: program, + openStrip: {}, + inverseStrip: {}, + closeStrip: {}, + loc: locInfo + }; + } + + function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) { + if (close && close.path) { + validateClose(openBlock, close); + } + + var decorator = /\*/.test(openBlock.open); + + program.blockParams = openBlock.blockParams; + + var inverse = undefined, + inverseStrip = undefined; + + if (inverseAndProgram) { + if (decorator) { + throw new _exception2['default']('Unexpected inverse block on decorator', inverseAndProgram); + } + + if (inverseAndProgram.chain) { + inverseAndProgram.program.body[0].closeStrip = close.strip; + } + + inverseStrip = inverseAndProgram.strip; + inverse = inverseAndProgram.program; + } + + if (inverted) { + inverted = inverse; + inverse = program; + program = inverted; + } + + return { + type: decorator ? 'DecoratorBlock' : 'BlockStatement', + path: openBlock.path, + params: openBlock.params, + hash: openBlock.hash, + program: program, + inverse: inverse, + openStrip: openBlock.strip, + inverseStrip: inverseStrip, + closeStrip: close && close.strip, + loc: this.locInfo(locInfo) + }; + } + + function prepareProgram(statements, loc) { + if (!loc && statements.length) { + var firstLoc = statements[0].loc, + lastLoc = statements[statements.length - 1].loc; + + /* istanbul ignore else */ + if (firstLoc && lastLoc) { + loc = { + source: firstLoc.source, + start: { + line: firstLoc.start.line, + column: firstLoc.start.column + }, + end: { + line: lastLoc.end.line, + column: lastLoc.end.column + } + }; + } + } + + return { + type: 'Program', + body: statements, + strip: {}, + loc: loc + }; + } + + function preparePartialBlock(open, program, close, locInfo) { + validateClose(open, close); + + return { + type: 'PartialBlockStatement', + name: open.path, + params: open.params, + hash: open.hash, + program: program, + openStrip: open.strip, + closeStrip: close && close.strip, + loc: this.locInfo(locInfo) + }; + } + +/***/ }, +/* 27 */ +/***/ function(module, exports, __webpack_require__) { + + /* eslint-disable new-cap */ + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.Compiler = Compiler; + exports.precompile = precompile; + exports.compile = compile; + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + var _utils = __webpack_require__(5); + + var _ast = __webpack_require__(21); + + var _ast2 = _interopRequireDefault(_ast); + + var slice = [].slice; + + function Compiler() {} + + // the foundHelper register will disambiguate helper lookup from finding a + // function in a context. This is necessary for mustache compatibility, which + // requires that context functions in blocks are evaluated by blockHelperMissing, + // and then proceed as if the resulting value was provided to blockHelperMissing. + + Compiler.prototype = { + compiler: Compiler, + + equals: function equals(other) { + var len = this.opcodes.length; + if (other.opcodes.length !== len) { + return false; + } + + for (var i = 0; i < len; i++) { + var opcode = this.opcodes[i], + otherOpcode = other.opcodes[i]; + if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) { + return false; + } + } + + // We know that length is the same between the two arrays because they are directly tied + // to the opcode behavior above. + len = this.children.length; + for (var i = 0; i < len; i++) { + if (!this.children[i].equals(other.children[i])) { + return false; + } + } + + return true; + }, + + guid: 0, + + compile: function compile(program, options) { + this.sourceNode = []; + this.opcodes = []; + this.children = []; + this.options = options; + this.stringParams = options.stringParams; + this.trackIds = options.trackIds; + + options.blockParams = options.blockParams || []; + + // These changes will propagate to the other compiler components + var knownHelpers = options.knownHelpers; + options.knownHelpers = { + 'helperMissing': true, + 'blockHelperMissing': true, + 'each': true, + 'if': true, + 'unless': true, + 'with': true, + 'log': true, + 'lookup': true + }; + if (knownHelpers) { + for (var _name in knownHelpers) { + /* istanbul ignore else */ + if (_name in knownHelpers) { + options.knownHelpers[_name] = knownHelpers[_name]; + } + } + } + + return this.accept(program); + }, + + compileProgram: function compileProgram(program) { + var childCompiler = new this.compiler(), + // eslint-disable-line new-cap + result = childCompiler.compile(program, this.options), + guid = this.guid++; + + this.usePartial = this.usePartial || result.usePartial; + + this.children[guid] = result; + this.useDepths = this.useDepths || result.useDepths; + + return guid; + }, + + accept: function accept(node) { + /* istanbul ignore next: Sanity code */ + if (!this[node.type]) { + throw new _exception2['default']('Unknown type: ' + node.type, node); + } + + this.sourceNode.unshift(node); + var ret = this[node.type](node); + this.sourceNode.shift(); + return ret; + }, + + Program: function Program(program) { + this.options.blockParams.unshift(program.blockParams); + + var body = program.body, + bodyLength = body.length; + for (var i = 0; i < bodyLength; i++) { + this.accept(body[i]); + } + + this.options.blockParams.shift(); + + this.isSimple = bodyLength === 1; + this.blockParams = program.blockParams ? program.blockParams.length : 0; + + return this; + }, + + BlockStatement: function BlockStatement(block) { + transformLiteralToPath(block); + + var program = block.program, + inverse = block.inverse; + + program = program && this.compileProgram(program); + inverse = inverse && this.compileProgram(inverse); + + var type = this.classifySexpr(block); + + if (type === 'helper') { + this.helperSexpr(block, program, inverse); + } else if (type === 'simple') { + this.simpleSexpr(block); + + // now that the simple mustache is resolved, we need to + // evaluate it by executing `blockHelperMissing` + this.opcode('pushProgram', program); + this.opcode('pushProgram', inverse); + this.opcode('emptyHash'); + this.opcode('blockValue', block.path.original); + } else { + this.ambiguousSexpr(block, program, inverse); + + // now that the simple mustache is resolved, we need to + // evaluate it by executing `blockHelperMissing` + this.opcode('pushProgram', program); + this.opcode('pushProgram', inverse); + this.opcode('emptyHash'); + this.opcode('ambiguousBlockValue'); + } + + this.opcode('append'); + }, + + DecoratorBlock: function DecoratorBlock(decorator) { + var program = decorator.program && this.compileProgram(decorator.program); + var params = this.setupFullMustacheParams(decorator, program, undefined), + path = decorator.path; + + this.useDecorators = true; + this.opcode('registerDecorator', params.length, path.original); + }, + + PartialStatement: function PartialStatement(partial) { + this.usePartial = true; + + var program = partial.program; + if (program) { + program = this.compileProgram(partial.program); + } + + var params = partial.params; + if (params.length > 1) { + throw new _exception2['default']('Unsupported number of partial arguments: ' + params.length, partial); + } else if (!params.length) { + if (this.options.explicitPartialContext) { + this.opcode('pushLiteral', 'undefined'); + } else { + params.push({ type: 'PathExpression', parts: [], depth: 0 }); + } + } + + var partialName = partial.name.original, + isDynamic = partial.name.type === 'SubExpression'; + if (isDynamic) { + this.accept(partial.name); + } + + this.setupFullMustacheParams(partial, program, undefined, true); + + var indent = partial.indent || ''; + if (this.options.preventIndent && indent) { + this.opcode('appendContent', indent); + indent = ''; + } + + this.opcode('invokePartial', isDynamic, partialName, indent); + this.opcode('append'); + }, + PartialBlockStatement: function PartialBlockStatement(partialBlock) { + this.PartialStatement(partialBlock); + }, + + MustacheStatement: function MustacheStatement(mustache) { + this.SubExpression(mustache); + + if (mustache.escaped && !this.options.noEscape) { + this.opcode('appendEscaped'); + } else { + this.opcode('append'); + } + }, + Decorator: function Decorator(decorator) { + this.DecoratorBlock(decorator); + }, + + ContentStatement: function ContentStatement(content) { + if (content.value) { + this.opcode('appendContent', content.value); + } + }, + + CommentStatement: function CommentStatement() {}, + + SubExpression: function SubExpression(sexpr) { + transformLiteralToPath(sexpr); + var type = this.classifySexpr(sexpr); + + if (type === 'simple') { + this.simpleSexpr(sexpr); + } else if (type === 'helper') { + this.helperSexpr(sexpr); + } else { + this.ambiguousSexpr(sexpr); + } + }, + ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) { + var path = sexpr.path, + name = path.parts[0], + isBlock = program != null || inverse != null; + + this.opcode('getContext', path.depth); + + this.opcode('pushProgram', program); + this.opcode('pushProgram', inverse); + + path.strict = true; + this.accept(path); + + this.opcode('invokeAmbiguous', name, isBlock); + }, + + simpleSexpr: function simpleSexpr(sexpr) { + var path = sexpr.path; + path.strict = true; + this.accept(path); + this.opcode('resolvePossibleLambda'); + }, + + helperSexpr: function helperSexpr(sexpr, program, inverse) { + var params = this.setupFullMustacheParams(sexpr, program, inverse), + path = sexpr.path, + name = path.parts[0]; + + if (this.options.knownHelpers[name]) { + this.opcode('invokeKnownHelper', params.length, name); + } else if (this.options.knownHelpersOnly) { + throw new _exception2['default']('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr); + } else { + path.strict = true; + path.falsy = true; + + this.accept(path); + this.opcode('invokeHelper', params.length, path.original, _ast2['default'].helpers.simpleId(path)); + } + }, + + PathExpression: function PathExpression(path) { + this.addDepth(path.depth); + this.opcode('getContext', path.depth); + + var name = path.parts[0], + scoped = _ast2['default'].helpers.scopedId(path), + blockParamId = !path.depth && !scoped && this.blockParamIndex(name); + + if (blockParamId) { + this.opcode('lookupBlockParam', blockParamId, path.parts); + } else if (!name) { + // Context reference, i.e. `{{foo .}}` or `{{foo ..}}` + this.opcode('pushContext'); + } else if (path.data) { + this.options.data = true; + this.opcode('lookupData', path.depth, path.parts, path.strict); + } else { + this.opcode('lookupOnContext', path.parts, path.falsy, path.strict, scoped); + } + }, + + StringLiteral: function StringLiteral(string) { + this.opcode('pushString', string.value); + }, + + NumberLiteral: function NumberLiteral(number) { + this.opcode('pushLiteral', number.value); + }, + + BooleanLiteral: function BooleanLiteral(bool) { + this.opcode('pushLiteral', bool.value); + }, + + UndefinedLiteral: function UndefinedLiteral() { + this.opcode('pushLiteral', 'undefined'); + }, + + NullLiteral: function NullLiteral() { + this.opcode('pushLiteral', 'null'); + }, + + Hash: function Hash(hash) { + var pairs = hash.pairs, + i = 0, + l = pairs.length; + + this.opcode('pushHash'); + + for (; i < l; i++) { + this.pushParam(pairs[i].value); + } + while (i--) { + this.opcode('assignToHash', pairs[i].key); + } + this.opcode('popHash'); + }, + + // HELPERS + opcode: function opcode(name) { + this.opcodes.push({ opcode: name, args: slice.call(arguments, 1), loc: this.sourceNode[0].loc }); + }, + + addDepth: function addDepth(depth) { + if (!depth) { + return; + } + + this.useDepths = true; + }, + + classifySexpr: function classifySexpr(sexpr) { + var isSimple = _ast2['default'].helpers.simpleId(sexpr.path); + + var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]); + + // a mustache is an eligible helper if: + // * its id is simple (a single part, not `this` or `..`) + var isHelper = !isBlockParam && _ast2['default'].helpers.helperExpression(sexpr); + + // if a mustache is an eligible helper but not a definite + // helper, it is ambiguous, and will be resolved in a later + // pass or at runtime. + var isEligible = !isBlockParam && (isHelper || isSimple); + + // if ambiguous, we can possibly resolve the ambiguity now + // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc. + if (isEligible && !isHelper) { + var _name2 = sexpr.path.parts[0], + options = this.options; + + if (options.knownHelpers[_name2]) { + isHelper = true; + } else if (options.knownHelpersOnly) { + isEligible = false; + } + } + + if (isHelper) { + return 'helper'; + } else if (isEligible) { + return 'ambiguous'; + } else { + return 'simple'; + } + }, + + pushParams: function pushParams(params) { + for (var i = 0, l = params.length; i < l; i++) { + this.pushParam(params[i]); + } + }, + + pushParam: function pushParam(val) { + var value = val.value != null ? val.value : val.original || ''; + + if (this.stringParams) { + if (value.replace) { + value = value.replace(/^(\.?\.\/)*/g, '').replace(/\//g, '.'); + } + + if (val.depth) { + this.addDepth(val.depth); + } + this.opcode('getContext', val.depth || 0); + this.opcode('pushStringParam', value, val.type); + + if (val.type === 'SubExpression') { + // SubExpressions get evaluated and passed in + // in string params mode. + this.accept(val); + } + } else { + if (this.trackIds) { + var blockParamIndex = undefined; + if (val.parts && !_ast2['default'].helpers.scopedId(val) && !val.depth) { + blockParamIndex = this.blockParamIndex(val.parts[0]); + } + if (blockParamIndex) { + var blockParamChild = val.parts.slice(1).join('.'); + this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild); + } else { + value = val.original || value; + if (value.replace) { + value = value.replace(/^this(?:\.|$)/, '').replace(/^\.\//, '').replace(/^\.$/, ''); + } + + this.opcode('pushId', val.type, value); + } + } + this.accept(val); + } + }, + + setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) { + var params = sexpr.params; + this.pushParams(params); + + this.opcode('pushProgram', program); + this.opcode('pushProgram', inverse); + + if (sexpr.hash) { + this.accept(sexpr.hash); + } else { + this.opcode('emptyHash', omitEmpty); + } + + return params; + }, + + blockParamIndex: function blockParamIndex(name) { + for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) { + var blockParams = this.options.blockParams[depth], + param = blockParams && _utils.indexOf(blockParams, name); + if (blockParams && param >= 0) { + return [depth, param]; + } + } + } + }; + + function precompile(input, options, env) { + if (input == null || typeof input !== 'string' && input.type !== 'Program') { + throw new _exception2['default']('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input); + } + + options = options || {}; + if (!('data' in options)) { + options.data = true; + } + if (options.compat) { + options.useDepths = true; + } + + var ast = env.parse(input, options), + environment = new env.Compiler().compile(ast, options); + return new env.JavaScriptCompiler().compile(environment, options); + } + + function compile(input, options, env) { + if (options === undefined) options = {}; + + if (input == null || typeof input !== 'string' && input.type !== 'Program') { + throw new _exception2['default']('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input); + } + + if (!('data' in options)) { + options.data = true; + } + if (options.compat) { + options.useDepths = true; + } + + var compiled = undefined; + + function compileInput() { + var ast = env.parse(input, options), + environment = new env.Compiler().compile(ast, options), + templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true); + return env.template(templateSpec); + } + + // Template is only compiled on first use and cached after that point. + function ret(context, execOptions) { + if (!compiled) { + compiled = compileInput(); + } + return compiled.call(this, context, execOptions); + } + ret._setup = function (setupOptions) { + if (!compiled) { + compiled = compileInput(); + } + return compiled._setup(setupOptions); + }; + ret._child = function (i, data, blockParams, depths) { + if (!compiled) { + compiled = compileInput(); + } + return compiled._child(i, data, blockParams, depths); + }; + return ret; + } + + function argEquals(a, b) { + if (a === b) { + return true; + } + + if (_utils.isArray(a) && _utils.isArray(b) && a.length === b.length) { + for (var i = 0; i < a.length; i++) { + if (!argEquals(a[i], b[i])) { + return false; + } + } + return true; + } + } + + function transformLiteralToPath(sexpr) { + if (!sexpr.path.parts) { + var literal = sexpr.path; + // Casting to string here to make false and 0 literal values play nicely with the rest + // of the system. + sexpr.path = { + type: 'PathExpression', + data: false, + depth: 0, + parts: [literal.original + ''], + original: literal.original + '', + loc: literal.loc + }; + } + } + +/***/ }, +/* 28 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _base = __webpack_require__(4); + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + var _utils = __webpack_require__(5); + + var _codeGen = __webpack_require__(29); + + var _codeGen2 = _interopRequireDefault(_codeGen); + + function Literal(value) { + this.value = value; + } + + function JavaScriptCompiler() {} + + JavaScriptCompiler.prototype = { + // PUBLIC API: You can override these methods in a subclass to provide + // alternative compiled forms for name lookup and buffering semantics + nameLookup: function nameLookup(parent, name /* , type*/) { + if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) { + return [parent, '.', name]; + } else { + return [parent, '[', JSON.stringify(name), ']']; + } + }, + depthedLookup: function depthedLookup(name) { + return [this.aliasable('container.lookup'), '(depths, "', name, '")']; + }, + + compilerInfo: function compilerInfo() { + var revision = _base.COMPILER_REVISION, + versions = _base.REVISION_CHANGES[revision]; + return [revision, versions]; + }, + + appendToBuffer: function appendToBuffer(source, location, explicit) { + // Force a source as this simplifies the merge logic. + if (!_utils.isArray(source)) { + source = [source]; + } + source = this.source.wrap(source, location); + + if (this.environment.isSimple) { + return ['return ', source, ';']; + } else if (explicit) { + // This is a case where the buffer operation occurs as a child of another + // construct, generally braces. We have to explicitly output these buffer + // operations to ensure that the emitted code goes in the correct location. + return ['buffer += ', source, ';']; + } else { + source.appendToBuffer = true; + return source; + } + }, + + initializeBuffer: function initializeBuffer() { + return this.quotedString(''); + }, + // END PUBLIC API + + compile: function compile(environment, options, context, asObject) { + this.environment = environment; + this.options = options; + this.stringParams = this.options.stringParams; + this.trackIds = this.options.trackIds; + this.precompile = !asObject; + + this.name = this.environment.name; + this.isChild = !!context; + this.context = context || { + decorators: [], + programs: [], + environments: [] + }; + + this.preamble(); + + this.stackSlot = 0; + this.stackVars = []; + this.aliases = {}; + this.registers = { list: [] }; + this.hashes = []; + this.compileStack = []; + this.inlineStack = []; + this.blockParams = []; + + this.compileChildren(environment, options); + + this.useDepths = this.useDepths || environment.useDepths || environment.useDecorators || this.options.compat; + this.useBlockParams = this.useBlockParams || environment.useBlockParams; + + var opcodes = environment.opcodes, + opcode = undefined, + firstLoc = undefined, + i = undefined, + l = undefined; + + for (i = 0, l = opcodes.length; i < l; i++) { + opcode = opcodes[i]; + + this.source.currentLocation = opcode.loc; + firstLoc = firstLoc || opcode.loc; + this[opcode.opcode].apply(this, opcode.args); + } + + // Flush any trailing content that might be pending. + this.source.currentLocation = firstLoc; + this.pushSource(''); + + /* istanbul ignore next */ + if (this.stackSlot || this.inlineStack.length || this.compileStack.length) { + throw new _exception2['default']('Compile completed with content left on stack'); + } + + if (!this.decorators.isEmpty()) { + this.useDecorators = true; + + this.decorators.prepend('var decorators = container.decorators;\n'); + this.decorators.push('return fn;'); + + if (asObject) { + this.decorators = Function.apply(this, ['fn', 'props', 'container', 'depth0', 'data', 'blockParams', 'depths', this.decorators.merge()]); + } else { + this.decorators.prepend('function(fn, props, container, depth0, data, blockParams, depths) {\n'); + this.decorators.push('}\n'); + this.decorators = this.decorators.merge(); + } + } else { + this.decorators = undefined; + } + + var fn = this.createFunctionContext(asObject); + if (!this.isChild) { + var ret = { + compiler: this.compilerInfo(), + main: fn + }; + + if (this.decorators) { + ret.main_d = this.decorators; // eslint-disable-line camelcase + ret.useDecorators = true; + } + + var _context = this.context; + var programs = _context.programs; + var decorators = _context.decorators; + + for (i = 0, l = programs.length; i < l; i++) { + if (programs[i]) { + ret[i] = programs[i]; + if (decorators[i]) { + ret[i + '_d'] = decorators[i]; + ret.useDecorators = true; + } + } + } + + if (this.environment.usePartial) { + ret.usePartial = true; + } + if (this.options.data) { + ret.useData = true; + } + if (this.useDepths) { + ret.useDepths = true; + } + if (this.useBlockParams) { + ret.useBlockParams = true; + } + if (this.options.compat) { + ret.compat = true; + } + + if (!asObject) { + ret.compiler = JSON.stringify(ret.compiler); + + this.source.currentLocation = { start: { line: 1, column: 0 } }; + ret = this.objectLiteral(ret); + + if (options.srcName) { + ret = ret.toStringWithSourceMap({ file: options.destName }); + ret.map = ret.map && ret.map.toString(); + } else { + ret = ret.toString(); + } + } else { + ret.compilerOptions = this.options; + } + + return ret; + } else { + return fn; + } + }, + + preamble: function preamble() { + // track the last context pushed into place to allow skipping the + // getContext opcode when it would be a noop + this.lastContext = 0; + this.source = new _codeGen2['default'](this.options.srcName); + this.decorators = new _codeGen2['default'](this.options.srcName); + }, + + createFunctionContext: function createFunctionContext(asObject) { + var varDeclarations = ''; + + var locals = this.stackVars.concat(this.registers.list); + if (locals.length > 0) { + varDeclarations += ', ' + locals.join(', '); + } + + // Generate minimizer alias mappings + // + // When using true SourceNodes, this will update all references to the given alias + // as the source nodes are reused in situ. For the non-source node compilation mode, + // aliases will not be used, but this case is already being run on the client and + // we aren't concern about minimizing the template size. + var aliasCount = 0; + for (var alias in this.aliases) { + // eslint-disable-line guard-for-in + var node = this.aliases[alias]; + + if (this.aliases.hasOwnProperty(alias) && node.children && node.referenceCount > 1) { + varDeclarations += ', alias' + ++aliasCount + '=' + alias; + node.children[0] = 'alias' + aliasCount; + } + } + + var params = ['container', 'depth0', 'helpers', 'partials', 'data']; + + if (this.useBlockParams || this.useDepths) { + params.push('blockParams'); + } + if (this.useDepths) { + params.push('depths'); + } + + // Perform a second pass over the output to merge content when possible + var source = this.mergeSource(varDeclarations); + + if (asObject) { + params.push(source); + + return Function.apply(this, params); + } else { + return this.source.wrap(['function(', params.join(','), ') {\n ', source, '}']); + } + }, + mergeSource: function mergeSource(varDeclarations) { + var isSimple = this.environment.isSimple, + appendOnly = !this.forceBuffer, + appendFirst = undefined, + sourceSeen = undefined, + bufferStart = undefined, + bufferEnd = undefined; + this.source.each(function (line) { + if (line.appendToBuffer) { + if (bufferStart) { + line.prepend(' + '); + } else { + bufferStart = line; + } + bufferEnd = line; + } else { + if (bufferStart) { + if (!sourceSeen) { + appendFirst = true; + } else { + bufferStart.prepend('buffer += '); + } + bufferEnd.add(';'); + bufferStart = bufferEnd = undefined; + } + + sourceSeen = true; + if (!isSimple) { + appendOnly = false; + } + } + }); + + if (appendOnly) { + if (bufferStart) { + bufferStart.prepend('return '); + bufferEnd.add(';'); + } else if (!sourceSeen) { + this.source.push('return "";'); + } + } else { + varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer()); + + if (bufferStart) { + bufferStart.prepend('return buffer + '); + bufferEnd.add(';'); + } else { + this.source.push('return buffer;'); + } + } + + if (varDeclarations) { + this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n')); + } + + return this.source.merge(); + }, + + // [blockValue] + // + // On stack, before: hash, inverse, program, value + // On stack, after: return value of blockHelperMissing + // + // The purpose of this opcode is to take a block of the form + // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and + // replace it on the stack with the result of properly + // invoking blockHelperMissing. + blockValue: function blockValue(name) { + var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), + params = [this.contextName(0)]; + this.setupHelperArgs(name, 0, params); + + var blockName = this.popStack(); + params.splice(1, 0, blockName); + + this.push(this.source.functionCall(blockHelperMissing, 'call', params)); + }, + + // [ambiguousBlockValue] + // + // On stack, before: hash, inverse, program, value + // Compiler value, before: lastHelper=value of last found helper, if any + // On stack, after, if no lastHelper: same as [blockValue] + // On stack, after, if lastHelper: value + ambiguousBlockValue: function ambiguousBlockValue() { + // We're being a bit cheeky and reusing the options value from the prior exec + var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), + params = [this.contextName(0)]; + this.setupHelperArgs('', 0, params, true); + + this.flushInline(); + + var current = this.topStack(); + params.splice(1, 0, current); + + this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']); + }, + + // [appendContent] + // + // On stack, before: ... + // On stack, after: ... + // + // Appends the string value of `content` to the current buffer + appendContent: function appendContent(content) { + if (this.pendingContent) { + content = this.pendingContent + content; + } else { + this.pendingLocation = this.source.currentLocation; + } + + this.pendingContent = content; + }, + + // [append] + // + // On stack, before: value, ... + // On stack, after: ... + // + // Coerces `value` to a String and appends it to the current buffer. + // + // If `value` is truthy, or 0, it is coerced into a string and appended + // Otherwise, the empty string is appended + append: function append() { + if (this.isInline()) { + this.replaceStack(function (current) { + return [' != null ? ', current, ' : ""']; + }); + + this.pushSource(this.appendToBuffer(this.popStack())); + } else { + var local = this.popStack(); + this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']); + if (this.environment.isSimple) { + this.pushSource(['else { ', this.appendToBuffer("''", undefined, true), ' }']); + } + } + }, + + // [appendEscaped] + // + // On stack, before: value, ... + // On stack, after: ... + // + // Escape `value` and append it to the buffer + appendEscaped: function appendEscaped() { + this.pushSource(this.appendToBuffer([this.aliasable('container.escapeExpression'), '(', this.popStack(), ')'])); + }, + + // [getContext] + // + // On stack, before: ... + // On stack, after: ... + // Compiler value, after: lastContext=depth + // + // Set the value of the `lastContext` compiler value to the depth + getContext: function getContext(depth) { + this.lastContext = depth; + }, + + // [pushContext] + // + // On stack, before: ... + // On stack, after: currentContext, ... + // + // Pushes the value of the current context onto the stack. + pushContext: function pushContext() { + this.pushStackLiteral(this.contextName(this.lastContext)); + }, + + // [lookupOnContext] + // + // On stack, before: ... + // On stack, after: currentContext[name], ... + // + // Looks up the value of `name` on the current context and pushes + // it onto the stack. + lookupOnContext: function lookupOnContext(parts, falsy, strict, scoped) { + var i = 0; + + if (!scoped && this.options.compat && !this.lastContext) { + // The depthed query is expected to handle the undefined logic for the root level that + // is implemented below, so we evaluate that directly in compat mode + this.push(this.depthedLookup(parts[i++])); + } else { + this.pushContext(); + } + + this.resolvePath('context', parts, i, falsy, strict); + }, + + // [lookupBlockParam] + // + // On stack, before: ... + // On stack, after: blockParam[name], ... + // + // Looks up the value of `parts` on the given block param and pushes + // it onto the stack. + lookupBlockParam: function lookupBlockParam(blockParamId, parts) { + this.useBlockParams = true; + + this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']); + this.resolvePath('context', parts, 1); + }, + + // [lookupData] + // + // On stack, before: ... + // On stack, after: data, ... + // + // Push the data lookup operator + lookupData: function lookupData(depth, parts, strict) { + if (!depth) { + this.pushStackLiteral('data'); + } else { + this.pushStackLiteral('container.data(data, ' + depth + ')'); + } + + this.resolvePath('data', parts, 0, true, strict); + }, + + resolvePath: function resolvePath(type, parts, i, falsy, strict) { + // istanbul ignore next + + var _this = this; + + if (this.options.strict || this.options.assumeObjects) { + this.push(strictLookup(this.options.strict && strict, this, parts, type)); + return; + } + + var len = parts.length; + for (; i < len; i++) { + /* eslint-disable no-loop-func */ + this.replaceStack(function (current) { + var lookup = _this.nameLookup(current, parts[i], type); + // We want to ensure that zero and false are handled properly if the context (falsy flag) + // needs to have the special handling for these values. + if (!falsy) { + return [' != null ? ', lookup, ' : ', current]; + } else { + // Otherwise we can use generic falsy handling + return [' && ', lookup]; + } + }); + /* eslint-enable no-loop-func */ + } + }, + + // [resolvePossibleLambda] + // + // On stack, before: value, ... + // On stack, after: resolved value, ... + // + // If the `value` is a lambda, replace it on the stack by + // the return value of the lambda + resolvePossibleLambda: function resolvePossibleLambda() { + this.push([this.aliasable('container.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']); + }, + + // [pushStringParam] + // + // On stack, before: ... + // On stack, after: string, currentContext, ... + // + // This opcode is designed for use in string mode, which + // provides the string value of a parameter along with its + // depth rather than resolving it immediately. + pushStringParam: function pushStringParam(string, type) { + this.pushContext(); + this.pushString(type); + + // If it's a subexpression, the string result + // will be pushed after this opcode. + if (type !== 'SubExpression') { + if (typeof string === 'string') { + this.pushString(string); + } else { + this.pushStackLiteral(string); + } + } + }, + + emptyHash: function emptyHash(omitEmpty) { + if (this.trackIds) { + this.push('{}'); // hashIds + } + if (this.stringParams) { + this.push('{}'); // hashContexts + this.push('{}'); // hashTypes + } + this.pushStackLiteral(omitEmpty ? 'undefined' : '{}'); + }, + pushHash: function pushHash() { + if (this.hash) { + this.hashes.push(this.hash); + } + this.hash = { values: [], types: [], contexts: [], ids: [] }; + }, + popHash: function popHash() { + var hash = this.hash; + this.hash = this.hashes.pop(); + + if (this.trackIds) { + this.push(this.objectLiteral(hash.ids)); + } + if (this.stringParams) { + this.push(this.objectLiteral(hash.contexts)); + this.push(this.objectLiteral(hash.types)); + } + + this.push(this.objectLiteral(hash.values)); + }, + + // [pushString] + // + // On stack, before: ... + // On stack, after: quotedString(string), ... + // + // Push a quoted version of `string` onto the stack + pushString: function pushString(string) { + this.pushStackLiteral(this.quotedString(string)); + }, + + // [pushLiteral] + // + // On stack, before: ... + // On stack, after: value, ... + // + // Pushes a value onto the stack. This operation prevents + // the compiler from creating a temporary variable to hold + // it. + pushLiteral: function pushLiteral(value) { + this.pushStackLiteral(value); + }, + + // [pushProgram] + // + // On stack, before: ... + // On stack, after: program(guid), ... + // + // Push a program expression onto the stack. This takes + // a compile-time guid and converts it into a runtime-accessible + // expression. + pushProgram: function pushProgram(guid) { + if (guid != null) { + this.pushStackLiteral(this.programExpression(guid)); + } else { + this.pushStackLiteral(null); + } + }, + + // [registerDecorator] + // + // On stack, before: hash, program, params..., ... + // On stack, after: ... + // + // Pops off the decorator's parameters, invokes the decorator, + // and inserts the decorator into the decorators list. + registerDecorator: function registerDecorator(paramSize, name) { + var foundDecorator = this.nameLookup('decorators', name, 'decorator'), + options = this.setupHelperArgs(name, paramSize); + + this.decorators.push(['fn = ', this.decorators.functionCall(foundDecorator, '', ['fn', 'props', 'container', options]), ' || fn;']); + }, + + // [invokeHelper] + // + // On stack, before: hash, inverse, program, params..., ... + // On stack, after: result of helper invocation + // + // Pops off the helper's parameters, invokes the helper, + // and pushes the helper's return value onto the stack. + // + // If the helper is not found, `helperMissing` is called. + invokeHelper: function invokeHelper(paramSize, name, isSimple) { + var nonHelper = this.popStack(), + helper = this.setupHelper(paramSize, name), + simple = isSimple ? [helper.name, ' || '] : ''; + + var lookup = ['('].concat(simple, nonHelper); + if (!this.options.strict) { + lookup.push(' || ', this.aliasable('helpers.helperMissing')); + } + lookup.push(')'); + + this.push(this.source.functionCall(lookup, 'call', helper.callParams)); + }, + + // [invokeKnownHelper] + // + // On stack, before: hash, inverse, program, params..., ... + // On stack, after: result of helper invocation + // + // This operation is used when the helper is known to exist, + // so a `helperMissing` fallback is not required. + invokeKnownHelper: function invokeKnownHelper(paramSize, name) { + var helper = this.setupHelper(paramSize, name); + this.push(this.source.functionCall(helper.name, 'call', helper.callParams)); + }, + + // [invokeAmbiguous] + // + // On stack, before: hash, inverse, program, params..., ... + // On stack, after: result of disambiguation + // + // This operation is used when an expression like `{{foo}}` + // is provided, but we don't know at compile-time whether it + // is a helper or a path. + // + // This operation emits more code than the other options, + // and can be avoided by passing the `knownHelpers` and + // `knownHelpersOnly` flags at compile-time. + invokeAmbiguous: function invokeAmbiguous(name, helperCall) { + this.useRegister('helper'); + + var nonHelper = this.popStack(); + + this.emptyHash(); + var helper = this.setupHelper(0, name, helperCall); + + var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper'); + + var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')']; + if (!this.options.strict) { + lookup[0] = '(helper = '; + lookup.push(' != null ? helper : ', this.aliasable('helpers.helperMissing')); + } + + this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('"function"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']); + }, + + // [invokePartial] + // + // On stack, before: context, ... + // On stack after: result of partial invocation + // + // This operation pops off a context, invokes a partial with that context, + // and pushes the result of the invocation back. + invokePartial: function invokePartial(isDynamic, name, indent) { + var params = [], + options = this.setupParams(name, 1, params); + + if (isDynamic) { + name = this.popStack(); + delete options.name; + } + + if (indent) { + options.indent = JSON.stringify(indent); + } + options.helpers = 'helpers'; + options.partials = 'partials'; + options.decorators = 'container.decorators'; + + if (!isDynamic) { + params.unshift(this.nameLookup('partials', name, 'partial')); + } else { + params.unshift(name); + } + + if (this.options.compat) { + options.depths = 'depths'; + } + options = this.objectLiteral(options); + params.push(options); + + this.push(this.source.functionCall('container.invokePartial', '', params)); + }, + + // [assignToHash] + // + // On stack, before: value, ..., hash, ... + // On stack, after: ..., hash, ... + // + // Pops a value off the stack and assigns it to the current hash + assignToHash: function assignToHash(key) { + var value = this.popStack(), + context = undefined, + type = undefined, + id = undefined; + + if (this.trackIds) { + id = this.popStack(); + } + if (this.stringParams) { + type = this.popStack(); + context = this.popStack(); + } + + var hash = this.hash; + if (context) { + hash.contexts[key] = context; + } + if (type) { + hash.types[key] = type; + } + if (id) { + hash.ids[key] = id; + } + hash.values[key] = value; + }, + + pushId: function pushId(type, name, child) { + if (type === 'BlockParam') { + this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : '')); + } else if (type === 'PathExpression') { + this.pushString(name); + } else if (type === 'SubExpression') { + this.pushStackLiteral('true'); + } else { + this.pushStackLiteral('null'); + } + }, + + // HELPERS + + compiler: JavaScriptCompiler, + + compileChildren: function compileChildren(environment, options) { + var children = environment.children, + child = undefined, + compiler = undefined; + + for (var i = 0, l = children.length; i < l; i++) { + child = children[i]; + compiler = new this.compiler(); // eslint-disable-line new-cap + + var index = this.matchExistingProgram(child); + + if (index == null) { + this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children + index = this.context.programs.length; + child.index = index; + child.name = 'program' + index; + this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile); + this.context.decorators[index] = compiler.decorators; + this.context.environments[index] = child; + + this.useDepths = this.useDepths || compiler.useDepths; + this.useBlockParams = this.useBlockParams || compiler.useBlockParams; + } else { + child.index = index; + child.name = 'program' + index; + + this.useDepths = this.useDepths || child.useDepths; + this.useBlockParams = this.useBlockParams || child.useBlockParams; + } + } + }, + matchExistingProgram: function matchExistingProgram(child) { + for (var i = 0, len = this.context.environments.length; i < len; i++) { + var environment = this.context.environments[i]; + if (environment && environment.equals(child)) { + return i; + } + } + }, + + programExpression: function programExpression(guid) { + var child = this.environment.children[guid], + programParams = [child.index, 'data', child.blockParams]; + + if (this.useBlockParams || this.useDepths) { + programParams.push('blockParams'); + } + if (this.useDepths) { + programParams.push('depths'); + } + + return 'container.program(' + programParams.join(', ') + ')'; + }, + + useRegister: function useRegister(name) { + if (!this.registers[name]) { + this.registers[name] = true; + this.registers.list.push(name); + } + }, + + push: function push(expr) { + if (!(expr instanceof Literal)) { + expr = this.source.wrap(expr); + } + + this.inlineStack.push(expr); + return expr; + }, + + pushStackLiteral: function pushStackLiteral(item) { + this.push(new Literal(item)); + }, + + pushSource: function pushSource(source) { + if (this.pendingContent) { + this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation)); + this.pendingContent = undefined; + } + + if (source) { + this.source.push(source); + } + }, + + replaceStack: function replaceStack(callback) { + var prefix = ['('], + stack = undefined, + createdStack = undefined, + usedLiteral = undefined; + + /* istanbul ignore next */ + if (!this.isInline()) { + throw new _exception2['default']('replaceStack on non-inline'); + } + + // We want to merge the inline statement into the replacement statement via ',' + var top = this.popStack(true); + + if (top instanceof Literal) { + // Literals do not need to be inlined + stack = [top.value]; + prefix = ['(', stack]; + usedLiteral = true; + } else { + // Get or create the current stack name for use by the inline + createdStack = true; + var _name = this.incrStack(); + + prefix = ['((', this.push(_name), ' = ', top, ')']; + stack = this.topStack(); + } + + var item = callback.call(this, stack); + + if (!usedLiteral) { + this.popStack(); + } + if (createdStack) { + this.stackSlot--; + } + this.push(prefix.concat(item, ')')); + }, + + incrStack: function incrStack() { + this.stackSlot++; + if (this.stackSlot > this.stackVars.length) { + this.stackVars.push('stack' + this.stackSlot); + } + return this.topStackName(); + }, + topStackName: function topStackName() { + return 'stack' + this.stackSlot; + }, + flushInline: function flushInline() { + var inlineStack = this.inlineStack; + this.inlineStack = []; + for (var i = 0, len = inlineStack.length; i < len; i++) { + var entry = inlineStack[i]; + /* istanbul ignore if */ + if (entry instanceof Literal) { + this.compileStack.push(entry); + } else { + var stack = this.incrStack(); + this.pushSource([stack, ' = ', entry, ';']); + this.compileStack.push(stack); + } + } + }, + isInline: function isInline() { + return this.inlineStack.length; + }, + + popStack: function popStack(wrapped) { + var inline = this.isInline(), + item = (inline ? this.inlineStack : this.compileStack).pop(); + + if (!wrapped && item instanceof Literal) { + return item.value; + } else { + if (!inline) { + /* istanbul ignore next */ + if (!this.stackSlot) { + throw new _exception2['default']('Invalid stack pop'); + } + this.stackSlot--; + } + return item; + } + }, + + topStack: function topStack() { + var stack = this.isInline() ? this.inlineStack : this.compileStack, + item = stack[stack.length - 1]; + + /* istanbul ignore if */ + if (item instanceof Literal) { + return item.value; + } else { + return item; + } + }, + + contextName: function contextName(context) { + if (this.useDepths && context) { + return 'depths[' + context + ']'; + } else { + return 'depth' + context; + } + }, + + quotedString: function quotedString(str) { + return this.source.quotedString(str); + }, + + objectLiteral: function objectLiteral(obj) { + return this.source.objectLiteral(obj); + }, + + aliasable: function aliasable(name) { + var ret = this.aliases[name]; + if (ret) { + ret.referenceCount++; + return ret; + } + + ret = this.aliases[name] = this.source.wrap(name); + ret.aliasable = true; + ret.referenceCount = 1; + + return ret; + }, + + setupHelper: function setupHelper(paramSize, name, blockHelper) { + var params = [], + paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper); + var foundHelper = this.nameLookup('helpers', name, 'helper'), + callContext = this.aliasable(this.contextName(0) + ' != null ? ' + this.contextName(0) + ' : {}'); + + return { + params: params, + paramsInit: paramsInit, + name: foundHelper, + callParams: [callContext].concat(params) + }; + }, + + setupParams: function setupParams(helper, paramSize, params) { + var options = {}, + contexts = [], + types = [], + ids = [], + objectArgs = !params, + param = undefined; + + if (objectArgs) { + params = []; + } + + options.name = this.quotedString(helper); + options.hash = this.popStack(); + + if (this.trackIds) { + options.hashIds = this.popStack(); + } + if (this.stringParams) { + options.hashTypes = this.popStack(); + options.hashContexts = this.popStack(); + } + + var inverse = this.popStack(), + program = this.popStack(); + + // Avoid setting fn and inverse if neither are set. This allows + // helpers to do a check for `if (options.fn)` + if (program || inverse) { + options.fn = program || 'container.noop'; + options.inverse = inverse || 'container.noop'; + } + + // The parameters go on to the stack in order (making sure that they are evaluated in order) + // so we need to pop them off the stack in reverse order + var i = paramSize; + while (i--) { + param = this.popStack(); + params[i] = param; + + if (this.trackIds) { + ids[i] = this.popStack(); + } + if (this.stringParams) { + types[i] = this.popStack(); + contexts[i] = this.popStack(); + } + } + + if (objectArgs) { + options.args = this.source.generateArray(params); + } + + if (this.trackIds) { + options.ids = this.source.generateArray(ids); + } + if (this.stringParams) { + options.types = this.source.generateArray(types); + options.contexts = this.source.generateArray(contexts); + } + + if (this.options.data) { + options.data = 'data'; + } + if (this.useBlockParams) { + options.blockParams = 'blockParams'; + } + return options; + }, + + setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) { + var options = this.setupParams(helper, paramSize, params); + options = this.objectLiteral(options); + if (useRegister) { + this.useRegister('options'); + params.push('options'); + return ['options=', options]; + } else if (params) { + params.push(options); + return ''; + } else { + return options; + } + } + }; + + (function () { + var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' '); + + var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {}; + + for (var i = 0, l = reservedWords.length; i < l; i++) { + compilerWords[reservedWords[i]] = true; + } + })(); + + JavaScriptCompiler.isValidJavaScriptVariableName = function (name) { + return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name); + }; + + function strictLookup(requireTerminal, compiler, parts, type) { + var stack = compiler.popStack(), + i = 0, + len = parts.length; + if (requireTerminal) { + len--; + } + + for (; i < len; i++) { + stack = compiler.nameLookup(stack, parts[i], type); + } + + if (requireTerminal) { + return [compiler.aliasable('container.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ')']; + } else { + return stack; + } + } + + exports['default'] = JavaScriptCompiler; + module.exports = exports['default']; + +/***/ }, +/* 29 */ +/***/ function(module, exports, __webpack_require__) { + + /* global define */ + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + var SourceNode = undefined; + + try { + /* istanbul ignore next */ + if (false) { + // We don't support this in AMD environments. For these environments, we asusme that + // they are running on the browser and thus have no need for the source-map library. + var SourceMap = require('source-map'); + SourceNode = SourceMap.SourceNode; + } + } catch (err) {} + /* NOP */ + + /* istanbul ignore if: tested but not covered in istanbul due to dist build */ + if (!SourceNode) { + SourceNode = function (line, column, srcFile, chunks) { + this.src = ''; + if (chunks) { + this.add(chunks); + } + }; + /* istanbul ignore next */ + SourceNode.prototype = { + add: function add(chunks) { + if (_utils.isArray(chunks)) { + chunks = chunks.join(''); + } + this.src += chunks; + }, + prepend: function prepend(chunks) { + if (_utils.isArray(chunks)) { + chunks = chunks.join(''); + } + this.src = chunks + this.src; + }, + toStringWithSourceMap: function toStringWithSourceMap() { + return { code: this.toString() }; + }, + toString: function toString() { + return this.src; + } + }; + } + + function castChunk(chunk, codeGen, loc) { + if (_utils.isArray(chunk)) { + var ret = []; + + for (var i = 0, len = chunk.length; i < len; i++) { + ret.push(codeGen.wrap(chunk[i], loc)); + } + return ret; + } else if (typeof chunk === 'boolean' || typeof chunk === 'number') { + // Handle primitives that the SourceNode will throw up on + return chunk + ''; + } + return chunk; + } + + function CodeGen(srcFile) { + this.srcFile = srcFile; + this.source = []; + } + + CodeGen.prototype = { + isEmpty: function isEmpty() { + return !this.source.length; + }, + prepend: function prepend(source, loc) { + this.source.unshift(this.wrap(source, loc)); + }, + push: function push(source, loc) { + this.source.push(this.wrap(source, loc)); + }, + + merge: function merge() { + var source = this.empty(); + this.each(function (line) { + source.add([' ', line, '\n']); + }); + return source; + }, + + each: function each(iter) { + for (var i = 0, len = this.source.length; i < len; i++) { + iter(this.source[i]); + } + }, + + empty: function empty() { + var loc = this.currentLocation || { start: {} }; + return new SourceNode(loc.start.line, loc.start.column, this.srcFile); + }, + wrap: function wrap(chunk) { + var loc = arguments.length <= 1 || arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1]; + + if (chunk instanceof SourceNode) { + return chunk; + } + + chunk = castChunk(chunk, this, loc); + + return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk); + }, + + functionCall: function functionCall(fn, type, params) { + params = this.generateList(params); + return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']); + }, + + quotedString: function quotedString(str) { + return '"' + (str + '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4 + .replace(/\u2029/g, '\\u2029') + '"'; + }, + + objectLiteral: function objectLiteral(obj) { + var pairs = []; + + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + var value = castChunk(obj[key], this); + if (value !== 'undefined') { + pairs.push([this.quotedString(key), ':', value]); + } + } + } + + var ret = this.generateList(pairs); + ret.prepend('{'); + ret.add('}'); + return ret; + }, + + generateList: function generateList(entries) { + var ret = this.empty(); + + for (var i = 0, len = entries.length; i < len; i++) { + if (i) { + ret.add(','); + } + + ret.add(castChunk(entries[i], this)); + } + + return ret; + }, + + generateArray: function generateArray(entries) { + var ret = this.generateList(entries); + ret.prepend('['); + ret.add(']'); + + return ret; + } + }; + + exports['default'] = CodeGen; + module.exports = exports['default']; + +/***/ } +/******/ ]) +}); +; \ No newline at end of file diff --git a/public/assets/prototype/js/handlebars.js b/public/assets/prototype/js/handlebars.js new file mode 100644 index 0000000..11b5133 --- /dev/null +++ b/public/assets/prototype/js/handlebars.js @@ -0,0 +1,4839 @@ +/**! + + @license + handlebars v4.0.13 + +Copyright (C) 2011-2017 by Yehuda Katz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["Handlebars"] = factory(); + else + root["Handlebars"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _handlebarsRuntime = __webpack_require__(2); + + var _handlebarsRuntime2 = _interopRequireDefault(_handlebarsRuntime); + + // Compiler imports + + var _handlebarsCompilerAst = __webpack_require__(35); + + var _handlebarsCompilerAst2 = _interopRequireDefault(_handlebarsCompilerAst); + + var _handlebarsCompilerBase = __webpack_require__(36); + + var _handlebarsCompilerCompiler = __webpack_require__(41); + + var _handlebarsCompilerJavascriptCompiler = __webpack_require__(42); + + var _handlebarsCompilerJavascriptCompiler2 = _interopRequireDefault(_handlebarsCompilerJavascriptCompiler); + + var _handlebarsCompilerVisitor = __webpack_require__(39); + + var _handlebarsCompilerVisitor2 = _interopRequireDefault(_handlebarsCompilerVisitor); + + var _handlebarsNoConflict = __webpack_require__(34); + + var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict); + + var _create = _handlebarsRuntime2['default'].create; + function create() { + var hb = _create(); + + hb.compile = function (input, options) { + return _handlebarsCompilerCompiler.compile(input, options, hb); + }; + hb.precompile = function (input, options) { + return _handlebarsCompilerCompiler.precompile(input, options, hb); + }; + + hb.AST = _handlebarsCompilerAst2['default']; + hb.Compiler = _handlebarsCompilerCompiler.Compiler; + hb.JavaScriptCompiler = _handlebarsCompilerJavascriptCompiler2['default']; + hb.Parser = _handlebarsCompilerBase.parser; + hb.parse = _handlebarsCompilerBase.parse; + + return hb; + } + + var inst = create(); + inst.create = create; + + _handlebarsNoConflict2['default'](inst); + + inst.Visitor = _handlebarsCompilerVisitor2['default']; + + inst['default'] = inst; + + exports['default'] = inst; + module.exports = exports['default']; + +/***/ }), +/* 1 */ +/***/ (function(module, exports) { + + "use strict"; + + exports["default"] = function (obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; + }; + + exports.__esModule = true; + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireWildcard = __webpack_require__(3)['default']; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _handlebarsBase = __webpack_require__(4); + + var base = _interopRequireWildcard(_handlebarsBase); + + // Each of these augment the Handlebars object. No need to setup here. + // (This is done to easily share code between commonjs and browse envs) + + var _handlebarsSafeString = __webpack_require__(21); + + var _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString); + + var _handlebarsException = __webpack_require__(6); + + var _handlebarsException2 = _interopRequireDefault(_handlebarsException); + + var _handlebarsUtils = __webpack_require__(5); + + var Utils = _interopRequireWildcard(_handlebarsUtils); + + var _handlebarsRuntime = __webpack_require__(22); + + var runtime = _interopRequireWildcard(_handlebarsRuntime); + + var _handlebarsNoConflict = __webpack_require__(34); + + var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict); + + // For compatibility and usage outside of module systems, make the Handlebars object a namespace + function create() { + var hb = new base.HandlebarsEnvironment(); + + Utils.extend(hb, base); + hb.SafeString = _handlebarsSafeString2['default']; + hb.Exception = _handlebarsException2['default']; + hb.Utils = Utils; + hb.escapeExpression = Utils.escapeExpression; + + hb.VM = runtime; + hb.template = function (spec) { + return runtime.template(spec, hb); + }; + + return hb; + } + + var inst = create(); + inst.create = create; + + _handlebarsNoConflict2['default'](inst); + + inst['default'] = inst; + + exports['default'] = inst; + module.exports = exports['default']; + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + + "use strict"; + + exports["default"] = function (obj) { + if (obj && obj.__esModule) { + return obj; + } else { + var newObj = {}; + + if (obj != null) { + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; + } + } + + newObj["default"] = obj; + return newObj; + } + }; + + exports.__esModule = true; + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.HandlebarsEnvironment = HandlebarsEnvironment; + + var _utils = __webpack_require__(5); + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + var _helpers = __webpack_require__(10); + + var _decorators = __webpack_require__(18); + + var _logger = __webpack_require__(20); + + var _logger2 = _interopRequireDefault(_logger); + + var VERSION = '4.0.13'; + exports.VERSION = VERSION; + var COMPILER_REVISION = 7; + + exports.COMPILER_REVISION = COMPILER_REVISION; + var REVISION_CHANGES = { + 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it + 2: '== 1.0.0-rc.3', + 3: '== 1.0.0-rc.4', + 4: '== 1.x.x', + 5: '== 2.0.0-alpha.x', + 6: '>= 2.0.0-beta.1', + 7: '>= 4.0.0' + }; + + exports.REVISION_CHANGES = REVISION_CHANGES; + var objectType = '[object Object]'; + + function HandlebarsEnvironment(helpers, partials, decorators) { + this.helpers = helpers || {}; + this.partials = partials || {}; + this.decorators = decorators || {}; + + _helpers.registerDefaultHelpers(this); + _decorators.registerDefaultDecorators(this); + } + + HandlebarsEnvironment.prototype = { + constructor: HandlebarsEnvironment, + + logger: _logger2['default'], + log: _logger2['default'].log, + + registerHelper: function registerHelper(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple helpers'); + } + _utils.extend(this.helpers, name); + } else { + this.helpers[name] = fn; + } + }, + unregisterHelper: function unregisterHelper(name) { + delete this.helpers[name]; + }, + + registerPartial: function registerPartial(name, partial) { + if (_utils.toString.call(name) === objectType) { + _utils.extend(this.partials, name); + } else { + if (typeof partial === 'undefined') { + throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined'); + } + this.partials[name] = partial; + } + }, + unregisterPartial: function unregisterPartial(name) { + delete this.partials[name]; + }, + + registerDecorator: function registerDecorator(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple decorators'); + } + _utils.extend(this.decorators, name); + } else { + this.decorators[name] = fn; + } + }, + unregisterDecorator: function unregisterDecorator(name) { + delete this.decorators[name]; + } + }; + + var log = _logger2['default'].log; + + exports.log = log; + exports.createFrame = _utils.createFrame; + exports.logger = _logger2['default']; + +/***/ }), +/* 5 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + exports.extend = extend; + exports.indexOf = indexOf; + exports.escapeExpression = escapeExpression; + exports.isEmpty = isEmpty; + exports.createFrame = createFrame; + exports.blockParams = blockParams; + exports.appendContextPath = appendContextPath; + var escape = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`', + '=': '=' + }; + + var badChars = /[&<>"'`=]/g, + possible = /[&<>"'`=]/; + + function escapeChar(chr) { + return escape[chr]; + } + + function extend(obj /* , ...source */) { + for (var i = 1; i < arguments.length; i++) { + for (var key in arguments[i]) { + if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { + obj[key] = arguments[i][key]; + } + } + } + + return obj; + } + + var toString = Object.prototype.toString; + + exports.toString = toString; + // Sourced from lodash + // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt + /* eslint-disable func-style */ + var isFunction = function isFunction(value) { + return typeof value === 'function'; + }; + // fallback for older versions of Chrome and Safari + /* istanbul ignore next */ + if (isFunction(/x/)) { + exports.isFunction = isFunction = function (value) { + return typeof value === 'function' && toString.call(value) === '[object Function]'; + }; + } + exports.isFunction = isFunction; + + /* eslint-enable func-style */ + + /* istanbul ignore next */ + var isArray = Array.isArray || function (value) { + return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; + }; + + exports.isArray = isArray; + // Older IE versions do not directly support indexOf so we must implement our own, sadly. + + function indexOf(array, value) { + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + return -1; + } + + function escapeExpression(string) { + if (typeof string !== 'string') { + // don't escape SafeStrings, since they're already safe + if (string && string.toHTML) { + return string.toHTML(); + } else if (string == null) { + return ''; + } else if (!string) { + return string + ''; + } + + // Force a string conversion as this will be done by the append regardless and + // the regex test will do this transparently behind the scenes, causing issues if + // an object's to string has escaped characters in it. + string = '' + string; + } + + if (!possible.test(string)) { + return string; + } + return string.replace(badChars, escapeChar); + } + + function isEmpty(value) { + if (!value && value !== 0) { + return true; + } else if (isArray(value) && value.length === 0) { + return true; + } else { + return false; + } + } + + function createFrame(object) { + var frame = extend({}, object); + frame._parent = object; + return frame; + } + + function blockParams(params, ids) { + params.path = ids; + return params; + } + + function appendContextPath(contextPath, id) { + return (contextPath ? contextPath + '.' : '') + id; + } + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _Object$defineProperty = __webpack_require__(7)['default']; + + exports.__esModule = true; + + var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; + + function Exception(message, node) { + var loc = node && node.loc, + line = undefined, + column = undefined; + if (loc) { + line = loc.start.line; + column = loc.start.column; + + message += ' - ' + line + ':' + column; + } + + var tmp = Error.prototype.constructor.call(this, message); + + // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. + for (var idx = 0; idx < errorProps.length; idx++) { + this[errorProps[idx]] = tmp[errorProps[idx]]; + } + + /* istanbul ignore else */ + if (Error.captureStackTrace) { + Error.captureStackTrace(this, Exception); + } + + try { + if (loc) { + this.lineNumber = line; + + // Work around issue under safari where we can't directly set the column value + /* istanbul ignore next */ + if (_Object$defineProperty) { + Object.defineProperty(this, 'column', { + value: column, + enumerable: true + }); + } else { + this.column = column; + } + } + } catch (nop) { + /* Ignore if the browser is very particular */ + } + } + + Exception.prototype = new Error(); + + exports['default'] = Exception; + module.exports = exports['default']; + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = { "default": __webpack_require__(8), __esModule: true }; + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + + var $ = __webpack_require__(9); + module.exports = function defineProperty(it, key, desc){ + return $.setDesc(it, key, desc); + }; + +/***/ }), +/* 9 */ +/***/ (function(module, exports) { + + var $Object = Object; + module.exports = { + create: $Object.create, + getProto: $Object.getPrototypeOf, + isEnum: {}.propertyIsEnumerable, + getDesc: $Object.getOwnPropertyDescriptor, + setDesc: $Object.defineProperty, + setDescs: $Object.defineProperties, + getKeys: $Object.keys, + getNames: $Object.getOwnPropertyNames, + getSymbols: $Object.getOwnPropertySymbols, + each: [].forEach + }; + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.registerDefaultHelpers = registerDefaultHelpers; + + var _helpersBlockHelperMissing = __webpack_require__(11); + + var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing); + + var _helpersEach = __webpack_require__(12); + + var _helpersEach2 = _interopRequireDefault(_helpersEach); + + var _helpersHelperMissing = __webpack_require__(13); + + var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing); + + var _helpersIf = __webpack_require__(14); + + var _helpersIf2 = _interopRequireDefault(_helpersIf); + + var _helpersLog = __webpack_require__(15); + + var _helpersLog2 = _interopRequireDefault(_helpersLog); + + var _helpersLookup = __webpack_require__(16); + + var _helpersLookup2 = _interopRequireDefault(_helpersLookup); + + var _helpersWith = __webpack_require__(17); + + var _helpersWith2 = _interopRequireDefault(_helpersWith); + + function registerDefaultHelpers(instance) { + _helpersBlockHelperMissing2['default'](instance); + _helpersEach2['default'](instance); + _helpersHelperMissing2['default'](instance); + _helpersIf2['default'](instance); + _helpersLog2['default'](instance); + _helpersLookup2['default'](instance); + _helpersWith2['default'](instance); + } + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + exports['default'] = function (instance) { + instance.registerHelper('blockHelperMissing', function (context, options) { + var inverse = options.inverse, + fn = options.fn; + + if (context === true) { + return fn(this); + } else if (context === false || context == null) { + return inverse(this); + } else if (_utils.isArray(context)) { + if (context.length > 0) { + if (options.ids) { + options.ids = [options.name]; + } + + return instance.helpers.each(context, options); + } else { + return inverse(this); + } + } else { + if (options.data && options.ids) { + var data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); + options = { data: data }; + } + + return fn(context, options); + } + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('each', function (context, options) { + if (!options) { + throw new _exception2['default']('Must pass iterator to #each'); + } + + var fn = options.fn, + inverse = options.inverse, + i = 0, + ret = '', + data = undefined, + contextPath = undefined; + + if (options.data && options.ids) { + contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; + } + + if (_utils.isFunction(context)) { + context = context.call(this); + } + + if (options.data) { + data = _utils.createFrame(options.data); + } + + function execIteration(field, index, last) { + if (data) { + data.key = field; + data.index = index; + data.first = index === 0; + data.last = !!last; + + if (contextPath) { + data.contextPath = contextPath + field; + } + } + + ret = ret + fn(context[field], { + data: data, + blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) + }); + } + + if (context && typeof context === 'object') { + if (_utils.isArray(context)) { + for (var j = context.length; i < j; i++) { + if (i in context) { + execIteration(i, i, i === context.length - 1); + } + } + } else { + var priorKey = undefined; + + for (var key in context) { + if (context.hasOwnProperty(key)) { + // We're running the iterations one step out of sync so we can detect + // the last iteration without have to scan the object twice and create + // an itermediate keys array. + if (priorKey !== undefined) { + execIteration(priorKey, i - 1); + } + priorKey = key; + i++; + } + } + if (priorKey !== undefined) { + execIteration(priorKey, i - 1, true); + } + } + } + + if (i === 0) { + ret = inverse(this); + } + + return ret; + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('helperMissing', function () /* [args, ]options */{ + if (arguments.length === 1) { + // A missing field in a {{foo}} construct. + return undefined; + } else { + // Someone is actually trying to call something, blow up. + throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); + } + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + exports['default'] = function (instance) { + instance.registerHelper('if', function (conditional, options) { + if (_utils.isFunction(conditional)) { + conditional = conditional.call(this); + } + + // Default behavior is to render the positive path if the value is truthy and not empty. + // The `includeZero` option may be set to treat the condtional as purely not empty based on the + // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. + if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { + return options.inverse(this); + } else { + return options.fn(this); + } + }); + + instance.registerHelper('unless', function (conditional, options) { + return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 15 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (instance) { + instance.registerHelper('log', function () /* message, options */{ + var args = [undefined], + options = arguments[arguments.length - 1]; + for (var i = 0; i < arguments.length - 1; i++) { + args.push(arguments[i]); + } + + var level = 1; + if (options.hash.level != null) { + level = options.hash.level; + } else if (options.data && options.data.level != null) { + level = options.data.level; + } + args[0] = level; + + instance.log.apply(instance, args); + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 16 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (instance) { + instance.registerHelper('lookup', function (obj, field) { + return obj && obj[field]; + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + exports['default'] = function (instance) { + instance.registerHelper('with', function (context, options) { + if (_utils.isFunction(context)) { + context = context.call(this); + } + + var fn = options.fn; + + if (!_utils.isEmpty(context)) { + var data = options.data; + if (options.data && options.ids) { + data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); + } + + return fn(context, { + data: data, + blockParams: _utils.blockParams([context], [data && data.contextPath]) + }); + } else { + return options.inverse(this); + } + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.registerDefaultDecorators = registerDefaultDecorators; + + var _decoratorsInline = __webpack_require__(19); + + var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline); + + function registerDefaultDecorators(instance) { + _decoratorsInline2['default'](instance); + } + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + exports['default'] = function (instance) { + instance.registerDecorator('inline', function (fn, props, container, options) { + var ret = fn; + if (!props.partials) { + props.partials = {}; + ret = function (context, options) { + // Create a new partials stack frame prior to exec. + var original = container.partials; + container.partials = _utils.extend({}, original, props.partials); + var ret = fn(context, options); + container.partials = original; + return ret; + }; + } + + props.partials[options.args[0]] = options.fn; + + return ret; + }); + }; + + module.exports = exports['default']; + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + var logger = { + methodMap: ['debug', 'info', 'warn', 'error'], + level: 'info', + + // Maps a given level value to the `methodMap` indexes above. + lookupLevel: function lookupLevel(level) { + if (typeof level === 'string') { + var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase()); + if (levelMap >= 0) { + level = levelMap; + } else { + level = parseInt(level, 10); + } + } + + return level; + }, + + // Can be overridden in the host environment + log: function log(level) { + level = logger.lookupLevel(level); + + if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) { + var method = logger.methodMap[level]; + if (!console[method]) { + // eslint-disable-line no-console + method = 'log'; + } + + for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + message[_key - 1] = arguments[_key]; + } + + console[method].apply(console, message); // eslint-disable-line no-console + } + } + }; + + exports['default'] = logger; + module.exports = exports['default']; + +/***/ }), +/* 21 */ +/***/ (function(module, exports) { + + // Build out our basic SafeString type + 'use strict'; + + exports.__esModule = true; + function SafeString(string) { + this.string = string; + } + + SafeString.prototype.toString = SafeString.prototype.toHTML = function () { + return '' + this.string; + }; + + exports['default'] = SafeString; + module.exports = exports['default']; + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _Object$seal = __webpack_require__(23)['default']; + + var _interopRequireWildcard = __webpack_require__(3)['default']; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.checkRevision = checkRevision; + exports.template = template; + exports.wrapProgram = wrapProgram; + exports.resolvePartial = resolvePartial; + exports.invokePartial = invokePartial; + exports.noop = noop; + + var _utils = __webpack_require__(5); + + var Utils = _interopRequireWildcard(_utils); + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + var _base = __webpack_require__(4); + + function checkRevision(compilerInfo) { + var compilerRevision = compilerInfo && compilerInfo[0] || 1, + currentRevision = _base.COMPILER_REVISION; + + if (compilerRevision !== currentRevision) { + if (compilerRevision < currentRevision) { + var runtimeVersions = _base.REVISION_CHANGES[currentRevision], + compilerVersions = _base.REVISION_CHANGES[compilerRevision]; + throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); + } else { + // Use the embedded version info since the runtime doesn't know about this revision yet + throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); + } + } + } + + function template(templateSpec, env) { + /* istanbul ignore next */ + if (!env) { + throw new _exception2['default']('No environment passed to template'); + } + if (!templateSpec || !templateSpec.main) { + throw new _exception2['default']('Unknown template object: ' + typeof templateSpec); + } + + templateSpec.main.decorator = templateSpec.main_d; + + // Note: Using env.VM references rather than local var references throughout this section to allow + // for external users to override these as psuedo-supported APIs. + env.VM.checkRevision(templateSpec.compiler); + + function invokePartialWrapper(partial, context, options) { + if (options.hash) { + context = Utils.extend({}, context, options.hash); + if (options.ids) { + options.ids[0] = true; + } + } + + partial = env.VM.resolvePartial.call(this, partial, context, options); + var result = env.VM.invokePartial.call(this, partial, context, options); + + if (result == null && env.compile) { + options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); + result = options.partials[options.name](context, options); + } + if (result != null) { + if (options.indent) { + var lines = result.split('\n'); + for (var i = 0, l = lines.length; i < l; i++) { + if (!lines[i] && i + 1 === l) { + break; + } + + lines[i] = options.indent + lines[i]; + } + result = lines.join('\n'); + } + return result; + } else { + throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); + } + } + + // Just add water + var container = { + strict: function strict(obj, name) { + if (!(name in obj)) { + throw new _exception2['default']('"' + name + '" not defined in ' + obj); + } + return obj[name]; + }, + lookup: function lookup(depths, name) { + var len = depths.length; + for (var i = 0; i < len; i++) { + if (depths[i] && depths[i][name] != null) { + return depths[i][name]; + } + } + }, + lambda: function lambda(current, context) { + return typeof current === 'function' ? current.call(context) : current; + }, + + escapeExpression: Utils.escapeExpression, + invokePartial: invokePartialWrapper, + + fn: function fn(i) { + var ret = templateSpec[i]; + ret.decorator = templateSpec[i + '_d']; + return ret; + }, + + programs: [], + program: function program(i, data, declaredBlockParams, blockParams, depths) { + var programWrapper = this.programs[i], + fn = this.fn(i); + if (data || depths || blockParams || declaredBlockParams) { + programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); + } else if (!programWrapper) { + programWrapper = this.programs[i] = wrapProgram(this, i, fn); + } + return programWrapper; + }, + + data: function data(value, depth) { + while (value && depth--) { + value = value._parent; + } + return value; + }, + merge: function merge(param, common) { + var obj = param || common; + + if (param && common && param !== common) { + obj = Utils.extend({}, common, param); + } + + return obj; + }, + // An empty object to use as replacement for null-contexts + nullContext: _Object$seal({}), + + noop: env.VM.noop, + compilerInfo: templateSpec.compiler + }; + + function ret(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var data = options.data; + + ret._setup(options); + if (!options.partial && templateSpec.useData) { + data = initData(context, data); + } + var depths = undefined, + blockParams = templateSpec.useBlockParams ? [] : undefined; + if (templateSpec.useDepths) { + if (options.depths) { + depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths; + } else { + depths = [context]; + } + } + + function main(context /*, options*/) { + return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths); + } + main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams); + return main(context, options); + } + ret.isTop = true; + + ret._setup = function (options) { + if (!options.partial) { + container.helpers = container.merge(options.helpers, env.helpers); + + if (templateSpec.usePartial) { + container.partials = container.merge(options.partials, env.partials); + } + if (templateSpec.usePartial || templateSpec.useDecorators) { + container.decorators = container.merge(options.decorators, env.decorators); + } + } else { + container.helpers = options.helpers; + container.partials = options.partials; + container.decorators = options.decorators; + } + }; + + ret._child = function (i, data, blockParams, depths) { + if (templateSpec.useBlockParams && !blockParams) { + throw new _exception2['default']('must pass block params'); + } + if (templateSpec.useDepths && !depths) { + throw new _exception2['default']('must pass parent depths'); + } + + return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); + }; + return ret; + } + + function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { + function prog(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var currentDepths = depths; + if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) { + currentDepths = [context].concat(depths); + } + + return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths); + } + + prog = executeDecorators(fn, prog, container, depths, data, blockParams); + + prog.program = i; + prog.depth = depths ? depths.length : 0; + prog.blockParams = declaredBlockParams || 0; + return prog; + } + + function resolvePartial(partial, context, options) { + if (!partial) { + if (options.name === '@partial-block') { + partial = options.data['partial-block']; + } else { + partial = options.partials[options.name]; + } + } else if (!partial.call && !options.name) { + // This is a dynamic partial that returned a string + options.name = partial; + partial = options.partials[partial]; + } + return partial; + } + + function invokePartial(partial, context, options) { + // Use the current closure context to save the partial-block if this partial + var currentPartialBlock = options.data && options.data['partial-block']; + options.partial = true; + if (options.ids) { + options.data.contextPath = options.ids[0] || options.data.contextPath; + } + + var partialBlock = undefined; + if (options.fn && options.fn !== noop) { + (function () { + options.data = _base.createFrame(options.data); + // Wrapper function to get access to currentPartialBlock from the closure + var fn = options.fn; + partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + // Restore the partial-block from the closure for the execution of the block + // i.e. the part inside the block of the partial call. + options.data = _base.createFrame(options.data); + options.data['partial-block'] = currentPartialBlock; + return fn(context, options); + }; + if (fn.partials) { + options.partials = Utils.extend({}, options.partials, fn.partials); + } + })(); + } + + if (partial === undefined && partialBlock) { + partial = partialBlock; + } + + if (partial === undefined) { + throw new _exception2['default']('The partial ' + options.name + ' could not be found'); + } else if (partial instanceof Function) { + return partial(context, options); + } + } + + function noop() { + return ''; + } + + function initData(context, data) { + if (!data || !('root' in data)) { + data = data ? _base.createFrame(data) : {}; + data.root = context; + } + return data; + } + + function executeDecorators(fn, prog, container, depths, data, blockParams) { + if (fn.decorator) { + var props = {}; + prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths); + Utils.extend(prog, props); + } + return prog; + } + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = { "default": __webpack_require__(24), __esModule: true }; + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { + + __webpack_require__(25); + module.exports = __webpack_require__(30).Object.seal; + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { + + // 19.1.2.17 Object.seal(O) + var isObject = __webpack_require__(26); + + __webpack_require__(27)('seal', function($seal){ + return function seal(it){ + return $seal && isObject(it) ? $seal(it) : it; + }; + }); + +/***/ }), +/* 26 */ +/***/ (function(module, exports) { + + module.exports = function(it){ + return typeof it === 'object' ? it !== null : typeof it === 'function'; + }; + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + + // most Object methods by ES6 should accept primitives + var $export = __webpack_require__(28) + , core = __webpack_require__(30) + , fails = __webpack_require__(33); + module.exports = function(KEY, exec){ + var fn = (core.Object || {})[KEY] || Object[KEY] + , exp = {}; + exp[KEY] = exec(fn); + $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp); + }; + +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { + + var global = __webpack_require__(29) + , core = __webpack_require__(30) + , ctx = __webpack_require__(31) + , PROTOTYPE = 'prototype'; + + var $export = function(type, name, source){ + var IS_FORCED = type & $export.F + , IS_GLOBAL = type & $export.G + , IS_STATIC = type & $export.S + , IS_PROTO = type & $export.P + , IS_BIND = type & $export.B + , IS_WRAP = type & $export.W + , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) + , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE] + , key, own, out; + if(IS_GLOBAL)source = name; + for(key in source){ + // contains in native + own = !IS_FORCED && target && key in target; + if(own && key in exports)continue; + // export native or passed + out = own ? target[key] : source[key]; + // prevent global pollution for namespaces + exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] + // bind timers to global for call from export context + : IS_BIND && own ? ctx(out, global) + // wrap global constructors for prevent change them in library + : IS_WRAP && target[key] == out ? (function(C){ + var F = function(param){ + return this instanceof C ? new C(param) : C(param); + }; + F[PROTOTYPE] = C[PROTOTYPE]; + return F; + // make static versions for prototype methods + })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; + if(IS_PROTO)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out; + } + }; + // type bitmap + $export.F = 1; // forced + $export.G = 2; // global + $export.S = 4; // static + $export.P = 8; // proto + $export.B = 16; // bind + $export.W = 32; // wrap + module.exports = $export; + +/***/ }), +/* 29 */ +/***/ (function(module, exports) { + + // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 + var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); + if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef + +/***/ }), +/* 30 */ +/***/ (function(module, exports) { + + var core = module.exports = {version: '1.2.6'}; + if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef + +/***/ }), +/* 31 */ +/***/ (function(module, exports, __webpack_require__) { + + // optional / simple context binding + var aFunction = __webpack_require__(32); + module.exports = function(fn, that, length){ + aFunction(fn); + if(that === undefined)return fn; + switch(length){ + case 1: return function(a){ + return fn.call(that, a); + }; + case 2: return function(a, b){ + return fn.call(that, a, b); + }; + case 3: return function(a, b, c){ + return fn.call(that, a, b, c); + }; + } + return function(/* ...args */){ + return fn.apply(that, arguments); + }; + }; + +/***/ }), +/* 32 */ +/***/ (function(module, exports) { + + module.exports = function(it){ + if(typeof it != 'function')throw TypeError(it + ' is not a function!'); + return it; + }; + +/***/ }), +/* 33 */ +/***/ (function(module, exports) { + + module.exports = function(exec){ + try { + return !!exec(); + } catch(e){ + return true; + } + }; + +/***/ }), +/* 34 */ +/***/ (function(module, exports) { + + /* WEBPACK VAR INJECTION */(function(global) {/* global window */ + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (Handlebars) { + /* istanbul ignore next */ + var root = typeof global !== 'undefined' ? global : window, + $Handlebars = root.Handlebars; + /* istanbul ignore next */ + Handlebars.noConflict = function () { + if (root.Handlebars === Handlebars) { + root.Handlebars = $Handlebars; + } + return Handlebars; + }; + }; + + module.exports = exports['default']; + /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) + +/***/ }), +/* 35 */ +/***/ (function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + var AST = { + // Public API used to evaluate derived attributes regarding AST nodes + helpers: { + // a mustache is definitely a helper if: + // * it is an eligible helper, and + // * it has at least one parameter or hash segment + helperExpression: function helperExpression(node) { + return node.type === 'SubExpression' || (node.type === 'MustacheStatement' || node.type === 'BlockStatement') && !!(node.params && node.params.length || node.hash); + }, + + scopedId: function scopedId(path) { + return (/^\.|this\b/.test(path.original) + ); + }, + + // an ID is simple if it only has one part, and that part is not + // `..` or `this`. + simpleId: function simpleId(path) { + return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth; + } + } + }; + + // Must be exported as an object rather than the root of the module as the jison lexer + // must modify the object to operate properly. + exports['default'] = AST; + module.exports = exports['default']; + +/***/ }), +/* 36 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + var _interopRequireWildcard = __webpack_require__(3)['default']; + + exports.__esModule = true; + exports.parse = parse; + + var _parser = __webpack_require__(37); + + var _parser2 = _interopRequireDefault(_parser); + + var _whitespaceControl = __webpack_require__(38); + + var _whitespaceControl2 = _interopRequireDefault(_whitespaceControl); + + var _helpers = __webpack_require__(40); + + var Helpers = _interopRequireWildcard(_helpers); + + var _utils = __webpack_require__(5); + + exports.parser = _parser2['default']; + + var yy = {}; + _utils.extend(yy, Helpers); + + function parse(input, options) { + // Just return if an already-compiled AST was passed in. + if (input.type === 'Program') { + return input; + } + + _parser2['default'].yy = yy; + + // Altering the shared object here, but this is ok as parser is a sync operation + yy.locInfo = function (locInfo) { + return new yy.SourceLocation(options && options.srcName, locInfo); + }; + + var strip = new _whitespaceControl2['default'](options); + return strip.accept(_parser2['default'].parse(input)); + } + +/***/ }), +/* 37 */ +/***/ (function(module, exports) { + + // File ignored in coverage tests via setting in .istanbul.yml + /* Jison generated parser */ + "use strict"; + + exports.__esModule = true; + var handlebars = (function () { + var parser = { trace: function trace() {}, + yy: {}, + symbols_: { "error": 2, "root": 3, "program": 4, "EOF": 5, "program_repetition0": 6, "statement": 7, "mustache": 8, "block": 9, "rawBlock": 10, "partial": 11, "partialBlock": 12, "content": 13, "COMMENT": 14, "CONTENT": 15, "openRawBlock": 16, "rawBlock_repetition_plus0": 17, "END_RAW_BLOCK": 18, "OPEN_RAW_BLOCK": 19, "helperName": 20, "openRawBlock_repetition0": 21, "openRawBlock_option0": 22, "CLOSE_RAW_BLOCK": 23, "openBlock": 24, "block_option0": 25, "closeBlock": 26, "openInverse": 27, "block_option1": 28, "OPEN_BLOCK": 29, "openBlock_repetition0": 30, "openBlock_option0": 31, "openBlock_option1": 32, "CLOSE": 33, "OPEN_INVERSE": 34, "openInverse_repetition0": 35, "openInverse_option0": 36, "openInverse_option1": 37, "openInverseChain": 38, "OPEN_INVERSE_CHAIN": 39, "openInverseChain_repetition0": 40, "openInverseChain_option0": 41, "openInverseChain_option1": 42, "inverseAndProgram": 43, "INVERSE": 44, "inverseChain": 45, "inverseChain_option0": 46, "OPEN_ENDBLOCK": 47, "OPEN": 48, "mustache_repetition0": 49, "mustache_option0": 50, "OPEN_UNESCAPED": 51, "mustache_repetition1": 52, "mustache_option1": 53, "CLOSE_UNESCAPED": 54, "OPEN_PARTIAL": 55, "partialName": 56, "partial_repetition0": 57, "partial_option0": 58, "openPartialBlock": 59, "OPEN_PARTIAL_BLOCK": 60, "openPartialBlock_repetition0": 61, "openPartialBlock_option0": 62, "param": 63, "sexpr": 64, "OPEN_SEXPR": 65, "sexpr_repetition0": 66, "sexpr_option0": 67, "CLOSE_SEXPR": 68, "hash": 69, "hash_repetition_plus0": 70, "hashSegment": 71, "ID": 72, "EQUALS": 73, "blockParams": 74, "OPEN_BLOCK_PARAMS": 75, "blockParams_repetition_plus0": 76, "CLOSE_BLOCK_PARAMS": 77, "path": 78, "dataName": 79, "STRING": 80, "NUMBER": 81, "BOOLEAN": 82, "UNDEFINED": 83, "NULL": 84, "DATA": 85, "pathSegments": 86, "SEP": 87, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 5: "EOF", 14: "COMMENT", 15: "CONTENT", 18: "END_RAW_BLOCK", 19: "OPEN_RAW_BLOCK", 23: "CLOSE_RAW_BLOCK", 29: "OPEN_BLOCK", 33: "CLOSE", 34: "OPEN_INVERSE", 39: "OPEN_INVERSE_CHAIN", 44: "INVERSE", 47: "OPEN_ENDBLOCK", 48: "OPEN", 51: "OPEN_UNESCAPED", 54: "CLOSE_UNESCAPED", 55: "OPEN_PARTIAL", 60: "OPEN_PARTIAL_BLOCK", 65: "OPEN_SEXPR", 68: "CLOSE_SEXPR", 72: "ID", 73: "EQUALS", 75: "OPEN_BLOCK_PARAMS", 77: "CLOSE_BLOCK_PARAMS", 80: "STRING", 81: "NUMBER", 82: "BOOLEAN", 83: "UNDEFINED", 84: "NULL", 85: "DATA", 87: "SEP" }, + productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [13, 1], [10, 3], [16, 5], [9, 4], [9, 4], [24, 6], [27, 6], [38, 6], [43, 2], [45, 3], [45, 1], [26, 3], [8, 5], [8, 5], [11, 5], [12, 3], [59, 5], [63, 1], [63, 1], [64, 5], [69, 1], [71, 3], [74, 3], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [56, 1], [56, 1], [79, 2], [78, 1], [86, 3], [86, 1], [6, 0], [6, 2], [17, 1], [17, 2], [21, 0], [21, 2], [22, 0], [22, 1], [25, 0], [25, 1], [28, 0], [28, 1], [30, 0], [30, 2], [31, 0], [31, 1], [32, 0], [32, 1], [35, 0], [35, 2], [36, 0], [36, 1], [37, 0], [37, 1], [40, 0], [40, 2], [41, 0], [41, 1], [42, 0], [42, 1], [46, 0], [46, 1], [49, 0], [49, 2], [50, 0], [50, 1], [52, 0], [52, 2], [53, 0], [53, 1], [57, 0], [57, 2], [58, 0], [58, 1], [61, 0], [61, 2], [62, 0], [62, 1], [66, 0], [66, 2], [67, 0], [67, 1], [70, 1], [70, 2], [76, 1], [76, 2]], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + + var $0 = $$.length - 1; + switch (yystate) { + case 1: + return $$[$0 - 1]; + break; + case 2: + this.$ = yy.prepareProgram($$[$0]); + break; + case 3: + this.$ = $$[$0]; + break; + case 4: + this.$ = $$[$0]; + break; + case 5: + this.$ = $$[$0]; + break; + case 6: + this.$ = $$[$0]; + break; + case 7: + this.$ = $$[$0]; + break; + case 8: + this.$ = $$[$0]; + break; + case 9: + this.$ = { + type: 'CommentStatement', + value: yy.stripComment($$[$0]), + strip: yy.stripFlags($$[$0], $$[$0]), + loc: yy.locInfo(this._$) + }; + + break; + case 10: + this.$ = { + type: 'ContentStatement', + original: $$[$0], + value: $$[$0], + loc: yy.locInfo(this._$) + }; + + break; + case 11: + this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$); + break; + case 12: + this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] }; + break; + case 13: + this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$); + break; + case 14: + this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$); + break; + case 15: + this.$ = { open: $$[$0 - 5], path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; + break; + case 16: + this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; + break; + case 17: + this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; + break; + case 18: + this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] }; + break; + case 19: + var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$), + program = yy.prepareProgram([inverse], $$[$0 - 1].loc); + program.chained = true; + + this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true }; + + break; + case 20: + this.$ = $$[$0]; + break; + case 21: + this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) }; + break; + case 22: + this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); + break; + case 23: + this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); + break; + case 24: + this.$ = { + type: 'PartialStatement', + name: $$[$0 - 3], + params: $$[$0 - 2], + hash: $$[$0 - 1], + indent: '', + strip: yy.stripFlags($$[$0 - 4], $$[$0]), + loc: yy.locInfo(this._$) + }; + + break; + case 25: + this.$ = yy.preparePartialBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$); + break; + case 26: + this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 4], $$[$0]) }; + break; + case 27: + this.$ = $$[$0]; + break; + case 28: + this.$ = $$[$0]; + break; + case 29: + this.$ = { + type: 'SubExpression', + path: $$[$0 - 3], + params: $$[$0 - 2], + hash: $$[$0 - 1], + loc: yy.locInfo(this._$) + }; + + break; + case 30: + this.$ = { type: 'Hash', pairs: $$[$0], loc: yy.locInfo(this._$) }; + break; + case 31: + this.$ = { type: 'HashPair', key: yy.id($$[$0 - 2]), value: $$[$0], loc: yy.locInfo(this._$) }; + break; + case 32: + this.$ = yy.id($$[$0 - 1]); + break; + case 33: + this.$ = $$[$0]; + break; + case 34: + this.$ = $$[$0]; + break; + case 35: + this.$ = { type: 'StringLiteral', value: $$[$0], original: $$[$0], loc: yy.locInfo(this._$) }; + break; + case 36: + this.$ = { type: 'NumberLiteral', value: Number($$[$0]), original: Number($$[$0]), loc: yy.locInfo(this._$) }; + break; + case 37: + this.$ = { type: 'BooleanLiteral', value: $$[$0] === 'true', original: $$[$0] === 'true', loc: yy.locInfo(this._$) }; + break; + case 38: + this.$ = { type: 'UndefinedLiteral', original: undefined, value: undefined, loc: yy.locInfo(this._$) }; + break; + case 39: + this.$ = { type: 'NullLiteral', original: null, value: null, loc: yy.locInfo(this._$) }; + break; + case 40: + this.$ = $$[$0]; + break; + case 41: + this.$ = $$[$0]; + break; + case 42: + this.$ = yy.preparePath(true, $$[$0], this._$); + break; + case 43: + this.$ = yy.preparePath(false, $$[$0], this._$); + break; + case 44: + $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2]; + break; + case 45: + this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }]; + break; + case 46: + this.$ = []; + break; + case 47: + $$[$0 - 1].push($$[$0]); + break; + case 48: + this.$ = [$$[$0]]; + break; + case 49: + $$[$0 - 1].push($$[$0]); + break; + case 50: + this.$ = []; + break; + case 51: + $$[$0 - 1].push($$[$0]); + break; + case 58: + this.$ = []; + break; + case 59: + $$[$0 - 1].push($$[$0]); + break; + case 64: + this.$ = []; + break; + case 65: + $$[$0 - 1].push($$[$0]); + break; + case 70: + this.$ = []; + break; + case 71: + $$[$0 - 1].push($$[$0]); + break; + case 78: + this.$ = []; + break; + case 79: + $$[$0 - 1].push($$[$0]); + break; + case 82: + this.$ = []; + break; + case 83: + $$[$0 - 1].push($$[$0]); + break; + case 86: + this.$ = []; + break; + case 87: + $$[$0 - 1].push($$[$0]); + break; + case 90: + this.$ = []; + break; + case 91: + $$[$0 - 1].push($$[$0]); + break; + case 94: + this.$ = []; + break; + case 95: + $$[$0 - 1].push($$[$0]); + break; + case 98: + this.$ = [$$[$0]]; + break; + case 99: + $$[$0 - 1].push($$[$0]); + break; + case 100: + this.$ = [$$[$0]]; + break; + case 101: + $$[$0 - 1].push($$[$0]); + break; + } + }, + table: [{ 3: 1, 4: 2, 5: [2, 46], 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: 11, 14: [1, 12], 15: [1, 20], 16: 17, 19: [1, 23], 24: 15, 27: 16, 29: [1, 21], 34: [1, 22], 39: [2, 2], 44: [2, 2], 47: [2, 2], 48: [1, 13], 51: [1, 14], 55: [1, 18], 59: 19, 60: [1, 24] }, { 1: [2, 1] }, { 5: [2, 47], 14: [2, 47], 15: [2, 47], 19: [2, 47], 29: [2, 47], 34: [2, 47], 39: [2, 47], 44: [2, 47], 47: [2, 47], 48: [2, 47], 51: [2, 47], 55: [2, 47], 60: [2, 47] }, { 5: [2, 3], 14: [2, 3], 15: [2, 3], 19: [2, 3], 29: [2, 3], 34: [2, 3], 39: [2, 3], 44: [2, 3], 47: [2, 3], 48: [2, 3], 51: [2, 3], 55: [2, 3], 60: [2, 3] }, { 5: [2, 4], 14: [2, 4], 15: [2, 4], 19: [2, 4], 29: [2, 4], 34: [2, 4], 39: [2, 4], 44: [2, 4], 47: [2, 4], 48: [2, 4], 51: [2, 4], 55: [2, 4], 60: [2, 4] }, { 5: [2, 5], 14: [2, 5], 15: [2, 5], 19: [2, 5], 29: [2, 5], 34: [2, 5], 39: [2, 5], 44: [2, 5], 47: [2, 5], 48: [2, 5], 51: [2, 5], 55: [2, 5], 60: [2, 5] }, { 5: [2, 6], 14: [2, 6], 15: [2, 6], 19: [2, 6], 29: [2, 6], 34: [2, 6], 39: [2, 6], 44: [2, 6], 47: [2, 6], 48: [2, 6], 51: [2, 6], 55: [2, 6], 60: [2, 6] }, { 5: [2, 7], 14: [2, 7], 15: [2, 7], 19: [2, 7], 29: [2, 7], 34: [2, 7], 39: [2, 7], 44: [2, 7], 47: [2, 7], 48: [2, 7], 51: [2, 7], 55: [2, 7], 60: [2, 7] }, { 5: [2, 8], 14: [2, 8], 15: [2, 8], 19: [2, 8], 29: [2, 8], 34: [2, 8], 39: [2, 8], 44: [2, 8], 47: [2, 8], 48: [2, 8], 51: [2, 8], 55: [2, 8], 60: [2, 8] }, { 5: [2, 9], 14: [2, 9], 15: [2, 9], 19: [2, 9], 29: [2, 9], 34: [2, 9], 39: [2, 9], 44: [2, 9], 47: [2, 9], 48: [2, 9], 51: [2, 9], 55: [2, 9], 60: [2, 9] }, { 20: 25, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 36, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 37, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 4: 38, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 13: 40, 15: [1, 20], 17: 39 }, { 20: 42, 56: 41, 64: 43, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 45, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 5: [2, 10], 14: [2, 10], 15: [2, 10], 18: [2, 10], 19: [2, 10], 29: [2, 10], 34: [2, 10], 39: [2, 10], 44: [2, 10], 47: [2, 10], 48: [2, 10], 51: [2, 10], 55: [2, 10], 60: [2, 10] }, { 20: 46, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 47, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 48, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 42, 56: 49, 64: 43, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [2, 78], 49: 50, 65: [2, 78], 72: [2, 78], 80: [2, 78], 81: [2, 78], 82: [2, 78], 83: [2, 78], 84: [2, 78], 85: [2, 78] }, { 23: [2, 33], 33: [2, 33], 54: [2, 33], 65: [2, 33], 68: [2, 33], 72: [2, 33], 75: [2, 33], 80: [2, 33], 81: [2, 33], 82: [2, 33], 83: [2, 33], 84: [2, 33], 85: [2, 33] }, { 23: [2, 34], 33: [2, 34], 54: [2, 34], 65: [2, 34], 68: [2, 34], 72: [2, 34], 75: [2, 34], 80: [2, 34], 81: [2, 34], 82: [2, 34], 83: [2, 34], 84: [2, 34], 85: [2, 34] }, { 23: [2, 35], 33: [2, 35], 54: [2, 35], 65: [2, 35], 68: [2, 35], 72: [2, 35], 75: [2, 35], 80: [2, 35], 81: [2, 35], 82: [2, 35], 83: [2, 35], 84: [2, 35], 85: [2, 35] }, { 23: [2, 36], 33: [2, 36], 54: [2, 36], 65: [2, 36], 68: [2, 36], 72: [2, 36], 75: [2, 36], 80: [2, 36], 81: [2, 36], 82: [2, 36], 83: [2, 36], 84: [2, 36], 85: [2, 36] }, { 23: [2, 37], 33: [2, 37], 54: [2, 37], 65: [2, 37], 68: [2, 37], 72: [2, 37], 75: [2, 37], 80: [2, 37], 81: [2, 37], 82: [2, 37], 83: [2, 37], 84: [2, 37], 85: [2, 37] }, { 23: [2, 38], 33: [2, 38], 54: [2, 38], 65: [2, 38], 68: [2, 38], 72: [2, 38], 75: [2, 38], 80: [2, 38], 81: [2, 38], 82: [2, 38], 83: [2, 38], 84: [2, 38], 85: [2, 38] }, { 23: [2, 39], 33: [2, 39], 54: [2, 39], 65: [2, 39], 68: [2, 39], 72: [2, 39], 75: [2, 39], 80: [2, 39], 81: [2, 39], 82: [2, 39], 83: [2, 39], 84: [2, 39], 85: [2, 39] }, { 23: [2, 43], 33: [2, 43], 54: [2, 43], 65: [2, 43], 68: [2, 43], 72: [2, 43], 75: [2, 43], 80: [2, 43], 81: [2, 43], 82: [2, 43], 83: [2, 43], 84: [2, 43], 85: [2, 43], 87: [1, 51] }, { 72: [1, 35], 86: 52 }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 52: 53, 54: [2, 82], 65: [2, 82], 72: [2, 82], 80: [2, 82], 81: [2, 82], 82: [2, 82], 83: [2, 82], 84: [2, 82], 85: [2, 82] }, { 25: 54, 38: 56, 39: [1, 58], 43: 57, 44: [1, 59], 45: 55, 47: [2, 54] }, { 28: 60, 43: 61, 44: [1, 59], 47: [2, 56] }, { 13: 63, 15: [1, 20], 18: [1, 62] }, { 15: [2, 48], 18: [2, 48] }, { 33: [2, 86], 57: 64, 65: [2, 86], 72: [2, 86], 80: [2, 86], 81: [2, 86], 82: [2, 86], 83: [2, 86], 84: [2, 86], 85: [2, 86] }, { 33: [2, 40], 65: [2, 40], 72: [2, 40], 80: [2, 40], 81: [2, 40], 82: [2, 40], 83: [2, 40], 84: [2, 40], 85: [2, 40] }, { 33: [2, 41], 65: [2, 41], 72: [2, 41], 80: [2, 41], 81: [2, 41], 82: [2, 41], 83: [2, 41], 84: [2, 41], 85: [2, 41] }, { 20: 65, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 66, 47: [1, 67] }, { 30: 68, 33: [2, 58], 65: [2, 58], 72: [2, 58], 75: [2, 58], 80: [2, 58], 81: [2, 58], 82: [2, 58], 83: [2, 58], 84: [2, 58], 85: [2, 58] }, { 33: [2, 64], 35: 69, 65: [2, 64], 72: [2, 64], 75: [2, 64], 80: [2, 64], 81: [2, 64], 82: [2, 64], 83: [2, 64], 84: [2, 64], 85: [2, 64] }, { 21: 70, 23: [2, 50], 65: [2, 50], 72: [2, 50], 80: [2, 50], 81: [2, 50], 82: [2, 50], 83: [2, 50], 84: [2, 50], 85: [2, 50] }, { 33: [2, 90], 61: 71, 65: [2, 90], 72: [2, 90], 80: [2, 90], 81: [2, 90], 82: [2, 90], 83: [2, 90], 84: [2, 90], 85: [2, 90] }, { 20: 75, 33: [2, 80], 50: 72, 63: 73, 64: 76, 65: [1, 44], 69: 74, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 72: [1, 80] }, { 23: [2, 42], 33: [2, 42], 54: [2, 42], 65: [2, 42], 68: [2, 42], 72: [2, 42], 75: [2, 42], 80: [2, 42], 81: [2, 42], 82: [2, 42], 83: [2, 42], 84: [2, 42], 85: [2, 42], 87: [1, 51] }, { 20: 75, 53: 81, 54: [2, 84], 63: 82, 64: 76, 65: [1, 44], 69: 83, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 84, 47: [1, 67] }, { 47: [2, 55] }, { 4: 85, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 47: [2, 20] }, { 20: 86, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 87, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 26: 88, 47: [1, 67] }, { 47: [2, 57] }, { 5: [2, 11], 14: [2, 11], 15: [2, 11], 19: [2, 11], 29: [2, 11], 34: [2, 11], 39: [2, 11], 44: [2, 11], 47: [2, 11], 48: [2, 11], 51: [2, 11], 55: [2, 11], 60: [2, 11] }, { 15: [2, 49], 18: [2, 49] }, { 20: 75, 33: [2, 88], 58: 89, 63: 90, 64: 76, 65: [1, 44], 69: 91, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 65: [2, 94], 66: 92, 68: [2, 94], 72: [2, 94], 80: [2, 94], 81: [2, 94], 82: [2, 94], 83: [2, 94], 84: [2, 94], 85: [2, 94] }, { 5: [2, 25], 14: [2, 25], 15: [2, 25], 19: [2, 25], 29: [2, 25], 34: [2, 25], 39: [2, 25], 44: [2, 25], 47: [2, 25], 48: [2, 25], 51: [2, 25], 55: [2, 25], 60: [2, 25] }, { 20: 93, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 31: 94, 33: [2, 60], 63: 95, 64: 76, 65: [1, 44], 69: 96, 70: 77, 71: 78, 72: [1, 79], 75: [2, 60], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 33: [2, 66], 36: 97, 63: 98, 64: 76, 65: [1, 44], 69: 99, 70: 77, 71: 78, 72: [1, 79], 75: [2, 66], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 22: 100, 23: [2, 52], 63: 101, 64: 76, 65: [1, 44], 69: 102, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 33: [2, 92], 62: 103, 63: 104, 64: 76, 65: [1, 44], 69: 105, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 106] }, { 33: [2, 79], 65: [2, 79], 72: [2, 79], 80: [2, 79], 81: [2, 79], 82: [2, 79], 83: [2, 79], 84: [2, 79], 85: [2, 79] }, { 33: [2, 81] }, { 23: [2, 27], 33: [2, 27], 54: [2, 27], 65: [2, 27], 68: [2, 27], 72: [2, 27], 75: [2, 27], 80: [2, 27], 81: [2, 27], 82: [2, 27], 83: [2, 27], 84: [2, 27], 85: [2, 27] }, { 23: [2, 28], 33: [2, 28], 54: [2, 28], 65: [2, 28], 68: [2, 28], 72: [2, 28], 75: [2, 28], 80: [2, 28], 81: [2, 28], 82: [2, 28], 83: [2, 28], 84: [2, 28], 85: [2, 28] }, { 23: [2, 30], 33: [2, 30], 54: [2, 30], 68: [2, 30], 71: 107, 72: [1, 108], 75: [2, 30] }, { 23: [2, 98], 33: [2, 98], 54: [2, 98], 68: [2, 98], 72: [2, 98], 75: [2, 98] }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 73: [1, 109], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 23: [2, 44], 33: [2, 44], 54: [2, 44], 65: [2, 44], 68: [2, 44], 72: [2, 44], 75: [2, 44], 80: [2, 44], 81: [2, 44], 82: [2, 44], 83: [2, 44], 84: [2, 44], 85: [2, 44], 87: [2, 44] }, { 54: [1, 110] }, { 54: [2, 83], 65: [2, 83], 72: [2, 83], 80: [2, 83], 81: [2, 83], 82: [2, 83], 83: [2, 83], 84: [2, 83], 85: [2, 83] }, { 54: [2, 85] }, { 5: [2, 13], 14: [2, 13], 15: [2, 13], 19: [2, 13], 29: [2, 13], 34: [2, 13], 39: [2, 13], 44: [2, 13], 47: [2, 13], 48: [2, 13], 51: [2, 13], 55: [2, 13], 60: [2, 13] }, { 38: 56, 39: [1, 58], 43: 57, 44: [1, 59], 45: 112, 46: 111, 47: [2, 76] }, { 33: [2, 70], 40: 113, 65: [2, 70], 72: [2, 70], 75: [2, 70], 80: [2, 70], 81: [2, 70], 82: [2, 70], 83: [2, 70], 84: [2, 70], 85: [2, 70] }, { 47: [2, 18] }, { 5: [2, 14], 14: [2, 14], 15: [2, 14], 19: [2, 14], 29: [2, 14], 34: [2, 14], 39: [2, 14], 44: [2, 14], 47: [2, 14], 48: [2, 14], 51: [2, 14], 55: [2, 14], 60: [2, 14] }, { 33: [1, 114] }, { 33: [2, 87], 65: [2, 87], 72: [2, 87], 80: [2, 87], 81: [2, 87], 82: [2, 87], 83: [2, 87], 84: [2, 87], 85: [2, 87] }, { 33: [2, 89] }, { 20: 75, 63: 116, 64: 76, 65: [1, 44], 67: 115, 68: [2, 96], 69: 117, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 118] }, { 32: 119, 33: [2, 62], 74: 120, 75: [1, 121] }, { 33: [2, 59], 65: [2, 59], 72: [2, 59], 75: [2, 59], 80: [2, 59], 81: [2, 59], 82: [2, 59], 83: [2, 59], 84: [2, 59], 85: [2, 59] }, { 33: [2, 61], 75: [2, 61] }, { 33: [2, 68], 37: 122, 74: 123, 75: [1, 121] }, { 33: [2, 65], 65: [2, 65], 72: [2, 65], 75: [2, 65], 80: [2, 65], 81: [2, 65], 82: [2, 65], 83: [2, 65], 84: [2, 65], 85: [2, 65] }, { 33: [2, 67], 75: [2, 67] }, { 23: [1, 124] }, { 23: [2, 51], 65: [2, 51], 72: [2, 51], 80: [2, 51], 81: [2, 51], 82: [2, 51], 83: [2, 51], 84: [2, 51], 85: [2, 51] }, { 23: [2, 53] }, { 33: [1, 125] }, { 33: [2, 91], 65: [2, 91], 72: [2, 91], 80: [2, 91], 81: [2, 91], 82: [2, 91], 83: [2, 91], 84: [2, 91], 85: [2, 91] }, { 33: [2, 93] }, { 5: [2, 22], 14: [2, 22], 15: [2, 22], 19: [2, 22], 29: [2, 22], 34: [2, 22], 39: [2, 22], 44: [2, 22], 47: [2, 22], 48: [2, 22], 51: [2, 22], 55: [2, 22], 60: [2, 22] }, { 23: [2, 99], 33: [2, 99], 54: [2, 99], 68: [2, 99], 72: [2, 99], 75: [2, 99] }, { 73: [1, 109] }, { 20: 75, 63: 126, 64: 76, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 23], 14: [2, 23], 15: [2, 23], 19: [2, 23], 29: [2, 23], 34: [2, 23], 39: [2, 23], 44: [2, 23], 47: [2, 23], 48: [2, 23], 51: [2, 23], 55: [2, 23], 60: [2, 23] }, { 47: [2, 19] }, { 47: [2, 77] }, { 20: 75, 33: [2, 72], 41: 127, 63: 128, 64: 76, 65: [1, 44], 69: 129, 70: 77, 71: 78, 72: [1, 79], 75: [2, 72], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 24], 14: [2, 24], 15: [2, 24], 19: [2, 24], 29: [2, 24], 34: [2, 24], 39: [2, 24], 44: [2, 24], 47: [2, 24], 48: [2, 24], 51: [2, 24], 55: [2, 24], 60: [2, 24] }, { 68: [1, 130] }, { 65: [2, 95], 68: [2, 95], 72: [2, 95], 80: [2, 95], 81: [2, 95], 82: [2, 95], 83: [2, 95], 84: [2, 95], 85: [2, 95] }, { 68: [2, 97] }, { 5: [2, 21], 14: [2, 21], 15: [2, 21], 19: [2, 21], 29: [2, 21], 34: [2, 21], 39: [2, 21], 44: [2, 21], 47: [2, 21], 48: [2, 21], 51: [2, 21], 55: [2, 21], 60: [2, 21] }, { 33: [1, 131] }, { 33: [2, 63] }, { 72: [1, 133], 76: 132 }, { 33: [1, 134] }, { 33: [2, 69] }, { 15: [2, 12] }, { 14: [2, 26], 15: [2, 26], 19: [2, 26], 29: [2, 26], 34: [2, 26], 47: [2, 26], 48: [2, 26], 51: [2, 26], 55: [2, 26], 60: [2, 26] }, { 23: [2, 31], 33: [2, 31], 54: [2, 31], 68: [2, 31], 72: [2, 31], 75: [2, 31] }, { 33: [2, 74], 42: 135, 74: 136, 75: [1, 121] }, { 33: [2, 71], 65: [2, 71], 72: [2, 71], 75: [2, 71], 80: [2, 71], 81: [2, 71], 82: [2, 71], 83: [2, 71], 84: [2, 71], 85: [2, 71] }, { 33: [2, 73], 75: [2, 73] }, { 23: [2, 29], 33: [2, 29], 54: [2, 29], 65: [2, 29], 68: [2, 29], 72: [2, 29], 75: [2, 29], 80: [2, 29], 81: [2, 29], 82: [2, 29], 83: [2, 29], 84: [2, 29], 85: [2, 29] }, { 14: [2, 15], 15: [2, 15], 19: [2, 15], 29: [2, 15], 34: [2, 15], 39: [2, 15], 44: [2, 15], 47: [2, 15], 48: [2, 15], 51: [2, 15], 55: [2, 15], 60: [2, 15] }, { 72: [1, 138], 77: [1, 137] }, { 72: [2, 100], 77: [2, 100] }, { 14: [2, 16], 15: [2, 16], 19: [2, 16], 29: [2, 16], 34: [2, 16], 44: [2, 16], 47: [2, 16], 48: [2, 16], 51: [2, 16], 55: [2, 16], 60: [2, 16] }, { 33: [1, 139] }, { 33: [2, 75] }, { 33: [2, 32] }, { 72: [2, 101], 77: [2, 101] }, { 14: [2, 17], 15: [2, 17], 19: [2, 17], 29: [2, 17], 34: [2, 17], 39: [2, 17], 44: [2, 17], 47: [2, 17], 48: [2, 17], 51: [2, 17], 55: [2, 17], 60: [2, 17] }], + defaultActions: { 4: [2, 1], 55: [2, 55], 57: [2, 20], 61: [2, 57], 74: [2, 81], 83: [2, 85], 87: [2, 18], 91: [2, 89], 102: [2, 53], 105: [2, 93], 111: [2, 19], 112: [2, 77], 117: [2, 97], 120: [2, 63], 123: [2, 69], 124: [2, 12], 136: [2, 75], 137: [2, 32] }, + parseError: function parseError(str, hash) { + throw new Error(str); + }, + parse: function parse(input) { + var self = this, + stack = [0], + vstack = [null], + lstack = [], + table = this.table, + yytext = "", + yylineno = 0, + yyleng = 0, + recovering = 0, + TERROR = 2, + EOF = 1; + this.lexer.setInput(input); + this.lexer.yy = this.yy; + this.yy.lexer = this.lexer; + this.yy.parser = this; + if (typeof this.lexer.yylloc == "undefined") this.lexer.yylloc = {}; + var yyloc = this.lexer.yylloc; + lstack.push(yyloc); + var ranges = this.lexer.options && this.lexer.options.ranges; + if (typeof this.yy.parseError === "function") this.parseError = this.yy.parseError; + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + function lex() { + var token; + token = self.lexer.lex() || 1; + if (typeof token !== "number") { + token = self.symbols_[token] || token; + } + return token; + } + var symbol, + preErrorSymbol, + state, + action, + a, + r, + yyval = {}, + p, + len, + newState, + expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + if (!recovering) { + expected = []; + for (p in table[state]) if (this.terminals_[p] && p > 2) { + expected.push("'" + this.terminals_[p] + "'"); + } + if (this.lexer.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1 ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected }); + } + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(this.lexer.yytext); + lstack.push(this.lexer.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = this.lexer.yyleng; + yytext = this.lexer.yytext; + yylineno = this.lexer.yylineno; + yyloc = this.lexer.yylloc; + if (recovering > 0) recovering--; + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column }; + if (ranges) { + yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; + } + r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + } + }; + /* Jison generated lexer */ + var lexer = (function () { + var lexer = { EOF: 1, + parseError: function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + setInput: function setInput(input) { + this._input = input; + this._more = this._less = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ''; + this.conditionStack = ['INITIAL']; + this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }; + if (this.options.ranges) this.yylloc.range = [0, 0]; + this.offset = 0; + return this; + }, + input: function input() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) this.yylloc.range[1]++; + + this._input = this._input.slice(1); + return ch; + }, + unput: function unput(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len - 1); + //this.yyleng -= len; + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + + if (lines.length - 1) this.yylineno -= lines.length - 1; + var r = this.yylloc.range; + + this.yylloc = { first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + return this; + }, + more: function more() { + this._more = true; + return this; + }, + less: function less(n) { + this.unput(this.match.slice(n)); + }, + pastInput: function pastInput() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\n/g, ""); + }, + upcomingInput: function upcomingInput() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); + }, + showPosition: function showPosition() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, + next: function next() { + if (this.done) { + return this.EOF; + } + if (!this._input) this.done = true; + + var token, match, tempMatch, index, col, lines; + if (!this._more) { + this.yytext = ''; + this.match = ''; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (!this.options.flex) break; + } + } + if (match) { + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) this.yylineno += lines.length; + this.yylloc = { first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) this.done = false; + if (token) return token;else return; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { text: "", token: null, line: this.yylineno }); + } + }, + lex: function lex() { + var r = this.next(); + if (typeof r !== 'undefined') { + return r; + } else { + return this.lex(); + } + }, + begin: function begin(condition) { + this.conditionStack.push(condition); + }, + popState: function popState() { + return this.conditionStack.pop(); + }, + _currentRules: function _currentRules() { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + }, + topState: function topState() { + return this.conditionStack[this.conditionStack.length - 2]; + }, + pushState: function begin(condition) { + this.begin(condition); + } }; + lexer.options = {}; + lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + + function strip(start, end) { + return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng - end); + } + + var YYSTATE = YY_START; + switch ($avoiding_name_collisions) { + case 0: + if (yy_.yytext.slice(-2) === "\\\\") { + strip(0, 1); + this.begin("mu"); + } else if (yy_.yytext.slice(-1) === "\\") { + strip(0, 1); + this.begin("emu"); + } else { + this.begin("mu"); + } + if (yy_.yytext) return 15; + + break; + case 1: + return 15; + break; + case 2: + this.popState(); + return 15; + + break; + case 3: + this.begin('raw');return 15; + break; + case 4: + this.popState(); + // Should be using `this.topState()` below, but it currently + // returns the second top instead of the first top. Opened an + // issue about it at https://github.com/zaach/jison/issues/291 + if (this.conditionStack[this.conditionStack.length - 1] === 'raw') { + return 15; + } else { + yy_.yytext = yy_.yytext.substr(5, yy_.yyleng - 9); + return 'END_RAW_BLOCK'; + } + + break; + case 5: + return 15; + break; + case 6: + this.popState(); + return 14; + + break; + case 7: + return 65; + break; + case 8: + return 68; + break; + case 9: + return 19; + break; + case 10: + this.popState(); + this.begin('raw'); + return 23; + + break; + case 11: + return 55; + break; + case 12: + return 60; + break; + case 13: + return 29; + break; + case 14: + return 47; + break; + case 15: + this.popState();return 44; + break; + case 16: + this.popState();return 44; + break; + case 17: + return 34; + break; + case 18: + return 39; + break; + case 19: + return 51; + break; + case 20: + return 48; + break; + case 21: + this.unput(yy_.yytext); + this.popState(); + this.begin('com'); + + break; + case 22: + this.popState(); + return 14; + + break; + case 23: + return 48; + break; + case 24: + return 73; + break; + case 25: + return 72; + break; + case 26: + return 72; + break; + case 27: + return 87; + break; + case 28: + // ignore whitespace + break; + case 29: + this.popState();return 54; + break; + case 30: + this.popState();return 33; + break; + case 31: + yy_.yytext = strip(1, 2).replace(/\\"/g, '"');return 80; + break; + case 32: + yy_.yytext = strip(1, 2).replace(/\\'/g, "'");return 80; + break; + case 33: + return 85; + break; + case 34: + return 82; + break; + case 35: + return 82; + break; + case 36: + return 83; + break; + case 37: + return 84; + break; + case 38: + return 81; + break; + case 39: + return 75; + break; + case 40: + return 77; + break; + case 41: + return 72; + break; + case 42: + yy_.yytext = yy_.yytext.replace(/\\([\\\]])/g, '$1');return 72; + break; + case 43: + return 'INVALID'; + break; + case 44: + return 5; + break; + } + }; + lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/, /^(?:[^\x00]+)/, /^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/, /^(?:\{\{\{\{(?=[^\/]))/, /^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/, /^(?:[^\x00]*?(?=(\{\{\{\{)))/, /^(?:[\s\S]*?--(~)?\}\})/, /^(?:\()/, /^(?:\))/, /^(?:\{\{\{\{)/, /^(?:\}\}\}\})/, /^(?:\{\{(~)?>)/, /^(?:\{\{(~)?#>)/, /^(?:\{\{(~)?#\*?)/, /^(?:\{\{(~)?\/)/, /^(?:\{\{(~)?\^\s*(~)?\}\})/, /^(?:\{\{(~)?\s*else\s*(~)?\}\})/, /^(?:\{\{(~)?\^)/, /^(?:\{\{(~)?\s*else\b)/, /^(?:\{\{(~)?\{)/, /^(?:\{\{(~)?&)/, /^(?:\{\{(~)?!--)/, /^(?:\{\{(~)?![\s\S]*?\}\})/, /^(?:\{\{(~)?\*?)/, /^(?:=)/, /^(?:\.\.)/, /^(?:\.(?=([=~}\s\/.)|])))/, /^(?:[\/.])/, /^(?:\s+)/, /^(?:\}(~)?\}\})/, /^(?:(~)?\}\})/, /^(?:"(\\["]|[^"])*")/, /^(?:'(\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\s)])))/, /^(?:false(?=([~}\s)])))/, /^(?:undefined(?=([~}\s)])))/, /^(?:null(?=([~}\s)])))/, /^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/, /^(?:as\s+\|)/, /^(?:\|)/, /^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/, /^(?:\[(\\\]|[^\]])*\])/, /^(?:.)/, /^(?:$)/]; + lexer.conditions = { "mu": { "rules": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44], "inclusive": false }, "emu": { "rules": [2], "inclusive": false }, "com": { "rules": [6], "inclusive": false }, "raw": { "rules": [3, 4, 5], "inclusive": false }, "INITIAL": { "rules": [0, 1, 44], "inclusive": true } }; + return lexer; + })(); + parser.lexer = lexer; + function Parser() { + this.yy = {}; + }Parser.prototype = parser;parser.Parser = Parser; + return new Parser(); + })();exports["default"] = handlebars; + module.exports = exports["default"]; + +/***/ }), +/* 38 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _visitor = __webpack_require__(39); + + var _visitor2 = _interopRequireDefault(_visitor); + + function WhitespaceControl() { + var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + this.options = options; + } + WhitespaceControl.prototype = new _visitor2['default'](); + + WhitespaceControl.prototype.Program = function (program) { + var doStandalone = !this.options.ignoreStandalone; + + var isRoot = !this.isRootSeen; + this.isRootSeen = true; + + var body = program.body; + for (var i = 0, l = body.length; i < l; i++) { + var current = body[i], + strip = this.accept(current); + + if (!strip) { + continue; + } + + var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot), + _isNextWhitespace = isNextWhitespace(body, i, isRoot), + openStandalone = strip.openStandalone && _isPrevWhitespace, + closeStandalone = strip.closeStandalone && _isNextWhitespace, + inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace; + + if (strip.close) { + omitRight(body, i, true); + } + if (strip.open) { + omitLeft(body, i, true); + } + + if (doStandalone && inlineStandalone) { + omitRight(body, i); + + if (omitLeft(body, i)) { + // If we are on a standalone node, save the indent info for partials + if (current.type === 'PartialStatement') { + // Pull out the whitespace from the final line + current.indent = /([ \t]+$)/.exec(body[i - 1].original)[1]; + } + } + } + if (doStandalone && openStandalone) { + omitRight((current.program || current.inverse).body); + + // Strip out the previous content node if it's whitespace only + omitLeft(body, i); + } + if (doStandalone && closeStandalone) { + // Always strip the next node + omitRight(body, i); + + omitLeft((current.inverse || current.program).body); + } + } + + return program; + }; + + WhitespaceControl.prototype.BlockStatement = WhitespaceControl.prototype.DecoratorBlock = WhitespaceControl.prototype.PartialBlockStatement = function (block) { + this.accept(block.program); + this.accept(block.inverse); + + // Find the inverse program that is involed with whitespace stripping. + var program = block.program || block.inverse, + inverse = block.program && block.inverse, + firstInverse = inverse, + lastInverse = inverse; + + if (inverse && inverse.chained) { + firstInverse = inverse.body[0].program; + + // Walk the inverse chain to find the last inverse that is actually in the chain. + while (lastInverse.chained) { + lastInverse = lastInverse.body[lastInverse.body.length - 1].program; + } + } + + var strip = { + open: block.openStrip.open, + close: block.closeStrip.close, + + // Determine the standalone candiacy. Basically flag our content as being possibly standalone + // so our parent can determine if we actually are standalone + openStandalone: isNextWhitespace(program.body), + closeStandalone: isPrevWhitespace((firstInverse || program).body) + }; + + if (block.openStrip.close) { + omitRight(program.body, null, true); + } + + if (inverse) { + var inverseStrip = block.inverseStrip; + + if (inverseStrip.open) { + omitLeft(program.body, null, true); + } + + if (inverseStrip.close) { + omitRight(firstInverse.body, null, true); + } + if (block.closeStrip.open) { + omitLeft(lastInverse.body, null, true); + } + + // Find standalone else statments + if (!this.options.ignoreStandalone && isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) { + omitLeft(program.body); + omitRight(firstInverse.body); + } + } else if (block.closeStrip.open) { + omitLeft(program.body, null, true); + } + + return strip; + }; + + WhitespaceControl.prototype.Decorator = WhitespaceControl.prototype.MustacheStatement = function (mustache) { + return mustache.strip; + }; + + WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) { + /* istanbul ignore next */ + var strip = node.strip || {}; + return { + inlineStandalone: true, + open: strip.open, + close: strip.close + }; + }; + + function isPrevWhitespace(body, i, isRoot) { + if (i === undefined) { + i = body.length; + } + + // Nodes that end with newlines are considered whitespace (but are special + // cased for strip operations) + var prev = body[i - 1], + sibling = body[i - 2]; + if (!prev) { + return isRoot; + } + + if (prev.type === 'ContentStatement') { + return (sibling || !isRoot ? /\r?\n\s*?$/ : /(^|\r?\n)\s*?$/).test(prev.original); + } + } + function isNextWhitespace(body, i, isRoot) { + if (i === undefined) { + i = -1; + } + + var next = body[i + 1], + sibling = body[i + 2]; + if (!next) { + return isRoot; + } + + if (next.type === 'ContentStatement') { + return (sibling || !isRoot ? /^\s*?\r?\n/ : /^\s*?(\r?\n|$)/).test(next.original); + } + } + + // Marks the node to the right of the position as omitted. + // I.e. {{foo}}' ' will mark the ' ' node as omitted. + // + // If i is undefined, then the first child will be marked as such. + // + // If mulitple is truthy then all whitespace will be stripped out until non-whitespace + // content is met. + function omitRight(body, i, multiple) { + var current = body[i == null ? 0 : i + 1]; + if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) { + return; + } + + var original = current.value; + current.value = current.value.replace(multiple ? /^\s+/ : /^[ \t]*\r?\n?/, ''); + current.rightStripped = current.value !== original; + } + + // Marks the node to the left of the position as omitted. + // I.e. ' '{{foo}} will mark the ' ' node as omitted. + // + // If i is undefined then the last child will be marked as such. + // + // If mulitple is truthy then all whitespace will be stripped out until non-whitespace + // content is met. + function omitLeft(body, i, multiple) { + var current = body[i == null ? body.length - 1 : i - 1]; + if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) { + return; + } + + // We omit the last node if it's whitespace only and not preceeded by a non-content node. + var original = current.value; + current.value = current.value.replace(multiple ? /\s+$/ : /[ \t]+$/, ''); + current.leftStripped = current.value !== original; + return current.leftStripped; + } + + exports['default'] = WhitespaceControl; + module.exports = exports['default']; + +/***/ }), +/* 39 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + function Visitor() { + this.parents = []; + } + + Visitor.prototype = { + constructor: Visitor, + mutating: false, + + // Visits a given value. If mutating, will replace the value if necessary. + acceptKey: function acceptKey(node, name) { + var value = this.accept(node[name]); + if (this.mutating) { + // Hacky sanity check: This may have a few false positives for type for the helper + // methods but will generally do the right thing without a lot of overhead. + if (value && !Visitor.prototype[value.type]) { + throw new _exception2['default']('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type); + } + node[name] = value; + } + }, + + // Performs an accept operation with added sanity check to ensure + // required keys are not removed. + acceptRequired: function acceptRequired(node, name) { + this.acceptKey(node, name); + + if (!node[name]) { + throw new _exception2['default'](node.type + ' requires ' + name); + } + }, + + // Traverses a given array. If mutating, empty respnses will be removed + // for child elements. + acceptArray: function acceptArray(array) { + for (var i = 0, l = array.length; i < l; i++) { + this.acceptKey(array, i); + + if (!array[i]) { + array.splice(i, 1); + i--; + l--; + } + } + }, + + accept: function accept(object) { + if (!object) { + return; + } + + /* istanbul ignore next: Sanity code */ + if (!this[object.type]) { + throw new _exception2['default']('Unknown type: ' + object.type, object); + } + + if (this.current) { + this.parents.unshift(this.current); + } + this.current = object; + + var ret = this[object.type](object); + + this.current = this.parents.shift(); + + if (!this.mutating || ret) { + return ret; + } else if (ret !== false) { + return object; + } + }, + + Program: function Program(program) { + this.acceptArray(program.body); + }, + + MustacheStatement: visitSubExpression, + Decorator: visitSubExpression, + + BlockStatement: visitBlock, + DecoratorBlock: visitBlock, + + PartialStatement: visitPartial, + PartialBlockStatement: function PartialBlockStatement(partial) { + visitPartial.call(this, partial); + + this.acceptKey(partial, 'program'); + }, + + ContentStatement: function ContentStatement() /* content */{}, + CommentStatement: function CommentStatement() /* comment */{}, + + SubExpression: visitSubExpression, + + PathExpression: function PathExpression() /* path */{}, + + StringLiteral: function StringLiteral() /* string */{}, + NumberLiteral: function NumberLiteral() /* number */{}, + BooleanLiteral: function BooleanLiteral() /* bool */{}, + UndefinedLiteral: function UndefinedLiteral() /* literal */{}, + NullLiteral: function NullLiteral() /* literal */{}, + + Hash: function Hash(hash) { + this.acceptArray(hash.pairs); + }, + HashPair: function HashPair(pair) { + this.acceptRequired(pair, 'value'); + } + }; + + function visitSubExpression(mustache) { + this.acceptRequired(mustache, 'path'); + this.acceptArray(mustache.params); + this.acceptKey(mustache, 'hash'); + } + function visitBlock(block) { + visitSubExpression.call(this, block); + + this.acceptKey(block, 'program'); + this.acceptKey(block, 'inverse'); + } + function visitPartial(partial) { + this.acceptRequired(partial, 'name'); + this.acceptArray(partial.params); + this.acceptKey(partial, 'hash'); + } + + exports['default'] = Visitor; + module.exports = exports['default']; + +/***/ }), +/* 40 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.SourceLocation = SourceLocation; + exports.id = id; + exports.stripFlags = stripFlags; + exports.stripComment = stripComment; + exports.preparePath = preparePath; + exports.prepareMustache = prepareMustache; + exports.prepareRawBlock = prepareRawBlock; + exports.prepareBlock = prepareBlock; + exports.prepareProgram = prepareProgram; + exports.preparePartialBlock = preparePartialBlock; + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + function validateClose(open, close) { + close = close.path ? close.path.original : close; + + if (open.path.original !== close) { + var errorNode = { loc: open.path.loc }; + + throw new _exception2['default'](open.path.original + " doesn't match " + close, errorNode); + } + } + + function SourceLocation(source, locInfo) { + this.source = source; + this.start = { + line: locInfo.first_line, + column: locInfo.first_column + }; + this.end = { + line: locInfo.last_line, + column: locInfo.last_column + }; + } + + function id(token) { + if (/^\[.*\]$/.test(token)) { + return token.substr(1, token.length - 2); + } else { + return token; + } + } + + function stripFlags(open, close) { + return { + open: open.charAt(2) === '~', + close: close.charAt(close.length - 3) === '~' + }; + } + + function stripComment(comment) { + return comment.replace(/^\{\{~?!-?-?/, '').replace(/-?-?~?\}\}$/, ''); + } + + function preparePath(data, parts, loc) { + loc = this.locInfo(loc); + + var original = data ? '@' : '', + dig = [], + depth = 0; + + for (var i = 0, l = parts.length; i < l; i++) { + var part = parts[i].part, + + // If we have [] syntax then we do not treat path references as operators, + // i.e. foo.[this] resolves to approximately context.foo['this'] + isLiteral = parts[i].original !== part; + original += (parts[i].separator || '') + part; + + if (!isLiteral && (part === '..' || part === '.' || part === 'this')) { + if (dig.length > 0) { + throw new _exception2['default']('Invalid path: ' + original, { loc: loc }); + } else if (part === '..') { + depth++; + } + } else { + dig.push(part); + } + } + + return { + type: 'PathExpression', + data: data, + depth: depth, + parts: dig, + original: original, + loc: loc + }; + } + + function prepareMustache(path, params, hash, open, strip, locInfo) { + // Must use charAt to support IE pre-10 + var escapeFlag = open.charAt(3) || open.charAt(2), + escaped = escapeFlag !== '{' && escapeFlag !== '&'; + + var decorator = /\*/.test(open); + return { + type: decorator ? 'Decorator' : 'MustacheStatement', + path: path, + params: params, + hash: hash, + escaped: escaped, + strip: strip, + loc: this.locInfo(locInfo) + }; + } + + function prepareRawBlock(openRawBlock, contents, close, locInfo) { + validateClose(openRawBlock, close); + + locInfo = this.locInfo(locInfo); + var program = { + type: 'Program', + body: contents, + strip: {}, + loc: locInfo + }; + + return { + type: 'BlockStatement', + path: openRawBlock.path, + params: openRawBlock.params, + hash: openRawBlock.hash, + program: program, + openStrip: {}, + inverseStrip: {}, + closeStrip: {}, + loc: locInfo + }; + } + + function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) { + if (close && close.path) { + validateClose(openBlock, close); + } + + var decorator = /\*/.test(openBlock.open); + + program.blockParams = openBlock.blockParams; + + var inverse = undefined, + inverseStrip = undefined; + + if (inverseAndProgram) { + if (decorator) { + throw new _exception2['default']('Unexpected inverse block on decorator', inverseAndProgram); + } + + if (inverseAndProgram.chain) { + inverseAndProgram.program.body[0].closeStrip = close.strip; + } + + inverseStrip = inverseAndProgram.strip; + inverse = inverseAndProgram.program; + } + + if (inverted) { + inverted = inverse; + inverse = program; + program = inverted; + } + + return { + type: decorator ? 'DecoratorBlock' : 'BlockStatement', + path: openBlock.path, + params: openBlock.params, + hash: openBlock.hash, + program: program, + inverse: inverse, + openStrip: openBlock.strip, + inverseStrip: inverseStrip, + closeStrip: close && close.strip, + loc: this.locInfo(locInfo) + }; + } + + function prepareProgram(statements, loc) { + if (!loc && statements.length) { + var firstLoc = statements[0].loc, + lastLoc = statements[statements.length - 1].loc; + + /* istanbul ignore else */ + if (firstLoc && lastLoc) { + loc = { + source: firstLoc.source, + start: { + line: firstLoc.start.line, + column: firstLoc.start.column + }, + end: { + line: lastLoc.end.line, + column: lastLoc.end.column + } + }; + } + } + + return { + type: 'Program', + body: statements, + strip: {}, + loc: loc + }; + } + + function preparePartialBlock(open, program, close, locInfo) { + validateClose(open, close); + + return { + type: 'PartialBlockStatement', + name: open.path, + params: open.params, + hash: open.hash, + program: program, + openStrip: open.strip, + closeStrip: close && close.strip, + loc: this.locInfo(locInfo) + }; + } + +/***/ }), +/* 41 */ +/***/ (function(module, exports, __webpack_require__) { + + /* eslint-disable new-cap */ + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + exports.Compiler = Compiler; + exports.precompile = precompile; + exports.compile = compile; + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + var _utils = __webpack_require__(5); + + var _ast = __webpack_require__(35); + + var _ast2 = _interopRequireDefault(_ast); + + var slice = [].slice; + + function Compiler() {} + + // the foundHelper register will disambiguate helper lookup from finding a + // function in a context. This is necessary for mustache compatibility, which + // requires that context functions in blocks are evaluated by blockHelperMissing, + // and then proceed as if the resulting value was provided to blockHelperMissing. + + Compiler.prototype = { + compiler: Compiler, + + equals: function equals(other) { + var len = this.opcodes.length; + if (other.opcodes.length !== len) { + return false; + } + + for (var i = 0; i < len; i++) { + var opcode = this.opcodes[i], + otherOpcode = other.opcodes[i]; + if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) { + return false; + } + } + + // We know that length is the same between the two arrays because they are directly tied + // to the opcode behavior above. + len = this.children.length; + for (var i = 0; i < len; i++) { + if (!this.children[i].equals(other.children[i])) { + return false; + } + } + + return true; + }, + + guid: 0, + + compile: function compile(program, options) { + this.sourceNode = []; + this.opcodes = []; + this.children = []; + this.options = options; + this.stringParams = options.stringParams; + this.trackIds = options.trackIds; + + options.blockParams = options.blockParams || []; + + // These changes will propagate to the other compiler components + var knownHelpers = options.knownHelpers; + options.knownHelpers = { + 'helperMissing': true, + 'blockHelperMissing': true, + 'each': true, + 'if': true, + 'unless': true, + 'with': true, + 'log': true, + 'lookup': true + }; + if (knownHelpers) { + // the next line should use "Object.keys", but the code has been like this a long time and changing it, might + // cause backwards-compatibility issues... It's an old library... + // eslint-disable-next-line guard-for-in + for (var _name in knownHelpers) { + this.options.knownHelpers[_name] = knownHelpers[_name]; + } + } + + return this.accept(program); + }, + + compileProgram: function compileProgram(program) { + var childCompiler = new this.compiler(), + // eslint-disable-line new-cap + result = childCompiler.compile(program, this.options), + guid = this.guid++; + + this.usePartial = this.usePartial || result.usePartial; + + this.children[guid] = result; + this.useDepths = this.useDepths || result.useDepths; + + return guid; + }, + + accept: function accept(node) { + /* istanbul ignore next: Sanity code */ + if (!this[node.type]) { + throw new _exception2['default']('Unknown type: ' + node.type, node); + } + + this.sourceNode.unshift(node); + var ret = this[node.type](node); + this.sourceNode.shift(); + return ret; + }, + + Program: function Program(program) { + this.options.blockParams.unshift(program.blockParams); + + var body = program.body, + bodyLength = body.length; + for (var i = 0; i < bodyLength; i++) { + this.accept(body[i]); + } + + this.options.blockParams.shift(); + + this.isSimple = bodyLength === 1; + this.blockParams = program.blockParams ? program.blockParams.length : 0; + + return this; + }, + + BlockStatement: function BlockStatement(block) { + transformLiteralToPath(block); + + var program = block.program, + inverse = block.inverse; + + program = program && this.compileProgram(program); + inverse = inverse && this.compileProgram(inverse); + + var type = this.classifySexpr(block); + + if (type === 'helper') { + this.helperSexpr(block, program, inverse); + } else if (type === 'simple') { + this.simpleSexpr(block); + + // now that the simple mustache is resolved, we need to + // evaluate it by executing `blockHelperMissing` + this.opcode('pushProgram', program); + this.opcode('pushProgram', inverse); + this.opcode('emptyHash'); + this.opcode('blockValue', block.path.original); + } else { + this.ambiguousSexpr(block, program, inverse); + + // now that the simple mustache is resolved, we need to + // evaluate it by executing `blockHelperMissing` + this.opcode('pushProgram', program); + this.opcode('pushProgram', inverse); + this.opcode('emptyHash'); + this.opcode('ambiguousBlockValue'); + } + + this.opcode('append'); + }, + + DecoratorBlock: function DecoratorBlock(decorator) { + var program = decorator.program && this.compileProgram(decorator.program); + var params = this.setupFullMustacheParams(decorator, program, undefined), + path = decorator.path; + + this.useDecorators = true; + this.opcode('registerDecorator', params.length, path.original); + }, + + PartialStatement: function PartialStatement(partial) { + this.usePartial = true; + + var program = partial.program; + if (program) { + program = this.compileProgram(partial.program); + } + + var params = partial.params; + if (params.length > 1) { + throw new _exception2['default']('Unsupported number of partial arguments: ' + params.length, partial); + } else if (!params.length) { + if (this.options.explicitPartialContext) { + this.opcode('pushLiteral', 'undefined'); + } else { + params.push({ type: 'PathExpression', parts: [], depth: 0 }); + } + } + + var partialName = partial.name.original, + isDynamic = partial.name.type === 'SubExpression'; + if (isDynamic) { + this.accept(partial.name); + } + + this.setupFullMustacheParams(partial, program, undefined, true); + + var indent = partial.indent || ''; + if (this.options.preventIndent && indent) { + this.opcode('appendContent', indent); + indent = ''; + } + + this.opcode('invokePartial', isDynamic, partialName, indent); + this.opcode('append'); + }, + PartialBlockStatement: function PartialBlockStatement(partialBlock) { + this.PartialStatement(partialBlock); + }, + + MustacheStatement: function MustacheStatement(mustache) { + this.SubExpression(mustache); + + if (mustache.escaped && !this.options.noEscape) { + this.opcode('appendEscaped'); + } else { + this.opcode('append'); + } + }, + Decorator: function Decorator(decorator) { + this.DecoratorBlock(decorator); + }, + + ContentStatement: function ContentStatement(content) { + if (content.value) { + this.opcode('appendContent', content.value); + } + }, + + CommentStatement: function CommentStatement() {}, + + SubExpression: function SubExpression(sexpr) { + transformLiteralToPath(sexpr); + var type = this.classifySexpr(sexpr); + + if (type === 'simple') { + this.simpleSexpr(sexpr); + } else if (type === 'helper') { + this.helperSexpr(sexpr); + } else { + this.ambiguousSexpr(sexpr); + } + }, + ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) { + var path = sexpr.path, + name = path.parts[0], + isBlock = program != null || inverse != null; + + this.opcode('getContext', path.depth); + + this.opcode('pushProgram', program); + this.opcode('pushProgram', inverse); + + path.strict = true; + this.accept(path); + + this.opcode('invokeAmbiguous', name, isBlock); + }, + + simpleSexpr: function simpleSexpr(sexpr) { + var path = sexpr.path; + path.strict = true; + this.accept(path); + this.opcode('resolvePossibleLambda'); + }, + + helperSexpr: function helperSexpr(sexpr, program, inverse) { + var params = this.setupFullMustacheParams(sexpr, program, inverse), + path = sexpr.path, + name = path.parts[0]; + + if (this.options.knownHelpers[name]) { + this.opcode('invokeKnownHelper', params.length, name); + } else if (this.options.knownHelpersOnly) { + throw new _exception2['default']('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr); + } else { + path.strict = true; + path.falsy = true; + + this.accept(path); + this.opcode('invokeHelper', params.length, path.original, _ast2['default'].helpers.simpleId(path)); + } + }, + + PathExpression: function PathExpression(path) { + this.addDepth(path.depth); + this.opcode('getContext', path.depth); + + var name = path.parts[0], + scoped = _ast2['default'].helpers.scopedId(path), + blockParamId = !path.depth && !scoped && this.blockParamIndex(name); + + if (blockParamId) { + this.opcode('lookupBlockParam', blockParamId, path.parts); + } else if (!name) { + // Context reference, i.e. `{{foo .}}` or `{{foo ..}}` + this.opcode('pushContext'); + } else if (path.data) { + this.options.data = true; + this.opcode('lookupData', path.depth, path.parts, path.strict); + } else { + this.opcode('lookupOnContext', path.parts, path.falsy, path.strict, scoped); + } + }, + + StringLiteral: function StringLiteral(string) { + this.opcode('pushString', string.value); + }, + + NumberLiteral: function NumberLiteral(number) { + this.opcode('pushLiteral', number.value); + }, + + BooleanLiteral: function BooleanLiteral(bool) { + this.opcode('pushLiteral', bool.value); + }, + + UndefinedLiteral: function UndefinedLiteral() { + this.opcode('pushLiteral', 'undefined'); + }, + + NullLiteral: function NullLiteral() { + this.opcode('pushLiteral', 'null'); + }, + + Hash: function Hash(hash) { + var pairs = hash.pairs, + i = 0, + l = pairs.length; + + this.opcode('pushHash'); + + for (; i < l; i++) { + this.pushParam(pairs[i].value); + } + while (i--) { + this.opcode('assignToHash', pairs[i].key); + } + this.opcode('popHash'); + }, + + // HELPERS + opcode: function opcode(name) { + this.opcodes.push({ opcode: name, args: slice.call(arguments, 1), loc: this.sourceNode[0].loc }); + }, + + addDepth: function addDepth(depth) { + if (!depth) { + return; + } + + this.useDepths = true; + }, + + classifySexpr: function classifySexpr(sexpr) { + var isSimple = _ast2['default'].helpers.simpleId(sexpr.path); + + var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]); + + // a mustache is an eligible helper if: + // * its id is simple (a single part, not `this` or `..`) + var isHelper = !isBlockParam && _ast2['default'].helpers.helperExpression(sexpr); + + // if a mustache is an eligible helper but not a definite + // helper, it is ambiguous, and will be resolved in a later + // pass or at runtime. + var isEligible = !isBlockParam && (isHelper || isSimple); + + // if ambiguous, we can possibly resolve the ambiguity now + // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc. + if (isEligible && !isHelper) { + var _name2 = sexpr.path.parts[0], + options = this.options; + + if (options.knownHelpers[_name2]) { + isHelper = true; + } else if (options.knownHelpersOnly) { + isEligible = false; + } + } + + if (isHelper) { + return 'helper'; + } else if (isEligible) { + return 'ambiguous'; + } else { + return 'simple'; + } + }, + + pushParams: function pushParams(params) { + for (var i = 0, l = params.length; i < l; i++) { + this.pushParam(params[i]); + } + }, + + pushParam: function pushParam(val) { + var value = val.value != null ? val.value : val.original || ''; + + if (this.stringParams) { + if (value.replace) { + value = value.replace(/^(\.?\.\/)*/g, '').replace(/\//g, '.'); + } + + if (val.depth) { + this.addDepth(val.depth); + } + this.opcode('getContext', val.depth || 0); + this.opcode('pushStringParam', value, val.type); + + if (val.type === 'SubExpression') { + // SubExpressions get evaluated and passed in + // in string params mode. + this.accept(val); + } + } else { + if (this.trackIds) { + var blockParamIndex = undefined; + if (val.parts && !_ast2['default'].helpers.scopedId(val) && !val.depth) { + blockParamIndex = this.blockParamIndex(val.parts[0]); + } + if (blockParamIndex) { + var blockParamChild = val.parts.slice(1).join('.'); + this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild); + } else { + value = val.original || value; + if (value.replace) { + value = value.replace(/^this(?:\.|$)/, '').replace(/^\.\//, '').replace(/^\.$/, ''); + } + + this.opcode('pushId', val.type, value); + } + } + this.accept(val); + } + }, + + setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) { + var params = sexpr.params; + this.pushParams(params); + + this.opcode('pushProgram', program); + this.opcode('pushProgram', inverse); + + if (sexpr.hash) { + this.accept(sexpr.hash); + } else { + this.opcode('emptyHash', omitEmpty); + } + + return params; + }, + + blockParamIndex: function blockParamIndex(name) { + for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) { + var blockParams = this.options.blockParams[depth], + param = blockParams && _utils.indexOf(blockParams, name); + if (blockParams && param >= 0) { + return [depth, param]; + } + } + } + }; + + function precompile(input, options, env) { + if (input == null || typeof input !== 'string' && input.type !== 'Program') { + throw new _exception2['default']('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input); + } + + options = options || {}; + if (!('data' in options)) { + options.data = true; + } + if (options.compat) { + options.useDepths = true; + } + + var ast = env.parse(input, options), + environment = new env.Compiler().compile(ast, options); + return new env.JavaScriptCompiler().compile(environment, options); + } + + function compile(input, options, env) { + if (options === undefined) options = {}; + + if (input == null || typeof input !== 'string' && input.type !== 'Program') { + throw new _exception2['default']('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input); + } + + options = _utils.extend({}, options); + if (!('data' in options)) { + options.data = true; + } + if (options.compat) { + options.useDepths = true; + } + + var compiled = undefined; + + function compileInput() { + var ast = env.parse(input, options), + environment = new env.Compiler().compile(ast, options), + templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true); + return env.template(templateSpec); + } + + // Template is only compiled on first use and cached after that point. + function ret(context, execOptions) { + if (!compiled) { + compiled = compileInput(); + } + return compiled.call(this, context, execOptions); + } + ret._setup = function (setupOptions) { + if (!compiled) { + compiled = compileInput(); + } + return compiled._setup(setupOptions); + }; + ret._child = function (i, data, blockParams, depths) { + if (!compiled) { + compiled = compileInput(); + } + return compiled._child(i, data, blockParams, depths); + }; + return ret; + } + + function argEquals(a, b) { + if (a === b) { + return true; + } + + if (_utils.isArray(a) && _utils.isArray(b) && a.length === b.length) { + for (var i = 0; i < a.length; i++) { + if (!argEquals(a[i], b[i])) { + return false; + } + } + return true; + } + } + + function transformLiteralToPath(sexpr) { + if (!sexpr.path.parts) { + var literal = sexpr.path; + // Casting to string here to make false and 0 literal values play nicely with the rest + // of the system. + sexpr.path = { + type: 'PathExpression', + data: false, + depth: 0, + parts: [literal.original + ''], + original: literal.original + '', + loc: literal.loc + }; + } + } + +/***/ }), +/* 42 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(1)['default']; + + exports.__esModule = true; + + var _base = __webpack_require__(4); + + var _exception = __webpack_require__(6); + + var _exception2 = _interopRequireDefault(_exception); + + var _utils = __webpack_require__(5); + + var _codeGen = __webpack_require__(43); + + var _codeGen2 = _interopRequireDefault(_codeGen); + + function Literal(value) { + this.value = value; + } + + function JavaScriptCompiler() {} + + JavaScriptCompiler.prototype = { + // PUBLIC API: You can override these methods in a subclass to provide + // alternative compiled forms for name lookup and buffering semantics + nameLookup: function nameLookup(parent, name /* , type*/) { + if (name === 'constructor') { + return ['(', parent, '.propertyIsEnumerable(\'constructor\') ? ', parent, '.constructor : undefined', ')']; + } + if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) { + return [parent, '.', name]; + } else { + return [parent, '[', JSON.stringify(name), ']']; + } + }, + depthedLookup: function depthedLookup(name) { + return [this.aliasable('container.lookup'), '(depths, "', name, '")']; + }, + + compilerInfo: function compilerInfo() { + var revision = _base.COMPILER_REVISION, + versions = _base.REVISION_CHANGES[revision]; + return [revision, versions]; + }, + + appendToBuffer: function appendToBuffer(source, location, explicit) { + // Force a source as this simplifies the merge logic. + if (!_utils.isArray(source)) { + source = [source]; + } + source = this.source.wrap(source, location); + + if (this.environment.isSimple) { + return ['return ', source, ';']; + } else if (explicit) { + // This is a case where the buffer operation occurs as a child of another + // construct, generally braces. We have to explicitly output these buffer + // operations to ensure that the emitted code goes in the correct location. + return ['buffer += ', source, ';']; + } else { + source.appendToBuffer = true; + return source; + } + }, + + initializeBuffer: function initializeBuffer() { + return this.quotedString(''); + }, + // END PUBLIC API + + compile: function compile(environment, options, context, asObject) { + this.environment = environment; + this.options = options; + this.stringParams = this.options.stringParams; + this.trackIds = this.options.trackIds; + this.precompile = !asObject; + + this.name = this.environment.name; + this.isChild = !!context; + this.context = context || { + decorators: [], + programs: [], + environments: [] + }; + + this.preamble(); + + this.stackSlot = 0; + this.stackVars = []; + this.aliases = {}; + this.registers = { list: [] }; + this.hashes = []; + this.compileStack = []; + this.inlineStack = []; + this.blockParams = []; + + this.compileChildren(environment, options); + + this.useDepths = this.useDepths || environment.useDepths || environment.useDecorators || this.options.compat; + this.useBlockParams = this.useBlockParams || environment.useBlockParams; + + var opcodes = environment.opcodes, + opcode = undefined, + firstLoc = undefined, + i = undefined, + l = undefined; + + for (i = 0, l = opcodes.length; i < l; i++) { + opcode = opcodes[i]; + + this.source.currentLocation = opcode.loc; + firstLoc = firstLoc || opcode.loc; + this[opcode.opcode].apply(this, opcode.args); + } + + // Flush any trailing content that might be pending. + this.source.currentLocation = firstLoc; + this.pushSource(''); + + /* istanbul ignore next */ + if (this.stackSlot || this.inlineStack.length || this.compileStack.length) { + throw new _exception2['default']('Compile completed with content left on stack'); + } + + if (!this.decorators.isEmpty()) { + this.useDecorators = true; + + this.decorators.prepend('var decorators = container.decorators;\n'); + this.decorators.push('return fn;'); + + if (asObject) { + this.decorators = Function.apply(this, ['fn', 'props', 'container', 'depth0', 'data', 'blockParams', 'depths', this.decorators.merge()]); + } else { + this.decorators.prepend('function(fn, props, container, depth0, data, blockParams, depths) {\n'); + this.decorators.push('}\n'); + this.decorators = this.decorators.merge(); + } + } else { + this.decorators = undefined; + } + + var fn = this.createFunctionContext(asObject); + if (!this.isChild) { + var ret = { + compiler: this.compilerInfo(), + main: fn + }; + + if (this.decorators) { + ret.main_d = this.decorators; // eslint-disable-line camelcase + ret.useDecorators = true; + } + + var _context = this.context; + var programs = _context.programs; + var decorators = _context.decorators; + + for (i = 0, l = programs.length; i < l; i++) { + if (programs[i]) { + ret[i] = programs[i]; + if (decorators[i]) { + ret[i + '_d'] = decorators[i]; + ret.useDecorators = true; + } + } + } + + if (this.environment.usePartial) { + ret.usePartial = true; + } + if (this.options.data) { + ret.useData = true; + } + if (this.useDepths) { + ret.useDepths = true; + } + if (this.useBlockParams) { + ret.useBlockParams = true; + } + if (this.options.compat) { + ret.compat = true; + } + + if (!asObject) { + ret.compiler = JSON.stringify(ret.compiler); + + this.source.currentLocation = { start: { line: 1, column: 0 } }; + ret = this.objectLiteral(ret); + + if (options.srcName) { + ret = ret.toStringWithSourceMap({ file: options.destName }); + ret.map = ret.map && ret.map.toString(); + } else { + ret = ret.toString(); + } + } else { + ret.compilerOptions = this.options; + } + + return ret; + } else { + return fn; + } + }, + + preamble: function preamble() { + // track the last context pushed into place to allow skipping the + // getContext opcode when it would be a noop + this.lastContext = 0; + this.source = new _codeGen2['default'](this.options.srcName); + this.decorators = new _codeGen2['default'](this.options.srcName); + }, + + createFunctionContext: function createFunctionContext(asObject) { + var varDeclarations = ''; + + var locals = this.stackVars.concat(this.registers.list); + if (locals.length > 0) { + varDeclarations += ', ' + locals.join(', '); + } + + // Generate minimizer alias mappings + // + // When using true SourceNodes, this will update all references to the given alias + // as the source nodes are reused in situ. For the non-source node compilation mode, + // aliases will not be used, but this case is already being run on the client and + // we aren't concern about minimizing the template size. + var aliasCount = 0; + for (var alias in this.aliases) { + // eslint-disable-line guard-for-in + var node = this.aliases[alias]; + + if (this.aliases.hasOwnProperty(alias) && node.children && node.referenceCount > 1) { + varDeclarations += ', alias' + ++aliasCount + '=' + alias; + node.children[0] = 'alias' + aliasCount; + } + } + + var params = ['container', 'depth0', 'helpers', 'partials', 'data']; + + if (this.useBlockParams || this.useDepths) { + params.push('blockParams'); + } + if (this.useDepths) { + params.push('depths'); + } + + // Perform a second pass over the output to merge content when possible + var source = this.mergeSource(varDeclarations); + + if (asObject) { + params.push(source); + + return Function.apply(this, params); + } else { + return this.source.wrap(['function(', params.join(','), ') {\n ', source, '}']); + } + }, + mergeSource: function mergeSource(varDeclarations) { + var isSimple = this.environment.isSimple, + appendOnly = !this.forceBuffer, + appendFirst = undefined, + sourceSeen = undefined, + bufferStart = undefined, + bufferEnd = undefined; + this.source.each(function (line) { + if (line.appendToBuffer) { + if (bufferStart) { + line.prepend(' + '); + } else { + bufferStart = line; + } + bufferEnd = line; + } else { + if (bufferStart) { + if (!sourceSeen) { + appendFirst = true; + } else { + bufferStart.prepend('buffer += '); + } + bufferEnd.add(';'); + bufferStart = bufferEnd = undefined; + } + + sourceSeen = true; + if (!isSimple) { + appendOnly = false; + } + } + }); + + if (appendOnly) { + if (bufferStart) { + bufferStart.prepend('return '); + bufferEnd.add(';'); + } else if (!sourceSeen) { + this.source.push('return "";'); + } + } else { + varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer()); + + if (bufferStart) { + bufferStart.prepend('return buffer + '); + bufferEnd.add(';'); + } else { + this.source.push('return buffer;'); + } + } + + if (varDeclarations) { + this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n')); + } + + return this.source.merge(); + }, + + // [blockValue] + // + // On stack, before: hash, inverse, program, value + // On stack, after: return value of blockHelperMissing + // + // The purpose of this opcode is to take a block of the form + // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and + // replace it on the stack with the result of properly + // invoking blockHelperMissing. + blockValue: function blockValue(name) { + var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), + params = [this.contextName(0)]; + this.setupHelperArgs(name, 0, params); + + var blockName = this.popStack(); + params.splice(1, 0, blockName); + + this.push(this.source.functionCall(blockHelperMissing, 'call', params)); + }, + + // [ambiguousBlockValue] + // + // On stack, before: hash, inverse, program, value + // Compiler value, before: lastHelper=value of last found helper, if any + // On stack, after, if no lastHelper: same as [blockValue] + // On stack, after, if lastHelper: value + ambiguousBlockValue: function ambiguousBlockValue() { + // We're being a bit cheeky and reusing the options value from the prior exec + var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), + params = [this.contextName(0)]; + this.setupHelperArgs('', 0, params, true); + + this.flushInline(); + + var current = this.topStack(); + params.splice(1, 0, current); + + this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']); + }, + + // [appendContent] + // + // On stack, before: ... + // On stack, after: ... + // + // Appends the string value of `content` to the current buffer + appendContent: function appendContent(content) { + if (this.pendingContent) { + content = this.pendingContent + content; + } else { + this.pendingLocation = this.source.currentLocation; + } + + this.pendingContent = content; + }, + + // [append] + // + // On stack, before: value, ... + // On stack, after: ... + // + // Coerces `value` to a String and appends it to the current buffer. + // + // If `value` is truthy, or 0, it is coerced into a string and appended + // Otherwise, the empty string is appended + append: function append() { + if (this.isInline()) { + this.replaceStack(function (current) { + return [' != null ? ', current, ' : ""']; + }); + + this.pushSource(this.appendToBuffer(this.popStack())); + } else { + var local = this.popStack(); + this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']); + if (this.environment.isSimple) { + this.pushSource(['else { ', this.appendToBuffer("''", undefined, true), ' }']); + } + } + }, + + // [appendEscaped] + // + // On stack, before: value, ... + // On stack, after: ... + // + // Escape `value` and append it to the buffer + appendEscaped: function appendEscaped() { + this.pushSource(this.appendToBuffer([this.aliasable('container.escapeExpression'), '(', this.popStack(), ')'])); + }, + + // [getContext] + // + // On stack, before: ... + // On stack, after: ... + // Compiler value, after: lastContext=depth + // + // Set the value of the `lastContext` compiler value to the depth + getContext: function getContext(depth) { + this.lastContext = depth; + }, + + // [pushContext] + // + // On stack, before: ... + // On stack, after: currentContext, ... + // + // Pushes the value of the current context onto the stack. + pushContext: function pushContext() { + this.pushStackLiteral(this.contextName(this.lastContext)); + }, + + // [lookupOnContext] + // + // On stack, before: ... + // On stack, after: currentContext[name], ... + // + // Looks up the value of `name` on the current context and pushes + // it onto the stack. + lookupOnContext: function lookupOnContext(parts, falsy, strict, scoped) { + var i = 0; + + if (!scoped && this.options.compat && !this.lastContext) { + // The depthed query is expected to handle the undefined logic for the root level that + // is implemented below, so we evaluate that directly in compat mode + this.push(this.depthedLookup(parts[i++])); + } else { + this.pushContext(); + } + + this.resolvePath('context', parts, i, falsy, strict); + }, + + // [lookupBlockParam] + // + // On stack, before: ... + // On stack, after: blockParam[name], ... + // + // Looks up the value of `parts` on the given block param and pushes + // it onto the stack. + lookupBlockParam: function lookupBlockParam(blockParamId, parts) { + this.useBlockParams = true; + + this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']); + this.resolvePath('context', parts, 1); + }, + + // [lookupData] + // + // On stack, before: ... + // On stack, after: data, ... + // + // Push the data lookup operator + lookupData: function lookupData(depth, parts, strict) { + if (!depth) { + this.pushStackLiteral('data'); + } else { + this.pushStackLiteral('container.data(data, ' + depth + ')'); + } + + this.resolvePath('data', parts, 0, true, strict); + }, + + resolvePath: function resolvePath(type, parts, i, falsy, strict) { + // istanbul ignore next + + var _this = this; + + if (this.options.strict || this.options.assumeObjects) { + this.push(strictLookup(this.options.strict && strict, this, parts, type)); + return; + } + + var len = parts.length; + for (; i < len; i++) { + /* eslint-disable no-loop-func */ + this.replaceStack(function (current) { + var lookup = _this.nameLookup(current, parts[i], type); + // We want to ensure that zero and false are handled properly if the context (falsy flag) + // needs to have the special handling for these values. + if (!falsy) { + return [' != null ? ', lookup, ' : ', current]; + } else { + // Otherwise we can use generic falsy handling + return [' && ', lookup]; + } + }); + /* eslint-enable no-loop-func */ + } + }, + + // [resolvePossibleLambda] + // + // On stack, before: value, ... + // On stack, after: resolved value, ... + // + // If the `value` is a lambda, replace it on the stack by + // the return value of the lambda + resolvePossibleLambda: function resolvePossibleLambda() { + this.push([this.aliasable('container.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']); + }, + + // [pushStringParam] + // + // On stack, before: ... + // On stack, after: string, currentContext, ... + // + // This opcode is designed for use in string mode, which + // provides the string value of a parameter along with its + // depth rather than resolving it immediately. + pushStringParam: function pushStringParam(string, type) { + this.pushContext(); + this.pushString(type); + + // If it's a subexpression, the string result + // will be pushed after this opcode. + if (type !== 'SubExpression') { + if (typeof string === 'string') { + this.pushString(string); + } else { + this.pushStackLiteral(string); + } + } + }, + + emptyHash: function emptyHash(omitEmpty) { + if (this.trackIds) { + this.push('{}'); // hashIds + } + if (this.stringParams) { + this.push('{}'); // hashContexts + this.push('{}'); // hashTypes + } + this.pushStackLiteral(omitEmpty ? 'undefined' : '{}'); + }, + pushHash: function pushHash() { + if (this.hash) { + this.hashes.push(this.hash); + } + this.hash = { values: [], types: [], contexts: [], ids: [] }; + }, + popHash: function popHash() { + var hash = this.hash; + this.hash = this.hashes.pop(); + + if (this.trackIds) { + this.push(this.objectLiteral(hash.ids)); + } + if (this.stringParams) { + this.push(this.objectLiteral(hash.contexts)); + this.push(this.objectLiteral(hash.types)); + } + + this.push(this.objectLiteral(hash.values)); + }, + + // [pushString] + // + // On stack, before: ... + // On stack, after: quotedString(string), ... + // + // Push a quoted version of `string` onto the stack + pushString: function pushString(string) { + this.pushStackLiteral(this.quotedString(string)); + }, + + // [pushLiteral] + // + // On stack, before: ... + // On stack, after: value, ... + // + // Pushes a value onto the stack. This operation prevents + // the compiler from creating a temporary variable to hold + // it. + pushLiteral: function pushLiteral(value) { + this.pushStackLiteral(value); + }, + + // [pushProgram] + // + // On stack, before: ... + // On stack, after: program(guid), ... + // + // Push a program expression onto the stack. This takes + // a compile-time guid and converts it into a runtime-accessible + // expression. + pushProgram: function pushProgram(guid) { + if (guid != null) { + this.pushStackLiteral(this.programExpression(guid)); + } else { + this.pushStackLiteral(null); + } + }, + + // [registerDecorator] + // + // On stack, before: hash, program, params..., ... + // On stack, after: ... + // + // Pops off the decorator's parameters, invokes the decorator, + // and inserts the decorator into the decorators list. + registerDecorator: function registerDecorator(paramSize, name) { + var foundDecorator = this.nameLookup('decorators', name, 'decorator'), + options = this.setupHelperArgs(name, paramSize); + + this.decorators.push(['fn = ', this.decorators.functionCall(foundDecorator, '', ['fn', 'props', 'container', options]), ' || fn;']); + }, + + // [invokeHelper] + // + // On stack, before: hash, inverse, program, params..., ... + // On stack, after: result of helper invocation + // + // Pops off the helper's parameters, invokes the helper, + // and pushes the helper's return value onto the stack. + // + // If the helper is not found, `helperMissing` is called. + invokeHelper: function invokeHelper(paramSize, name, isSimple) { + var nonHelper = this.popStack(), + helper = this.setupHelper(paramSize, name), + simple = isSimple ? [helper.name, ' || '] : ''; + + var lookup = ['('].concat(simple, nonHelper); + if (!this.options.strict) { + lookup.push(' || ', this.aliasable('helpers.helperMissing')); + } + lookup.push(')'); + + this.push(this.source.functionCall(lookup, 'call', helper.callParams)); + }, + + // [invokeKnownHelper] + // + // On stack, before: hash, inverse, program, params..., ... + // On stack, after: result of helper invocation + // + // This operation is used when the helper is known to exist, + // so a `helperMissing` fallback is not required. + invokeKnownHelper: function invokeKnownHelper(paramSize, name) { + var helper = this.setupHelper(paramSize, name); + this.push(this.source.functionCall(helper.name, 'call', helper.callParams)); + }, + + // [invokeAmbiguous] + // + // On stack, before: hash, inverse, program, params..., ... + // On stack, after: result of disambiguation + // + // This operation is used when an expression like `{{foo}}` + // is provided, but we don't know at compile-time whether it + // is a helper or a path. + // + // This operation emits more code than the other options, + // and can be avoided by passing the `knownHelpers` and + // `knownHelpersOnly` flags at compile-time. + invokeAmbiguous: function invokeAmbiguous(name, helperCall) { + this.useRegister('helper'); + + var nonHelper = this.popStack(); + + this.emptyHash(); + var helper = this.setupHelper(0, name, helperCall); + + var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper'); + + var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')']; + if (!this.options.strict) { + lookup[0] = '(helper = '; + lookup.push(' != null ? helper : ', this.aliasable('helpers.helperMissing')); + } + + this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('"function"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']); + }, + + // [invokePartial] + // + // On stack, before: context, ... + // On stack after: result of partial invocation + // + // This operation pops off a context, invokes a partial with that context, + // and pushes the result of the invocation back. + invokePartial: function invokePartial(isDynamic, name, indent) { + var params = [], + options = this.setupParams(name, 1, params); + + if (isDynamic) { + name = this.popStack(); + delete options.name; + } + + if (indent) { + options.indent = JSON.stringify(indent); + } + options.helpers = 'helpers'; + options.partials = 'partials'; + options.decorators = 'container.decorators'; + + if (!isDynamic) { + params.unshift(this.nameLookup('partials', name, 'partial')); + } else { + params.unshift(name); + } + + if (this.options.compat) { + options.depths = 'depths'; + } + options = this.objectLiteral(options); + params.push(options); + + this.push(this.source.functionCall('container.invokePartial', '', params)); + }, + + // [assignToHash] + // + // On stack, before: value, ..., hash, ... + // On stack, after: ..., hash, ... + // + // Pops a value off the stack and assigns it to the current hash + assignToHash: function assignToHash(key) { + var value = this.popStack(), + context = undefined, + type = undefined, + id = undefined; + + if (this.trackIds) { + id = this.popStack(); + } + if (this.stringParams) { + type = this.popStack(); + context = this.popStack(); + } + + var hash = this.hash; + if (context) { + hash.contexts[key] = context; + } + if (type) { + hash.types[key] = type; + } + if (id) { + hash.ids[key] = id; + } + hash.values[key] = value; + }, + + pushId: function pushId(type, name, child) { + if (type === 'BlockParam') { + this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : '')); + } else if (type === 'PathExpression') { + this.pushString(name); + } else if (type === 'SubExpression') { + this.pushStackLiteral('true'); + } else { + this.pushStackLiteral('null'); + } + }, + + // HELPERS + + compiler: JavaScriptCompiler, + + compileChildren: function compileChildren(environment, options) { + var children = environment.children, + child = undefined, + compiler = undefined; + + for (var i = 0, l = children.length; i < l; i++) { + child = children[i]; + compiler = new this.compiler(); // eslint-disable-line new-cap + + var existing = this.matchExistingProgram(child); + + if (existing == null) { + this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children + var index = this.context.programs.length; + child.index = index; + child.name = 'program' + index; + this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile); + this.context.decorators[index] = compiler.decorators; + this.context.environments[index] = child; + + this.useDepths = this.useDepths || compiler.useDepths; + this.useBlockParams = this.useBlockParams || compiler.useBlockParams; + child.useDepths = this.useDepths; + child.useBlockParams = this.useBlockParams; + } else { + child.index = existing.index; + child.name = 'program' + existing.index; + + this.useDepths = this.useDepths || existing.useDepths; + this.useBlockParams = this.useBlockParams || existing.useBlockParams; + } + } + }, + matchExistingProgram: function matchExistingProgram(child) { + for (var i = 0, len = this.context.environments.length; i < len; i++) { + var environment = this.context.environments[i]; + if (environment && environment.equals(child)) { + return environment; + } + } + }, + + programExpression: function programExpression(guid) { + var child = this.environment.children[guid], + programParams = [child.index, 'data', child.blockParams]; + + if (this.useBlockParams || this.useDepths) { + programParams.push('blockParams'); + } + if (this.useDepths) { + programParams.push('depths'); + } + + return 'container.program(' + programParams.join(', ') + ')'; + }, + + useRegister: function useRegister(name) { + if (!this.registers[name]) { + this.registers[name] = true; + this.registers.list.push(name); + } + }, + + push: function push(expr) { + if (!(expr instanceof Literal)) { + expr = this.source.wrap(expr); + } + + this.inlineStack.push(expr); + return expr; + }, + + pushStackLiteral: function pushStackLiteral(item) { + this.push(new Literal(item)); + }, + + pushSource: function pushSource(source) { + if (this.pendingContent) { + this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation)); + this.pendingContent = undefined; + } + + if (source) { + this.source.push(source); + } + }, + + replaceStack: function replaceStack(callback) { + var prefix = ['('], + stack = undefined, + createdStack = undefined, + usedLiteral = undefined; + + /* istanbul ignore next */ + if (!this.isInline()) { + throw new _exception2['default']('replaceStack on non-inline'); + } + + // We want to merge the inline statement into the replacement statement via ',' + var top = this.popStack(true); + + if (top instanceof Literal) { + // Literals do not need to be inlined + stack = [top.value]; + prefix = ['(', stack]; + usedLiteral = true; + } else { + // Get or create the current stack name for use by the inline + createdStack = true; + var _name = this.incrStack(); + + prefix = ['((', this.push(_name), ' = ', top, ')']; + stack = this.topStack(); + } + + var item = callback.call(this, stack); + + if (!usedLiteral) { + this.popStack(); + } + if (createdStack) { + this.stackSlot--; + } + this.push(prefix.concat(item, ')')); + }, + + incrStack: function incrStack() { + this.stackSlot++; + if (this.stackSlot > this.stackVars.length) { + this.stackVars.push('stack' + this.stackSlot); + } + return this.topStackName(); + }, + topStackName: function topStackName() { + return 'stack' + this.stackSlot; + }, + flushInline: function flushInline() { + var inlineStack = this.inlineStack; + this.inlineStack = []; + for (var i = 0, len = inlineStack.length; i < len; i++) { + var entry = inlineStack[i]; + /* istanbul ignore if */ + if (entry instanceof Literal) { + this.compileStack.push(entry); + } else { + var stack = this.incrStack(); + this.pushSource([stack, ' = ', entry, ';']); + this.compileStack.push(stack); + } + } + }, + isInline: function isInline() { + return this.inlineStack.length; + }, + + popStack: function popStack(wrapped) { + var inline = this.isInline(), + item = (inline ? this.inlineStack : this.compileStack).pop(); + + if (!wrapped && item instanceof Literal) { + return item.value; + } else { + if (!inline) { + /* istanbul ignore next */ + if (!this.stackSlot) { + throw new _exception2['default']('Invalid stack pop'); + } + this.stackSlot--; + } + return item; + } + }, + + topStack: function topStack() { + var stack = this.isInline() ? this.inlineStack : this.compileStack, + item = stack[stack.length - 1]; + + /* istanbul ignore if */ + if (item instanceof Literal) { + return item.value; + } else { + return item; + } + }, + + contextName: function contextName(context) { + if (this.useDepths && context) { + return 'depths[' + context + ']'; + } else { + return 'depth' + context; + } + }, + + quotedString: function quotedString(str) { + return this.source.quotedString(str); + }, + + objectLiteral: function objectLiteral(obj) { + return this.source.objectLiteral(obj); + }, + + aliasable: function aliasable(name) { + var ret = this.aliases[name]; + if (ret) { + ret.referenceCount++; + return ret; + } + + ret = this.aliases[name] = this.source.wrap(name); + ret.aliasable = true; + ret.referenceCount = 1; + + return ret; + }, + + setupHelper: function setupHelper(paramSize, name, blockHelper) { + var params = [], + paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper); + var foundHelper = this.nameLookup('helpers', name, 'helper'), + callContext = this.aliasable(this.contextName(0) + ' != null ? ' + this.contextName(0) + ' : (container.nullContext || {})'); + + return { + params: params, + paramsInit: paramsInit, + name: foundHelper, + callParams: [callContext].concat(params) + }; + }, + + setupParams: function setupParams(helper, paramSize, params) { + var options = {}, + contexts = [], + types = [], + ids = [], + objectArgs = !params, + param = undefined; + + if (objectArgs) { + params = []; + } + + options.name = this.quotedString(helper); + options.hash = this.popStack(); + + if (this.trackIds) { + options.hashIds = this.popStack(); + } + if (this.stringParams) { + options.hashTypes = this.popStack(); + options.hashContexts = this.popStack(); + } + + var inverse = this.popStack(), + program = this.popStack(); + + // Avoid setting fn and inverse if neither are set. This allows + // helpers to do a check for `if (options.fn)` + if (program || inverse) { + options.fn = program || 'container.noop'; + options.inverse = inverse || 'container.noop'; + } + + // The parameters go on to the stack in order (making sure that they are evaluated in order) + // so we need to pop them off the stack in reverse order + var i = paramSize; + while (i--) { + param = this.popStack(); + params[i] = param; + + if (this.trackIds) { + ids[i] = this.popStack(); + } + if (this.stringParams) { + types[i] = this.popStack(); + contexts[i] = this.popStack(); + } + } + + if (objectArgs) { + options.args = this.source.generateArray(params); + } + + if (this.trackIds) { + options.ids = this.source.generateArray(ids); + } + if (this.stringParams) { + options.types = this.source.generateArray(types); + options.contexts = this.source.generateArray(contexts); + } + + if (this.options.data) { + options.data = 'data'; + } + if (this.useBlockParams) { + options.blockParams = 'blockParams'; + } + return options; + }, + + setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) { + var options = this.setupParams(helper, paramSize, params); + options = this.objectLiteral(options); + if (useRegister) { + this.useRegister('options'); + params.push('options'); + return ['options=', options]; + } else if (params) { + params.push(options); + return ''; + } else { + return options; + } + } + }; + + (function () { + var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' '); + + var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {}; + + for (var i = 0, l = reservedWords.length; i < l; i++) { + compilerWords[reservedWords[i]] = true; + } + })(); + + JavaScriptCompiler.isValidJavaScriptVariableName = function (name) { + return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name); + }; + + function strictLookup(requireTerminal, compiler, parts, type) { + var stack = compiler.popStack(), + i = 0, + len = parts.length; + if (requireTerminal) { + len--; + } + + for (; i < len; i++) { + stack = compiler.nameLookup(stack, parts[i], type); + } + + if (requireTerminal) { + return [compiler.aliasable('container.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ')']; + } else { + return stack; + } + } + + exports['default'] = JavaScriptCompiler; + module.exports = exports['default']; + +/***/ }), +/* 43 */ +/***/ (function(module, exports, __webpack_require__) { + + /* global define */ + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(5); + + var SourceNode = undefined; + + try { + /* istanbul ignore next */ + if (false) { + // We don't support this in AMD environments. For these environments, we asusme that + // they are running on the browser and thus have no need for the source-map library. + var SourceMap = require('source-map'); + SourceNode = SourceMap.SourceNode; + } + } catch (err) {} + /* NOP */ + + /* istanbul ignore if: tested but not covered in istanbul due to dist build */ + if (!SourceNode) { + SourceNode = function (line, column, srcFile, chunks) { + this.src = ''; + if (chunks) { + this.add(chunks); + } + }; + /* istanbul ignore next */ + SourceNode.prototype = { + add: function add(chunks) { + if (_utils.isArray(chunks)) { + chunks = chunks.join(''); + } + this.src += chunks; + }, + prepend: function prepend(chunks) { + if (_utils.isArray(chunks)) { + chunks = chunks.join(''); + } + this.src = chunks + this.src; + }, + toStringWithSourceMap: function toStringWithSourceMap() { + return { code: this.toString() }; + }, + toString: function toString() { + return this.src; + } + }; + } + + function castChunk(chunk, codeGen, loc) { + if (_utils.isArray(chunk)) { + var ret = []; + + for (var i = 0, len = chunk.length; i < len; i++) { + ret.push(codeGen.wrap(chunk[i], loc)); + } + return ret; + } else if (typeof chunk === 'boolean' || typeof chunk === 'number') { + // Handle primitives that the SourceNode will throw up on + return chunk + ''; + } + return chunk; + } + + function CodeGen(srcFile) { + this.srcFile = srcFile; + this.source = []; + } + + CodeGen.prototype = { + isEmpty: function isEmpty() { + return !this.source.length; + }, + prepend: function prepend(source, loc) { + this.source.unshift(this.wrap(source, loc)); + }, + push: function push(source, loc) { + this.source.push(this.wrap(source, loc)); + }, + + merge: function merge() { + var source = this.empty(); + this.each(function (line) { + source.add([' ', line, '\n']); + }); + return source; + }, + + each: function each(iter) { + for (var i = 0, len = this.source.length; i < len; i++) { + iter(this.source[i]); + } + }, + + empty: function empty() { + var loc = this.currentLocation || { start: {} }; + return new SourceNode(loc.start.line, loc.start.column, this.srcFile); + }, + wrap: function wrap(chunk) { + var loc = arguments.length <= 1 || arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1]; + + if (chunk instanceof SourceNode) { + return chunk; + } + + chunk = castChunk(chunk, this, loc); + + return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk); + }, + + functionCall: function functionCall(fn, type, params) { + params = this.generateList(params); + return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']); + }, + + quotedString: function quotedString(str) { + return '"' + (str + '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4 + .replace(/\u2029/g, '\\u2029') + '"'; + }, + + objectLiteral: function objectLiteral(obj) { + var pairs = []; + + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + var value = castChunk(obj[key], this); + if (value !== 'undefined') { + pairs.push([this.quotedString(key), ':', value]); + } + } + } + + var ret = this.generateList(pairs); + ret.prepend('{'); + ret.add('}'); + return ret; + }, + + generateList: function generateList(entries) { + var ret = this.empty(); + + for (var i = 0, len = entries.length; i < len; i++) { + if (i) { + ret.add(','); + } + + ret.add(castChunk(entries[i], this)); + } + + return ret; + }, + + generateArray: function generateArray(entries) { + var ret = this.generateList(entries); + ret.prepend('['); + ret.add(']'); + + return ret; + } + }; + + exports['default'] = CodeGen; + module.exports = exports['default']; + +/***/ }) +/******/ ]) +}); +; \ No newline at end of file diff --git a/public/assets/prototype/js/jquery-3.1.1.min.js b/public/assets/prototype/js/jquery-3.1.1.min.js new file mode 100644 index 0000000..4c5be4c --- /dev/null +++ b/public/assets/prototype/js/jquery-3.1.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.1.1 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(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 qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):C.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/[^\x20\t\r\n\f]+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R), +a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,ka=/^$|\/(?:java|ecma)script/i,la={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),"script"),j&&na(g),c){k=0;while(f=g[k++])ka.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/\s*$/g;function Da(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Ea(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Fa(a){var b=Ba.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ga(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Aa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ia(f,b,c,d)});if(m&&(e=pa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ma(e,"script"),Ea),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ma(h),f=ma(a),d=0,e=f.length;d0&&na(g,!i&&ma(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ja(this,a,!0)},remove:function(a){return Ja(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.appendChild(a)}})},prepend:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(ma(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!za.test(a)&&!la[(ja.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function Ya(a,b,c,d,e){return new Ya.prototype.init(a,b,c,d,e)}r.Tween=Ya,Ya.prototype={constructor:Ya,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Ya.propHooks[this.prop];return a&&a.get?a.get(this):Ya.propHooks._default.get(this)},run:function(a){var b,c=Ya.propHooks[this.prop];return this.options.duration?this.pos=b=r.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):Ya.propHooks._default.set(this),this}},Ya.prototype.init.prototype=Ya.prototype,Ya.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Ya.propHooks.scrollTop=Ya.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Ya.prototype.init,r.fx.step={};var Za,$a,_a=/^(?:toggle|show|hide)$/,ab=/queueHooks$/;function bb(){$a&&(a.requestAnimationFrame(bb),r.fx.tick())}function cb(){return a.setTimeout(function(){Za=void 0}),Za=r.now()}function db(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ba[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function eb(a,b,c){for(var d,e=(hb.tweeners[b]||[]).concat(hb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?ib:void 0)), +void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),ib={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=jb[b]||r.find.attr;jb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=jb[g],jb[g]=e,e=null!=c(a,b,d)?g:null,jb[g]=f),e}});var kb=/^(?:input|select|textarea|button)$/i,lb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):kb.test(a.nodeName)||lb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function mb(a){var b=a.match(K)||[];return b.join(" ")}function nb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,nb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,nb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,nb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=nb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(nb(c))+" ").indexOf(b)>-1)return!0;return!1}});var ob=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ob,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:mb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ia.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,"$1"),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("