From 3b878948bfe210edd610a166aec1f16bbccedda3 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sat, 6 Jan 2018 21:26:46 +0800 Subject: [PATCH] Initial commit --- .env.dist | 17 + .gitignore | 7 + bin/console | 39 + composer.json | 69 + composer.lock | 3706 + config/bundles.php | 14 + config/menu.yaml | 17 + config/packages/dev/routing.yaml | 3 + config/packages/dev/web_profiler.yaml | 6 + config/packages/doctrine.yaml | 27 + config/packages/doctrine_migrations.yaml | 5 + config/packages/framework.yaml | 15 + config/packages/prod/doctrine.yaml | 31 + config/packages/routing.yaml | 3 + config/packages/security.yaml | 40 + config/packages/test/framework.yaml | 5 + config/packages/test/web_profiler.yaml | 6 + config/packages/twig.yaml | 4 + config/routes.yaml | 19 + config/routes/annotations.yaml | 3 + config/routes/dev/twig.yaml | 3 + config/routes/dev/web_profiler.yaml | 7 + config/services.yaml | 33 + public/assets/app/js/dashboard.js | 1682 + public/assets/app/js/layout-builder.js | 439 + public/assets/app/media/img/bg/bg-1.jpg | Bin 0 -> 204792 bytes public/assets/app/media/img/bg/bg-2.jpg | Bin 0 -> 241948 bytes public/assets/app/media/img/bg/bg-3.jpg | Bin 0 -> 244652 bytes public/assets/app/media/img/bg/bg-4.jpg | Bin 0 -> 461693 bytes public/assets/app/media/img/bg/bg-5.jpg | Bin 0 -> 366266 bytes public/assets/app/media/img/blog/blog1.jpg | Bin 0 -> 88643 bytes public/assets/app/media/img/blog/blog2.jpg | Bin 0 -> 104583 bytes public/assets/app/media/img/blog/blog3.jpg | Bin 0 -> 48075 bytes public/assets/app/media/img/blog/blog4.jpg | Bin 0 -> 312492 bytes public/assets/app/media/img/blog/blog5.jpg | Bin 0 -> 124910 bytes .../app/media/img/client-logos/logo1.png | Bin 0 -> 3392 bytes .../app/media/img/client-logos/logo2.png | Bin 0 -> 4231 bytes .../app/media/img/client-logos/logo3.png | Bin 0 -> 3405 bytes .../app/media/img/client-logos/logo4.png | Bin 0 -> 5461 bytes .../app/media/img/client-logos/logo5.png | Bin 0 -> 3051 bytes .../assets/app/media/img/envato/screen1.jpg | Bin 0 -> 145220 bytes .../assets/app/media/img/envato/screen2.jpg | Bin 0 -> 245644 bytes public/assets/app/media/img/error/bg1.jpg | Bin 0 -> 729066 bytes public/assets/app/media/img/error/bg2.jpg | Bin 0 -> 1334801 bytes public/assets/app/media/img/error/bg3.jpg | Bin 0 -> 373401 bytes public/assets/app/media/img/error/bg4.jpg | Bin 0 -> 284948 bytes public/assets/app/media/img/error/bg5.jpg | Bin 0 -> 210412 bytes public/assets/app/media/img/error/bg6.jpg | Bin 0 -> 210379 bytes public/assets/app/media/img/files/css.svg | 81 + public/assets/app/media/img/files/csv.svg | 71 + public/assets/app/media/img/files/doc.svg | 81 + public/assets/app/media/img/files/html.svg | 57 + .../assets/app/media/img/files/javascript.svg | 74 + public/assets/app/media/img/files/jpg.svg | 67 + public/assets/app/media/img/files/mp4.svg | 59 + public/assets/app/media/img/files/pdf.svg | 69 + public/assets/app/media/img/files/xml.svg | 59 + public/assets/app/media/img/files/zip.svg | 58 + .../assets/app/media/img/icons/exchange.svg | 53 + public/assets/app/media/img/icons/logout.svg | 51 + .../assets/app/media/img/icons/question.svg | 55 + public/assets/app/media/img/icons/warning.svg | 59 + public/assets/app/media/img/logos/logo-1.png | Bin 0 -> 3475 bytes public/assets/app/media/img/logos/logo-2.png | Bin 0 -> 3597 bytes public/assets/app/media/img/logos/logo-3.png | Bin 0 -> 3635 bytes .../app/media/img/misc/notification_bg.jpg | Bin 0 -> 22245 bytes .../app/media/img/misc/quick_actions_bg.jpg | Bin 0 -> 24216 bytes .../app/media/img/misc/user_profile_bg.jpg | Bin 0 -> 20767 bytes .../app/media/img/products/product1.jpg | Bin 0 -> 127491 bytes .../app/media/img/products/product10.jpg | Bin 0 -> 89658 bytes .../app/media/img/products/product11.jpg | Bin 0 -> 171862 bytes .../app/media/img/products/product2.jpg | Bin 0 -> 183922 bytes .../app/media/img/products/product3.jpg | Bin 0 -> 127861 bytes .../app/media/img/products/product4.jpg | Bin 0 -> 166046 bytes .../app/media/img/products/product5.jpg | Bin 0 -> 158794 bytes .../app/media/img/products/product6.jpg | Bin 0 -> 255923 bytes .../app/media/img/products/product7.jpg | Bin 0 -> 250354 bytes .../app/media/img/products/product8.jpg | Bin 0 -> 215790 bytes .../app/media/img/products/product9.jpg | Bin 0 -> 231501 bytes public/assets/app/media/img/users/100_1.jpg | Bin 0 -> 15538 bytes public/assets/app/media/img/users/100_10.jpg | Bin 0 -> 12742 bytes public/assets/app/media/img/users/100_11.jpg | Bin 0 -> 14410 bytes public/assets/app/media/img/users/100_12.jpg | Bin 0 -> 14954 bytes public/assets/app/media/img/users/100_13.jpg | Bin 0 -> 17908 bytes public/assets/app/media/img/users/100_14.jpg | Bin 0 -> 17255 bytes public/assets/app/media/img/users/100_2.jpg | Bin 0 -> 13057 bytes public/assets/app/media/img/users/100_3.jpg | Bin 0 -> 14355 bytes public/assets/app/media/img/users/100_4.jpg | Bin 0 -> 11984 bytes public/assets/app/media/img/users/100_5.jpg | Bin 0 -> 17078 bytes public/assets/app/media/img/users/100_6.jpg | Bin 0 -> 15174 bytes public/assets/app/media/img/users/100_7.jpg | Bin 0 -> 13684 bytes public/assets/app/media/img/users/100_8.jpg | Bin 0 -> 13388 bytes public/assets/app/media/img/users/100_9.jpg | Bin 0 -> 11647 bytes public/assets/app/media/img/users/300_1.jpg | Bin 0 -> 85469 bytes public/assets/app/media/img/users/300_10.jpg | Bin 0 -> 76872 bytes public/assets/app/media/img/users/300_11.jpg | Bin 0 -> 82395 bytes public/assets/app/media/img/users/300_12.jpg | Bin 0 -> 82518 bytes public/assets/app/media/img/users/300_13.jpg | Bin 0 -> 110700 bytes public/assets/app/media/img/users/300_14.jpg | Bin 0 -> 90044 bytes public/assets/app/media/img/users/300_2.jpg | Bin 0 -> 84659 bytes public/assets/app/media/img/users/300_3.jpg | Bin 0 -> 81972 bytes public/assets/app/media/img/users/300_4.jpg | Bin 0 -> 65263 bytes public/assets/app/media/img/users/300_5.jpg | Bin 0 -> 98499 bytes public/assets/app/media/img/users/300_6.jpg | Bin 0 -> 88402 bytes public/assets/app/media/img/users/300_7.jpg | Bin 0 -> 77030 bytes public/assets/app/media/img/users/300_8.jpg | Bin 0 -> 84951 bytes public/assets/app/media/img/users/300_9.jpg | Bin 0 -> 68447 bytes public/assets/app/media/img/users/user1.jpg | Bin 0 -> 8583 bytes public/assets/app/media/img/users/user2.jpg | Bin 0 -> 6733 bytes public/assets/app/media/img/users/user3.jpg | Bin 0 -> 9424 bytes public/assets/app/media/img/users/user4.jpg | Bin 0 -> 8627 bytes public/assets/app/media/img/users/user5.jpg | Bin 0 -> 9674 bytes .../demo/default/base/scripts.bundle.js | 5085 + .../assets/demo/default/base/style.bundle.css | 33970 +++++ .../default/custom/components/base/blockui.js | 268 + .../components/base/bootstrap-notify.js | 90 + .../custom/components/base/dropdown.js | 50 + .../custom/components/base/scrollable.js | 21 + .../custom/components/base/sweetalert2.js | 170 + .../default/custom/components/base/toastr.js | 163 + .../custom/components/base/treeview.js | 275 + .../components/calendar/background-events.js | 150 + .../custom/components/calendar/basic.js | 138 + .../components/calendar/external-events.js | 185 + .../custom/components/calendar/google.js | 64 + .../custom/components/calendar/list-view.js | 138 + .../components/charts/amcharts/charts.js | 2388 + .../custom/components/charts/amcharts/maps.js | 1022 + .../charts/amcharts/stock-charts.js | 781 + .../custom/components/charts/flotcharts.js | 728 + .../custom/components/charts/google-charts.js | 165 + .../custom/components/charts/morris-charts.js | 184 + .../components/datatables/api/events.js | 210 + .../components/datatables/api/methods.js | 213 + .../datatables/base/column-rendering.js | 219 + .../datatables/base/column-width.js | 100 + .../components/datatables/base/data-ajax.js | 197 + .../components/datatables/base/data-json.js | 151 + .../components/datatables/base/data-local.js | 153 + .../components/datatables/base/html-table.js | 41 + .../components/datatables/base/local-sort.js | 191 + .../datatables/base/record-selection.js | 240 + .../datatables/base/responsive-columns.js | 112 + .../components/datatables/base/row-details.js | 142 + .../components/datatables/base/translation.js | 112 + .../components/datatables/child/data-ajax.js | 250 + .../components/datatables/child/data-local.js | 564 + .../components/datatables/locked/both.js | 189 + .../datatables/locked/html-table.js | 44 + .../components/datatables/locked/left.js | 173 + .../components/datatables/locked/right.js | 176 + .../components/datatables/scrolling/both.js | 189 + .../datatables/scrolling/horizontal.js | 193 + .../datatables/scrolling/vertical.js | 143 + .../forms/validation/form-controls.js | 144 + .../forms/validation/form-widgets.js | 143 + .../components/forms/widgets/autosize.js | 27 + .../forms/widgets/bootstrap-datepicker.js | 135 + .../widgets/bootstrap-daterangepicker.js | 143 + .../forms/widgets/bootstrap-datetimepicker.js | 120 + .../forms/widgets/bootstrap-markdown.js | 20 + .../forms/widgets/bootstrap-maxlength.js | 128 + .../bootstrap-multipleselectsplitter.js | 21 + .../forms/widgets/bootstrap-select.js | 21 + .../forms/widgets/bootstrap-switch.js | 21 + .../forms/widgets/bootstrap-timepicker.js | 54 + .../forms/widgets/bootstrap-touchspin.js | 108 + .../components/forms/widgets/clipboard.js | 24 + .../components/forms/widgets/dropzone.js | 61 + .../components/forms/widgets/form-repeater.js | 134 + .../forms/widgets/google-recaptcha.js | 21 + .../components/forms/widgets/input-mask.js | 78 + .../forms/widgets/ion-range-slider.js | 83 + .../components/forms/widgets/nouislider.js | 312 + .../components/forms/widgets/select2.js | 187 + .../components/forms/widgets/summernote.js | 22 + .../components/forms/widgets/typeahead.js | 155 + .../custom/components/forms/wizard/wizard.js | 208 + .../custom/components/maps/google-maps.js | 221 + .../default/custom/components/maps/jqvmap.js | 248 + .../custom/components/maps/jvectormap.js | 20 + .../custom/components/portlets/draggable.js | 33 + .../custom/components/portlets/tools.js | 552 + .../custom/components/utils/idle-timer.js | 256 + .../components/utils/session-timeout.js | 29 + .../demo/default/custom/header/actions.js | 19 + .../demo/default/media/img/logo/favicon.ico | Bin 0 -> 1150 bytes .../demo/default/media/img/logo/logo.png | Bin 0 -> 1682 bytes .../default/media/img/logo/logo_compact.png | Bin 0 -> 1685 bytes .../media/img/logo/logo_default_dark.png | Bin 0 -> 1774 bytes .../media/img/logo/logo_default_light.png | Bin 0 -> 1789 bytes .../media/img/misc/notification_bg.jpg | Bin 0 -> 22245 bytes .../media/img/misc/quick_actions_bg.jpg | Bin 0 -> 24216 bytes .../media/img/misc/user_profile_bg.jpg | Bin 0 -> 20767 bytes public/assets/snippets/pages/user/login.js | 220 + .../vendors/base/fonts/flaticon/Flaticon.eot | Bin 0 -> 60178 bytes .../vendors/base/fonts/flaticon/Flaticon.svg | 2195 + .../vendors/base/fonts/flaticon/Flaticon.ttf | Bin 0 -> 60000 bytes .../vendors/base/fonts/flaticon/Flaticon.woff | Bin 0 -> 35172 bytes .../base/fonts/font-awesome/FontAwesome.otf | Bin 0 -> 134808 bytes .../font-awesome/fontawesome-webfont.eot | Bin 0 -> 165742 bytes .../font-awesome/fontawesome-webfont.svg | 2671 + .../font-awesome/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes .../font-awesome/fontawesome-webfont.woff | Bin 0 -> 98024 bytes .../font-awesome/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes .../base/fonts/line-awesome/line-awesome.eot | Bin 0 -> 112916 bytes .../base/fonts/line-awesome/line-awesome.svg | 2628 + .../base/fonts/line-awesome/line-awesome.ttf | Bin 0 -> 112728 bytes .../base/fonts/line-awesome/line-awesome.woff | Bin 0 -> 57436 bytes .../fonts/line-awesome/line-awesome.woff2 | Bin 0 -> 45108 bytes ...ronic_fda1334c35d0f5fe2afb3afebbb6774a.eot | Bin 0 -> 1952 bytes ...ronic_fda1334c35d0f5fe2afb3afebbb6774a.svg | 39 + ...ronic_fda1334c35d0f5fe2afb3afebbb6774a.ttf | Bin 0 -> 1776 bytes ...onic_fda1334c35d0f5fe2afb3afebbb6774a.woff | Bin 0 -> 1208 bytes ...nic_fda1334c35d0f5fe2afb3afebbb6774a.woff2 | Bin 0 -> 788 bytes .../vendors/base/fonts/socicon/socicon.eot | Bin 0 -> 52592 bytes .../vendors/base/fonts/socicon/socicon.svg | 178 + .../vendors/base/fonts/socicon/socicon.ttf | Bin 0 -> 52428 bytes .../vendors/base/fonts/socicon/socicon.woff | Bin 0 -> 38700 bytes .../base/fonts/summernote/summernote.eot | Bin 0 -> 16574 bytes .../base/fonts/summernote/summernote.ttf | Bin 0 -> 16388 bytes .../base/fonts/summernote/summernote.woff | Bin 0 -> 10196 bytes .../ion-rangeslider/sprite-skin-flat.png | Bin 0 -> 304 bytes .../vendors/base/images/jstree/32px.png | Bin 0 -> 2387 bytes .../vendors/base/images/jstree/40px.png | Bin 0 -> 1880 bytes .../vendors/base/images/jstree/throbber.gif | Bin 0 -> 1720 bytes .../mCSB_buttons.png | Bin 0 -> 2998 bytes public/assets/vendors/base/vendors.bundle.css | 16559 +++ public/assets/vendors/base/vendors.bundle.js | 105051 +++++++++++++++ .../assets/vendors/custom/flot/flot.bundle.js | 4606 + .../fullcalendar/fullcalendar.bundle.css | 1265 + .../fullcalendar/fullcalendar.bundle.js | 14990 ++ public/assets/vendors/custom/gmaps/gmaps.js | 2409 + .../custom/jquery-ui/jquery-ui.bundle.css | 836 + .../custom/jquery-ui/jquery-ui.bundle.js | 8 + .../vendors/custom/jqvmap/jqvmap.bundle.css | 43 + .../vendors/custom/jqvmap/jqvmap.bundle.js | 1296 + public/components/base/accordions.html | 4295 + public/components/base/alerts.html | 4308 + public/components/base/blockui.html | 4185 + public/components/base/bootstrap-notify.html | 4535 + public/components/base/dropdown.html | 5390 + public/components/base/lists.html | 5160 + public/components/base/modal.html | 4135 + public/components/base/navs.html | 4654 + public/components/base/popover.html | 3962 + public/components/base/progress.html | 4112 + public/components/base/scrollable.html | 4016 + public/components/base/spinners.html | 3981 + public/components/base/stack.html | 4281 + public/components/base/state.html | 4265 + public/components/base/sweetalert2.html | 3965 + public/components/base/tables.html | 5300 + public/components/base/tabs/bootstrap.html | 4508 + public/components/base/tabs/line.html | 4410 + public/components/base/toastr.html | 4034 + public/components/base/tooltip.html | 3964 + public/components/base/treeview.html | 3984 + public/components/base/typography.html | 4528 + public/components/buttons/base/air.html | 4749 + public/components/buttons/base/default.html | 4771 + public/components/buttons/base/pill.html | 4749 + public/components/buttons/base/square.html | 4749 + public/components/buttons/dropdown.html | 4832 + public/components/buttons/group.html | 5281 + public/components/buttons/icon/flaticon.html | 6159 + .../components/buttons/icon/fontawesome.html | 6159 + .../components/buttons/icon/lineawesome.html | 6159 + public/components/buttons/spinner.html | 3775 + .../calendar/background-events.html | 3913 + public/components/calendar/basic.html | 3849 + .../components/calendar/external-events.html | 4009 + public/components/calendar/google.html | 3913 + public/components/calendar/list-view.html | 3849 + public/components/charts/amcharts/charts.html | 4124 + public/components/charts/amcharts/maps.html | 3989 + .../charts/amcharts/stock-charts.html | 3970 + public/components/charts/flotcharts.html | 4043 + public/components/charts/google-charts.html | 3935 + public/components/charts/morris-charts.html | 3913 + public/components/datatables/api/events.html | 3961 + public/components/datatables/api/methods.html | 4037 + .../datatables/base/auto-column-hide.html | 3782 + .../datatables/base/column-rendering.html | 4002 + .../datatables/base/column-width.html | 3949 + .../components/datatables/base/data-ajax.html | 4004 + .../components/datatables/base/data-json.html | 4004 + .../datatables/base/data-local.html | 4004 + .../datatables/base/html-table.html | 7698 ++ .../datatables/base/local-sort.html | 4001 + .../datatables/base/record-selection.html | 4324 + .../datatables/base/responsive-columns.html | 3949 + .../datatables/base/row-details.html | 3952 + .../datatables/base/translation.html | 3950 + .../datatables/child/data-ajax.html | 3949 + .../datatables/child/data-local.html | 3949 + public/components/datatables/locked/both.html | 3949 + .../datatables/locked/html-table.html | 7698 ++ public/components/datatables/locked/left.html | 3949 + .../components/datatables/locked/right.html | 3949 + .../components/datatables/scrolling/both.html | 3949 + .../datatables/scrolling/horizontal.html | 3949 + .../datatables/scrolling/vertical.html | 3949 + public/components/forms/controls/base.html | 4720 + .../forms/controls/checkbox-radio.html | 4525 + .../forms/controls/input-group.html | 4832 + public/components/forms/controls/switch.html | 4598 + .../components/forms/layouts/action-bars.html | 4444 + .../forms/layouts/default-forms.html | 4445 + .../forms/layouts/multi-column-forms.html | 4351 + .../forms/validation/form-controls.html | 4346 + .../forms/validation/form-widgets.html | 4169 + .../components/forms/validation/states.html | 4889 + public/components/forms/widgets/autosize.html | 3867 + .../forms/widgets/bootstrap-datepicker.html | 4110 + .../widgets/bootstrap-daterangepicker.html | 4088 + .../widgets/bootstrap-datetimepicker.html | 4133 + .../forms/widgets/bootstrap-markdown.html | 3978 + .../forms/widgets/bootstrap-maxlength.html | 4003 + .../bootstrap-multipleselectsplitter.html | 4030 + .../forms/widgets/bootstrap-select.html | 4978 + .../forms/widgets/bootstrap-switch.html | 4023 + .../forms/widgets/bootstrap-timepicker.html | 4071 + .../forms/widgets/bootstrap-touchspin.html | 4047 + .../components/forms/widgets/clipboard.html | 3909 + public/components/forms/widgets/dropzone.html | 3904 + .../forms/widgets/form-repeater.html | 4264 + .../components/forms/widgets/input-mask.html | 3968 + .../forms/widgets/ion-range-slider.html | 3929 + .../components/forms/widgets/nouislider.html | 4053 + .../components/forms/widgets/recaptcha.html | 3926 + public/components/forms/widgets/select2.html | 6830 + .../components/forms/widgets/summernote.html | 3978 + .../components/forms/widgets/typeahead.html | 4066 + public/components/forms/wizard/wizard-1.html | 5534 + public/components/forms/wizard/wizard-2.html | 5183 + public/components/forms/wizard/wizard-3.html | 5476 + public/components/forms/wizard/wizard-4.html | 5464 + public/components/icons/flaticon.html | 5645 + public/components/icons/fontawesome.html | 11947 ++ public/components/icons/lineawesome.html | 10791 ++ public/components/icons/socicons.html | 5561 + public/components/maps/google-maps.html | 4023 + public/components/maps/jqvmap.html | 3925 + public/components/portlets/advanced.html | 5105 + public/components/portlets/base.html | 4216 + public/components/portlets/creative.html | 4165 + public/components/portlets/draggable.html | 4358 + public/components/portlets/tabbed.html | 4522 + public/components/portlets/tools.html | 4333 + public/components/timeline/timeline-1.html | 4251 + public/components/timeline/timeline-2.html | 4279 + public/components/utils/idle-timer.html | 3937 + public/components/utils/session-timeout.html | 3839 + public/components/widgets/chart.html | 5955 + public/components/widgets/general.html | 7369 + public/header/actions.html | 3855 + public/header/profile.html | 4177 + public/index.php | 39 + .../pricing-tables/pricing-table-1.html | 4065 + .../pricing-tables/pricing-table-2.html | 4070 + .../pricing-tables/pricing-table-3.html | 3945 + .../pricing-tables/pricing-table-4.html | 4248 + public/snippets/pages/errors/error-1.html | 67 + public/snippets/pages/errors/error-2.html | 67 + public/snippets/pages/errors/error-3.html | 75 + public/snippets/pages/errors/error-4.html | 68 + public/snippets/pages/errors/error-5.html | 74 + public/snippets/pages/errors/error-6.html | 69 + public/snippets/pages/user/login-1.html | 199 + public/snippets/pages/user/login-2.html | 183 + public/snippets/pages/user/login-3.html | 183 + public/snippets/pages/user/login-4.html | 183 + public/snippets/pages/user/login-5.html | 194 + src/Command/UserCreateCommand.php | 70 + src/Controller/.gitignore | 0 src/Controller/HomeController.php | 15 + src/Controller/SecurityController.php | 28 + src/Controller/UserController.php | 15 + src/DataFixtures/.gitignore | 0 src/DataFixtures/UserFixtures.php | 20 + src/Entity/.gitignore | 0 src/Entity/Role.php | 114 + src/Entity/User.php | 231 + src/Kernel.php | 61 + src/Menu/Collection.php | 71 + src/Menu/Generator.php | 158 + src/Menu/Item.php | 138 + src/Migrations/.gitignore | 0 src/Ramcar/BaseController.php | 33 + src/Repository/.gitignore | 0 symfony.lock | 251 + templates/base.html.twig | 12 + templates/home.html.twig | 4852 + templates/login.html.twig | 176 + templates/menu.html.twig | 59 + 396 files changed, 791059 insertions(+) create mode 100644 .env.dist create mode 100644 .gitignore create mode 100755 bin/console create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/bundles.php create mode 100644 config/menu.yaml create mode 100644 config/packages/dev/routing.yaml create mode 100644 config/packages/dev/web_profiler.yaml create mode 100644 config/packages/doctrine.yaml create mode 100644 config/packages/doctrine_migrations.yaml create mode 100644 config/packages/framework.yaml create mode 100644 config/packages/prod/doctrine.yaml create mode 100644 config/packages/routing.yaml create mode 100644 config/packages/security.yaml create mode 100644 config/packages/test/framework.yaml create mode 100644 config/packages/test/web_profiler.yaml create mode 100644 config/packages/twig.yaml create mode 100644 config/routes.yaml create mode 100644 config/routes/annotations.yaml create mode 100644 config/routes/dev/twig.yaml create mode 100644 config/routes/dev/web_profiler.yaml create mode 100644 config/services.yaml create mode 100644 public/assets/app/js/dashboard.js create mode 100644 public/assets/app/js/layout-builder.js create mode 100644 public/assets/app/media/img/bg/bg-1.jpg create mode 100644 public/assets/app/media/img/bg/bg-2.jpg create mode 100644 public/assets/app/media/img/bg/bg-3.jpg create mode 100644 public/assets/app/media/img/bg/bg-4.jpg create mode 100644 public/assets/app/media/img/bg/bg-5.jpg create mode 100644 public/assets/app/media/img/blog/blog1.jpg create mode 100644 public/assets/app/media/img/blog/blog2.jpg create mode 100644 public/assets/app/media/img/blog/blog3.jpg create mode 100644 public/assets/app/media/img/blog/blog4.jpg create mode 100644 public/assets/app/media/img/blog/blog5.jpg create mode 100644 public/assets/app/media/img/client-logos/logo1.png create mode 100644 public/assets/app/media/img/client-logos/logo2.png create mode 100644 public/assets/app/media/img/client-logos/logo3.png create mode 100644 public/assets/app/media/img/client-logos/logo4.png create mode 100644 public/assets/app/media/img/client-logos/logo5.png create mode 100644 public/assets/app/media/img/envato/screen1.jpg create mode 100644 public/assets/app/media/img/envato/screen2.jpg create mode 100644 public/assets/app/media/img/error/bg1.jpg create mode 100644 public/assets/app/media/img/error/bg2.jpg create mode 100644 public/assets/app/media/img/error/bg3.jpg create mode 100644 public/assets/app/media/img/error/bg4.jpg create mode 100644 public/assets/app/media/img/error/bg5.jpg create mode 100644 public/assets/app/media/img/error/bg6.jpg create mode 100644 public/assets/app/media/img/files/css.svg create mode 100644 public/assets/app/media/img/files/csv.svg create mode 100644 public/assets/app/media/img/files/doc.svg create mode 100644 public/assets/app/media/img/files/html.svg create mode 100644 public/assets/app/media/img/files/javascript.svg create mode 100644 public/assets/app/media/img/files/jpg.svg create mode 100644 public/assets/app/media/img/files/mp4.svg create mode 100644 public/assets/app/media/img/files/pdf.svg create mode 100644 public/assets/app/media/img/files/xml.svg create mode 100644 public/assets/app/media/img/files/zip.svg create mode 100644 public/assets/app/media/img/icons/exchange.svg create mode 100644 public/assets/app/media/img/icons/logout.svg create mode 100644 public/assets/app/media/img/icons/question.svg create mode 100644 public/assets/app/media/img/icons/warning.svg create mode 100644 public/assets/app/media/img/logos/logo-1.png create mode 100644 public/assets/app/media/img/logos/logo-2.png create mode 100644 public/assets/app/media/img/logos/logo-3.png create mode 100644 public/assets/app/media/img/misc/notification_bg.jpg create mode 100644 public/assets/app/media/img/misc/quick_actions_bg.jpg create mode 100644 public/assets/app/media/img/misc/user_profile_bg.jpg create mode 100644 public/assets/app/media/img/products/product1.jpg create mode 100644 public/assets/app/media/img/products/product10.jpg create mode 100644 public/assets/app/media/img/products/product11.jpg create mode 100644 public/assets/app/media/img/products/product2.jpg create mode 100644 public/assets/app/media/img/products/product3.jpg create mode 100644 public/assets/app/media/img/products/product4.jpg create mode 100644 public/assets/app/media/img/products/product5.jpg create mode 100644 public/assets/app/media/img/products/product6.jpg create mode 100644 public/assets/app/media/img/products/product7.jpg create mode 100644 public/assets/app/media/img/products/product8.jpg create mode 100644 public/assets/app/media/img/products/product9.jpg create mode 100644 public/assets/app/media/img/users/100_1.jpg create mode 100644 public/assets/app/media/img/users/100_10.jpg create mode 100644 public/assets/app/media/img/users/100_11.jpg create mode 100644 public/assets/app/media/img/users/100_12.jpg create mode 100644 public/assets/app/media/img/users/100_13.jpg create mode 100644 public/assets/app/media/img/users/100_14.jpg create mode 100644 public/assets/app/media/img/users/100_2.jpg create mode 100644 public/assets/app/media/img/users/100_3.jpg create mode 100644 public/assets/app/media/img/users/100_4.jpg create mode 100644 public/assets/app/media/img/users/100_5.jpg create mode 100644 public/assets/app/media/img/users/100_6.jpg create mode 100644 public/assets/app/media/img/users/100_7.jpg create mode 100644 public/assets/app/media/img/users/100_8.jpg create mode 100644 public/assets/app/media/img/users/100_9.jpg create mode 100644 public/assets/app/media/img/users/300_1.jpg create mode 100644 public/assets/app/media/img/users/300_10.jpg create mode 100644 public/assets/app/media/img/users/300_11.jpg create mode 100644 public/assets/app/media/img/users/300_12.jpg create mode 100644 public/assets/app/media/img/users/300_13.jpg create mode 100644 public/assets/app/media/img/users/300_14.jpg create mode 100644 public/assets/app/media/img/users/300_2.jpg create mode 100644 public/assets/app/media/img/users/300_3.jpg create mode 100644 public/assets/app/media/img/users/300_4.jpg create mode 100644 public/assets/app/media/img/users/300_5.jpg create mode 100644 public/assets/app/media/img/users/300_6.jpg create mode 100644 public/assets/app/media/img/users/300_7.jpg create mode 100644 public/assets/app/media/img/users/300_8.jpg create mode 100644 public/assets/app/media/img/users/300_9.jpg create mode 100644 public/assets/app/media/img/users/user1.jpg create mode 100644 public/assets/app/media/img/users/user2.jpg create mode 100644 public/assets/app/media/img/users/user3.jpg create mode 100644 public/assets/app/media/img/users/user4.jpg create mode 100644 public/assets/app/media/img/users/user5.jpg create mode 100644 public/assets/demo/default/base/scripts.bundle.js create mode 100644 public/assets/demo/default/base/style.bundle.css create mode 100644 public/assets/demo/default/custom/components/base/blockui.js create mode 100644 public/assets/demo/default/custom/components/base/bootstrap-notify.js create mode 100644 public/assets/demo/default/custom/components/base/dropdown.js create mode 100644 public/assets/demo/default/custom/components/base/scrollable.js create mode 100644 public/assets/demo/default/custom/components/base/sweetalert2.js create mode 100644 public/assets/demo/default/custom/components/base/toastr.js create mode 100644 public/assets/demo/default/custom/components/base/treeview.js create mode 100644 public/assets/demo/default/custom/components/calendar/background-events.js create mode 100644 public/assets/demo/default/custom/components/calendar/basic.js create mode 100644 public/assets/demo/default/custom/components/calendar/external-events.js create mode 100644 public/assets/demo/default/custom/components/calendar/google.js create mode 100644 public/assets/demo/default/custom/components/calendar/list-view.js create mode 100644 public/assets/demo/default/custom/components/charts/amcharts/charts.js create mode 100644 public/assets/demo/default/custom/components/charts/amcharts/maps.js create mode 100644 public/assets/demo/default/custom/components/charts/amcharts/stock-charts.js create mode 100644 public/assets/demo/default/custom/components/charts/flotcharts.js create mode 100644 public/assets/demo/default/custom/components/charts/google-charts.js create mode 100644 public/assets/demo/default/custom/components/charts/morris-charts.js create mode 100644 public/assets/demo/default/custom/components/datatables/api/events.js create mode 100644 public/assets/demo/default/custom/components/datatables/api/methods.js create mode 100644 public/assets/demo/default/custom/components/datatables/base/column-rendering.js create mode 100644 public/assets/demo/default/custom/components/datatables/base/column-width.js create mode 100644 public/assets/demo/default/custom/components/datatables/base/data-ajax.js create mode 100644 public/assets/demo/default/custom/components/datatables/base/data-json.js create mode 100644 public/assets/demo/default/custom/components/datatables/base/data-local.js create mode 100644 public/assets/demo/default/custom/components/datatables/base/html-table.js create mode 100644 public/assets/demo/default/custom/components/datatables/base/local-sort.js create mode 100644 public/assets/demo/default/custom/components/datatables/base/record-selection.js create mode 100644 public/assets/demo/default/custom/components/datatables/base/responsive-columns.js create mode 100644 public/assets/demo/default/custom/components/datatables/base/row-details.js create mode 100644 public/assets/demo/default/custom/components/datatables/base/translation.js create mode 100644 public/assets/demo/default/custom/components/datatables/child/data-ajax.js create mode 100644 public/assets/demo/default/custom/components/datatables/child/data-local.js create mode 100644 public/assets/demo/default/custom/components/datatables/locked/both.js create mode 100644 public/assets/demo/default/custom/components/datatables/locked/html-table.js create mode 100644 public/assets/demo/default/custom/components/datatables/locked/left.js create mode 100644 public/assets/demo/default/custom/components/datatables/locked/right.js create mode 100644 public/assets/demo/default/custom/components/datatables/scrolling/both.js create mode 100644 public/assets/demo/default/custom/components/datatables/scrolling/horizontal.js create mode 100644 public/assets/demo/default/custom/components/datatables/scrolling/vertical.js create mode 100644 public/assets/demo/default/custom/components/forms/validation/form-controls.js create mode 100644 public/assets/demo/default/custom/components/forms/validation/form-widgets.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/autosize.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/bootstrap-datepicker.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/bootstrap-daterangepicker.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/bootstrap-datetimepicker.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/bootstrap-markdown.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/bootstrap-maxlength.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/bootstrap-multipleselectsplitter.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/bootstrap-select.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/bootstrap-switch.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/bootstrap-timepicker.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/bootstrap-touchspin.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/clipboard.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/dropzone.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/form-repeater.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/google-recaptcha.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/input-mask.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/ion-range-slider.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/nouislider.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/select2.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/summernote.js create mode 100644 public/assets/demo/default/custom/components/forms/widgets/typeahead.js create mode 100644 public/assets/demo/default/custom/components/forms/wizard/wizard.js create mode 100644 public/assets/demo/default/custom/components/maps/google-maps.js create mode 100644 public/assets/demo/default/custom/components/maps/jqvmap.js create mode 100644 public/assets/demo/default/custom/components/maps/jvectormap.js create mode 100644 public/assets/demo/default/custom/components/portlets/draggable.js create mode 100644 public/assets/demo/default/custom/components/portlets/tools.js create mode 100644 public/assets/demo/default/custom/components/utils/idle-timer.js create mode 100644 public/assets/demo/default/custom/components/utils/session-timeout.js create mode 100644 public/assets/demo/default/custom/header/actions.js create mode 100644 public/assets/demo/default/media/img/logo/favicon.ico create mode 100644 public/assets/demo/default/media/img/logo/logo.png create mode 100644 public/assets/demo/default/media/img/logo/logo_compact.png create mode 100644 public/assets/demo/default/media/img/logo/logo_default_dark.png create mode 100644 public/assets/demo/default/media/img/logo/logo_default_light.png create mode 100644 public/assets/demo/default/media/img/misc/notification_bg.jpg create mode 100644 public/assets/demo/default/media/img/misc/quick_actions_bg.jpg create mode 100644 public/assets/demo/default/media/img/misc/user_profile_bg.jpg create mode 100644 public/assets/snippets/pages/user/login.js create mode 100644 public/assets/vendors/base/fonts/flaticon/Flaticon.eot create mode 100644 public/assets/vendors/base/fonts/flaticon/Flaticon.svg create mode 100644 public/assets/vendors/base/fonts/flaticon/Flaticon.ttf create mode 100644 public/assets/vendors/base/fonts/flaticon/Flaticon.woff create mode 100644 public/assets/vendors/base/fonts/font-awesome/FontAwesome.otf create mode 100644 public/assets/vendors/base/fonts/font-awesome/fontawesome-webfont.eot create mode 100644 public/assets/vendors/base/fonts/font-awesome/fontawesome-webfont.svg create mode 100644 public/assets/vendors/base/fonts/font-awesome/fontawesome-webfont.ttf create mode 100644 public/assets/vendors/base/fonts/font-awesome/fontawesome-webfont.woff create mode 100644 public/assets/vendors/base/fonts/font-awesome/fontawesome-webfont.woff2 create mode 100644 public/assets/vendors/base/fonts/line-awesome/line-awesome.eot create mode 100644 public/assets/vendors/base/fonts/line-awesome/line-awesome.svg create mode 100644 public/assets/vendors/base/fonts/line-awesome/line-awesome.ttf create mode 100644 public/assets/vendors/base/fonts/line-awesome/line-awesome.woff create mode 100644 public/assets/vendors/base/fonts/line-awesome/line-awesome.woff2 create mode 100644 public/assets/vendors/base/fonts/metronic/Metronic_fda1334c35d0f5fe2afb3afebbb6774a.eot create mode 100644 public/assets/vendors/base/fonts/metronic/Metronic_fda1334c35d0f5fe2afb3afebbb6774a.svg create mode 100644 public/assets/vendors/base/fonts/metronic/Metronic_fda1334c35d0f5fe2afb3afebbb6774a.ttf create mode 100644 public/assets/vendors/base/fonts/metronic/Metronic_fda1334c35d0f5fe2afb3afebbb6774a.woff create mode 100644 public/assets/vendors/base/fonts/metronic/Metronic_fda1334c35d0f5fe2afb3afebbb6774a.woff2 create mode 100644 public/assets/vendors/base/fonts/socicon/socicon.eot create mode 100644 public/assets/vendors/base/fonts/socicon/socicon.svg create mode 100644 public/assets/vendors/base/fonts/socicon/socicon.ttf create mode 100644 public/assets/vendors/base/fonts/socicon/socicon.woff create mode 100644 public/assets/vendors/base/fonts/summernote/summernote.eot create mode 100644 public/assets/vendors/base/fonts/summernote/summernote.ttf create mode 100644 public/assets/vendors/base/fonts/summernote/summernote.woff create mode 100644 public/assets/vendors/base/images/ion-rangeslider/sprite-skin-flat.png create mode 100644 public/assets/vendors/base/images/jstree/32px.png create mode 100644 public/assets/vendors/base/images/jstree/40px.png create mode 100644 public/assets/vendors/base/images/jstree/throbber.gif create mode 100644 public/assets/vendors/base/images/malihu-custom-scrollbar-plugin/mCSB_buttons.png create mode 100644 public/assets/vendors/base/vendors.bundle.css create mode 100644 public/assets/vendors/base/vendors.bundle.js create mode 100644 public/assets/vendors/custom/flot/flot.bundle.js create mode 100644 public/assets/vendors/custom/fullcalendar/fullcalendar.bundle.css create mode 100644 public/assets/vendors/custom/fullcalendar/fullcalendar.bundle.js create mode 100644 public/assets/vendors/custom/gmaps/gmaps.js create mode 100644 public/assets/vendors/custom/jquery-ui/jquery-ui.bundle.css create mode 100644 public/assets/vendors/custom/jquery-ui/jquery-ui.bundle.js create mode 100644 public/assets/vendors/custom/jqvmap/jqvmap.bundle.css create mode 100644 public/assets/vendors/custom/jqvmap/jqvmap.bundle.js create mode 100644 public/components/base/accordions.html create mode 100644 public/components/base/alerts.html create mode 100644 public/components/base/blockui.html create mode 100644 public/components/base/bootstrap-notify.html create mode 100644 public/components/base/dropdown.html create mode 100644 public/components/base/lists.html create mode 100644 public/components/base/modal.html create mode 100644 public/components/base/navs.html create mode 100644 public/components/base/popover.html create mode 100644 public/components/base/progress.html create mode 100644 public/components/base/scrollable.html create mode 100644 public/components/base/spinners.html create mode 100644 public/components/base/stack.html create mode 100644 public/components/base/state.html create mode 100644 public/components/base/sweetalert2.html create mode 100644 public/components/base/tables.html create mode 100644 public/components/base/tabs/bootstrap.html create mode 100644 public/components/base/tabs/line.html create mode 100644 public/components/base/toastr.html create mode 100644 public/components/base/tooltip.html create mode 100644 public/components/base/treeview.html create mode 100644 public/components/base/typography.html create mode 100644 public/components/buttons/base/air.html create mode 100644 public/components/buttons/base/default.html create mode 100644 public/components/buttons/base/pill.html create mode 100644 public/components/buttons/base/square.html create mode 100644 public/components/buttons/dropdown.html create mode 100644 public/components/buttons/group.html create mode 100644 public/components/buttons/icon/flaticon.html create mode 100644 public/components/buttons/icon/fontawesome.html create mode 100644 public/components/buttons/icon/lineawesome.html create mode 100644 public/components/buttons/spinner.html create mode 100644 public/components/calendar/background-events.html create mode 100644 public/components/calendar/basic.html create mode 100644 public/components/calendar/external-events.html create mode 100644 public/components/calendar/google.html create mode 100644 public/components/calendar/list-view.html create mode 100644 public/components/charts/amcharts/charts.html create mode 100644 public/components/charts/amcharts/maps.html create mode 100644 public/components/charts/amcharts/stock-charts.html create mode 100644 public/components/charts/flotcharts.html create mode 100644 public/components/charts/google-charts.html create mode 100644 public/components/charts/morris-charts.html create mode 100644 public/components/datatables/api/events.html create mode 100644 public/components/datatables/api/methods.html create mode 100644 public/components/datatables/base/auto-column-hide.html create mode 100644 public/components/datatables/base/column-rendering.html create mode 100644 public/components/datatables/base/column-width.html create mode 100644 public/components/datatables/base/data-ajax.html create mode 100644 public/components/datatables/base/data-json.html create mode 100644 public/components/datatables/base/data-local.html create mode 100644 public/components/datatables/base/html-table.html create mode 100644 public/components/datatables/base/local-sort.html create mode 100644 public/components/datatables/base/record-selection.html create mode 100644 public/components/datatables/base/responsive-columns.html create mode 100644 public/components/datatables/base/row-details.html create mode 100644 public/components/datatables/base/translation.html create mode 100644 public/components/datatables/child/data-ajax.html create mode 100644 public/components/datatables/child/data-local.html create mode 100644 public/components/datatables/locked/both.html create mode 100644 public/components/datatables/locked/html-table.html create mode 100644 public/components/datatables/locked/left.html create mode 100644 public/components/datatables/locked/right.html create mode 100644 public/components/datatables/scrolling/both.html create mode 100644 public/components/datatables/scrolling/horizontal.html create mode 100644 public/components/datatables/scrolling/vertical.html create mode 100644 public/components/forms/controls/base.html create mode 100644 public/components/forms/controls/checkbox-radio.html create mode 100644 public/components/forms/controls/input-group.html create mode 100644 public/components/forms/controls/switch.html create mode 100644 public/components/forms/layouts/action-bars.html create mode 100644 public/components/forms/layouts/default-forms.html create mode 100644 public/components/forms/layouts/multi-column-forms.html create mode 100644 public/components/forms/validation/form-controls.html create mode 100644 public/components/forms/validation/form-widgets.html create mode 100644 public/components/forms/validation/states.html create mode 100644 public/components/forms/widgets/autosize.html create mode 100644 public/components/forms/widgets/bootstrap-datepicker.html create mode 100644 public/components/forms/widgets/bootstrap-daterangepicker.html create mode 100644 public/components/forms/widgets/bootstrap-datetimepicker.html create mode 100644 public/components/forms/widgets/bootstrap-markdown.html create mode 100644 public/components/forms/widgets/bootstrap-maxlength.html create mode 100644 public/components/forms/widgets/bootstrap-multipleselectsplitter.html create mode 100644 public/components/forms/widgets/bootstrap-select.html create mode 100644 public/components/forms/widgets/bootstrap-switch.html create mode 100644 public/components/forms/widgets/bootstrap-timepicker.html create mode 100644 public/components/forms/widgets/bootstrap-touchspin.html create mode 100644 public/components/forms/widgets/clipboard.html create mode 100644 public/components/forms/widgets/dropzone.html create mode 100644 public/components/forms/widgets/form-repeater.html create mode 100644 public/components/forms/widgets/input-mask.html create mode 100644 public/components/forms/widgets/ion-range-slider.html create mode 100644 public/components/forms/widgets/nouislider.html create mode 100644 public/components/forms/widgets/recaptcha.html create mode 100644 public/components/forms/widgets/select2.html create mode 100644 public/components/forms/widgets/summernote.html create mode 100644 public/components/forms/widgets/typeahead.html create mode 100644 public/components/forms/wizard/wizard-1.html create mode 100644 public/components/forms/wizard/wizard-2.html create mode 100644 public/components/forms/wizard/wizard-3.html create mode 100644 public/components/forms/wizard/wizard-4.html create mode 100644 public/components/icons/flaticon.html create mode 100644 public/components/icons/fontawesome.html create mode 100644 public/components/icons/lineawesome.html create mode 100644 public/components/icons/socicons.html create mode 100644 public/components/maps/google-maps.html create mode 100644 public/components/maps/jqvmap.html create mode 100644 public/components/portlets/advanced.html create mode 100644 public/components/portlets/base.html create mode 100644 public/components/portlets/creative.html create mode 100644 public/components/portlets/draggable.html create mode 100644 public/components/portlets/tabbed.html create mode 100644 public/components/portlets/tools.html create mode 100644 public/components/timeline/timeline-1.html create mode 100644 public/components/timeline/timeline-2.html create mode 100644 public/components/utils/idle-timer.html create mode 100644 public/components/utils/session-timeout.html create mode 100644 public/components/widgets/chart.html create mode 100644 public/components/widgets/general.html create mode 100644 public/header/actions.html create mode 100644 public/header/profile.html create mode 100644 public/index.php create mode 100644 public/snippets/general/pricing-tables/pricing-table-1.html create mode 100644 public/snippets/general/pricing-tables/pricing-table-2.html create mode 100644 public/snippets/general/pricing-tables/pricing-table-3.html create mode 100644 public/snippets/general/pricing-tables/pricing-table-4.html create mode 100644 public/snippets/pages/errors/error-1.html create mode 100644 public/snippets/pages/errors/error-2.html create mode 100644 public/snippets/pages/errors/error-3.html create mode 100644 public/snippets/pages/errors/error-4.html create mode 100644 public/snippets/pages/errors/error-5.html create mode 100644 public/snippets/pages/errors/error-6.html create mode 100644 public/snippets/pages/user/login-1.html create mode 100644 public/snippets/pages/user/login-2.html create mode 100644 public/snippets/pages/user/login-3.html create mode 100644 public/snippets/pages/user/login-4.html create mode 100644 public/snippets/pages/user/login-5.html create mode 100644 src/Command/UserCreateCommand.php create mode 100644 src/Controller/.gitignore create mode 100644 src/Controller/HomeController.php create mode 100644 src/Controller/SecurityController.php create mode 100644 src/Controller/UserController.php create mode 100644 src/DataFixtures/.gitignore create mode 100644 src/DataFixtures/UserFixtures.php create mode 100644 src/Entity/.gitignore create mode 100644 src/Entity/Role.php create mode 100644 src/Entity/User.php create mode 100644 src/Kernel.php create mode 100644 src/Menu/Collection.php create mode 100644 src/Menu/Generator.php create mode 100644 src/Menu/Item.php create mode 100644 src/Migrations/.gitignore create mode 100644 src/Ramcar/BaseController.php create mode 100644 src/Repository/.gitignore create mode 100644 symfony.lock create mode 100644 templates/base.html.twig create mode 100644 templates/home.html.twig create mode 100644 templates/login.html.twig create mode 100644 templates/menu.html.twig diff --git a/.env.dist b/.env.dist new file mode 100644 index 00000000..929f4618 --- /dev/null +++ b/.env.dist @@ -0,0 +1,17 @@ +# This file is a "template" of which env vars need to be defined for your application +# Copy this file to .env file for development, create environment variables when deploying to production +# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration + +###> symfony/framework-bundle ### +APP_ENV=dev +APP_SECRET=b344cd6cd151ae1d61403ed55806c5ce +#TRUSTED_PROXIES=127.0.0.1,127.0.0.2 +#TRUSTED_HOSTS=localhost,example.com +###< symfony/framework-bundle ### + +###> doctrine/doctrine-bundle ### +# Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url +# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" +# Configure your db driver and server_version in config/packages/doctrine.yaml +DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name +###< doctrine/doctrine-bundle ### diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..a0dbcb06 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ + +###> symfony/framework-bundle ### +.env +/public/bundles/ +/var/ +/vendor/ +###< symfony/framework-bundle ### diff --git a/bin/console b/bin/console new file mode 100755 index 00000000..d026a6d2 --- /dev/null +++ b/bin/console @@ -0,0 +1,39 @@ +#!/usr/bin/env php +load(__DIR__.'/../.env'); +} + +$input = new ArgvInput(); +$env = $input->getParameterOption(['--env', '-e'], $_SERVER['APP_ENV'] ?? 'dev'); +$debug = ($_SERVER['APP_DEBUG'] ?? ('prod' !== $env)) && !$input->hasParameterOption(['--no-debug', '']); + +if ($debug) { + umask(0000); + + if (class_exists(Debug::class)) { + Debug::enable(); + } +} + +$kernel = new Kernel($env, $debug); +$application = new Application($kernel); +$application->run($input); diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..4b4704bc --- /dev/null +++ b/composer.json @@ -0,0 +1,69 @@ +{ + "type": "project", + "license": "proprietary", + "require": { + "php": "^7.1.3", + "ext-iconv": "*", + "sensio/framework-extra-bundle": "^5.1", + "symfony/console": "^4.0", + "symfony/debug": "^4.0", + "symfony/flex": "^1.0", + "symfony/framework-bundle": "^4.0", + "symfony/lts": "^4@dev", + "symfony/maker-bundle": "^1.0", + "symfony/orm-pack": "^1.0", + "symfony/profiler-pack": "^1.0", + "symfony/security-bundle": "^4.0", + "symfony/twig-bundle": "^4.0", + "symfony/yaml": "^4.0" + }, + "require-dev": { + "doctrine/doctrine-fixtures-bundle": "^3.0", + "symfony/dotenv": "^4.0", + "symfony/thanks": "^1.0" + }, + "config": { + "preferred-install": { + "*": "dist" + }, + "sort-packages": true + }, + "autoload": { + "psr-4": { + "App\\": "src/", + "Catalyst\\": "catalyst-libs/" + } + }, + "autoload-dev": { + "psr-4": { + "App\\Tests\\": "tests/" + } + }, + "replace": { + "symfony/polyfill-iconv": "*", + "symfony/polyfill-php71": "*", + "symfony/polyfill-php70": "*", + "symfony/polyfill-php56": "*" + }, + "scripts": { + "auto-scripts": { + "cache:clear": "symfony-cmd", + "assets:install --symlink --relative %PUBLIC_DIR%": "symfony-cmd" + }, + "post-install-cmd": [ + "@auto-scripts" + ], + "post-update-cmd": [ + "@auto-scripts" + ] + }, + "conflict": { + "symfony/symfony": "*" + }, + "extra": { + "symfony": { + "id": "01C2S930830GN7Q2AE2C3DZVAD", + "allow-contrib": false + } + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 00000000..0557ff40 --- /dev/null +++ b/composer.lock @@ -0,0 +1,3706 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "content-hash": "ae93696c5d16286657ac856844efd058", + "packages": [ + { + "name": "doctrine/annotations", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", + "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "php": "^7.1" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "time": "2017-12-06T07:11:42+00:00" + }, + { + "name": "doctrine/cache", + "version": "v1.7.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/b3217d58609e9c8e661cd41357a54d926c4a2a1a", + "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a", + "shasum": "" + }, + "require": { + "php": "~7.1" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^5.7", + "predis/predis": "~1.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Caching library offering an object-oriented API for many cache backends", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "cache", + "caching" + ], + "time": "2017-08-25T07:02:50+00:00" + }, + { + "name": "doctrine/collections", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf", + "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "~0.1@dev", + "phpunit/phpunit": "^5.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Collections\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Collections Abstraction library", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "array", + "collections", + "iterator" + ], + "time": "2017-07-22T10:37:32+00:00" + }, + { + "name": "doctrine/common", + "version": "v2.8.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/f68c297ce6455e8fd794aa8ffaf9fa458f6ade66", + "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66", + "shasum": "" + }, + "require": { + "doctrine/annotations": "1.*", + "doctrine/cache": "1.*", + "doctrine/collections": "1.*", + "doctrine/inflector": "1.*", + "doctrine/lexer": "1.*", + "php": "~7.1" + }, + "require-dev": { + "phpunit/phpunit": "^5.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Common Library for Doctrine projects", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "collections", + "eventmanager", + "persistence", + "spl" + ], + "time": "2017-08-31T08:43:38+00:00" + }, + { + "name": "doctrine/dbal", + "version": "v2.6.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/e3eed9b1facbb0ced3a0995244843a189e7d1b13", + "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13", + "shasum": "" + }, + "require": { + "doctrine/common": "^2.7.1", + "ext-pdo": "*", + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^5.4.6", + "phpunit/phpunit-mock-objects": "!=3.2.4,!=3.2.5", + "symfony/console": "2.*||^3.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\DBAL\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Database Abstraction Layer", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "persistence", + "queryobject" + ], + "time": "2017-11-19T13:38:54+00:00" + }, + { + "name": "doctrine/doctrine-bundle", + "version": "1.8.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "eb6e4fb904a459be28872765ab6e2d246aac7c87" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/eb6e4fb904a459be28872765ab6e2d246aac7c87", + "reference": "eb6e4fb904a459be28872765ab6e2d246aac7c87", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.5.12", + "doctrine/doctrine-cache-bundle": "~1.2", + "jdorn/sql-formatter": "^1.2.16", + "php": "^5.5.9|^7.0", + "symfony/console": "~2.7|~3.0|~4.0", + "symfony/dependency-injection": "~2.7|~3.0|~4.0", + "symfony/doctrine-bridge": "~2.7|~3.0|~4.0", + "symfony/framework-bundle": "~2.7|~3.0|~4.0" + }, + "conflict": { + "symfony/http-foundation": "<2.6" + }, + "require-dev": { + "doctrine/orm": "~2.3", + "phpunit/phpunit": "^4.8.36|^5.7|^6.4", + "satooshi/php-coveralls": "^1.0", + "symfony/phpunit-bridge": "~2.7|~3.0|~4.0", + "symfony/property-info": "~2.8|~3.0|~4.0", + "symfony/validator": "~2.7|~3.0|~4.0", + "symfony/web-profiler-bundle": "~2.7|~3.0|~4.0", + "symfony/yaml": "~2.7|~3.0|~4.0", + "twig/twig": "~1.26|~2.0" + }, + "suggest": { + "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "symfony/web-profiler-bundle": "To use the data collector." + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\DoctrineBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org/" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony DoctrineBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "orm", + "persistence" + ], + "time": "2017-11-24T13:09:19+00:00" + }, + { + "name": "doctrine/doctrine-cache-bundle", + "version": "1.3.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineCacheBundle.git", + "reference": "9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1", + "reference": "9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.4.2", + "doctrine/inflector": "~1.0", + "php": ">=5.3.2", + "symfony/doctrine-bridge": "~2.2|~3.0|~4.0" + }, + "require-dev": { + "instaclick/coding-standard": "~1.1", + "instaclick/object-calisthenics-sniffs": "dev-master", + "instaclick/symfony2-coding-standard": "dev-remaster", + "phpunit/phpunit": "~4", + "predis/predis": "~0.8", + "satooshi/php-coveralls": "^1.0", + "squizlabs/php_codesniffer": "~1.5", + "symfony/console": "~2.2|~3.0|~4.0", + "symfony/finder": "~2.2|~3.0|~4.0", + "symfony/framework-bundle": "~2.2|~3.0|~4.0", + "symfony/phpunit-bridge": "~2.7|~3.0|~4.0", + "symfony/security-acl": "~2.3|~3.0", + "symfony/validator": "~2.2|~3.0|~4.0", + "symfony/yaml": "~2.2|~3.0|~4.0" + }, + "suggest": { + "symfony/security-acl": "For using this bundle to cache ACLs" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\DoctrineCacheBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Fabio B. Silva", + "email": "fabio.bat.silva@gmail.com" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@hotmail.com" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org/" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Bundle for Doctrine Cache", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "cache", + "caching" + ], + "time": "2017-10-12T17:23:29+00:00" + }, + { + "name": "doctrine/doctrine-migrations-bundle", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", + "reference": "a9e506369f931351a2a6dd2aef588a822802b1b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/a9e506369f931351a2a6dd2aef588a822802b1b7", + "reference": "a9e506369f931351a2a6dd2aef588a822802b1b7", + "shasum": "" + }, + "require": { + "doctrine/doctrine-bundle": "~1.0", + "doctrine/migrations": "^1.1", + "php": ">=5.4.0", + "symfony/framework-bundle": "~2.7|~3.3|~4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\MigrationsBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony DoctrineMigrationsBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "dbal", + "migrations", + "schema" + ], + "time": "2017-11-01T09:13:26+00:00" + }, + { + "name": "doctrine/inflector", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/e11d84c6e018beedd929cff5220969a3c6d1d462", + "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Common String Manipulations with regard to casing and singular/plural rules.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "inflection", + "pluralize", + "singularize", + "string" + ], + "time": "2017-07-22T12:18:28+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", + "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "^6.2.3", + "squizlabs/php_codesniffer": "^3.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2017-07-22T11:58:36+00:00" + }, + { + "name": "doctrine/lexer", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Lexer\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "lexer", + "parser" + ], + "time": "2014-09-09T13:34:57+00:00" + }, + { + "name": "doctrine/migrations", + "version": "v1.6.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/migrations.git", + "reference": "e3faf7c96b8a6084045dedcaf51f74c7834644d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/e3faf7c96b8a6084045dedcaf51f74c7834644d4", + "reference": "e3faf7c96b8a6084045dedcaf51f74c7834644d4", + "shasum": "" + }, + "require": { + "doctrine/dbal": "~2.6", + "ocramius/proxy-manager": "^1.0|^2.0", + "php": "^7.1", + "symfony/console": "~3.3|^4.0", + "symfony/yaml": "~3.3|^4.0" + }, + "require-dev": { + "doctrine/coding-standard": "^1.0", + "doctrine/orm": "~2.5", + "jdorn/sql-formatter": "~1.1", + "mikey179/vfsstream": "^1.6", + "phpunit/phpunit": "~6.2", + "squizlabs/php_codesniffer": "^3.0" + }, + "suggest": { + "jdorn/sql-formatter": "Allows to generate formatted SQL with the diff command." + }, + "bin": [ + "bin/doctrine-migrations" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "v1.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\Migrations\\": "lib/Doctrine/DBAL/Migrations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Michael Simonson", + "email": "contact@mikesimonson.com" + } + ], + "description": "Database Schema migrations using Doctrine DBAL", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "migrations" + ], + "time": "2017-11-24T14:13:17+00:00" + }, + { + "name": "doctrine/orm", + "version": "v2.6.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/doctrine2.git", + "reference": "374e7ace49d864dad8cddbc55346447c8a6a2083" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/374e7ace49d864dad8cddbc55346447c8a6a2083", + "reference": "374e7ace49d864dad8cddbc55346447c8a6a2083", + "shasum": "" + }, + "require": { + "doctrine/annotations": "~1.5", + "doctrine/cache": "~1.6", + "doctrine/collections": "^1.4", + "doctrine/common": "^2.7.1", + "doctrine/dbal": "^2.6", + "doctrine/instantiator": "~1.1", + "ext-pdo": "*", + "php": "^7.1", + "symfony/console": "~3.0|~4.0" + }, + "require-dev": { + "doctrine/coding-standard": "^1.0", + "phpunit/phpunit": "^6.5", + "squizlabs/php_codesniffer": "^3.2", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + }, + "bin": [ + "bin/doctrine" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\ORM\\": "lib/Doctrine/ORM" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "orm" + ], + "time": "2017-12-20T00:38:15+00:00" + }, + { + "name": "jdorn/sql-formatter", + "version": "v1.2.17", + "source": { + "type": "git", + "url": "https://github.com/jdorn/sql-formatter.git", + "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc", + "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "lib" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "http://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/jdorn/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "time": "2014-01-12T16:20:24+00:00" + }, + { + "name": "ocramius/package-versions", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/PackageVersions.git", + "reference": "ad8a245decad4897cc6b432743913dad0d69753c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/ad8a245decad4897cc6b432743913dad0d69753c", + "reference": "ad8a245decad4897cc6b432743913dad0d69753c", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0", + "php": "~7.0" + }, + "require-dev": { + "composer/composer": "^1.3", + "ext-zip": "*", + "humbug/humbug": "dev-master", + "phpunit/phpunit": "^6.4" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "time": "2017-11-24T11:07:03+00:00" + }, + { + "name": "ocramius/proxy-manager", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/ProxyManager.git", + "reference": "81d53b2878f1d1c40ad27270e64b51798485dfc5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/81d53b2878f1d1c40ad27270e64b51798485dfc5", + "reference": "81d53b2878f1d1c40ad27270e64b51798485dfc5", + "shasum": "" + }, + "require": { + "ocramius/package-versions": "^1.1.3", + "php": "^7.2.0", + "zendframework/zend-code": "^3.3.0" + }, + "require-dev": { + "couscous/couscous": "^1.6.1", + "ext-phar": "*", + "humbug/humbug": "1.0.0-RC.0@RC", + "nikic/php-parser": "^3.1.1", + "padraic/phpunit-accelerator": "dev-master@DEV", + "phpbench/phpbench": "^0.12.2", + "phpstan/phpstan": "dev-master#856eb10a81c1d27c701a83f167dc870fd8f4236a as 0.9.999", + "phpstan/phpstan-phpunit": "dev-master#5629c0a1f4a9c417cb1077cf6693ad9753895761", + "phpunit/phpunit": "^6.4.3", + "squizlabs/php_codesniffer": "^2.9.1" + }, + "suggest": { + "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects", + "zendframework/zend-json": "To have the JsonRpc adapter (Remote Object feature)", + "zendframework/zend-soap": "To have the Soap adapter (Remote Object feature)", + "zendframework/zend-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "ProxyManager\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.io/" + } + ], + "description": "A library providing utilities to generate, instantiate and generally operate with Object Proxies", + "homepage": "https://github.com/Ocramius/ProxyManager", + "keywords": [ + "aop", + "lazy loading", + "proxy", + "proxy pattern", + "service proxies" + ], + "time": "2017-11-16T23:22:31+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/log", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2016-10-10T12:19:37+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24", + "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "time": "2017-01-02T13:31:39+00:00" + }, + { + "name": "sensio/framework-extra-bundle", + "version": "v5.1.3", + "source": { + "type": "git", + "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", + "reference": "0696496cb3e2d23add645d424699e5c723238aad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/0696496cb3e2d23add645d424699e5c723238aad", + "reference": "0696496cb3e2d23add645d424699e5c723238aad", + "shasum": "" + }, + "require": { + "doctrine/common": "^2.2", + "symfony/config": "^3.3|^4.0", + "symfony/dependency-injection": "^3.3|^4.0", + "symfony/framework-bundle": "^3.3|^4.0", + "symfony/http-kernel": "^3.3|^4.0" + }, + "require-dev": { + "doctrine/doctrine-bundle": "^1.6", + "doctrine/orm": "^2.5", + "symfony/browser-kit": "^3.3|^4.0", + "symfony/dom-crawler": "^3.3|^4.0", + "symfony/expression-language": "^3.3|^4.0", + "symfony/finder": "^3.3|^4.0", + "symfony/phpunit-bridge": "^3.3|^4.0", + "symfony/psr-http-message-bridge": "^0.3", + "symfony/security-bundle": "^3.3|^4.0", + "symfony/twig-bundle": "^3.3|^4.0", + "symfony/yaml": "^3.3|^4.0", + "twig/twig": "~1.12|~2.0", + "zendframework/zend-diactoros": "^1.3" + }, + "suggest": { + "symfony/expression-language": "", + "symfony/psr-http-message-bridge": "To use the PSR-7 converters", + "symfony/security-bundle": "" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sensio\\Bundle\\FrameworkExtraBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "This bundle provides a way to configure your controllers with annotations", + "keywords": [ + "annotations", + "controllers" + ], + "time": "2017-12-04T18:33:55+00:00" + }, + { + "name": "symfony/cache", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "d00351f230ca037ca13f6fec3411e002043f7421" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/d00351f230ca037ca13f6fec3411e002043f7421", + "reference": "d00351f230ca037ca13f6fec3411e002043f7421", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/cache": "~1.0", + "psr/log": "~1.0", + "psr/simple-cache": "^1.0" + }, + "conflict": { + "symfony/var-dumper": "<3.4" + }, + "provide": { + "psr/cache-implementation": "1.0", + "psr/simple-cache-implementation": "1.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/cache": "~1.6", + "doctrine/dbal": "~2.4", + "predis/predis": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Cache component with PSR-6, PSR-16, and tags", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "time": "2017-12-08T16:11:45+00:00" + }, + { + "name": "symfony/config", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "0356e6d5298e9e72212c0bad65c2f1b49e42d622" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/0356e6d5298e9e72212c0bad65c2f1b49e42d622", + "reference": "0356e6d5298e9e72212c0bad65c2f1b49e42d622", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/filesystem": "~3.4|~4.0" + }, + "conflict": { + "symfony/finder": "<3.4" + }, + "require-dev": { + "symfony/finder": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "time": "2017-12-14T19:48:22+00:00" + }, + { + "name": "symfony/console", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "de8cf039eacdec59d83f7def67e3b8ff5ed46714" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/de8cf039eacdec59d83f7def67e3b8ff5ed46714", + "reference": "de8cf039eacdec59d83f7def67e3b8ff5ed46714", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/process": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2017-12-14T19:48:22+00:00" + }, + { + "name": "symfony/debug", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "8c3e709209ce3b952a31c0f4a31ac7703c3d0226" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/8c3e709209ce3b952a31c0f4a31ac7703c3d0226", + "reference": "8c3e709209ce3b952a31c0f4a31ac7703c3d0226", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": "<3.4" + }, + "require-dev": { + "symfony/http-kernel": "~3.4|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2017-12-12T08:41:51+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "d2fa088b5fd7d429974a36bf1a9846b912d9d124" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/d2fa088b5fd7d429974a36bf1a9846b912d9d124", + "reference": "d2fa088b5fd7d429974a36bf1a9846b912d9d124", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/container": "^1.0" + }, + "conflict": { + "symfony/config": "<3.4", + "symfony/finder": "<3.4", + "symfony/proxy-manager-bridge": "<3.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "psr/container-implementation": "1.0" + }, + "require-dev": { + "symfony/config": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com", + "time": "2017-12-14T19:48:22+00:00" + }, + { + "name": "symfony/doctrine-bridge", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "d14c17af9290634eb1588b75ed64a64ee286ba3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/d14c17af9290634eb1588b75ed64a64ee286ba3e", + "reference": "d14c17af9290634eb1588b75ed64a64ee286ba3e", + "shasum": "" + }, + "require": { + "doctrine/common": "~2.4", + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/dependency-injection": "<3.4" + }, + "require-dev": { + "doctrine/data-fixtures": "1.0.*", + "doctrine/dbal": "~2.4", + "doctrine/orm": "^2.4.5", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/form": "~3.4|~4.0", + "symfony/http-kernel": "~3.4|~4.0", + "symfony/property-access": "~3.4|~4.0", + "symfony/property-info": "~3.4|~4.0", + "symfony/proxy-manager-bridge": "~3.4|~4.0", + "symfony/security": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0", + "symfony/translation": "~3.4|~4.0", + "symfony/validator": "~3.4|~4.0" + }, + "suggest": { + "doctrine/data-fixtures": "", + "doctrine/dbal": "", + "doctrine/orm": "", + "symfony/form": "", + "symfony/property-info": "", + "symfony/validator": "" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Doctrine\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Doctrine Bridge", + "homepage": "https://symfony.com", + "time": "2017-12-09T12:13:31+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "d4face19ed8002eec8280bc1c5ec18130472bf43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d4face19ed8002eec8280bc1c5ec18130472bf43", + "reference": "d4face19ed8002eec8280bc1c5ec18130472bf43", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2017-12-14T19:48:22+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "8c2868641d0c4885eee9c12a89c2b695eb1985cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/8c2868641d0c4885eee9c12a89c2b695eb1985cd", + "reference": "8c2868641d0c4885eee9c12a89c2b695eb1985cd", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2017-12-14T19:48:22+00:00" + }, + { + "name": "symfony/finder", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "c9cdda4dc4a3182d8d6daeebce4a25fef078ea4c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/c9cdda4dc4a3182d8d6daeebce4a25fef078ea4c", + "reference": "c9cdda4dc4a3182d8d6daeebce4a25fef078ea4c", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2017-11-07T14:45:01+00:00" + }, + { + "name": "symfony/flex", + "version": "v1.0.53", + "source": { + "type": "git", + "url": "https://github.com/symfony/flex.git", + "reference": "cc4b1bac464597ce220d4f8208c38c75195e80c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/flex/zipball/cc4b1bac464597ce220d4f8208c38c75195e80c2", + "reference": "cc4b1bac464597ce220d4f8208c38c75195e80c2", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1", + "php": "^7.0" + }, + "require-dev": { + "composer/composer": "^1.4", + "symfony/phpunit-bridge": "^3.2.8" + }, + "type": "composer-plugin", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "class": "Symfony\\Flex\\Flex" + }, + "autoload": { + "psr-4": { + "Symfony\\Flex\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien.potencier@gmail.com" + } + ], + "time": "2017-12-27T16:06:01+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "82e45a486a2cbdab5d43512bea10af1681dcd8e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/82e45a486a2cbdab5d43512bea10af1681dcd8e2", + "reference": "82e45a486a2cbdab5d43512bea10af1681dcd8e2", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": "^7.1.3", + "symfony/cache": "~3.4|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/filesystem": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", + "symfony/http-kernel": "~3.4|~4.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/routing": "~3.4|~4.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.0", + "phpdocumentor/type-resolver": "<0.2.1", + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/asset": "<3.4", + "symfony/console": "<3.4", + "symfony/form": "<3.4", + "symfony/property-info": "<3.4", + "symfony/serializer": "<3.4", + "symfony/stopwatch": "<3.4", + "symfony/translation": "<3.4", + "symfony/validator": "<3.4", + "symfony/workflow": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/cache": "~1.0", + "fig/link-util": "^1.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0", + "symfony/asset": "~3.4|~4.0", + "symfony/browser-kit": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/css-selector": "~3.4|~4.0", + "symfony/dom-crawler": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/form": "~3.4|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "~3.4|~4.0", + "symfony/property-info": "~3.4|~4.0", + "symfony/security": "~3.4|~4.0", + "symfony/security-core": "~3.4|~4.0", + "symfony/security-csrf": "~3.4|~4.0", + "symfony/serializer": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0", + "symfony/templating": "~3.4|~4.0", + "symfony/translation": "~3.4|~4.0", + "symfony/validator": "~3.4|~4.0", + "symfony/var-dumper": "~3.4|~4.0", + "symfony/web-link": "~3.4|~4.0", + "symfony/workflow": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0", + "twig/twig": "~1.34|~2.4" + }, + "suggest": { + "ext-apcu": "For best performance of the system caches", + "symfony/console": "For using the console commands", + "symfony/form": "For using forms", + "symfony/property-info": "For using the property_info service", + "symfony/serializer": "For using the serializer service", + "symfony/validator": "For using validation", + "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", + "symfony/yaml": "For using the debug:config and lint:yaml commands" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony FrameworkBundle", + "homepage": "https://symfony.com", + "time": "2017-12-15T01:44:28+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "aba96bd07be7796c81ca0ceafa7d48a6fef036c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/aba96bd07be7796c81ca0ceafa7d48a6fef036c8", + "reference": "aba96bd07be7796c81ca0ceafa7d48a6fef036c8", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.1" + }, + "require-dev": { + "symfony/expression-language": "~3.4|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com", + "time": "2017-12-14T19:48:22+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "f2ea7461cdcad837b8bc6022b59d5eb8c9618aa5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f2ea7461cdcad837b8bc6022b59d5eb8c9618aa5", + "reference": "f2ea7461cdcad837b8bc6022b59d5eb8c9618aa5", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/log": "~1.0", + "symfony/debug": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0" + }, + "conflict": { + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", + "symfony/var-dumper": "<3.4", + "twig/twig": "<1.34|<2.4,>=2" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/cache": "~1.0", + "symfony/browser-kit": "~3.4|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/css-selector": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/dom-crawler": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0", + "symfony/routing": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0", + "symfony/templating": "~3.4|~4.0", + "symfony/translation": "~3.4|~4.0", + "symfony/var-dumper": "~3.4|~4.0" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "", + "symfony/var-dumper": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpKernel Component", + "homepage": "https://symfony.com", + "time": "2017-12-15T03:06:17+00:00" + }, + { + "name": "symfony/inflector", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/inflector.git", + "reference": "8740990f67ec9f89bfa116d11bad2990dd510ece" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/inflector/zipball/8740990f67ec9f89bfa116d11bad2990dd510ece", + "reference": "8740990f67ec9f89bfa116d11bad2990dd510ece", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Inflector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Inflector Component", + "homepage": "https://symfony.com", + "keywords": [ + "inflection", + "pluralize", + "singularize", + "string", + "symfony", + "words" + ], + "time": "2017-08-31T20:46:21+00:00" + }, + { + "name": "symfony/lts", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/symfony/lts.git", + "reference": "396c5fca8d73d01186df37d7031321a3c0c2bf92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/lts/zipball/396c5fca8d73d01186df37d7031321a3c0c2bf92", + "reference": "396c5fca8d73d01186df37d7031321a3c0c2bf92", + "shasum": "" + }, + "conflict": { + "symfony/asset": ">=5", + "symfony/browser-kit": ">=5", + "symfony/cache": ">=5", + "symfony/class-loader": ">=5", + "symfony/config": ">=5", + "symfony/console": ">=5", + "symfony/css-selector": ">=5", + "symfony/debug": ">=5", + "symfony/debug-bundle": ">=5", + "symfony/dependency-injection": ">=5", + "symfony/doctrine-bridge": ">=5", + "symfony/dom-crawler": ">=5", + "symfony/dotenv": ">=5", + "symfony/event-dispatcher": ">=5", + "symfony/expression-language": ">=5", + "symfony/filesystem": ">=5", + "symfony/finder": ">=5", + "symfony/form": ">=5", + "symfony/framework-bundle": ">=5", + "symfony/http-foundation": ">=5", + "symfony/http-kernel": ">=5", + "symfony/inflector": ">=5", + "symfony/intl": ">=5", + "symfony/ldap": ">=5", + "symfony/lock": ">=5", + "symfony/monolog-bridge": ">=5", + "symfony/options-resolver": ">=5", + "symfony/process": ">=5", + "symfony/property-access": ">=5", + "symfony/property-info": ">=5", + "symfony/proxy-manager-bridge": ">=5", + "symfony/routing": ">=5", + "symfony/security": ">=5", + "symfony/security-bundle": ">=5", + "symfony/security-core": ">=5", + "symfony/security-csrf": ">=5", + "symfony/security-guard": ">=5", + "symfony/security-http": ">=5", + "symfony/serializer": ">=5", + "symfony/stopwatch": ">=5", + "symfony/symfony": ">=5", + "symfony/templating": ">=5", + "symfony/translation": ">=5", + "symfony/twig-bridge": ">=5", + "symfony/twig-bundle": ">=5", + "symfony/validator": ">=5", + "symfony/var-dumper": ">=5", + "symfony/web-link": ">=5", + "symfony/web-profiler-bundle": ">=5", + "symfony/web-server-bundle": ">=5", + "symfony/workflow": ">=5", + "symfony/yaml": ">=5" + }, + "type": "metapackage", + "extra": { + "branch-alias": { + "dev-master": "4-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Enforces Long Term Supported versions of Symfony components", + "homepage": "https://symfony.com", + "time": "2017-10-19T02:16:32+00:00" + }, + { + "name": "symfony/maker-bundle", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/maker-bundle.git", + "reference": "bf97703ddb68c6b37bd6bab5f5ebd5c7542ca1ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/bf97703ddb68c6b37bd6bab5f5ebd5c7542ca1ef", + "reference": "bf97703ddb68c6b37bd6bab5f5ebd5c7542ca1ef", + "shasum": "" + }, + "require": { + "php": "^7.0.8", + "symfony/config": "^3.4|^4.0", + "symfony/console": "^3.4|^4.0", + "symfony/dependency-injection": "^3.4|^4.0", + "symfony/filesystem": "^3.4|^4.0", + "symfony/framework-bundle": "^3.4|^4.0", + "symfony/http-kernel": "^3.4|^4.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.8", + "symfony/phpunit-bridge": "^3.4|^4.0", + "symfony/process": "^3.4|^4.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\MakerBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "keywords": [ + "code generator", + "generator", + "scaffold", + "scaffolding" + ], + "time": "2017-12-04T17:50:28+00:00" + }, + { + "name": "symfony/orm-pack", + "version": "v1.0.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/orm-pack.git", + "reference": "1b58f752cd917a08c9c8df020781d9c46a2275b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/orm-pack/zipball/1b58f752cd917a08c9c8df020781d9c46a2275b1", + "reference": "1b58f752cd917a08c9c8df020781d9c46a2275b1", + "shasum": "" + }, + "require": { + "doctrine/doctrine-bundle": "^1.6.10", + "doctrine/doctrine-migrations-bundle": "^1.3", + "doctrine/orm": "^2.5.11", + "php": "^7.0" + }, + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A pack for the Doctrine ORM", + "time": "2017-12-12T01:47:50+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", + "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2017-10-11T12:05:26+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "6de4f4884b97abbbed9f0a84a95ff2ff77254254" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/6de4f4884b97abbbed9f0a84a95ff2ff77254254", + "reference": "6de4f4884b97abbbed9f0a84a95ff2ff77254254", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2017-10-11T12:05:26+00:00" + }, + { + "name": "symfony/profiler-pack", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/profiler-pack.git", + "reference": "fa2e2dad522a3bef322196abad28ffce6d0fdbc5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/profiler-pack/zipball/fa2e2dad522a3bef322196abad28ffce6d0fdbc5", + "reference": "fa2e2dad522a3bef322196abad28ffce6d0fdbc5", + "shasum": "" + }, + "require": { + "php": "^7.0", + "symfony/stopwatch": "^3.3|^4.0", + "symfony/twig-bundle": "^3.3|^4.0", + "symfony/web-profiler-bundle": "^3.3|^4.0" + }, + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A pack for the Symfony web profiler", + "time": "2017-12-12T01:48:24+00:00" + }, + { + "name": "symfony/property-access", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "8dc059852b7bdd8b871eb3ca95b8d70be3b39488" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/8dc059852b7bdd8b871eb3ca95b8d70be3b39488", + "reference": "8dc059852b7bdd8b871eb3ca95b8d70be3b39488", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/inflector": "~3.4|~4.0" + }, + "require-dev": { + "symfony/cache": "~3.4|~4.0" + }, + "suggest": { + "psr/cache-implementation": "To cache access methods." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony PropertyAccess Component", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property path", + "reflection" + ], + "time": "2017-12-14T00:19:09+00:00" + }, + { + "name": "symfony/routing", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "972810def5cae044d19195045f7eb418141bf37b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/972810def5cae044d19195045f7eb418141bf37b", + "reference": "972810def5cae044d19195045f7eb418141bf37b", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "conflict": { + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/common": "~2.2", + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/dependency-injection": "For loading routes from a service", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Routing Component", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "time": "2017-12-14T22:39:22+00:00" + }, + { + "name": "symfony/security", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/security.git", + "reference": "6ff0f1e97f583583c10152e4050e8a4fac2cfd1e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security/zipball/6ff0f1e97f583583c10152e4050e8a4fac2cfd1e", + "reference": "6ff0f1e97f583583c10152e4050e8a4fac2cfd1e", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", + "symfony/http-kernel": "~3.4|~4.0", + "symfony/property-access": "~3.4|~4.0" + }, + "replace": { + "symfony/security-core": "self.version", + "symfony/security-csrf": "self.version", + "symfony/security-guard": "self.version", + "symfony/security-http": "self.version" + }, + "require-dev": { + "psr/container": "^1.0", + "psr/log": "~1.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/ldap": "~3.4|~4.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/routing": "~3.4|~4.0", + "symfony/validator": "~3.4|~4.0" + }, + "suggest": { + "psr/container": "To instantiate the Security class", + "symfony/expression-language": "For using the expression voter", + "symfony/form": "", + "symfony/ldap": "For using the LDAP user and authentication providers", + "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs", + "symfony/validator": "For using the user password constraint" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component", + "homepage": "https://symfony.com", + "time": "2017-12-14T19:48:22+00:00" + }, + { + "name": "symfony/security-bundle", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-bundle.git", + "reference": "3b05217c09492ed797c2ac8244c77f9258f46cd1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/3b05217c09492ed797c2ac8244c77f9258f46cd1", + "reference": "3b05217c09492ed797c2ac8244c77f9258f46cd1", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": "^7.1.3", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/http-kernel": "~3.4|~4.0", + "symfony/security": "~3.4|~4.0" + }, + "conflict": { + "symfony/console": "<3.4", + "symfony/event-dispatcher": "<3.4", + "symfony/framework-bundle": "<3.4", + "symfony/var-dumper": "<3.4" + }, + "require-dev": { + "doctrine/doctrine-bundle": "~1.5", + "symfony/asset": "~3.4|~4.0", + "symfony/browser-kit": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/css-selector": "~3.4|~4.0", + "symfony/dom-crawler": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/form": "~3.4|~4.0", + "symfony/framework-bundle": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0", + "symfony/translation": "~3.4|~4.0", + "symfony/twig-bridge": "~3.4|~4.0", + "symfony/twig-bundle": "~3.4|~4.0", + "symfony/validator": "~3.4|~4.0", + "symfony/var-dumper": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0", + "twig/twig": "~1.34|~2.4" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\SecurityBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony SecurityBundle", + "homepage": "https://symfony.com", + "time": "2017-12-14T22:39:22+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "ac0e49150555c703fef6b696d8eaba1db7a3ca03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/ac0e49150555c703fef6b696d8eaba1db7a3ca03", + "reference": "ac0e49150555c703fef6b696d8eaba1db7a3ca03", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "https://symfony.com", + "time": "2017-11-09T12:45:29+00:00" + }, + { + "name": "symfony/twig-bridge", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "aeb221936ad39c579b7e002dfd4e7544a5d666f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/aeb221936ad39c579b7e002dfd4e7544a5d666f6", + "reference": "aeb221936ad39c579b7e002dfd4e7544a5d666f6", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "twig/twig": "^1.35|^2.4.4" + }, + "conflict": { + "symfony/console": "<3.4", + "symfony/form": "<3.4" + }, + "require-dev": { + "symfony/asset": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/form": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", + "symfony/http-kernel": "~3.4|~4.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/routing": "~3.4|~4.0", + "symfony/security": "~3.4|~4.0", + "symfony/security-acl": "~2.8|~3.0", + "symfony/stopwatch": "~3.4|~4.0", + "symfony/templating": "~3.4|~4.0", + "symfony/translation": "~3.4|~4.0", + "symfony/var-dumper": "~3.4|~4.0", + "symfony/web-link": "~3.4|~4.0", + "symfony/workflow": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/asset": "For using the AssetExtension", + "symfony/expression-language": "For using the ExpressionExtension", + "symfony/finder": "", + "symfony/form": "For using the FormExtension", + "symfony/http-kernel": "For using the HttpKernelExtension", + "symfony/routing": "For using the RoutingExtension", + "symfony/security": "For using the SecurityExtension", + "symfony/stopwatch": "For using the StopwatchExtension", + "symfony/templating": "For using the TwigEngine", + "symfony/translation": "For using the TranslationExtension", + "symfony/var-dumper": "For using the DumpExtension", + "symfony/web-link": "For using the WebLinkExtension", + "symfony/yaml": "For using the YamlExtension" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Twig\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Twig Bridge", + "homepage": "https://symfony.com", + "time": "2017-12-12T08:41:51+00:00" + }, + { + "name": "symfony/twig-bundle", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "77381f8b99b319dc83e609c66942eb3a0a5b066d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/77381f8b99b319dc83e609c66942eb3a0a5b066d", + "reference": "77381f8b99b319dc83e609c66942eb3a0a5b066d", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/config": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", + "symfony/http-kernel": "~3.4|~4.0", + "symfony/twig-bridge": "~3.4|~4.0", + "twig/twig": "~1.34|~2.4" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/cache": "~1.0", + "symfony/asset": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/form": "~3.4|~4.0", + "symfony/framework-bundle": "~3.4|~4.0", + "symfony/routing": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0", + "symfony/templating": "~3.4|~4.0", + "symfony/web-link": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\TwigBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony TwigBundle", + "homepage": "https://symfony.com", + "time": "2017-12-04T12:31:58+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "0991597a40f062bab7203efc2cc6cee9b3d44ed6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0991597a40f062bab7203efc2cc6cee9b3d44ed6", + "reference": "0991597a40f062bab7203efc2cc6cee9b3d44ed6", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + }, + "require-dev": { + "ext-iconv": "*", + "twig/twig": "~1.34|~2.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "time": "2017-12-12T08:41:51+00:00" + }, + { + "name": "symfony/web-profiler-bundle", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/web-profiler-bundle.git", + "reference": "81e20cbc7b998918a413fbf84a6f2cc770837e10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/81e20cbc7b998918a413fbf84a6f2cc770837e10", + "reference": "81e20cbc7b998918a413fbf84a6f2cc770837e10", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/http-kernel": "~3.4|~4.0", + "symfony/routing": "~3.4|~4.0", + "symfony/twig-bridge": "~3.4|~4.0", + "symfony/var-dumper": "~3.4|~4.0", + "twig/twig": "~1.34|~2.4" + }, + "conflict": { + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<3.4", + "symfony/var-dumper": "<3.4" + }, + "require-dev": { + "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\WebProfilerBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony WebProfilerBundle", + "homepage": "https://symfony.com", + "time": "2017-12-12T08:41:51+00:00" + }, + { + "name": "symfony/yaml", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "a5ee52d155f06ad23b19eb63c31228ff56ad1116" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/a5ee52d155f06ad23b19eb63c31228ff56ad1116", + "reference": "a5ee52d155f06ad23b19eb63c31228ff56ad1116", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "conflict": { + "symfony/console": "<3.4" + }, + "require-dev": { + "symfony/console": "~3.4|~4.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2017-12-12T08:41:51+00:00" + }, + { + "name": "twig/twig", + "version": "v2.4.4", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "eddb97148ad779f27e670e1e3f19fb323aedafeb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/eddb97148ad779f27e670e1e3f19fb323aedafeb", + "reference": "eddb97148ad779f27e670e1e3f19fb323aedafeb", + "shasum": "" + }, + "require": { + "php": "^7.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "psr/container": "^1.0", + "symfony/debug": "~2.7", + "symfony/phpunit-bridge": "~3.3@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Twig_": "lib/" + }, + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + }, + { + "name": "Twig Team", + "homepage": "http://twig.sensiolabs.org/contributors", + "role": "Contributors" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "http://twig.sensiolabs.org", + "keywords": [ + "templating" + ], + "time": "2017-09-27T18:10:31+00:00" + }, + { + "name": "zendframework/zend-code", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-code.git", + "reference": "6b1059db5b368db769e4392c6cb6cc139e56640d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-code/zipball/6b1059db5b368db769e4392c6cb6cc139e56640d", + "reference": "6b1059db5b368db769e4392c6cb6cc139e56640d", + "shasum": "" + }, + "require": { + "php": "^7.1", + "zendframework/zend-eventmanager": "^2.6 || ^3.0" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "ext-phar": "*", + "phpunit/phpunit": "^6.2.3", + "zendframework/zend-coding-standard": "^1.0.0", + "zendframework/zend-stdlib": "^2.7 || ^3.0" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "zendframework/zend-stdlib": "Zend\\Stdlib component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev", + "dev-develop": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Code\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides facilities to generate arbitrary code using an object oriented interface", + "homepage": "https://github.com/zendframework/zend-code", + "keywords": [ + "code", + "zf2" + ], + "time": "2017-10-20T15:21:32+00:00" + }, + { + "name": "zendframework/zend-eventmanager", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-eventmanager.git", + "reference": "9d72db10ceb6e42fb92350c0cb54460da61bd79c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/9d72db10ceb6e42fb92350c0cb54460da61bd79c", + "reference": "9d72db10ceb6e42fb92350c0cb54460da61bd79c", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "athletic/athletic": "^0.1", + "container-interop/container-interop": "^1.1.0", + "phpunit/phpunit": "^6.0.7 || ^5.7.14", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-stdlib": "^2.7.3 || ^3.0" + }, + "suggest": { + "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature", + "zendframework/zend-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev", + "dev-develop": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\EventManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Trigger and listen to events within a PHP application", + "homepage": "https://github.com/zendframework/zend-eventmanager", + "keywords": [ + "event", + "eventmanager", + "events", + "zf2" + ], + "time": "2017-07-11T19:17:22+00:00" + } + ], + "packages-dev": [ + { + "name": "doctrine/data-fixtures", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/data-fixtures.git", + "reference": "7b76ccc8e648c4502aad7f61347326c8a072bd3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/7b76ccc8e648c4502aad7f61347326c8a072bd3b", + "reference": "7b76ccc8e648c4502aad7f61347326c8a072bd3b", + "shasum": "" + }, + "require": { + "doctrine/common": "~2.2", + "php": "^7.1" + }, + "require-dev": { + "doctrine/dbal": "^2.5.4", + "doctrine/orm": "^2.5.4", + "phpunit/phpunit": "^6.3" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "For using MongoDB ODM with PHP 7", + "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", + "doctrine/orm": "For loading ORM fixtures", + "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\DataFixtures\\": "lib/Doctrine/Common/DataFixtures" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Data Fixtures for all Doctrine Object Managers", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database" + ], + "time": "2017-11-27T18:48:06+00:00" + }, + { + "name": "doctrine/doctrine-fixtures-bundle", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", + "reference": "7fc29d2b18c61ed99826b21fbfd1ff9969cc2e7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/7fc29d2b18c61ed99826b21fbfd1ff9969cc2e7f", + "reference": "7fc29d2b18c61ed99826b21fbfd1ff9969cc2e7f", + "shasum": "" + }, + "require": { + "doctrine/data-fixtures": "~1.0", + "doctrine/doctrine-bundle": "~1.0", + "php": ">=5.5.9|^7.0", + "symfony/doctrine-bridge": "~2.7|~3.0|~4.0", + "symfony/framework-bundle": "^3.3|^4.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3.3" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\FixturesBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony DoctrineFixturesBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "Fixture", + "persistence" + ], + "time": "2017-12-04T20:26:38+00:00" + }, + { + "name": "symfony/dotenv", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "ffcaeab01e42b0c40669add2aa8e77f79ddb9389" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/ffcaeab01e42b0c40669add2aa8e77f79ddb9389", + "reference": "ffcaeab01e42b0c40669add2aa8e77f79ddb9389", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "symfony/process": "~3.4|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Registers environment variables from a .env file", + "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "time": "2017-12-08T15:46:13+00:00" + }, + { + "name": "symfony/thanks", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/thanks.git", + "reference": "f3e567198cbac9dbec5baf9004f1e51fecc82c79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/thanks/zipball/f3e567198cbac9dbec5baf9004f1e51fecc82c79", + "reference": "f3e567198cbac9dbec5baf9004f1e51fecc82c79", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1", + "php": "^5.5.9|^7.0.8" + }, + "type": "composer-plugin", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "class": "Symfony\\Thanks\\Thanks" + }, + "autoload": { + "psr-4": { + "Symfony\\Thanks\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + } + ], + "time": "2017-12-20T21:36:05+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "symfony/lts": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "^7.1.3", + "ext-iconv": "*" + }, + "platform-dev": [] +} diff --git a/config/bundles.php b/config/bundles.php new file mode 100644 index 00000000..c2ceb04d --- /dev/null +++ b/config/bundles.php @@ -0,0 +1,14 @@ + ['all' => true], + Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle::class => ['all' => true], + Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], + Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], + Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], + Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], + Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], + Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], + Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], + Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], +]; diff --git a/config/menu.yaml b/config/menu.yaml new file mode 100644 index 00000000..3894ef03 --- /dev/null +++ b/config/menu.yaml @@ -0,0 +1,17 @@ +main_menu: + - id: home + acl: dashboard.menu + label: Dashboard + icon: flaticon-line-graph + - id: user + acl: user.menu + label: User + icon: flaticon-users + - id: user_list + acl: user.list + label: Users + parent: user + - id: role_list + acl: role.list + label: Roles + parent: user diff --git a/config/packages/dev/routing.yaml b/config/packages/dev/routing.yaml new file mode 100644 index 00000000..4116679a --- /dev/null +++ b/config/packages/dev/routing.yaml @@ -0,0 +1,3 @@ +framework: + router: + strict_requirements: true diff --git a/config/packages/dev/web_profiler.yaml b/config/packages/dev/web_profiler.yaml new file mode 100644 index 00000000..e92166a7 --- /dev/null +++ b/config/packages/dev/web_profiler.yaml @@ -0,0 +1,6 @@ +web_profiler: + toolbar: true + intercept_redirects: false + +framework: + profiler: { only_exceptions: false } diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml new file mode 100644 index 00000000..ee77d618 --- /dev/null +++ b/config/packages/doctrine.yaml @@ -0,0 +1,27 @@ +parameters: + # Adds a fallback DATABASE_URL if the env var is not set. + # This allows you to run cache:warmup even if your + # environment variables are not available yet. + # You should not need to change this value. + env(DATABASE_URL): '' + +doctrine: + dbal: + # configure these for your database server + driver: 'pdo_mysql' + server_version: '5.7' + charset: utf8mb4 + + # With Symfony 3.3, remove the `resolve:` prefix + url: '%env(resolve:DATABASE_URL)%' + orm: + auto_generate_proxy_classes: '%kernel.debug%' + naming_strategy: doctrine.orm.naming_strategy.underscore + auto_mapping: true + mappings: + App: + is_bundle: false + type: annotation + dir: '%kernel.project_dir%/src/Entity' + prefix: 'App\Entity' + alias: App diff --git a/config/packages/doctrine_migrations.yaml b/config/packages/doctrine_migrations.yaml new file mode 100644 index 00000000..3bf0fbca --- /dev/null +++ b/config/packages/doctrine_migrations.yaml @@ -0,0 +1,5 @@ +doctrine_migrations: + dir_name: '%kernel.project_dir%/src/Migrations' + # namespace is arbitrary but should be different from App\Migrations + # as migrations classes should NOT be autoloaded + namespace: DoctrineMigrations diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml new file mode 100644 index 00000000..50eeddcc --- /dev/null +++ b/config/packages/framework.yaml @@ -0,0 +1,15 @@ +framework: + secret: '%env(APP_SECRET)%' + #default_locale: en + #csrf_protection: ~ + #http_method_override: true + + # uncomment this entire section to enable sessions + session: + # # With this config, PHP's native session handling is used + handler_id: ~ + + #esi: ~ + #fragments: ~ + php_errors: + log: true diff --git a/config/packages/prod/doctrine.yaml b/config/packages/prod/doctrine.yaml new file mode 100644 index 00000000..2f16f0fd --- /dev/null +++ b/config/packages/prod/doctrine.yaml @@ -0,0 +1,31 @@ +doctrine: + orm: + metadata_cache_driver: + type: service + id: doctrine.system_cache_provider + query_cache_driver: + type: service + id: doctrine.system_cache_provider + result_cache_driver: + type: service + id: doctrine.result_cache_provider + +services: + doctrine.result_cache_provider: + class: Symfony\Component\Cache\DoctrineProvider + public: false + arguments: + - '@doctrine.result_cache_pool' + doctrine.system_cache_provider: + class: Symfony\Component\Cache\DoctrineProvider + public: false + arguments: + - '@doctrine.system_cache_pool' + +framework: + cache: + pools: + doctrine.result_cache_pool: + adapter: cache.app + doctrine.system_cache_pool: + adapter: cache.system diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml new file mode 100644 index 00000000..368bc7f4 --- /dev/null +++ b/config/packages/routing.yaml @@ -0,0 +1,3 @@ +framework: + router: + strict_requirements: ~ diff --git a/config/packages/security.yaml b/config/packages/security.yaml new file mode 100644 index 00000000..b76941e6 --- /dev/null +++ b/config/packages/security.yaml @@ -0,0 +1,40 @@ +security: + # https://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers + encoders: + App\Entity\User: + algorithm: bcrypt + cost: 12 + providers: + user: + entity: + class: App\Entity\User + property: username + firewalls: + dev: + pattern: ^/(_(profiler|wdt)|css|images|js)/ + security: false + + login: + pattern: ^\/login$ + methods: [GET] + security: false + + main: + form_login: + login_path: login + check_path: login + logout: + path: logout + target: / + remember_me: + secret: '%env(APP_SECRET)%' + lifetime: 604800 + path: / + + # activate different ways to authenticate + + # http_basic: ~ + # https://symfony.com/doc/current/book/security.html#a-configuring-how-your-users-will-authenticate + + # form_login: ~ + # https://symfony.com/doc/current/cookbook/security/form_login_setup.html diff --git a/config/packages/test/framework.yaml b/config/packages/test/framework.yaml new file mode 100644 index 00000000..8aa270e9 --- /dev/null +++ b/config/packages/test/framework.yaml @@ -0,0 +1,5 @@ +framework: + test: ~ + # Uncomment this section if you're using sessions + #session: + # storage_id: session.storage.mock_file diff --git a/config/packages/test/web_profiler.yaml b/config/packages/test/web_profiler.yaml new file mode 100644 index 00000000..03752de2 --- /dev/null +++ b/config/packages/test/web_profiler.yaml @@ -0,0 +1,6 @@ +web_profiler: + toolbar: false + intercept_redirects: false + +framework: + profiler: { collect: false } diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml new file mode 100644 index 00000000..3b315dcc --- /dev/null +++ b/config/packages/twig.yaml @@ -0,0 +1,4 @@ +twig: + paths: ['%kernel.project_dir%/templates'] + debug: '%kernel.debug%' + strict_variables: '%kernel.debug%' diff --git a/config/routes.yaml b/config/routes.yaml new file mode 100644 index 00000000..f2c6674d --- /dev/null +++ b/config/routes.yaml @@ -0,0 +1,19 @@ +#index: +# path: / +# controller: App\Controller\DefaultController::index +# +# +home: + path: / + controller: App\Controller\HomeController::index + +login: + path: /login + controller: App\Controller\SecurityController::login + +logout: + path: /logout + +user_list: + path: /users + controller: App\Controller\UserController::index diff --git a/config/routes/annotations.yaml b/config/routes/annotations.yaml new file mode 100644 index 00000000..d49a502a --- /dev/null +++ b/config/routes/annotations.yaml @@ -0,0 +1,3 @@ +controllers: + resource: ../../src/Controller/ + type: annotation diff --git a/config/routes/dev/twig.yaml b/config/routes/dev/twig.yaml new file mode 100644 index 00000000..f4ee8396 --- /dev/null +++ b/config/routes/dev/twig.yaml @@ -0,0 +1,3 @@ +_errors: + resource: '@TwigBundle/Resources/config/routing/errors.xml' + prefix: /_error diff --git a/config/routes/dev/web_profiler.yaml b/config/routes/dev/web_profiler.yaml new file mode 100644 index 00000000..c82beff2 --- /dev/null +++ b/config/routes/dev/web_profiler.yaml @@ -0,0 +1,7 @@ +web_profiler_wdt: + resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' + prefix: /_wdt + +web_profiler_profiler: + resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' + prefix: /_profiler diff --git a/config/services.yaml b/config/services.yaml new file mode 100644 index 00000000..927ff453 --- /dev/null +++ b/config/services.yaml @@ -0,0 +1,33 @@ +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration +parameters: + +services: + # default configuration for services in *this* file + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + public: false # Allows optimizing the container by removing unused services; this also means + # fetching services directly from the container via $container->get() won't work. + # The best practice is to be explicit about your dependencies anyway. + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/*' + exclude: '../src/{Entity,Migrations,Tests,Menu}' + + # controllers are imported separately to make sure services can be injected + # as action arguments even if you don't extend any base controller class + App\Controller\: + resource: '../src/Controller' + tags: ['controller.service_arguments'] + + # add more service definitions when explicit configuration is needed + # please note that last definitions always *replace* previous ones + App\Menu\Generator: + class: App\Menu\Generator + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" diff --git a/public/assets/app/js/dashboard.js b/public/assets/app/js/dashboard.js new file mode 100644 index 00000000..131d2d7b --- /dev/null +++ b/public/assets/app/js/dashboard.js @@ -0,0 +1,1682 @@ +//== Class definition +var Dashboard = function() { + + //== Sparkline Chart helper function + var _initSparklineChart = function(src, data, color, border) { + if (src.length == 0) { + return; + } + + var config = { + type: 'line', + data: { + labels: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October"], + datasets: [{ + label: "", + borderColor: color, + borderWidth: border, + + pointHoverRadius: 4, + pointHoverBorderWidth: 12, + pointBackgroundColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointBorderColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointHoverBackgroundColor: mUtil.getColor('danger'), + pointHoverBorderColor: Chart.helpers.color('#000000').alpha(0.1).rgbString(), + fill: false, + data: data, + }] + }, + options: { + title: { + display: false, + }, + tooltips: { + enabled: false, + intersect: false, + mode: 'nearest', + xPadding: 10, + yPadding: 10, + caretPadding: 10 + }, + legend: { + display: false, + labels: { + usePointStyle: false + } + }, + responsive: true, + maintainAspectRatio: true, + hover: { + mode: 'index' + }, + scales: { + xAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Month' + } + }], + yAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Value' + }, + ticks: { + beginAtZero: true + } + }] + }, + + elements: { + point: { + radius: 4, + borderWidth: 12 + }, + }, + + layout: { + padding: { + left: 0, + right: 10, + top: 5, + bottom: 0 + } + } + } + }; + + return new Chart(src, config); + } + + //== Daily Sales chart. + //** Based on Chartjs plugin - http://www.chartjs.org/ + var dailySales = function() { + var chartData = { + labels: ["Label 1", "Label 2", "Label 3", "Label 4", "Label 5", "Label 6", "Label 7", "Label 8", "Label 9", "Label 10", "Label 11", "Label 12", "Label 13", "Label 14", "Label 15", "Label 16"], + datasets: [{ + //label: 'Dataset 1', + backgroundColor: mUtil.getColor('success'), + data: [ + 15, 20, 25, 30, 25, 20, 15, 20, 25, 30, 25, 20, 15, 10, 15, 20 + ] + }, { + //label: 'Dataset 2', + backgroundColor: '#f3f3fb', + data: [ + 15, 20, 25, 30, 25, 20, 15, 20, 25, 30, 25, 20, 15, 10, 15, 20 + ] + }] + }; + + var chartContainer = $('#m_chart_daily_sales'); + + if (chartContainer.length == 0) { + return; + } + + var chart = new Chart(chartContainer, { + type: 'bar', + data: chartData, + options: { + title: { + display: false, + }, + tooltips: { + intersect: false, + mode: 'nearest', + xPadding: 10, + yPadding: 10, + caretPadding: 10 + }, + legend: { + display: false + }, + responsive: true, + maintainAspectRatio: false, + barRadius: 4, + scales: { + xAxes: [{ + display: false, + gridLines: false, + stacked: true + }], + yAxes: [{ + display: false, + stacked: true, + gridLines: false + }] + }, + layout: { + padding: { + left: 0, + right: 0, + top: 0, + bottom: 0 + } + } + } + }); + } + + //== Profit Share Chart. + //** Based on Chartist plugin - https://gionkunz.github.io/chartist-js/index.html + var profitShare = function() { + if ($('#m_chart_profit_share').length == 0) { + return; + } + + var chart = new Chartist.Pie('#m_chart_profit_share', { + series: [{ + value: 32, + className: 'custom', + meta: { + color: mUtil.getColor('brand') + } + }, + { + value: 32, + className: 'custom', + meta: { + color: mUtil.getColor('accent') + } + }, + { + value: 36, + className: 'custom', + meta: { + color: mUtil.getColor('warning') + } + } + ], + labels: [1, 2, 3] + }, { + donut: true, + donutWidth: 17, + showLabel: false + }); + + chart.on('draw', function(data) { + if (data.type === 'slice') { + // Get the total path length in order to use for dash array animation + var pathLength = data.element._node.getTotalLength(); + + // Set a dasharray that matches the path length as prerequisite to animate dashoffset + data.element.attr({ + 'stroke-dasharray': pathLength + 'px ' + pathLength + 'px' + }); + + // Create animation definition while also assigning an ID to the animation for later sync usage + var animationDefinition = { + 'stroke-dashoffset': { + id: 'anim' + data.index, + dur: 1000, + from: -pathLength + 'px', + to: '0px', + easing: Chartist.Svg.Easing.easeOutQuint, + // We need to use `fill: 'freeze'` otherwise our animation will fall back to initial (not visible) + fill: 'freeze', + 'stroke': data.meta.color + } + }; + + // If this was not the first slice, we need to time the animation so that it uses the end sync event of the previous animation + if (data.index !== 0) { + animationDefinition['stroke-dashoffset'].begin = 'anim' + (data.index - 1) + '.end'; + } + + // We need to set an initial value before the animation starts as we are not in guided mode which would do that for us + + data.element.attr({ + 'stroke-dashoffset': -pathLength + 'px', + 'stroke': data.meta.color + }); + + // We can't use guided mode as the animations need to rely on setting begin manually + // See http://gionkunz.github.io/chartist-js/api-documentation.html#chartistsvg-function-animate + data.element.animate(animationDefinition, false); + } + }); + + // For the sake of the example we update the chart every time it's created with a delay of 8 seconds + chart.on('created', function() { + if (window.__anim21278907124) { + clearTimeout(window.__anim21278907124); + window.__anim21278907124 = null; + } + window.__anim21278907124 = setTimeout(chart.update.bind(chart), 15000); + }); + } + + //== Sales Stats. + //** Based on Chartjs plugin - http://www.chartjs.org/ + var salesStats = function() { + if ($('#m_chart_sales_stats').length == 0) { + return; + } + + var config = { + type: 'line', + data: { + labels: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", + "January", "February", "March", "April" + ], + datasets: [{ + label: "Sales Stats", + borderColor: mUtil.getColor('brand'), + borderWidth: 2, + pointBackgroundColor: mUtil.getColor('brand'), + + backgroundColor: mUtil.getColor('accent'), + + pointHoverBackgroundColor: mUtil.getColor('danger'), + pointHoverBorderColor: Chart.helpers.color(mUtil.getColor('danger')).alpha(0.2).rgbString(), + data: [ + 10, 20, 16, + 18, 12, 40, + 35, 30, 33, + 34, 45, 40, + 60, 55, 70, + 65, 75, 62 + ] + }] + }, + options: { + title: { + display: false, + }, + tooltips: { + intersect: false, + mode: 'nearest', + xPadding: 10, + yPadding: 10, + caretPadding: 10 + }, + legend: { + display: false, + labels: { + usePointStyle: false + } + }, + responsive: true, + maintainAspectRatio: false, + hover: { + mode: 'index' + }, + scales: { + xAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Month' + } + }], + yAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Value' + } + }] + }, + + elements: { + point: { + radius: 3, + borderWidth: 0, + + hoverRadius: 8, + hoverBorderWidth: 2 + } + } + } + }; + + var chart = new Chart($('#m_chart_sales_stats'), config); + } + + //== Sales By mUtillication Stats. + //** Based on Chartjs plugin - http://www.chartjs.org/ + var salesBymUtils = function() { + // Init chart instances + _initSparklineChart($('#m_chart_sales_by_apps_1_1'), [10, 20, -5, 8, -20, -2, -4, 15, 5, 8], mUtil.getColor('accent'), 2); + _initSparklineChart($('#m_chart_sales_by_apps_1_2'), [2, 16, 0, 12, 22, 5, -10, 5, 15, 2], mUtil.getColor('danger'), 2); + _initSparklineChart($('#m_chart_sales_by_apps_1_3'), [15, 5, -10, 5, 16, 22, 6, -6, -12, 5], mUtil.getColor('success'), 2); + _initSparklineChart($('#m_chart_sales_by_apps_1_4'), [8, 18, -12, 12, 22, -2, -14, 16, 18, 2], mUtil.getColor('warning'), 2); + + _initSparklineChart($('#m_chart_sales_by_apps_2_1'), [10, 20, -5, 8, -20, -2, -4, 15, 5, 8], mUtil.getColor('danger'), 2); + _initSparklineChart($('#m_chart_sales_by_apps_2_2'), [2, 16, 0, 12, 22, 5, -10, 5, 15, 2], mUtil.getColor('metal'), 2); + _initSparklineChart($('#m_chart_sales_by_apps_2_3'), [15, 5, -10, 5, 16, 22, 6, -6, -12, 5], mUtil.getColor('brand'), 2); + _initSparklineChart($('#m_chart_sales_by_apps_2_4'), [8, 18, -12, 12, 22, -2, -14, 16, 18, 2], mUtil.getColor('info'), 2); + } + + //== Latest Updates. + //** Based on Chartjs plugin - http://www.chartjs.org/ + var latestUpdates = function() { + if ($('#m_chart_latest_updates').length == 0) { + return; + } + + var ctx = document.getElementById("m_chart_latest_updates").getContext("2d"); + + var config = { + type: 'line', + data: { + labels: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October"], + datasets: [{ + label: "Sales Stats", + backgroundColor: mUtil.getColor('danger'), // Put the gradient here as a fill color + borderColor: mUtil.getColor('danger'), + pointBackgroundColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointBorderColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointHoverBackgroundColor: mUtil.getColor('accent'), + pointHoverBorderColor: Chart.helpers.color('#000000').alpha(0.1).rgbString(), + + //fill: 'start', + data: [ + 10, 14, 12, 16, 9, 11, 13, 9, 13, 15 + ] + }] + }, + options: { + title: { + display: false, + }, + tooltips: { + intersect: false, + mode: 'nearest', + xPadding: 10, + yPadding: 10, + caretPadding: 10 + }, + legend: { + display: false + }, + responsive: true, + maintainAspectRatio: false, + hover: { + mode: 'index' + }, + scales: { + xAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Month' + } + }], + yAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Value' + }, + ticks: { + beginAtZero: true + } + }] + }, + elements: { + line: { + tension: 0.0000001 + }, + point: { + radius: 4, + borderWidth: 12 + } + } + } + }; + + var chart = new Chart(ctx, config); + } + + //== Trends Stats. + //** Based on Chartjs plugin - http://www.chartjs.org/ + var trendsStats = function() { + if ($('#m_chart_trends_stats').length == 0) { + return; + } + + var ctx = document.getElementById("m_chart_trends_stats").getContext("2d"); + + var gradient = ctx.createLinearGradient(0, 0, 0, 240); + gradient.addColorStop(0, Chart.helpers.color('#00c5dc').alpha(0.7).rgbString()); + gradient.addColorStop(1, Chart.helpers.color('#f2feff').alpha(0).rgbString()); + + var config = { + type: 'line', + data: { + labels: [ + "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", + "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", + "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", + "January", "February", "March", "April" + ], + datasets: [{ + label: "Sales Stats", + backgroundColor: gradient, // Put the gradient here as a fill color + borderColor: '#0dc8de', + + pointBackgroundColor: Chart.helpers.color('#ffffff').alpha(0).rgbString(), + pointBorderColor: Chart.helpers.color('#ffffff').alpha(0).rgbString(), + pointHoverBackgroundColor: mUtil.getColor('danger'), + pointHoverBorderColor: Chart.helpers.color('#000000').alpha(0.2).rgbString(), + + //fill: 'start', + data: [ + 20, 10, 18, 15, 26, 18, 15, 22, 16, 12, + 12, 13, 10, 18, 14, 24, 16, 12, 19, 21, + 16, 14, 21, 21, 13, 15, 22, 24, 21, 11, + 14, 19, 21, 17 + ] + }] + }, + options: { + title: { + display: false, + }, + tooltips: { + intersect: false, + mode: 'nearest', + xPadding: 10, + yPadding: 10, + caretPadding: 10 + }, + legend: { + display: false + }, + responsive: true, + maintainAspectRatio: false, + hover: { + mode: 'index' + }, + scales: { + xAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Month' + } + }], + yAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Value' + }, + ticks: { + beginAtZero: true + } + }] + }, + elements: { + line: { + tension: 0.19 + }, + point: { + radius: 4, + borderWidth: 12 + } + }, + layout: { + padding: { + left: 0, + right: 0, + top: 5, + bottom: 0 + } + } + } + }; + + var chart = new Chart(ctx, config); + } + + //== Trends Stats 2. + //** Based on Chartjs plugin - http://www.chartjs.org/ + var trendsStats2 = function() { + if ($('#m_chart_trends_stats_2').length == 0) { + return; + } + + var ctx = document.getElementById("m_chart_trends_stats_2").getContext("2d"); + + var config = { + type: 'line', + data: { + labels: [ + "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", + "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", + "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", + "January", "February", "March", "April" + ], + datasets: [{ + label: "Sales Stats", + backgroundColor: '#d2f5f9', // Put the gradient here as a fill color + borderColor: mUtil.getColor('brand'), + + pointBackgroundColor: Chart.helpers.color('#ffffff').alpha(0).rgbString(), + pointBorderColor: Chart.helpers.color('#ffffff').alpha(0).rgbString(), + pointHoverBackgroundColor: mUtil.getColor('danger'), + pointHoverBorderColor: Chart.helpers.color('#000000').alpha(0.2).rgbString(), + + //fill: 'start', + data: [ + 20, 10, 18, 15, 32, 18, 15, 22, 8, 6, + 12, 13, 10, 18, 14, 24, 16, 12, 19, 21, + 16, 14, 24, 21, 13, 15, 27, 29, 21, 11, + 14, 19, 21, 17 + ] + }] + }, + options: { + title: { + display: false, + }, + tooltips: { + intersect: false, + mode: 'nearest', + xPadding: 10, + yPadding: 10, + caretPadding: 10 + }, + legend: { + display: false + }, + responsive: true, + maintainAspectRatio: false, + hover: { + mode: 'index' + }, + scales: { + xAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Month' + } + }], + yAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Value' + }, + ticks: { + beginAtZero: true + } + }] + }, + elements: { + line: { + tension: 0.19 + }, + point: { + radius: 4, + borderWidth: 12 + } + }, + layout: { + padding: { + left: 0, + right: 0, + top: 5, + bottom: 0 + } + } + } + }; + + var chart = new Chart(ctx, config); + } + + //== Trends Stats. + //** Based on Chartjs plugin - http://www.chartjs.org/ + var latestTrendsMap = function() { + if ($('#m_chart_latest_trends_map').length == 0) { + return; + } + + try { + var map = new GMaps({ + div: '#m_chart_latest_trends_map', + lat: -12.043333, + lng: -77.028333 + }); + } catch (e) { + console.log(e); + } + } + + //== Revenue Change. + //** Based on Morris plugin - http://morrisjs.github.io/morris.js/ + var revenueChange = function() { + if ($('#m_chart_revenue_change').length == 0) { + return; + } + + Morris.Donut({ + element: 'm_chart_revenue_change', + data: [{ + label: "New York", + value: 10 + }, + { + label: "London", + value: 7 + }, + { + label: "Paris", + value: 20 + } + ], + colors: [ + mUtil.getColor('accent'), + mUtil.getColor('danger'), + mUtil.getColor('brand') + ], + }); + } + + //== Support Tickets Chart. + //** Based on Morris plugin - http://morrisjs.github.io/morris.js/ + var supportTickets = function() { + if ($('#m_chart_support_tickets').length == 0) { + return; + } + + Morris.Donut({ + element: 'm_chart_support_tickets', + data: [{ + label: "Margins", + value: 20 + }, + { + label: "Profit", + value: 70 + }, + { + label: "Lost", + value: 10 + } + ], + labelColor: '#a7a7c2', + colors: [ + mUtil.getColor('accent'), + mUtil.getColor('brand'), + mUtil.getColor('danger') + ] + //formatter: function (x) { return x + "%"} + }); + } + + //== Support Tickets Chart. + //** Based on Morris plugin - http://morrisjs.github.io/morris.js/ + var supportTickets2 = function() { + if ($('#m_chart_support_tickets2').length == 0) { + return; + } + + var chart = new Chartist.Pie('#m_chart_support_tickets2', { + series: [{ + value: 32, + className: 'custom', + meta: { + color: mUtil.getColor('brand') + } + }, + { + value: 32, + className: 'custom', + meta: { + color: mUtil.getColor('accent') + } + }, + { + value: 36, + className: 'custom', + meta: { + color: mUtil.getColor('warning') + } + } + ], + labels: [1, 2, 3] + }, { + donut: true, + donutWidth: 17, + showLabel: false + }); + + chart.on('draw', function(data) { + if (data.type === 'slice') { + // Get the total path length in order to use for dash array animation + var pathLength = data.element._node.getTotalLength(); + + // Set a dasharray that matches the path length as prerequisite to animate dashoffset + data.element.attr({ + 'stroke-dasharray': pathLength + 'px ' + pathLength + 'px' + }); + + // Create animation definition while also assigning an ID to the animation for later sync usage + var animationDefinition = { + 'stroke-dashoffset': { + id: 'anim' + data.index, + dur: 1000, + from: -pathLength + 'px', + to: '0px', + easing: Chartist.Svg.Easing.easeOutQuint, + // We need to use `fill: 'freeze'` otherwise our animation will fall back to initial (not visible) + fill: 'freeze', + 'stroke': data.meta.color + } + }; + + // If this was not the first slice, we need to time the animation so that it uses the end sync event of the previous animation + if (data.index !== 0) { + animationDefinition['stroke-dashoffset'].begin = 'anim' + (data.index - 1) + '.end'; + } + + // We need to set an initial value before the animation starts as we are not in guided mode which would do that for us + + data.element.attr({ + 'stroke-dashoffset': -pathLength + 'px', + 'stroke': data.meta.color + }); + + // We can't use guided mode as the animations need to rely on setting begin manually + // See http://gionkunz.github.io/chartist-js/api-documentation.html#chartistsvg-function-animate + data.element.animate(animationDefinition, false); + } + }); + } + + //== Activities Charts. + //** Based on Chartjs plugin - http://www.chartjs.org/ + var activitiesChart = function() { + if ($('#m_chart_activities').length == 0) { + return; + } + + var ctx = document.getElementById("m_chart_activities").getContext("2d"); + + var gradient = ctx.createLinearGradient(0, 0, 0, 240); + gradient.addColorStop(0, Chart.helpers.color('#e14c86').alpha(1).rgbString()); + gradient.addColorStop(1, Chart.helpers.color('#e14c86').alpha(0.3).rgbString()); + + var config = { + type: 'line', + data: { + labels: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October"], + datasets: [{ + label: "Sales Stats", + backgroundColor: gradient, + borderColor: '#e13a58', + + pointBackgroundColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointBorderColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointHoverBackgroundColor: mUtil.getColor('light'), + pointHoverBorderColor: Chart.helpers.color('#ffffff').alpha(0.1).rgbString(), + + //fill: 'start', + data: [ + 10, 14, 12, 16, 9, 11, 13, 9, 13, 15 + ] + }] + }, + options: { + title: { + display: false, + }, + tooltips: { + mode: 'nearest', + intersect: false, + position: 'nearest', + xPadding: 10, + yPadding: 10, + caretPadding: 10 + }, + legend: { + display: false + }, + responsive: true, + maintainAspectRatio: false, + scales: { + xAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Month' + } + }], + yAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Value' + }, + ticks: { + beginAtZero: true + } + }] + }, + elements: { + line: { + tension: 0.0000001 + }, + point: { + radius: 4, + borderWidth: 12 + } + }, + layout: { + padding: { + left: 0, + right: 0, + top: 10, + bottom: 0 + } + } + } + }; + + var chart = new Chart(ctx, config); + } + + //== Bandwidth Charts 1. + //** Based on Chartjs plugin - http://www.chartjs.org/ + var bandwidthChart1 = function() { + if ($('#m_chart_bandwidth1').length == 0) { + return; + } + + var ctx = document.getElementById("m_chart_bandwidth1").getContext("2d"); + + var gradient = ctx.createLinearGradient(0, 0, 0, 240); + gradient.addColorStop(0, Chart.helpers.color('#d1f1ec').alpha(1).rgbString()); + gradient.addColorStop(1, Chart.helpers.color('#d1f1ec').alpha(0.3).rgbString()); + + var config = { + type: 'line', + data: { + labels: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October"], + datasets: [{ + label: "Bandwidth Stats", + backgroundColor: gradient, + borderColor: mUtil.getColor('success'), + + pointBackgroundColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointBorderColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointHoverBackgroundColor: mUtil.getColor('danger'), + pointHoverBorderColor: Chart.helpers.color('#000000').alpha(0.1).rgbString(), + + //fill: 'start', + data: [ + 10, 14, 12, 16, 9, 11, 13, 9, 13, 15 + ] + }] + }, + options: { + title: { + display: false, + }, + tooltips: { + mode: 'nearest', + intersect: false, + position: 'nearest', + xPadding: 10, + yPadding: 10, + caretPadding: 10 + }, + legend: { + display: false + }, + responsive: true, + maintainAspectRatio: false, + scales: { + xAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Month' + } + }], + yAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Value' + }, + ticks: { + beginAtZero: true + } + }] + }, + elements: { + line: { + tension: 0.0000001 + }, + point: { + radius: 4, + borderWidth: 12 + } + }, + layout: { + padding: { + left: 0, + right: 0, + top: 10, + bottom: 0 + } + } + } + }; + + var chart = new Chart(ctx, config); + } + + //== Bandwidth Charts 2. + //** Based on Chartjs plugin - http://www.chartjs.org/ + var bandwidthChart2 = function() { + if ($('#m_chart_bandwidth2').length == 0) { + return; + } + + var ctx = document.getElementById("m_chart_bandwidth2").getContext("2d"); + + var gradient = ctx.createLinearGradient(0, 0, 0, 240); + gradient.addColorStop(0, Chart.helpers.color('#ffefce').alpha(1).rgbString()); + gradient.addColorStop(1, Chart.helpers.color('#ffefce').alpha(0.3).rgbString()); + + var config = { + type: 'line', + data: { + labels: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October"], + datasets: [{ + label: "Bandwidth Stats", + backgroundColor: gradient, + borderColor: mUtil.getColor('warning'), + + pointBackgroundColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointBorderColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointHoverBackgroundColor: mUtil.getColor('danger'), + pointHoverBorderColor: Chart.helpers.color('#000000').alpha(0.1).rgbString(), + + //fill: 'start', + data: [ + 10, 14, 12, 16, 9, 11, 13, 9, 13, 15 + ] + }] + }, + options: { + title: { + display: false, + }, + tooltips: { + mode: 'nearest', + intersect: false, + position: 'nearest', + xPadding: 10, + yPadding: 10, + caretPadding: 10 + }, + legend: { + display: false + }, + responsive: true, + maintainAspectRatio: false, + scales: { + xAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Month' + } + }], + yAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Value' + }, + ticks: { + beginAtZero: true + } + }] + }, + elements: { + line: { + tension: 0.0000001 + }, + point: { + radius: 4, + borderWidth: 12 + } + }, + layout: { + padding: { + left: 0, + right: 0, + top: 10, + bottom: 0 + } + } + } + }; + + var chart = new Chart(ctx, config); + } + + //== Bandwidth Charts 2. + //** Based on Chartjs plugin - http://www.chartjs.org/ + var adWordsStat = function() { + if ($('#m_chart_adwords_stats').length == 0) { + return; + } + + var ctx = document.getElementById("m_chart_adwords_stats").getContext("2d"); + + var gradient = ctx.createLinearGradient(0, 0, 0, 240); + gradient.addColorStop(0, Chart.helpers.color('#ffefce').alpha(1).rgbString()); + gradient.addColorStop(1, Chart.helpers.color('#ffefce').alpha(0.3).rgbString()); + + var config = { + type: 'line', + data: { + labels: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October"], + datasets: [{ + label: "AdWord Clicks", + backgroundColor: mUtil.getColor('brand'), + borderColor: mUtil.getColor('brand'), + + pointBackgroundColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointBorderColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointHoverBackgroundColor: mUtil.getColor('danger'), + pointHoverBorderColor: Chart.helpers.color('#000000').alpha(0.1).rgbString(), + data: [ + 12, 16, 9, 18, 13, 12, 18, 12, 15, 17 + ] + }, { + label: "AdWords Views", + + backgroundColor: mUtil.getColor('accent'), + borderColor: mUtil.getColor('accent'), + + pointBackgroundColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointBorderColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointHoverBackgroundColor: mUtil.getColor('danger'), + pointHoverBorderColor: Chart.helpers.color('#000000').alpha(0.1).rgbString(), + data: [ + 10, 14, 12, 16, 9, 11, 13, 9, 13, 15 + ] + }] + }, + options: { + title: { + display: false, + }, + tooltips: { + mode: 'nearest', + intersect: false, + position: 'nearest', + xPadding: 10, + yPadding: 10, + caretPadding: 10 + }, + legend: { + display: false + }, + responsive: true, + maintainAspectRatio: false, + scales: { + xAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Month' + } + }], + yAxes: [{ + stacked: true, + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Value' + }, + ticks: { + beginAtZero: true + } + }] + }, + elements: { + line: { + tension: 0.0000001 + }, + point: { + radius: 4, + borderWidth: 12 + } + }, + layout: { + padding: { + left: 0, + right: 0, + top: 10, + bottom: 0 + } + } + } + }; + + var chart = new Chart(ctx, config); + } + + //== Bandwidth Charts 2. + //** Based on Chartjs plugin - http://www.chartjs.org/ + var financeSummary = function() { + if ($('#m_chart_finance_summary').length == 0) { + return; + } + + var ctx = document.getElementById("m_chart_finance_summary").getContext("2d"); + + var config = { + type: 'line', + data: { + labels: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October"], + datasets: [{ + label: "AdWords Views", + + backgroundColor: mUtil.getColor('accent'), + borderColor: mUtil.getColor('accent'), + + pointBackgroundColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointBorderColor: Chart.helpers.color('#000000').alpha(0).rgbString(), + pointHoverBackgroundColor: mUtil.getColor('danger'), + pointHoverBorderColor: Chart.helpers.color('#000000').alpha(0.1).rgbString(), + data: [ + 10, 14, 12, 16, 9, 11, 13, 9, 13, 15 + ] + }] + }, + options: { + title: { + display: false, + }, + tooltips: { + mode: 'nearest', + intersect: false, + position: 'nearest', + xPadding: 10, + yPadding: 10, + caretPadding: 10 + }, + legend: { + display: false + }, + responsive: true, + maintainAspectRatio: false, + scales: { + xAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Month' + } + }], + yAxes: [{ + display: false, + gridLines: false, + scaleLabel: { + display: true, + labelString: 'Value' + }, + ticks: { + beginAtZero: true + } + }] + }, + elements: { + line: { + tension: 0.0000001 + }, + point: { + radius: 4, + borderWidth: 12 + } + }, + layout: { + padding: { + left: 0, + right: 0, + top: 10, + bottom: 0 + } + } + } + }; + + var chart = new Chart(ctx, config); + } + + //== Quick Stat Charts + var quickStats = function() { + _initSparklineChart($('#m_chart_quick_stats_1'), [10, 14, 18, 11, 9, 12, 14, 17, 18, 14], mUtil.getColor('brand'), 3); + _initSparklineChart($('#m_chart_quick_stats_2'), [11, 12, 18, 13, 11, 12, 15, 13, 19, 15], mUtil.getColor('danger'), 3); + _initSparklineChart($('#m_chart_quick_stats_3'), [12, 12, 18, 11, 15, 12, 13, 16, 11, 18], mUtil.getColor('success'), 3); + _initSparklineChart($('#m_chart_quick_stats_4'), [11, 9, 13, 18, 13, 15, 14, 13, 18, 15], mUtil.getColor('accent'), 3); + } + + var daterangepickerInit = function() { + if ($('#m_dashboard_daterangepicker').length == 0) { + return; + } + + var picker = $('#m_dashboard_daterangepicker'); + var start = moment(); + var end = moment(); + + function cb(start, end, label) { + var title = ''; + var range = ''; + + if ((end - start) < 100) { + title = 'Today:'; + range = start.format('MMM D'); + } else if (label == 'Yesterday') { + title = 'Yesterday:'; + range = start.format('MMM D'); + } else { + range = start.format('MMM D') + ' - ' + end.format('MMM D'); + } + + picker.find('.m-subheader__daterange-date').html(range); + picker.find('.m-subheader__daterange-title').html(title); + } + + picker.daterangepicker({ + startDate: start, + endDate: end, + opens: 'left', + ranges: { + 'Today': [moment(), moment()], + 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'Last 7 Days': [moment().subtract(6, 'days'), moment()], + 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + 'This Month': [moment().startOf('month'), moment().endOf('month')], + 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] + } + }, cb); + + cb(start, end, ''); + } + + var datatableLatestOrders = function() { + if ($('#m_datatable_latest_orders').length === 0) { + return; + } + + var datatable = $('.m_datatable').mDatatable({ + data: { + type: 'remote', + source: { + read: { + url: 'http://keenthemes.com/metronic/preview/inc/api/datatables/demos/default.php' + } + }, + pageSize: 20, + saveState: { + cookie: true, + webstorage: true + }, + serverPaging: true, + serverFiltering: true, + serverSorting: true + }, + + layout: { + theme: 'default', + class: '', + scroll: true, + height: 380, + footer: false + }, + + sortable: true, + + filterable: false, + + pagination: true, + + columns: [{ + field: "RecordID", + title: "#", + sortable: false, + width: 40, + selector: { + class: 'm-checkbox--solid m-checkbox--brand' + }, + textAlign: 'center' + }, { + field: "OrderID", + title: "Order ID", + sortable: 'asc', + filterable: false, + width: 150, + template: '{{OrderID}} - {{ShipCountry}}' + }, { + field: "ShipName", + title: "Ship Name", + width: 150, + responsive: { + visible: 'lg' + } + }, { + field: "ShipDate", + title: "Ship Date" + }, { + field: "Status", + title: "Status", + width: 100, + // callback function support for column rendering + template: function(row) { + var status = { + 1: { + 'title': 'Pending', + 'class': 'm-badge--brand' + }, + 2: { + 'title': 'Delivered', + 'class': ' m-badge--metal' + }, + 3: { + 'title': 'Canceled', + 'class': ' m-badge--primary' + }, + 4: { + 'title': 'Success', + 'class': ' m-badge--success' + }, + 5: { + 'title': 'Info', + 'class': ' m-badge--info' + }, + 6: { + 'title': 'Danger', + 'class': ' m-badge--danger' + }, + 7: { + 'title': 'Warning', + 'class': ' m-badge--warning' + } + }; + return '' + status[row.Status].title + ''; + } + }, { + field: "Type", + title: "Type", + width: 100, + // callback function support for column rendering + template: function(row) { + var status = { + 1: { + 'title': 'Online', + 'state': 'danger' + }, + 2: { + 'title': 'Retail', + 'state': 'primary' + }, + 3: { + 'title': 'Direct', + 'state': 'accent' + } + }; + return ' ' + status[row.Type].title + ''; + } + }, { + field: "Actions", + width: 110, + title: "Actions", + sortable: false, + overflow: 'visible', + template: function(row) { + var dropup = (row.getDatatable().getPageSize() - row.getIndex()) <= 4 ? 'dropup' : ''; + + return '\ + \ + \ + \ + \ + \ + \ + \ + '; + } + }] + }); + } + + var calendarInit = function() { + if ($('#m_calendar').length === 0) { + return; + } + + var todayDate = moment().startOf('day'); + var YM = todayDate.format('YYYY-MM'); + var YESTERDAY = todayDate.clone().subtract(1, 'day').format('YYYY-MM-DD'); + var TODAY = todayDate.format('YYYY-MM-DD'); + var TOMORROW = todayDate.clone().add(1, 'day').format('YYYY-MM-DD'); + + $('#m_calendar').fullCalendar({ + header: { + left: 'prev,next today', + center: 'title', + right: 'month,agendaWeek,agendaDay,listWeek' + }, + editable: true, + eventLimit: true, // allow "more" link when too many events + navLinks: true, + defaultDate: moment('2017-09-15'), + events: [ + { + title: 'Meeting', + start: moment('2017-08-28'), + description: 'Lorem ipsum dolor sit incid idunt ut', + className: "m-fc-event--light m-fc-event--solid-warning" + }, + { + title: 'Conference', + description: 'Lorem ipsum dolor incid idunt ut labore', + start: moment('2017-08-29T13:30:00'), + end: moment('2017-08-29T17:30:00'), + className: "m-fc-event--accent" + }, + { + title: 'Dinner', + start: moment('2017-08-30'), + description: 'Lorem ipsum dolor sit tempor incid', + className: "m-fc-event--light m-fc-event--solid-danger" + }, + { + title: 'All Day Event', + start: moment('2017-09-01'), + description: 'Lorem ipsum dolor sit incid idunt ut', + className: "m-fc-event--danger m-fc-event--solid-focus" + }, + { + title: 'Reporting', + description: 'Lorem ipsum dolor incid idunt ut labore', + start: moment('2017-09-03T13:30:00'), + end: moment('2017-09-04T17:30:00'), + className: "m-fc-event--accent" + }, + { + title: 'Company Trip', + start: moment('2017-09-05'), + end: moment('2017-09-07'), + description: 'Lorem ipsum dolor sit tempor incid', + className: "m-fc-event--primary" + }, + { + title: 'ICT Expo 2017 - Product Release', + start: moment('2017-09-09'), + description: 'Lorem ipsum dolor sit tempor inci', + className: "m-fc-event--light m-fc-event--solid-primary" + }, + { + title: 'Dinner', + start: moment('2017-09-12'), + description: 'Lorem ipsum dolor sit amet, conse ctetur' + }, + { + id: 999, + title: 'Repeating Event', + start: moment('2017-09-15T16:00:00'), + description: 'Lorem ipsum dolor sit ncididunt ut labore', + className: "m-fc-event--danger" + }, + { + id: 1000, + title: 'Repeating Event', + description: 'Lorem ipsum dolor sit amet, labore', + start: moment('2017-09-18T19:00:00'), + }, + { + title: 'Conference', + start: moment('2017-09-20T13:00:00'), + end: moment('2017-09-21T19:00:00'), + description: 'Lorem ipsum dolor eius mod tempor labore', + className: "m-fc-event--accent" + }, + { + title: 'Meeting', + start: moment('2017-09-11'), + description: 'Lorem ipsum dolor eiu idunt ut labore' + }, + { + title: 'Lunch', + start: moment('2017-09-18'), + className: "m-fc-event--info m-fc-event--solid-accent", + description: 'Lorem ipsum dolor sit amet, ut labore' + }, + { + title: 'Meeting', + start: moment('2017-09-24'), + className: "m-fc-event--warning", + description: 'Lorem ipsum conse ctetur adipi scing' + }, + { + title: 'Happy Hour', + start: moment('2017-09-24'), + className: "m-fc-event--light m-fc-event--solid-focus", + description: 'Lorem ipsum dolor sit amet, conse ctetur' + }, + { + title: 'Dinner', + start: moment('2017-09-24'), + className: "m-fc-event--solid-focus m-fc-event--light", + description: 'Lorem ipsum dolor sit ctetur adipi scing' + }, + { + title: 'Birthday Party', + start: moment('2017-09-24'), + className: "m-fc-event--primary", + description: 'Lorem ipsum dolor sit amet, scing' + }, + { + title: 'Company Event', + start: moment('2017-09-24'), + className: "m-fc-event--danger", + description: 'Lorem ipsum dolor sit amet, scing' + }, + { + title: 'Click for Google', + url: 'http://google.com/', + start: moment('2017-09-26'), + className: "m-fc-event--solid-info m-fc-event--light", + description: 'Lorem ipsum dolor sit amet, labore' + } + ], + + eventRender: function(event, element) { + if (element.hasClass('fc-day-grid-event')) { + element.data('content', event.description); + element.data('placement', 'top'); + mApp.initPopover(element); + } else if (element.hasClass('fc-time-grid-event')) { + element.find('.fc-title').append('
' + event.description + '
'); + } else if (element.find('.fc-list-item-title').lenght !== 0) { + element.find('.fc-list-item-title').append('
' + event.description + '
'); + } + } + }); + } + + return { + //== Init demos + init: function() { + // init charts + dailySales(); + profitShare(); + salesStats(); + salesBymUtils(); + latestUpdates(); + trendsStats(); + trendsStats2(); + latestTrendsMap(); + revenueChange(); + supportTickets(); + supportTickets2(); + activitiesChart(); + bandwidthChart1(); + bandwidthChart2(); + adWordsStat(); + financeSummary(); + quickStats(); + + // init daterangepicker + daterangepickerInit(); + + // datatables + datatableLatestOrders(); + + // calendar + calendarInit(); + } + }; +}(); + +//== Class initialization on page load +jQuery(document).ready(function() { + Dashboard.init(); +}); \ No newline at end of file diff --git a/public/assets/app/js/layout-builder.js b/public/assets/app/js/layout-builder.js new file mode 100644 index 00000000..989c7aaf --- /dev/null +++ b/public/assets/app/js/layout-builder.js @@ -0,0 +1,439 @@ +//== Class definition +var LayoutBuilder = function() { + + var exporter = { + init: function() { + $('#m-btn-howto').click(function(e) { + e.preventDefault(); + $('#m-howto').slideToggle(); + }); + this.exportHtml(); + this.exportHtmlStatic(); + this.exportAngular(); + }, + startLoad: function(options) { + $('#builder_export'). + addClass('m-loader m-loader--light m-loader--right'). + find('> span > span'). + text('Exporting...'). + closest('.m-form__actions'). + find('.btn'). + prop('disabled', true); + $.notify(options); + }, + doneLoad: function() { + $('#builder_export'). + removeClass('m-loader m-loader--light m-loader--right'). + find('> span > span'). + text('Export'). + closest('.m-form__actions'). + find('.btn'). + prop('disabled', false); + }, + exportHtml: function() { + $('#builder_export_html').click(function(e) { + e.preventDefault(); + if (!envato.isVerified()) return; + + var _self = $(this); + + exporter.startLoad({ + title: 'Generate HTML Partials', + message: 'Process started and it may take about 1 to 10 minutes.', + }); + + $.ajax('index.php', { + method: 'POST', + data: { + builder_export: 1, + export_type: 'partial', + demo: $(_self).data('demo'), + }, + }).done(function(r) { + var result = JSON.parse(r); + if (result.message) { + exporter.stopWithNotify(result.message); + return; + } + + var timer = setInterval(function() { + $.ajax('index.php', { + method: 'POST', + data: { + builder_export: 1, + builder_check: result.id, + }, + }).done(function(r) { + var result = JSON.parse(r); + if (typeof result === 'undefined') return; + // export status 1 is completed + if (result.export_status !== '1') return; + + $(''); + else + lyr1 = $(''); + + if (opts.theme) + lyr2 = $(''); + else + lyr2 = $(''); + + if (opts.theme && full) { + s = ''; + } + else if (opts.theme) { + s = ''; + } + else if (full) { + s = ''; + } + else { + s = ''; + } + lyr3 = $(s); + + // if we have a message, style it + if (msg) { + if (opts.theme) { + lyr3.css(themedCSS); + lyr3.addClass('ui-widget-content'); + } + else + lyr3.css(css); + } + + // style the overlay + if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/) + lyr2.css(opts.overlayCSS); + lyr2.css('position', full ? 'fixed' : 'absolute'); + + // make iframe layer transparent in IE + if (msie || opts.forceIframe) + lyr1.css('opacity',0.0); + + //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el); + var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el); + $.each(layers, function() { + this.appendTo($par); + }); + + if (opts.theme && opts.draggable && $.fn.draggable) { + lyr3.draggable({ + handle: '.ui-dialog-titlebar', + cancel: 'li' + }); + } + + // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling) + var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0); + if (ie6 || expr) { + // give body 100% height + if (full && opts.allowBodyStretch && $.support.boxModel) + $('html,body').css('height','100%'); + + // fix ie6 issue when blocked element has a border width + if ((ie6 || !$.support.boxModel) && !full) { + var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth'); + var fixT = t ? '(0 - '+t+')' : 0; + var fixL = l ? '(0 - '+l+')' : 0; + } + + // simulate fixed position + $.each(layers, function(i,o) { + var s = o[0].style; + s.position = 'absolute'; + if (i < 2) { + if (full) + s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"'); + else + s.setExpression('height','this.parentNode.offsetHeight + "px"'); + if (full) + s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"'); + else + s.setExpression('width','this.parentNode.offsetWidth + "px"'); + if (fixL) s.setExpression('left', fixL); + if (fixT) s.setExpression('top', fixT); + } + else if (opts.centerY) { + if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'); + s.marginTop = 0; + } + else if (!opts.centerY && full) { + var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0; + var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"'; + s.setExpression('top',expression); + } + }); + } + + // show the message + if (msg) { + if (opts.theme) + lyr3.find('.ui-widget-content').append(msg); + else + lyr3.append(msg); + if (msg.jquery || msg.nodeType) + $(msg).show(); + } + + if ((msie || opts.forceIframe) && opts.showOverlay) + lyr1.show(); // opacity is zero + if (opts.fadeIn) { + var cb = opts.onBlock ? opts.onBlock : noOp; + var cb1 = (opts.showOverlay && !msg) ? cb : noOp; + var cb2 = msg ? cb : noOp; + if (opts.showOverlay) + lyr2._fadeIn(opts.fadeIn, cb1); + if (msg) + lyr3._fadeIn(opts.fadeIn, cb2); + } + else { + if (opts.showOverlay) + lyr2.show(); + if (msg) + lyr3.show(); + if (opts.onBlock) + opts.onBlock.bind(lyr3)(); + } + + // bind key and mouse events + bind(1, el, opts); + + if (full) { + pageBlock = lyr3[0]; + pageBlockEls = $(opts.focusableElements,pageBlock); + if (opts.focusInput) + setTimeout(focus, 20); + } + else + center(lyr3[0], opts.centerX, opts.centerY); + + if (opts.timeout) { + // auto-unblock + var to = setTimeout(function() { + if (full) + $.unblockUI(opts); + else + $(el).unblock(opts); + }, opts.timeout); + $(el).data('blockUI.timeout', to); + } + } + + // remove the block + function remove(el, opts) { + var count; + var full = (el == window); + var $el = $(el); + var data = $el.data('blockUI.history'); + var to = $el.data('blockUI.timeout'); + if (to) { + clearTimeout(to); + $el.removeData('blockUI.timeout'); + } + opts = $.extend({}, $.blockUI.defaults, opts || {}); + bind(0, el, opts); // unbind events + + if (opts.onUnblock === null) { + opts.onUnblock = $el.data('blockUI.onUnblock'); + $el.removeData('blockUI.onUnblock'); + } + + var els; + if (full) // crazy selector to handle odd field errors in ie6/7 + els = $('body').children().filter('.blockUI').add('body > .blockUI'); + else + els = $el.find('>.blockUI'); + + // fix cursor issue + if ( opts.cursorReset ) { + if ( els.length > 1 ) + els[1].style.cursor = opts.cursorReset; + if ( els.length > 2 ) + els[2].style.cursor = opts.cursorReset; + } + + if (full) + pageBlock = pageBlockEls = null; + + if (opts.fadeOut) { + count = els.length; + els.stop().fadeOut(opts.fadeOut, function() { + if ( --count === 0) + reset(els,data,opts,el); + }); + } + else + reset(els, data, opts, el); + } + + // move blocking element back into the DOM where it started + function reset(els,data,opts,el) { + var $el = $(el); + if ( $el.data('blockUI.isBlocked') ) + return; + + els.each(function(i,o) { + // remove via DOM calls so we don't lose event handlers + if (this.parentNode) + this.parentNode.removeChild(this); + }); + + if (data && data.el) { + data.el.style.display = data.display; + data.el.style.position = data.position; + data.el.style.cursor = 'default'; // #59 + if (data.parent) + data.parent.appendChild(data.el); + $el.removeData('blockUI.history'); + } + + if ($el.data('blockUI.static')) { + $el.css('position', 'static'); // #22 + } + + if (typeof opts.onUnblock == 'function') + opts.onUnblock(el,opts); + + // fix issue in Safari 6 where block artifacts remain until reflow + var body = $(document.body), w = body.width(), cssW = body[0].style.width; + body.width(w-1).width(w); + body[0].style.width = cssW; + } + + // bind/unbind the handler + function bind(b, el, opts) { + var full = el == window, $el = $(el); + + // don't bother unbinding if there is nothing to unbind + if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked'))) + return; + + $el.data('blockUI.isBlocked', b); + + // don't bind events when overlay is not in use or if bindEvents is false + if (!full || !opts.bindEvents || (b && !opts.showOverlay)) + return; + + // bind anchors and inputs for mouse and key events + var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove'; + if (b) + $(document).bind(events, opts, handler); + else + $(document).unbind(events, handler); + + // former impl... + // var $e = $('a,:input'); + // b ? $e.bind(events, opts, handler) : $e.unbind(events, handler); + } + + // event handler to suppress keyboard/mouse events when blocking + function handler(e) { + // allow tab navigation (conditionally) + if (e.type === 'keydown' && e.keyCode && e.keyCode == 9) { + if (pageBlock && e.data.constrainTabKey) { + var els = pageBlockEls; + var fwd = !e.shiftKey && e.target === els[els.length-1]; + var back = e.shiftKey && e.target === els[0]; + if (fwd || back) { + setTimeout(function(){focus(back);},10); + return false; + } + } + } + var opts = e.data; + var target = $(e.target); + if (target.hasClass('blockOverlay') && opts.onOverlayClick) + opts.onOverlayClick(e); + + // allow events within the message content + if (target.parents('div.' + opts.blockMsgClass).length > 0) + return true; + + // allow events for content that is not being blocked + return target.parents().children().filter('div.blockUI').length === 0; + } + + function focus(back) { + if (!pageBlockEls) + return; + var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0]; + if (e) + e.focus(); + } + + function center(el, x, y) { + var p = el.parentNode, s = el.style; + var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth'); + var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth'); + if (x) s.left = l > 0 ? (l+'px') : '0'; + if (y) s.top = t > 0 ? (t+'px') : '0'; + } + + function sz(el, p) { + return parseInt($.css(el,p),10)||0; + } + + } + + + /*global define:true */ + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], setup); + } else if (typeof exports === 'object') { + // Node/CommonJS + setup(require('jquery')); + } else { + // Browser globals + setup(jQuery); + } + +})(); + +/*! + * Datepicker for Bootstrap v1.7.1 (https://github.com/uxsolutions/bootstrap-datepicker) + * + * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) + */ + +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a,b){function c(){return new Date(Date.UTC.apply(Date,arguments))}function d(){var a=new Date;return c(a.getFullYear(),a.getMonth(),a.getDate())}function e(a,b){return a.getUTCFullYear()===b.getUTCFullYear()&&a.getUTCMonth()===b.getUTCMonth()&&a.getUTCDate()===b.getUTCDate()}function f(c,d){return function(){return d!==b&&a.fn.datepicker.deprecated(d),this[c].apply(this,arguments)}}function g(a){return a&&!isNaN(a.getTime())}function h(b,c){function d(a,b){return b.toLowerCase()}var e,f=a(b).data(),g={},h=new RegExp("^"+c.toLowerCase()+"([A-Z])");c=new RegExp("^"+c.toLowerCase());for(var i in f)c.test(i)&&(e=i.replace(h,d),g[e]=f[i]);return g}function i(b){var c={};if(q[b]||(b=b.split("-")[0],q[b])){var d=q[b];return a.each(p,function(a,b){b in d&&(c[b]=d[b])}),c}}var j=function(){var b={get:function(a){return this.slice(a)[0]},contains:function(a){for(var b=a&&a.valueOf(),c=0,d=this.length;c]/g)||[]).length<=0)return!0;var d=a(c);return d.length>0}catch(a){return!1}},_process_options:function(b){this._o=a.extend({},this._o,b);var e=this.o=a.extend({},this._o),f=e.language;q[f]||(f=f.split("-")[0],q[f]||(f=o.language)),e.language=f,e.startView=this._resolveViewName(e.startView),e.minViewMode=this._resolveViewName(e.minViewMode),e.maxViewMode=this._resolveViewName(e.maxViewMode),e.startView=Math.max(this.o.minViewMode,Math.min(this.o.maxViewMode,e.startView)),e.multidate!==!0&&(e.multidate=Number(e.multidate)||!1,e.multidate!==!1&&(e.multidate=Math.max(0,e.multidate))),e.multidateSeparator=String(e.multidateSeparator),e.weekStart%=7,e.weekEnd=(e.weekStart+6)%7;var g=r.parseFormat(e.format);e.startDate!==-(1/0)&&(e.startDate?e.startDate instanceof Date?e.startDate=this._local_to_utc(this._zero_time(e.startDate)):e.startDate=r.parseDate(e.startDate,g,e.language,e.assumeNearbyYear):e.startDate=-(1/0)),e.endDate!==1/0&&(e.endDate?e.endDate instanceof Date?e.endDate=this._local_to_utc(this._zero_time(e.endDate)):e.endDate=r.parseDate(e.endDate,g,e.language,e.assumeNearbyYear):e.endDate=1/0),e.daysOfWeekDisabled=this._resolveDaysOfWeek(e.daysOfWeekDisabled||[]),e.daysOfWeekHighlighted=this._resolveDaysOfWeek(e.daysOfWeekHighlighted||[]),e.datesDisabled=e.datesDisabled||[],a.isArray(e.datesDisabled)||(e.datesDisabled=e.datesDisabled.split(",")),e.datesDisabled=a.map(e.datesDisabled,function(a){return r.parseDate(a,g,e.language,e.assumeNearbyYear)});var h=String(e.orientation).toLowerCase().split(/\s+/g),i=e.orientation.toLowerCase();if(h=a.grep(h,function(a){return/^auto|left|right|top|bottom$/.test(a)}),e.orientation={x:"auto",y:"auto"},i&&"auto"!==i)if(1===h.length)switch(h[0]){case"top":case"bottom":e.orientation.y=h[0];break;case"left":case"right":e.orientation.x=h[0]}else i=a.grep(h,function(a){return/^left|right$/.test(a)}),e.orientation.x=i[0]||"auto",i=a.grep(h,function(a){return/^top|bottom$/.test(a)}),e.orientation.y=i[0]||"auto";else;if(e.defaultViewDate instanceof Date||"string"==typeof e.defaultViewDate)e.defaultViewDate=r.parseDate(e.defaultViewDate,g,e.language,e.assumeNearbyYear);else if(e.defaultViewDate){var j=e.defaultViewDate.year||(new Date).getFullYear(),k=e.defaultViewDate.month||0,l=e.defaultViewDate.day||1;e.defaultViewDate=c(j,k,l)}else e.defaultViewDate=d()},_events:[],_secondaryEvents:[],_applyEvents:function(a){for(var c,d,e,f=0;ff?(this.picker.addClass("datepicker-orient-right"),n+=m-b):this.o.rtl?this.picker.addClass("datepicker-orient-right"):this.picker.addClass("datepicker-orient-left");var p,q=this.o.orientation.y;if("auto"===q&&(p=-g+o-c,q=p<0?"bottom":"top"),this.picker.addClass("datepicker-orient-"+q),"top"===q?o-=c+parseInt(this.picker.css("padding-top")):o+=l,this.o.rtl){var r=f-(n+m);this.picker.css({top:o,right:r,zIndex:j})}else this.picker.css({top:o,left:n,zIndex:j});return this},_allow_update:!0,update:function(){if(!this._allow_update)return this;var b=this.dates.copy(),c=[],d=!1;return arguments.length?(a.each(arguments,a.proxy(function(a,b){b instanceof Date&&(b=this._local_to_utc(b)),c.push(b)},this)),d=!0):(c=this.isInput?this.element.val():this.element.data("date")||this.inputField.val(),c=c&&this.o.multidate?c.split(this.o.multidateSeparator):[c],delete this.element.data().date),c=a.map(c,a.proxy(function(a){return r.parseDate(a,this.o.format,this.o.language,this.o.assumeNearbyYear)},this)),c=a.grep(c,a.proxy(function(a){return!this.dateWithinRange(a)||!a},this),!0),this.dates.replace(c),this.o.updateViewDate&&(this.dates.length?this.viewDate=new Date(this.dates.get(-1)):this.viewDatethis.o.endDate?this.viewDate=new Date(this.o.endDate):this.viewDate=this.o.defaultViewDate),d?(this.setValue(),this.element.change()):this.dates.length&&String(b)!==String(this.dates)&&d&&(this._trigger("changeDate"),this.element.change()),!this.dates.length&&b.length&&(this._trigger("clearDate"),this.element.change()),this.fill(),this},fillDow:function(){if(this.o.showWeekDays){var b=this.o.weekStart,c="";for(this.o.calendarWeeks&&(c+=' ');b";c+="",this.picker.find(".datepicker-days thead").append(c)}},fillMonths:function(){for(var a,b=this._utc_to_local(this.viewDate),c="",d=0;d<12;d++)a=b&&b.getMonth()===d?" focused":"",c+=''+q[this.o.language].monthsShort[d]+"";this.picker.find(".datepicker-months td").html(c)},setRange:function(b){b&&b.length?this.range=a.map(b,function(a){return a.valueOf()}):delete this.range,this.fill()},getClassNames:function(b){var c=[],f=this.viewDate.getUTCFullYear(),g=this.viewDate.getUTCMonth(),h=d();return b.getUTCFullYear()f||b.getUTCFullYear()===f&&b.getUTCMonth()>g)&&c.push("new"),this.focusDate&&b.valueOf()===this.focusDate.valueOf()&&c.push("focused"),this.o.todayHighlight&&e(b,h)&&c.push("today"),this.dates.contains(b)!==-1&&c.push("active"),this.dateWithinRange(b)||c.push("disabled"),this.dateIsDisabled(b)&&c.push("disabled","disabled-date"),a.inArray(b.getUTCDay(),this.o.daysOfWeekHighlighted)!==-1&&c.push("highlighted"),this.range&&(b>this.range[0]&&bh)&&j.push("disabled"),t===r&&j.push("focused"),i!==a.noop&&(l=i(new Date(t,0,1)),l===b?l={}:"boolean"==typeof l?l={enabled:l}:"string"==typeof l&&(l={classes:l}),l.enabled===!1&&j.push("disabled"),l.classes&&(j=j.concat(l.classes.split(/\s+/))),l.tooltip&&(k=l.tooltip)),m+='"+t+"";o.find(".datepicker-switch").text(p+"-"+q),o.find("td").html(m)},fill:function(){var d,e,f=new Date(this.viewDate),g=f.getUTCFullYear(),h=f.getUTCMonth(),i=this.o.startDate!==-(1/0)?this.o.startDate.getUTCFullYear():-(1/0),j=this.o.startDate!==-(1/0)?this.o.startDate.getUTCMonth():-(1/0),k=this.o.endDate!==1/0?this.o.endDate.getUTCFullYear():1/0,l=this.o.endDate!==1/0?this.o.endDate.getUTCMonth():1/0,m=q[this.o.language].today||q.en.today||"",n=q[this.o.language].clear||q.en.clear||"",o=q[this.o.language].titleFormat||q.en.titleFormat;if(!isNaN(g)&&!isNaN(h)){this.picker.find(".datepicker-days .datepicker-switch").text(r.formatDate(f,o,this.o.language)),this.picker.find("tfoot .today").text(m).css("display",this.o.todayBtn===!0||"linked"===this.o.todayBtn?"table-cell":"none"),this.picker.find("tfoot .clear").text(n).css("display",this.o.clearBtn===!0?"table-cell":"none"),this.picker.find("thead .datepicker-title").text(this.o.title).css("display","string"==typeof this.o.title&&""!==this.o.title?"table-cell":"none"),this.updateNavArrows(),this.fillMonths();var p=c(g,h,0),s=p.getUTCDate();p.setUTCDate(s-(p.getUTCDay()-this.o.weekStart+7)%7);var t=new Date(p);p.getUTCFullYear()<100&&t.setUTCFullYear(p.getUTCFullYear()),t.setUTCDate(t.getUTCDate()+42),t=t.valueOf();for(var u,v,w=[];p.valueOf()"),this.o.calendarWeeks)){var x=new Date(+p+(this.o.weekStart-u-7)%7*864e5),y=new Date(Number(x)+(11-x.getUTCDay())%7*864e5),z=new Date(Number(z=c(y.getUTCFullYear(),0,1))+(11-z.getUTCDay())%7*864e5),A=(y-z)/864e5/7+1;w.push(''+A+"")}v=this.getClassNames(p),v.push("day");var B=p.getUTCDate();this.o.beforeShowDay!==a.noop&&(e=this.o.beforeShowDay(this._utc_to_local(p)),e===b?e={}:"boolean"==typeof e?e={enabled:e}:"string"==typeof e&&(e={classes:e}),e.enabled===!1&&v.push("disabled"),e.classes&&(v=v.concat(e.classes.split(/\s+/))),e.tooltip&&(d=e.tooltip),e.content&&(B=e.content)),v=a.isFunction(a.uniqueSort)?a.uniqueSort(v):a.unique(v),w.push(''+B+""),d=null,u===this.o.weekEnd&&w.push(""),p.setUTCDate(p.getUTCDate()+1)}this.picker.find(".datepicker-days tbody").html(w.join(""));var C=q[this.o.language].monthsTitle||q.en.monthsTitle||"Months",D=this.picker.find(".datepicker-months").find(".datepicker-switch").text(this.o.maxViewMode<2?C:g).end().find("tbody span").removeClass("active");if(a.each(this.dates,function(a,b){b.getUTCFullYear()===g&&D.eq(b.getUTCMonth()).addClass("active")}),(gk)&&D.addClass("disabled"),g===i&&D.slice(0,j).addClass("disabled"),g===k&&D.slice(l+1).addClass("disabled"),this.o.beforeShowMonth!==a.noop){var E=this;a.each(D,function(c,d){var e=new Date(g,c,1),f=E.o.beforeShowMonth(e);f===b?f={}:"boolean"==typeof f?f={enabled:f}:"string"==typeof f&&(f={classes:f}),f.enabled!==!1||a(d).hasClass("disabled")||a(d).addClass("disabled"),f.classes&&a(d).addClass(f.classes),f.tooltip&&a(d).prop("title",f.tooltip)})}this._fill_yearsView(".datepicker-years","year",10,g,i,k,this.o.beforeShowYear),this._fill_yearsView(".datepicker-decades","decade",100,g,i,k,this.o.beforeShowDecade),this._fill_yearsView(".datepicker-centuries","century",1e3,g,i,k,this.o.beforeShowCentury)}},updateNavArrows:function(){if(this._allow_update){var a,b,c=new Date(this.viewDate),d=c.getUTCFullYear(),e=c.getUTCMonth(),f=this.o.startDate!==-(1/0)?this.o.startDate.getUTCFullYear():-(1/0),g=this.o.startDate!==-(1/0)?this.o.startDate.getUTCMonth():-(1/0),h=this.o.endDate!==1/0?this.o.endDate.getUTCFullYear():1/0,i=this.o.endDate!==1/0?this.o.endDate.getUTCMonth():1/0,j=1;switch(this.viewMode){case 0:a=d<=f&&e<=g,b=d>=h&&e>=i;break;case 4:j*=10;case 3:j*=10;case 2:j*=10;case 1:a=Math.floor(d/j)*j<=f,b=Math.floor(d/j)*j+j>=h}this.picker.find(".prev").toggleClass("disabled",a),this.picker.find(".next").toggleClass("disabled",b)}},click:function(b){b.preventDefault(),b.stopPropagation();var e,f,g,h;e=a(b.target),e.hasClass("datepicker-switch")&&this.viewMode!==this.o.maxViewMode&&this.setViewMode(this.viewMode+1),e.hasClass("today")&&!e.hasClass("day")&&(this.setViewMode(0),this._setDate(d(),"linked"===this.o.todayBtn?null:"view")),e.hasClass("clear")&&this.clearDates(),e.hasClass("disabled")||(e.hasClass("month")||e.hasClass("year")||e.hasClass("decade")||e.hasClass("century"))&&(this.viewDate.setUTCDate(1),f=1,1===this.viewMode?(h=e.parent().find("span").index(e),g=this.viewDate.getUTCFullYear(),this.viewDate.setUTCMonth(h)):(h=0,g=Number(e.text()),this.viewDate.setUTCFullYear(g)),this._trigger(r.viewModes[this.viewMode-1].e,this.viewDate),this.viewMode===this.o.minViewMode?this._setDate(c(g,h,f)):(this.setViewMode(this.viewMode-1),this.fill())),this.picker.is(":visible")&&this._focused_from&&this._focused_from.focus(),delete this._focused_from},dayCellClick:function(b){var c=a(b.currentTarget),d=c.data("date"),e=new Date(d);this.o.updateViewDate&&(e.getUTCFullYear()!==this.viewDate.getUTCFullYear()&&this._trigger("changeYear",this.viewDate),e.getUTCMonth()!==this.viewDate.getUTCMonth()&&this._trigger("changeMonth",this.viewDate)),this._setDate(e)},navArrowsClick:function(b){var c=a(b.currentTarget),d=c.hasClass("prev")?-1:1;0!==this.viewMode&&(d*=12*r.viewModes[this.viewMode].navStep),this.viewDate=this.moveMonth(this.viewDate,d),this._trigger(r.viewModes[this.viewMode].e,this.viewDate),this.fill()},_toggle_multidate:function(a){var b=this.dates.contains(a);if(a||this.dates.clear(),b!==-1?(this.o.multidate===!0||this.o.multidate>1||this.o.toggleActive)&&this.dates.remove(b):this.o.multidate===!1?(this.dates.clear(),this.dates.push(a)):this.dates.push(a),"number"==typeof this.o.multidate)for(;this.dates.length>this.o.multidate;)this.dates.remove(0)},_setDate:function(a,b){b&&"date"!==b||this._toggle_multidate(a&&new Date(a)),(!b&&this.o.updateViewDate||"view"===b)&&(this.viewDate=a&&new Date(a)),this.fill(),this.setValue(),b&&"view"===b||this._trigger("changeDate"),this.inputField.trigger("change"),!this.o.autoclose||b&&"date"!==b||this.hide()},moveDay:function(a,b){var c=new Date(a);return c.setUTCDate(a.getUTCDate()+b),c},moveWeek:function(a,b){return this.moveDay(a,7*b)},moveMonth:function(a,b){if(!g(a))return this.o.defaultViewDate;if(!b)return a;var c,d,e=new Date(a.valueOf()),f=e.getUTCDate(),h=e.getUTCMonth(),i=Math.abs(b);if(b=b>0?1:-1,1===i)d=b===-1?function(){return e.getUTCMonth()===h}:function(){return e.getUTCMonth()!==c},c=h+b,e.setUTCMonth(c),c=(c+12)%12;else{for(var j=0;j0},dateWithinRange:function(a){return a>=this.o.startDate&&a<=this.o.endDate},keydown:function(a){if(!this.picker.is(":visible"))return void(40!==a.keyCode&&27!==a.keyCode||(this.show(),a.stopPropagation()));var b,c,d=!1,e=this.focusDate||this.viewDate;switch(a.keyCode){case 27:this.focusDate?(this.focusDate=null,this.viewDate=this.dates.get(-1)||this.viewDate,this.fill()):this.hide(),a.preventDefault(),a.stopPropagation();break;case 37:case 38:case 39:case 40:if(!this.o.keyboardNavigation||7===this.o.daysOfWeekDisabled.length)break;b=37===a.keyCode||38===a.keyCode?-1:1,0===this.viewMode?a.ctrlKey?(c=this.moveAvailableDate(e,b,"moveYear"),c&&this._trigger("changeYear",this.viewDate)):a.shiftKey?(c=this.moveAvailableDate(e,b,"moveMonth"),c&&this._trigger("changeMonth",this.viewDate)):37===a.keyCode||39===a.keyCode?c=this.moveAvailableDate(e,b,"moveDay"):this.weekOfDateIsDisabled(e)||(c=this.moveAvailableDate(e,b,"moveWeek")):1===this.viewMode?(38!==a.keyCode&&40!==a.keyCode||(b*=4),c=this.moveAvailableDate(e,b,"moveMonth")):2===this.viewMode&&(38!==a.keyCode&&40!==a.keyCode||(b*=4),c=this.moveAvailableDate(e,b,"moveYear")),c&&(this.focusDate=this.viewDate=c,this.setValue(),this.fill(),a.preventDefault());break;case 13:if(!this.o.forceParse)break;e=this.focusDate||this.dates.get(-1)||this.viewDate,this.o.keyboardNavigation&&(this._toggle_multidate(e),d=!0),this.focusDate=null,this.viewDate=this.dates.get(-1)||this.viewDate,this.setValue(),this.fill(),this.picker.is(":visible")&&(a.preventDefault(),a.stopPropagation(),this.o.autoclose&&this.hide());break;case 9:this.focusDate=null,this.viewDate=this.dates.get(-1)||this.viewDate,this.fill(),this.hide()}d&&(this.dates.length?this._trigger("changeDate"):this._trigger("clearDate"),this.inputField.trigger("change"))},setViewMode:function(a){this.viewMode=a,this.picker.children("div").hide().filter(".datepicker-"+r.viewModes[this.viewMode].clsName).show(),this.updateNavArrows(),this._trigger("changeViewMode",new Date(this.viewDate))}};var l=function(b,c){a.data(b,"datepicker",this),this.element=a(b),this.inputs=a.map(c.inputs,function(a){return a.jquery?a[0]:a}),delete c.inputs,this.keepEmptyValues=c.keepEmptyValues,delete c.keepEmptyValues,n.call(a(this.inputs),c).on("changeDate",a.proxy(this.dateUpdated,this)),this.pickers=a.map(this.inputs,function(b){return a.data(b,"datepicker")}),this.updateDates()};l.prototype={updateDates:function(){this.dates=a.map(this.pickers,function(a){return a.getUTCDate()}),this.updateRanges()},updateRanges:function(){var b=a.map(this.dates,function(a){return a.valueOf()});a.each(this.pickers,function(a,c){c.setRange(b)})},dateUpdated:function(c){if(!this.updating){this.updating=!0;var d=a.data(c.target,"datepicker");if(d!==b){var e=d.getUTCDate(),f=this.keepEmptyValues,g=a.inArray(c.target,this.inputs),h=g-1,i=g+1,j=this.inputs.length;if(g!==-1){if(a.each(this.pickers,function(a,b){b.getUTCDate()||b!==d&&f||b.setUTCDate(e)}),e=0&&ethis.dates[i])for(;ithis.dates[i];)this.pickers[i++].setUTCDate(e);this.updateDates(),delete this.updating}}}},destroy:function(){a.map(this.pickers,function(a){a.destroy()}),a(this.inputs).off("changeDate",this.dateUpdated),delete this.element.data().datepicker},remove:f("destroy","Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead")};var m=a.fn.datepicker,n=function(c){var d=Array.apply(null,arguments);d.shift();var e;if(this.each(function(){var b=a(this),f=b.data("datepicker"),g="object"==typeof c&&c;if(!f){var j=h(this,"date"),m=a.extend({},o,j,g),n=i(m.language),p=a.extend({},o,n,j,g);b.hasClass("input-daterange")||p.inputs?(a.extend(p,{inputs:p.inputs||b.find("input").toArray()}),f=new l(this,p)):f=new k(this,p),b.data("datepicker",f)}"string"==typeof c&&"function"==typeof f[c]&&(e=f[c].apply(f,d))}),e===b||e instanceof k||e instanceof l)return this;if(this.length>1)throw new Error("Using only allowed for the collection of a single element ("+c+" function)");return e};a.fn.datepicker=n;var o=a.fn.datepicker.defaults={assumeNearbyYear:!1,autoclose:!1,beforeShowDay:a.noop,beforeShowMonth:a.noop,beforeShowYear:a.noop,beforeShowDecade:a.noop,beforeShowCentury:a.noop,calendarWeeks:!1,clearBtn:!1,toggleActive:!1,daysOfWeekDisabled:[],daysOfWeekHighlighted:[],datesDisabled:[],endDate:1/0,forceParse:!0,format:"mm/dd/yyyy",keepEmptyValues:!1,keyboardNavigation:!0,language:"en",minViewMode:0,maxViewMode:4,multidate:!1,multidateSeparator:",",orientation:"auto",rtl:!1,startDate:-(1/0),startView:0,todayBtn:!1,todayHighlight:!1,updateViewDate:!0,weekStart:0,disableTouchKeyboard:!1,enableOnReadonly:!0,showOnFocus:!0,zIndexOffset:10,container:"body",immediateUpdates:!1,title:"",templates:{leftArrow:"«",rightArrow:"»"},showWeekDays:!0},p=a.fn.datepicker.locale_opts=["format","rtl","weekStart"];a.fn.datepicker.Constructor=k;var q=a.fn.datepicker.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",clear:"Clear",titleFormat:"MM yyyy"}},r={viewModes:[{names:["days","month"],clsName:"days",e:"changeMonth"},{names:["months","year"],clsName:"months",e:"changeYear",navStep:1},{names:["years","decade"],clsName:"years",e:"changeDecade",navStep:10},{names:["decades","century"],clsName:"decades",e:"changeCentury",navStep:100},{names:["centuries","millennium"],clsName:"centuries",e:"changeMillennium",navStep:1e3}],validParts:/dd?|DD?|mm?|MM?|yy(?:yy)?/g,nonpunctuation:/[^ -\/:-@\u5e74\u6708\u65e5\[-`{-~\t\n\r]+/g,parseFormat:function(a){if("function"==typeof a.toValue&&"function"==typeof a.toDisplay)return a;var b=a.replace(this.validParts,"\0").split("\0"),c=a.match(this.validParts);if(!b||!b.length||!c||0===c.length)throw new Error("Invalid date format.");return{separators:b,parts:c}},parseDate:function(c,e,f,g){function h(a,b){return b===!0&&(b=10),a<100&&(a+=2e3,a>(new Date).getFullYear()+b&&(a-=100)),a}function i(){var a=this.slice(0,j[n].length),b=j[n].slice(0,a.length);return a.toLowerCase()===b.toLowerCase()}if(!c)return b;if(c instanceof Date)return c;if("string"==typeof e&&(e=r.parseFormat(e)),e.toValue)return e.toValue(c,e,f);var j,l,m,n,o,p={d:"moveDay",m:"moveMonth",w:"moveWeek",y:"moveYear"},s={yesterday:"-1d",today:"+0d",tomorrow:"+1d"};if(c in s&&(c=s[c]),/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/i.test(c)){for(j=c.match(/([\-+]\d+)([dmwy])/gi),c=new Date,n=0;n'+o.templates.leftArrow+''+o.templates.rightArrow+"", +contTemplate:'',footTemplate:''};r.template='
'+r.headTemplate+""+r.footTemplate+'
'+r.headTemplate+r.contTemplate+r.footTemplate+'
'+r.headTemplate+r.contTemplate+r.footTemplate+'
'+r.headTemplate+r.contTemplate+r.footTemplate+'
'+r.headTemplate+r.contTemplate+r.footTemplate+"
",a.fn.datepicker.DPGlobal=r,a.fn.datepicker.noConflict=function(){return a.fn.datepicker=m,this},a.fn.datepicker.version="1.7.1",a.fn.datepicker.deprecated=function(a){var b=window.console;b&&b.warn&&b.warn("DEPRECATED: "+a)},a(document).on("focus.datepicker.data-api click.datepicker.data-api",'[data-provide="datepicker"]',function(b){var c=a(this);c.data("datepicker")||(b.preventDefault(),n.call(c,"show"))}),a(function(){n.call(a('[data-provide="datepicker-inline"]'))})}); +(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{if(typeof exports==="object"){a(require("jquery"))}else{a(jQuery)}}}(function(d,f){if(!("indexOf" in Array.prototype)){Array.prototype.indexOf=function(k,j){if(j===f){j=0}if(j<0){j+=this.length}if(j<0){j=0}for(var l=this.length;jthis.endDate){o.push("disabled")}else{if(Math.floor(this.date.getUTCMinutes()/this.minuteStep)===Math.floor(n.getUTCMinutes()/this.minuteStep)){o.push("active")}}return o.concat((p?p:[]))};this.onRenderYear=function(o){var q=(j.onRenderYear||function(){return[]})(o);var p=["year"];if(typeof q==="string"){q=[q]}if(this.date.getUTCFullYear()===o.getUTCFullYear()){p.push("active")}var n=o.getUTCFullYear();var r=this.endDate.getUTCFullYear();if(or){p.push("disabled")}return p.concat((q?q:[]))};this.onRenderMonth=function(n){var p=(j.onRenderMonth||function(){return[]})(n);var o=["month"];if(typeof p==="string"){p=[p]}return o.concat((p?p:[]))};this.startDate=new Date(-8639968443048000);this.endDate=new Date(8639968443048000);this.datesDisabled=[];this.daysOfWeekDisabled=[];this.setStartDate(j.startDate||this.element.data("date-startdate"));this.setEndDate(j.endDate||this.element.data("date-enddate"));this.setDatesDisabled(j.datesDisabled||this.element.data("date-dates-disabled"));this.setDaysOfWeekDisabled(j.daysOfWeekDisabled||this.element.data("date-days-of-week-disabled"));this.setMinutesDisabled(j.minutesDisabled||this.element.data("date-minute-disabled"));this.setHoursDisabled(j.hoursDisabled||this.element.data("date-hour-disabled"));this.fillDow();this.fillMonths();this.update();this.showMode();if(this.isInline){this.show()}};g.prototype={constructor:g,_events:[],_attachEvents:function(){this._detachEvents();if(this.isInput){this._events=[[this.element,{focus:d.proxy(this.show,this),keyup:d.proxy(this.update,this),keydown:d.proxy(this.keydown,this)}]]}else{if(this.component&&this.hasInput){this._events=[[this.element.find("input"),{focus:d.proxy(this.show,this),keyup:d.proxy(this.update,this),keydown:d.proxy(this.keydown,this)}],[this.component,{click:d.proxy(this.show,this)}]];if(this.componentReset){this._events.push([this.componentReset,{click:d.proxy(this.reset,this)}])}}else{if(this.element.is("div")){this.isInline=true}else{this._events=[[this.element,{click:d.proxy(this.show,this)}]]}}}for(var j=0,k,l;j=this.startDate&&i<=this.endDate){this.date=i;this.setValue();this.viewDate=this.date;this.fill()}else{this.element.trigger({type:"outOfRange",date:i,startDate:this.startDate,endDate:this.endDate})}},setFormat:function(j){this.format=c.parseFormat(j,this.formatType);var i;if(this.isInput){i=this.element}else{if(this.component){i=this.element.find("input")}}if(i&&i.val()){this.setValue()}},setValue:function(){var i=this.getFormattedDate();if(!this.isInput){if(this.component){this.element.find("input").val(i)}this.element.data("date",i)}else{this.element.val(i)}if(this.linkField){d("#"+this.linkField).val(this.getFormattedDate(this.linkFormat))}},getFormattedDate:function(i){i=i||this.format;return c.formatDate(this.date,i,this.language,this.formatType,this.timezone)},setStartDate:function(i){this.startDate=i||this.startDate;if(this.startDate.valueOf()!==8639968443048000){this.startDate=c.parseDate(this.startDate,this.format,this.language,this.formatType,this.timezone)}this.update();this.updateNavArrows()},setEndDate:function(i){this.endDate=i||this.endDate;if(this.endDate.valueOf()!==8639968443048000){this.endDate=c.parseDate(this.endDate,this.format,this.language,this.formatType,this.timezone)}this.update();this.updateNavArrows()},setDatesDisabled:function(j){this.datesDisabled=j||[];if(!d.isArray(this.datesDisabled)){this.datesDisabled=this.datesDisabled.split(/,\s*/)}var i=this;this.datesDisabled=d.map(this.datesDisabled,function(k){return c.parseDate(k,i.format,i.language,i.formatType,i.timezone).toDateString()});this.update();this.updateNavArrows()},setTitle:function(i,j){return this.picker.find(i).find("th:eq(1)").text(this.title===false?j:this.title)},setDaysOfWeekDisabled:function(i){this.daysOfWeekDisabled=i||[];if(!d.isArray(this.daysOfWeekDisabled)){this.daysOfWeekDisabled=this.daysOfWeekDisabled.split(/,\s*/)}this.daysOfWeekDisabled=d.map(this.daysOfWeekDisabled,function(j){return parseInt(j,10)});this.update();this.updateNavArrows()},setMinutesDisabled:function(i){this.minutesDisabled=i||[];if(!d.isArray(this.minutesDisabled)){this.minutesDisabled=this.minutesDisabled.split(/,\s*/)}this.minutesDisabled=d.map(this.minutesDisabled,function(j){return parseInt(j,10)});this.update();this.updateNavArrows()},setHoursDisabled:function(i){this.hoursDisabled=i||[];if(!d.isArray(this.hoursDisabled)){this.hoursDisabled=this.hoursDisabled.split(/,\s*/)}this.hoursDisabled=d.map(this.hoursDisabled,function(j){return parseInt(j,10)});this.update();this.updateNavArrows()},place:function(){if(this.isInline){return}if(!this.zIndex){var j=0;d("div").each(function(){var o=parseInt(d(this).css("zIndex"),10);if(o>j){j=o}});this.zIndex=j+10}var n,m,l,k;if(this.container instanceof d){k=this.container.offset()}else{k=d(this.container).offset()}if(this.component){n=this.component.offset();l=n.left;if(this.pickerPosition==="bottom-left"||this.pickerPosition==="top-left"){l+=this.component.outerWidth()-this.picker.outerWidth()}}else{n=this.element.offset();l=n.left;if(this.pickerPosition==="bottom-left"||this.pickerPosition==="top-left"){l+=this.element.outerWidth()-this.picker.outerWidth()}}var i=document.body.clientWidth||window.innerWidth;if(l+220>i){l=i-220}if(this.pickerPosition==="top-left"||this.pickerPosition==="top-right"){m=n.top-this.picker.outerHeight()}else{m=n.top+this.height}m=m-k.top;l=l-k.left;this.picker.css({top:m,left:l,zIndex:this.zIndex})},hour_minute:"^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]",update:function(){var i,j=false;if(arguments&&arguments.length&&(typeof arguments[0]==="string"||arguments[0] instanceof Date)){i=arguments[0];j=true}else{i=(this.isInput?this.element.val():this.element.find("input").val())||this.element.data("date")||this.initialDate;if(typeof i==="string"){i=i.replace(/^\s+|\s+$/g,"")}}if(!i){i=new Date();j=false}if(typeof i==="string"){if(new RegExp(this.hour_minute).test(i)||new RegExp(this.hour_minute+":[0-5][0-9]").test(i)){i=this.getDate()}}this.date=c.parseDate(i,this.format,this.language,this.formatType,this.timezone);if(j){this.setValue()}if(this.datethis.endDate){this.viewDate=new Date(this.endDate)}else{this.viewDate=new Date(this.date)}}this.fill()},fillDow:function(){var i=this.weekStart,j="";while(i'+e[this.language].daysMin[(i++)%7]+""}j+="";this.picker.find(".datetimepicker-days thead").append(j)},fillMonths:function(){var l="";var m=new Date(this.viewDate);for(var k=0;k<12;k++){m.setUTCMonth(k);var j=this.onRenderMonth(m);l+=''+e[this.language].monthsShort[k]+""}this.picker.find(".datetimepicker-months td").html(l)},fill:function(){if(!this.date||!this.viewDate){return}var E=new Date(this.viewDate),t=E.getUTCFullYear(),G=E.getUTCMonth(),n=E.getUTCDate(),A=E.getUTCHours(),w=this.startDate.getUTCFullYear(),B=this.startDate.getUTCMonth(),p=this.endDate.getUTCFullYear(),x=this.endDate.getUTCMonth()+1,q=(new h(this.date.getUTCFullYear(),this.date.getUTCMonth(),this.date.getUTCDate())).valueOf(),D=new Date();this.setTitle(".datetimepicker-days",e[this.language].months[G]+" "+t);if(this.formatViewType==="time"){var k=this.getFormattedDate();this.setTitle(".datetimepicker-hours",k);this.setTitle(".datetimepicker-minutes",k)}else{this.setTitle(".datetimepicker-hours",n+" "+e[this.language].months[G]+" "+t);this.setTitle(".datetimepicker-minutes",n+" "+e[this.language].months[G]+" "+t)}this.picker.find("tfoot th.today").text(e[this.language].today||e.en.today).toggle(this.todayBtn!==false);this.picker.find("tfoot th.clear").text(e[this.language].clear||e.en.clear).toggle(this.clearBtn!==false);this.updateNavArrows();this.fillMonths();var I=h(t,G-1,28,0,0,0,0),z=c.getDaysInMonth(I.getUTCFullYear(),I.getUTCMonth());I.setUTCDate(z);I.setUTCDate(z-(I.getUTCDay()-this.weekStart+7)%7);var j=new Date(I);j.setUTCDate(j.getUTCDate()+42);j=j.valueOf();var r=[];var F;while(I.valueOf()")}F=this.onRenderDay(I);if(I.getUTCFullYear()t||(I.getUTCFullYear()===t&&I.getUTCMonth()>G)){F.push("new")}}if(this.todayHighlight&&I.getUTCFullYear()===D.getFullYear()&&I.getUTCMonth()===D.getMonth()&&I.getUTCDate()===D.getDate()){F.push("today")}if(I.valueOf()===q){F.push("active")}if((I.valueOf()+86400000)<=this.startDate||I.valueOf()>this.endDate||d.inArray(I.getUTCDay(),this.daysOfWeekDisabled)!==-1||d.inArray(I.toDateString(),this.datesDisabled)!==-1){F.push("disabled")}r.push(''+I.getUTCDate()+"");if(I.getUTCDay()===this.weekEnd){r.push("")}I.setUTCDate(I.getUTCDate()+1)}this.picker.find(".datetimepicker-days tbody").empty().append(r.join(""));r=[];var u="",C="",s="";var l=this.hoursDisabled||[];E=new Date(this.viewDate);for(var y=0;y<24;y++){E.setUTCHours(y);F=this.onRenderHour(E);if(l.indexOf(y)!==-1){F.push("disabled")}var v=h(t,G,n,y);if((v.valueOf()+3600000)<=this.startDate||v.valueOf()>this.endDate){F.push("disabled")}else{if(A===y){F.push("active")}}if(this.showMeridian&&e[this.language].meridiem.length===2){C=(y<12?e[this.language].meridiem[0]:e[this.language].meridiem[1]);if(C!==s){if(s!==""){r.push("")}r.push('
'+C.toUpperCase()+"")}s=C;u=(y%12?y%12:12);if(y<12){F.push("hour_am")}else{F.push("hour_pm")}r.push(''+u+"");if(y===23){r.push("
")}}else{u=y+":00";r.push(''+u+"")}}this.picker.find(".datetimepicker-hours td").html(r.join(""));r=[];u="";C="";s="";var m=this.minutesDisabled||[];E=new Date(this.viewDate);for(var y=0;y<60;y+=this.minuteStep){if(m.indexOf(y)!==-1){continue}E.setUTCMinutes(y);E.setUTCSeconds(0);F=this.onRenderMinute(E);if(this.showMeridian&&e[this.language].meridiem.length===2){C=(A<12?e[this.language].meridiem[0]:e[this.language].meridiem[1]);if(C!==s){if(s!==""){r.push("")}r.push('
'+C.toUpperCase()+"")}s=C;u=(A%12?A%12:12);r.push(''+u+":"+(y<10?"0"+y:y)+"");if(y===59){r.push("
")}}else{u=y+":00";r.push(''+A+":"+(y<10?"0"+y:y)+"")}}this.picker.find(".datetimepicker-minutes td").html(r.join(""));var J=this.date.getUTCFullYear();var o=this.setTitle(".datetimepicker-months",t).end().find(".month").removeClass("active");if(J===t){o.eq(this.date.getUTCMonth()).addClass("active")}if(tp){o.addClass("disabled")}if(t===w){o.slice(0,B).addClass("disabled")}if(t===p){o.slice(x).addClass("disabled")}r="";t=parseInt(t/10,10)*10;var H=this.setTitle(".datetimepicker-years",t+"-"+(t+9)).end().find("td");t-=1;E=new Date(this.viewDate);for(var y=-1;y<11;y++){E.setUTCFullYear(t);F=this.onRenderYear(E);if(y===-1||y===10){F.push(b)}r+=''+t+"";t+=1}H.html(r);this.place()},updateNavArrows:function(){var m=new Date(this.viewDate),k=m.getUTCFullYear(),l=m.getUTCMonth(),j=m.getUTCDate(),i=m.getUTCHours();switch(this.viewMode){case 0:if(k<=this.startDate.getUTCFullYear()&&l<=this.startDate.getUTCMonth()&&j<=this.startDate.getUTCDate()&&i<=this.startDate.getUTCHours()){this.picker.find(".prev").css({visibility:"hidden"})}else{this.picker.find(".prev").css({visibility:"visible"})}if(k>=this.endDate.getUTCFullYear()&&l>=this.endDate.getUTCMonth()&&j>=this.endDate.getUTCDate()&&i>=this.endDate.getUTCHours()){this.picker.find(".next").css({visibility:"hidden"})}else{this.picker.find(".next").css({visibility:"visible"})}break;case 1:if(k<=this.startDate.getUTCFullYear()&&l<=this.startDate.getUTCMonth()&&j<=this.startDate.getUTCDate()){this.picker.find(".prev").css({visibility:"hidden"})}else{this.picker.find(".prev").css({visibility:"visible"})}if(k>=this.endDate.getUTCFullYear()&&l>=this.endDate.getUTCMonth()&&j>=this.endDate.getUTCDate()){this.picker.find(".next").css({visibility:"hidden"})}else{this.picker.find(".next").css({visibility:"visible"})}break;case 2:if(k<=this.startDate.getUTCFullYear()&&l<=this.startDate.getUTCMonth()){this.picker.find(".prev").css({visibility:"hidden"})}else{this.picker.find(".prev").css({visibility:"visible"})}if(k>=this.endDate.getUTCFullYear()&&l>=this.endDate.getUTCMonth()){this.picker.find(".next").css({visibility:"hidden"})}else{this.picker.find(".next").css({visibility:"visible"})}break;case 3:case 4:if(k<=this.startDate.getUTCFullYear()){this.picker.find(".prev").css({visibility:"hidden"})}else{this.picker.find(".prev").css({visibility:"visible"})}if(k>=this.endDate.getUTCFullYear()){this.picker.find(".next").css({visibility:"hidden"})}else{this.picker.find(".next").css({visibility:"visible"})}break}},mousewheel:function(j){j.preventDefault();j.stopPropagation();if(this.wheelPause){return}this.wheelPause=true;var i=j.originalEvent;var l=i.wheelDelta;var k=l>0?1:(l===0)?0:-1;if(this.wheelViewModeNavigationInverseDirection){k=-k}this.showMode(k);setTimeout(d.proxy(function(){this.wheelPause=false},this),this.wheelViewModeNavigationDelay)},click:function(m){m.stopPropagation();m.preventDefault();var n=d(m.target).closest("span, td, th, legend");if(n.is("."+this.icontype)){n=d(n).parent().closest("span, td, th, legend")}if(n.length===1){if(n.is(".disabled")){this.element.trigger({type:"outOfRange",date:this.viewDate,startDate:this.startDate,endDate:this.endDate});return}switch(n[0].nodeName.toLowerCase()){case"th":switch(n[0].className){case"switch":this.showMode(1);break;case"prev":case"next":var i=c.modes[this.viewMode].navStep*(n[0].className==="prev"?-1:1);switch(this.viewMode){case 0:this.viewDate=this.moveHour(this.viewDate,i);break;case 1:this.viewDate=this.moveDate(this.viewDate,i);break;case 2:this.viewDate=this.moveMonth(this.viewDate,i);break;case 3:case 4:this.viewDate=this.moveYear(this.viewDate,i);break}this.fill();this.element.trigger({type:n[0].className+":"+this.convertViewModeText(this.viewMode),date:this.viewDate,startDate:this.startDate,endDate:this.endDate});break;case"clear":this.reset();if(this.autoclose){this.hide()}break;case"today":var j=new Date();j=h(j.getFullYear(),j.getMonth(),j.getDate(),j.getHours(),j.getMinutes(),j.getSeconds(),0);if(jthis.endDate){j=this.endDate}}this.viewMode=this.startViewMode;this.showMode(0);this._setDate(j);this.fill();if(this.autoclose){this.hide()}break}break;case"span":if(!n.is(".disabled")){var p=this.viewDate.getUTCFullYear(),o=this.viewDate.getUTCMonth(),q=this.viewDate.getUTCDate(),r=this.viewDate.getUTCHours(),k=this.viewDate.getUTCMinutes(),s=this.viewDate.getUTCSeconds();if(n.is(".month")){this.viewDate.setUTCDate(1);o=n.parent().find("span").index(n);q=this.viewDate.getUTCDate();this.viewDate.setUTCMonth(o);this.element.trigger({type:"changeMonth",date:this.viewDate});if(this.viewSelect>=3){this._setDate(h(p,o,q,r,k,s,0))}}else{if(n.is(".year")){this.viewDate.setUTCDate(1);p=parseInt(n.text(),10)||0;this.viewDate.setUTCFullYear(p);this.element.trigger({type:"changeYear",date:this.viewDate});if(this.viewSelect>=4){this._setDate(h(p,o,q,r,k,s,0))}}else{if(n.is(".hour")){r=parseInt(n.text(),10)||0;if(n.hasClass("hour_am")||n.hasClass("hour_pm")){if(r===12&&n.hasClass("hour_am")){r=0}else{if(r!==12&&n.hasClass("hour_pm")){r+=12}}}this.viewDate.setUTCHours(r);this.element.trigger({type:"changeHour",date:this.viewDate});if(this.viewSelect>=1){this._setDate(h(p,o,q,r,k,s,0))}}else{if(n.is(".minute")){k=parseInt(n.text().substr(n.text().indexOf(":")+1),10)||0;this.viewDate.setUTCMinutes(k);this.element.trigger({type:"changeMinute",date:this.viewDate});if(this.viewSelect>=0){this._setDate(h(p,o,q,r,k,s,0))}}}}}if(this.viewMode!==0){var l=this.viewMode;this.showMode(-1);this.fill();if(l===this.viewMode&&this.autoclose){this.hide()}}else{this.fill();if(this.autoclose){this.hide()}}}break;case"td":if(n.is(".day")&&!n.is(".disabled")){var q=parseInt(n.text(),10)||1;var p=this.viewDate.getUTCFullYear(),o=this.viewDate.getUTCMonth(),r=this.viewDate.getUTCHours(),k=this.viewDate.getUTCMinutes(),s=this.viewDate.getUTCSeconds();if(n.is(".old")){if(o===0){o=11;p-=1}else{o-=1}}else{if(n.is(".new")){if(o===11){o=0;p+=1}else{o+=1}}}this.viewDate.setUTCFullYear(p);this.viewDate.setUTCMonth(o,q);this.element.trigger({type:"changeDay",date:this.viewDate});if(this.viewSelect>=2){this._setDate(h(p,o,q,r,k,s,0))}}var l=this.viewMode;this.showMode(-1);this.fill();if(l===this.viewMode&&this.autoclose){this.hide()}break}}},_setDate:function(i,k){if(!k||k==="date"){this.date=i}if(!k||k==="view"){this.viewDate=i}this.fill();this.setValue();var j;if(this.isInput){j=this.element}else{if(this.component){j=this.element.find("input")}}if(j){j.change()}this.element.trigger({type:"changeDate",date:this.getDate()});if(i===null){this.date=this.viewDate}},moveMinute:function(j,i){if(!i){return j}var k=new Date(j.valueOf());k.setUTCMinutes(k.getUTCMinutes()+(i*this.minuteStep));return k},moveHour:function(j,i){if(!i){return j}var k=new Date(j.valueOf());k.setUTCHours(k.getUTCHours()+i);return k},moveDate:function(j,i){if(!i){return j}var k=new Date(j.valueOf());k.setUTCDate(k.getUTCDate()+i);return k},moveMonth:function(j,k){if(!k){return j}var n=new Date(j.valueOf()),r=n.getUTCDate(),o=n.getUTCMonth(),m=Math.abs(k),q,p;k=k>0?1:-1;if(m===1){p=k===-1?function(){return n.getUTCMonth()===o}:function(){return n.getUTCMonth()!==q};q=o+k;n.setUTCMonth(q);if(q<0||q>11){q=(q+12)%12}}else{for(var l=0;l=this.startDate&&i<=this.endDate},keydown:function(o){if(this.picker.is(":not(:visible)")){if(o.keyCode===27){this.show()}return}var k=false,j,i,n;switch(o.keyCode){case 27:this.hide();o.preventDefault();break;case 37:case 39:if(!this.keyboardNavigation){break}j=o.keyCode===37?-1:1;var m=this.viewMode;if(o.ctrlKey){m+=2}else{if(o.shiftKey){m+=1}}if(m===4){i=this.moveYear(this.date,j);n=this.moveYear(this.viewDate,j)}else{if(m===3){i=this.moveMonth(this.date,j);n=this.moveMonth(this.viewDate,j)}else{if(m===2){i=this.moveDate(this.date,j);n=this.moveDate(this.viewDate,j)}else{if(m===1){i=this.moveHour(this.date,j);n=this.moveHour(this.viewDate,j)}else{if(m===0){i=this.moveMinute(this.date,j);n=this.moveMinute(this.viewDate,j)}}}}}if(this.dateWithinRange(i)){this.date=i;this.viewDate=n;this.setValue();this.update();o.preventDefault();k=true}break;case 38:case 40:if(!this.keyboardNavigation){break}j=o.keyCode===38?-1:1;m=this.viewMode;if(o.ctrlKey){m+=2}else{if(o.shiftKey){m+=1}}if(m===4){i=this.moveYear(this.date,j);n=this.moveYear(this.viewDate,j)}else{if(m===3){i=this.moveMonth(this.date,j);n=this.moveMonth(this.viewDate,j)}else{if(m===2){i=this.moveDate(this.date,j*7);n=this.moveDate(this.viewDate,j*7)}else{if(m===1){if(this.showMeridian){i=this.moveHour(this.date,j*6);n=this.moveHour(this.viewDate,j*6)}else{i=this.moveHour(this.date,j*4);n=this.moveHour(this.viewDate,j*4)}}else{if(m===0){i=this.moveMinute(this.date,j*4);n=this.moveMinute(this.viewDate,j*4)}}}}}if(this.dateWithinRange(i)){this.date=i;this.viewDate=n;this.setValue();this.update();o.preventDefault();k=true}break;case 13:if(this.viewMode!==0){var p=this.viewMode;this.showMode(-1);this.fill();if(p===this.viewMode&&this.autoclose){this.hide()}}else{this.fill();if(this.autoclose){this.hide()}}o.preventDefault();break;case 9:this.hide();break}if(k){var l;if(this.isInput){l=this.element}else{if(this.component){l=this.element.find("input")}}if(l){l.change()}this.element.trigger({type:"changeDate",date:this.getDate()})}},showMode:function(i){if(i){var j=Math.max(0,Math.min(c.modes.length-1,this.viewMode+i));if(j>=this.minView&&j<=this.maxView){this.element.trigger({type:"changeMode",date:this.viewDate,oldViewMode:this.viewMode,newViewMode:j});this.viewMode=j}}this.picker.find(">div").hide().filter(".datetimepicker-"+c.modes[this.viewMode].clsName).css("display","block");this.updateNavArrows()},reset:function(){this._setDate(null,"date")},convertViewModeText:function(i){switch(i){case 4:return"decade";case 3:return"year";case 2:return"month";case 1:return"day";case 0:return"hour"}}};var b=d.fn.datetimepicker;d.fn.datetimepicker=function(k){var i=Array.apply(null,arguments);i.shift();var j;this.each(function(){var n=d(this),m=n.data("datetimepicker"),l=typeof k==="object"&&k;if(!m){n.data("datetimepicker",(m=new g(this,d.extend({},d.fn.datetimepicker.defaults,l))))}if(typeof k==="string"&&typeof m[k]==="function"){j=m[k].apply(m,i);if(j!==f){return false}}});if(j!==f){return j}else{return this}};d.fn.datetimepicker.defaults={};d.fn.datetimepicker.Constructor=g;var e=d.fn.datetimepicker.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],meridiem:["am","pm"],suffix:["st","nd","rd","th"],today:"Today",clear:"Clear"}};var c={modes:[{clsName:"minutes",navFnc:"Hours",navStep:1},{clsName:"hours",navFnc:"Date",navStep:1},{clsName:"days",navFnc:"Month",navStep:1},{clsName:"months",navFnc:"FullYear",navStep:1},{clsName:"years",navFnc:"FullYear",navStep:10}],isLeapYear:function(i){return(((i%4===0)&&(i%100!==0))||(i%400===0))},getDaysInMonth:function(i,j){return[31,(c.isLeapYear(i)?29:28),31,30,31,30,31,31,30,31,30,31][j]},getDefaultFormat:function(i,j){if(i==="standard"){if(j==="input"){return"yyyy-mm-dd hh:ii"}else{return"yyyy-mm-dd hh:ii:ss"}}else{if(i==="php"){if(j==="input"){return"Y-m-d H:i"}else{return"Y-m-d H:i:s"}}else{throw new Error("Invalid format type.")}}},validParts:function(i){if(i==="standard"){return/t|hh?|HH?|p|P|z|Z|ii?|ss?|dd?|DD?|mm?|MM?|yy(?:yy)?/g}else{if(i==="php"){return/[dDjlNwzFmMnStyYaABgGhHis]/g}else{throw new Error("Invalid format type.")}}},nonpunctuation:/[^ -\/:-@\[-`{-~\t\n\rTZ]+/g,parseFormat:function(l,j){var i=l.replace(this.validParts(j),"\0").split("\0"),k=l.match(this.validParts(j));if(!i||!i.length||!k||k.length===0){throw new Error("Invalid date format.")}return{separators:i,parts:k}},parseDate:function(A,y,v,j,r){if(A instanceof Date){var u=new Date(A.valueOf()-A.getTimezoneOffset()*60000);u.setMilliseconds(0);return u}if(/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(A)){y=this.parseFormat("yyyy-mm-dd",j)}if(/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(A)){y=this.parseFormat("yyyy-mm-dd hh:ii",j)}if(/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(A)){y=this.parseFormat("yyyy-mm-dd hh:ii:ss",j)}if(/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(A)){var l=/([-+]\d+)([dmwy])/,q=A.match(/([-+]\d+)([dmwy])/g),t,p;A=new Date();for(var x=0;x',headTemplateV3:' ',contTemplate:'',footTemplate:''};c.template='
'+c.headTemplate+c.contTemplate+c.footTemplate+'
'+c.headTemplate+c.contTemplate+c.footTemplate+'
'+c.headTemplate+""+c.footTemplate+'
'+c.headTemplate+c.contTemplate+c.footTemplate+'
'+c.headTemplate+c.contTemplate+c.footTemplate+"
";c.templateV3='
'+c.headTemplateV3+c.contTemplate+c.footTemplate+'
'+c.headTemplateV3+c.contTemplate+c.footTemplate+'
'+c.headTemplateV3+""+c.footTemplate+'
'+c.headTemplateV3+c.contTemplate+c.footTemplate+'
'+c.headTemplateV3+c.contTemplate+c.footTemplate+"
";d.fn.datetimepicker.DPGlobal=c;d.fn.datetimepicker.noConflict=function(){d.fn.datetimepicker=b;return this};d(document).on("focus.datetimepicker.data-api click.datetimepicker.data-api",'[data-provide="datetimepicker"]',function(j){var i=d(this);if(i.data("datetimepicker")){return}j.preventDefault();i.datetimepicker("show")});d(function(){d('[data-provide="datetimepicker-inline"]').datetimepicker()})})); +/*! bootstrap-timepicker v0.5.2 +* http://jdewit.github.com/bootstrap-timepicker +* Copyright (c) 2016 Joris de Wit and bootstrap-timepicker contributors +* MIT License +*/!function(a,b,c){"use strict";var d=function(b,c){this.widget="",this.$element=a(b),this.defaultTime=c.defaultTime,this.disableFocus=c.disableFocus,this.disableMousewheel=c.disableMousewheel,this.isOpen=c.isOpen,this.minuteStep=c.minuteStep,this.modalBackdrop=c.modalBackdrop,this.orientation=c.orientation,this.secondStep=c.secondStep,this.snapToStep=c.snapToStep,this.showInputs=c.showInputs,this.showMeridian=c.showMeridian,this.showSeconds=c.showSeconds,this.template=c.template,this.appendWidgetTo=c.appendWidgetTo,this.showWidgetOnAddonClick=c.showWidgetOnAddonClick,this.icons=c.icons,this.maxHours=c.maxHours,this.explicitMode=c.explicitMode,this.handleDocumentClick=function(a){var b=a.data.scope;b.$element.parent().find(a.target).length||b.$widget.is(a.target)||b.$widget.find(a.target).length||b.hideWidget()},this._init()};d.prototype={constructor:d,_init:function(){var b=this;this.showWidgetOnAddonClick&&this.$element.parent().hasClass("input-group")&&this.$element.parent().hasClass("bootstrap-timepicker")?(this.$element.parent(".input-group.bootstrap-timepicker").find(".input-group-addon").on({"click.timepicker":a.proxy(this.showWidget,this)}),this.$element.on({"focus.timepicker":a.proxy(this.highlightUnit,this),"click.timepicker":a.proxy(this.highlightUnit,this),"keydown.timepicker":a.proxy(this.elementKeydown,this),"blur.timepicker":a.proxy(this.blurElement,this),"mousewheel.timepicker DOMMouseScroll.timepicker":a.proxy(this.mousewheel,this)})):this.template?this.$element.on({"focus.timepicker":a.proxy(this.showWidget,this),"click.timepicker":a.proxy(this.showWidget,this),"blur.timepicker":a.proxy(this.blurElement,this),"mousewheel.timepicker DOMMouseScroll.timepicker":a.proxy(this.mousewheel,this)}):this.$element.on({"focus.timepicker":a.proxy(this.highlightUnit,this),"click.timepicker":a.proxy(this.highlightUnit,this),"keydown.timepicker":a.proxy(this.elementKeydown,this),"blur.timepicker":a.proxy(this.blurElement,this),"mousewheel.timepicker DOMMouseScroll.timepicker":a.proxy(this.mousewheel,this)}),this.template!==!1?this.$widget=a(this.getTemplate()).on("click",a.proxy(this.widgetClick,this)):this.$widget=!1,this.showInputs&&this.$widget!==!1&&this.$widget.find("input").each(function(){a(this).on({"click.timepicker":function(){a(this).select()},"keydown.timepicker":a.proxy(b.widgetKeydown,b),"keyup.timepicker":a.proxy(b.widgetKeyup,b)})}),this.setDefaultTime(this.defaultTime)},blurElement:function(){this.highlightedUnit=null,this.updateFromElementVal()},clear:function(){this.hour="",this.minute="",this.second="",this.meridian="",this.$element.val("")},decrementHour:function(){if(this.showMeridian)if(1===this.hour)this.hour=12;else{if(12===this.hour)return this.hour--,this.toggleMeridian();if(0===this.hour)return this.hour=11,this.toggleMeridian();this.hour--}else this.hour<=0?this.hour=this.maxHours-1:this.hour--},decrementMinute:function(a){var b;b=a?this.minute-a:this.minute-this.minuteStep,0>b?(this.decrementHour(),this.minute=b+60):this.minute=b},decrementSecond:function(){var a=this.second-this.secondStep;0>a?(this.decrementMinute(!0),this.second=a+60):this.second=a},elementKeydown:function(a){switch(a.which){case 9:if(a.shiftKey){if("hour"===this.highlightedUnit){this.hideWidget();break}this.highlightPrevUnit()}else{if(this.showMeridian&&"meridian"===this.highlightedUnit||this.showSeconds&&"second"===this.highlightedUnit||!this.showMeridian&&!this.showSeconds&&"minute"===this.highlightedUnit){this.hideWidget();break}this.highlightNextUnit()}a.preventDefault(),this.updateFromElementVal();break;case 27:this.updateFromElementVal();break;case 37:a.preventDefault(),this.highlightPrevUnit(),this.updateFromElementVal();break;case 38:switch(a.preventDefault(),this.highlightedUnit){case"hour":this.incrementHour(),this.highlightHour();break;case"minute":this.incrementMinute(),this.highlightMinute();break;case"second":this.incrementSecond(),this.highlightSecond();break;case"meridian":this.toggleMeridian(),this.highlightMeridian()}this.update();break;case 39:a.preventDefault(),this.highlightNextUnit(),this.updateFromElementVal();break;case 40:switch(a.preventDefault(),this.highlightedUnit){case"hour":this.decrementHour(),this.highlightHour();break;case"minute":this.decrementMinute(),this.highlightMinute();break;case"second":this.decrementSecond(),this.highlightSecond();break;case"meridian":this.toggleMeridian(),this.highlightMeridian()}this.update()}},getCursorPosition:function(){var a=this.$element.get(0);if("selectionStart"in a)return a.selectionStart;if(c.selection){a.focus();var b=c.selection.createRange(),d=c.selection.createRange().text.length;return b.moveStart("character",-a.value.length),b.text.length-d}},getTemplate:function(){var a,b,c,d,e,f;switch(this.showInputs?(b='',c='',d='',e=''):(b='',c='',d='',e=''),f=''+(this.showSeconds?'':"")+(this.showMeridian?'':"")+" "+(this.showSeconds?'":"")+(this.showMeridian?'":"")+''+(this.showSeconds?'':"")+(this.showMeridian?'':"")+"
   
"+b+' :'+c+":'+d+" '+e+"
  
",this.template){case"modal":a='';break;case"dropdown":a='"}return a},getTime:function(){return""===this.hour?"":this.hour+":"+(1===this.minute.toString().length?"0"+this.minute:this.minute)+(this.showSeconds?":"+(1===this.second.toString().length?"0"+this.second:this.second):"")+(this.showMeridian?" "+this.meridian:"")},hideWidget:function(){this.isOpen!==!1&&(this.$element.trigger({type:"hide.timepicker",time:{value:this.getTime(),hours:this.hour,minutes:this.minute,seconds:this.second,meridian:this.meridian}}),"modal"===this.template&&this.$widget.modal?this.$widget.modal("hide"):this.$widget.removeClass("open"),a(c).off("mousedown.timepicker, touchend.timepicker",this.handleDocumentClick),this.isOpen=!1,this.$widget.detach())},highlightUnit:function(){this.position=this.getCursorPosition(),this.position>=0&&this.position<=2?this.highlightHour():this.position>=3&&this.position<=5?this.highlightMinute():this.position>=6&&this.position<=8?this.showSeconds?this.highlightSecond():this.highlightMeridian():this.position>=9&&this.position<=11&&this.highlightMeridian()},highlightNextUnit:function(){switch(this.highlightedUnit){case"hour":this.highlightMinute();break;case"minute":this.showSeconds?this.highlightSecond():this.showMeridian?this.highlightMeridian():this.highlightHour();break;case"second":this.showMeridian?this.highlightMeridian():this.highlightHour();break;case"meridian":this.highlightHour()}},highlightPrevUnit:function(){switch(this.highlightedUnit){case"hour":this.showMeridian?this.highlightMeridian():this.showSeconds?this.highlightSecond():this.highlightMinute();break;case"minute":this.highlightHour();break;case"second":this.highlightMinute();break;case"meridian":this.showSeconds?this.highlightSecond():this.highlightMinute()}},highlightHour:function(){var a=this.$element.get(0),b=this;this.highlightedUnit="hour",a.setSelectionRange&&setTimeout(function(){b.hour<10?a.setSelectionRange(0,1):a.setSelectionRange(0,2)},0)},highlightMinute:function(){var a=this.$element.get(0),b=this;this.highlightedUnit="minute",a.setSelectionRange&&setTimeout(function(){b.hour<10?a.setSelectionRange(2,4):a.setSelectionRange(3,5)},0)},highlightSecond:function(){var a=this.$element.get(0),b=this;this.highlightedUnit="second",a.setSelectionRange&&setTimeout(function(){b.hour<10?a.setSelectionRange(5,7):a.setSelectionRange(6,8)},0)},highlightMeridian:function(){var a=this.$element.get(0),b=this;this.highlightedUnit="meridian",a.setSelectionRange&&(this.showSeconds?setTimeout(function(){b.hour<10?a.setSelectionRange(8,10):a.setSelectionRange(9,11)},0):setTimeout(function(){b.hour<10?a.setSelectionRange(5,7):a.setSelectionRange(6,8)},0))},incrementHour:function(){if(this.showMeridian){if(11===this.hour)return this.hour++,this.toggleMeridian();12===this.hour&&(this.hour=0)}return this.hour===this.maxHours-1?void(this.hour=0):void this.hour++},incrementMinute:function(a){var b;b=a?this.minute+a:this.minute+this.minuteStep-this.minute%this.minuteStep,b>59?(this.incrementHour(),this.minute=b-60):this.minute=b},incrementSecond:function(){var a=this.second+this.secondStep-this.second%this.secondStep;a>59?(this.incrementMinute(!0),this.second=a-60):this.second=a},mousewheel:function(b){if(!this.disableMousewheel){b.preventDefault(),b.stopPropagation();var c=b.originalEvent.wheelDelta||-b.originalEvent.detail,d=null;switch("mousewheel"===b.type?d=-1*b.originalEvent.wheelDelta:"DOMMouseScroll"===b.type&&(d=40*b.originalEvent.detail),d&&(b.preventDefault(),a(this).scrollTop(d+a(this).scrollTop())),this.highlightedUnit){case"minute":c>0?this.incrementMinute():this.decrementMinute(),this.highlightMinute();break;case"second":c>0?this.incrementSecond():this.decrementSecond(),this.highlightSecond();break;case"meridian":this.toggleMeridian(),this.highlightMeridian();break;default:c>0?this.incrementHour():this.decrementHour(),this.highlightHour()}return!1}},changeToNearestStep:function(a,b){return a%b===0?a:Math.round(a%b/b)?(a+(b-a%b))%60:a-a%b},place:function(){if(!this.isInline){var c=this.$widget.outerWidth(),d=this.$widget.outerHeight(),e=10,f=a(b).width(),g=a(b).height(),h=a(b).scrollTop(),i=parseInt(this.$element.parents().filter(function(){return"auto"!==a(this).css("z-index")}).first().css("z-index"),10)+10,j=this.component?this.component.parent().offset():this.$element.offset(),k=this.component?this.component.outerHeight(!0):this.$element.outerHeight(!1),l=this.component?this.component.outerWidth(!0):this.$element.outerWidth(!1),m=j.left,n=j.top;this.$widget.removeClass("timepicker-orient-top timepicker-orient-bottom timepicker-orient-right timepicker-orient-left"),"auto"!==this.orientation.x?(this.$widget.addClass("timepicker-orient-"+this.orientation.x),"right"===this.orientation.x&&(m-=c-l)):(this.$widget.addClass("timepicker-orient-left"),j.left<0?m-=j.left-e:j.left+c>f&&(m=f-c-e));var o,p,q=this.orientation.y;"auto"===q&&(o=-h+j.top-d,p=h+g-(j.top+k+d),q=Math.max(o,p)===p?"top":"bottom"),this.$widget.addClass("timepicker-orient-"+q),"top"===q?n+=k:n-=d+parseInt(this.$widget.css("padding-top"),10),this.$widget.css({top:n,left:m,zIndex:i})}},remove:function(){a("document").off(".timepicker"),this.$widget&&this.$widget.remove(),delete this.$element.data().timepicker},setDefaultTime:function(a){if(this.$element.val())this.updateFromElementVal();else if("current"===a){var b=new Date,c=b.getHours(),d=b.getMinutes(),e=b.getSeconds(),f="AM";0!==e&&(e=Math.ceil(b.getSeconds()/this.secondStep)*this.secondStep,60===e&&(d+=1,e=0)),0!==d&&(d=Math.ceil(b.getMinutes()/this.minuteStep)*this.minuteStep,60===d&&(c+=1,d=0)),this.showMeridian&&(0===c?c=12:c>=12?(c>12&&(c-=12),f="PM"):f="AM"),this.hour=c,this.minute=d,this.second=e,this.meridian=f,this.update()}else a===!1?(this.hour=0,this.minute=0,this.second=0,this.meridian="AM"):this.setTime(a)},setTime:function(a,b){if(!a)return void this.clear();var c,d,e,f,g,h;if("object"==typeof a&&a.getMonth)e=a.getHours(),f=a.getMinutes(),g=a.getSeconds(),this.showMeridian&&(h="AM",e>12&&(h="PM",e%=12),12===e&&(h="PM"));else{if(c=(/a/i.test(a)?1:0)+(/p/i.test(a)?2:0),c>2)return void this.clear();if(d=a.replace(/[^0-9\:]/g,"").split(":"),e=d[0]?d[0].toString():d.toString(),this.explicitMode&&e.length>2&&e.length%2!==0)return void this.clear();f=d[1]?d[1].toString():"",g=d[2]?d[2].toString():"",e.length>4&&(g=e.slice(-2),e=e.slice(0,-2)),e.length>2&&(f=e.slice(-2),e=e.slice(0,-2)),f.length>2&&(g=f.slice(-2),f=f.slice(0,-2)),e=parseInt(e,10),f=parseInt(f,10),g=parseInt(g,10),isNaN(e)&&(e=0),isNaN(f)&&(f=0),isNaN(g)&&(g=0),g>59&&(g=59),f>59&&(f=59),e>=this.maxHours&&(e=this.maxHours-1),this.showMeridian?(e>12&&(c=2,e-=12),c||(c=1),0===e&&(e=12),h=1===c?"AM":"PM"):12>e&&2===c?e+=12:e>=this.maxHours?e=this.maxHours-1:(0>e||12===e&&1===c)&&(e=0)}this.hour=e,this.snapToStep?(this.minute=this.changeToNearestStep(f,this.minuteStep),this.second=this.changeToNearestStep(g,this.secondStep)):(this.minute=f,this.second=g),this.meridian=h,this.update(b)},showWidget:function(){this.isOpen||this.$element.is(":disabled")||(this.$widget.appendTo(this.appendWidgetTo),a(c).on("mousedown.timepicker, touchend.timepicker",{scope:this},this.handleDocumentClick),this.$element.trigger({type:"show.timepicker",time:{value:this.getTime(),hours:this.hour,minutes:this.minute,seconds:this.second,meridian:this.meridian}}),this.place(),this.disableFocus&&this.$element.blur(),""===this.hour&&(this.defaultTime?this.setDefaultTime(this.defaultTime):this.setTime("0:0:0")),"modal"===this.template&&this.$widget.modal?this.$widget.modal("show").on("hidden",a.proxy(this.hideWidget,this)):this.isOpen===!1&&this.$widget.addClass("open"),this.isOpen=!0)},toggleMeridian:function(){this.meridian="AM"===this.meridian?"PM":"AM"},update:function(a){this.updateElement(),a||this.updateWidget(),this.$element.trigger({type:"changeTime.timepicker",time:{value:this.getTime(),hours:this.hour,minutes:this.minute,seconds:this.second,meridian:this.meridian}})},updateElement:function(){this.$element.val(this.getTime()).change()},updateFromElementVal:function(){this.setTime(this.$element.val())},updateWidget:function(){if(this.$widget!==!1){var a=this.hour,b=1===this.minute.toString().length?"0"+this.minute:this.minute,c=1===this.second.toString().length?"0"+this.second:this.second;this.showInputs?(this.$widget.find("input.bootstrap-timepicker-hour").val(a),this.$widget.find("input.bootstrap-timepicker-minute").val(b),this.showSeconds&&this.$widget.find("input.bootstrap-timepicker-second").val(c),this.showMeridian&&this.$widget.find("input.bootstrap-timepicker-meridian").val(this.meridian)):(this.$widget.find("span.bootstrap-timepicker-hour").text(a),this.$widget.find("span.bootstrap-timepicker-minute").text(b),this.showSeconds&&this.$widget.find("span.bootstrap-timepicker-second").text(c),this.showMeridian&&this.$widget.find("span.bootstrap-timepicker-meridian").text(this.meridian))}},updateFromWidgetInputs:function(){if(this.$widget!==!1){var a=this.$widget.find("input.bootstrap-timepicker-hour").val()+":"+this.$widget.find("input.bootstrap-timepicker-minute").val()+(this.showSeconds?":"+this.$widget.find("input.bootstrap-timepicker-second").val():"")+(this.showMeridian?this.$widget.find("input.bootstrap-timepicker-meridian").val():"");this.setTime(a,!0)}},widgetClick:function(b){b.stopPropagation(),b.preventDefault();var c=a(b.target),d=c.closest("a").data("action");d&&this[d](),this.update(),c.is("input")&&c.get(0).setSelectionRange(0,2)},widgetKeydown:function(b){var c=a(b.target),d=c.attr("class").replace("bootstrap-timepicker-","");switch(b.which){case 9:if(b.shiftKey){if("hour"===d)return this.hideWidget()}else if(this.showMeridian&&"meridian"===d||this.showSeconds&&"second"===d||!this.showMeridian&&!this.showSeconds&&"minute"===d)return this.hideWidget();break;case 27:this.hideWidget();break;case 38:switch(b.preventDefault(),d){case"hour":this.incrementHour();break;case"minute":this.incrementMinute();break;case"second":this.incrementSecond();break;case"meridian":this.toggleMeridian()}this.setTime(this.getTime()),c.get(0).setSelectionRange(0,2);break;case 40:switch(b.preventDefault(),d){case"hour":this.decrementHour();break;case"minute":this.decrementMinute();break;case"second":this.decrementSecond();break;case"meridian":this.toggleMeridian()}this.setTime(this.getTime()),c.get(0).setSelectionRange(0,2)}},widgetKeyup:function(a){(65===a.which||77===a.which||80===a.which||46===a.which||8===a.which||a.which>=48&&a.which<=57||a.which>=96&&a.which<=105)&&this.updateFromWidgetInputs()}},a.fn.timepicker=function(b){var c=Array.apply(null,arguments);return c.shift(),this.each(function(){var e=a(this),f=e.data("timepicker"),g="object"==typeof b&&b;f||e.data("timepicker",f=new d(this,a.extend({},a.fn.timepicker.defaults,g,a(this).data()))),"string"==typeof b&&f[b].apply(f,c)})},a.fn.timepicker.defaults={defaultTime:"current",disableFocus:!1,disableMousewheel:!1,isOpen:!1,minuteStep:15,modalBackdrop:!1,orientation:{x:"auto",y:"auto"},secondStep:15,snapToStep:!1,showSeconds:!1,showInputs:!0,showMeridian:!0,template:"dropdown",appendWidgetTo:"body",showWidgetOnAddonClick:!0,icons:{up:"glyphicon glyphicon-chevron-up",down:"glyphicon glyphicon-chevron-down"},maxHours:24,explicitMode:!1},a.fn.timepicker.Constructor=d,a(c).on("focus.timepicker.data-api click.timepicker.data-api",'[data-provide="timepicker"]',function(b){var c=a(this);c.data("timepicker")||(b.preventDefault(),c.timepicker())})}(jQuery,window,document); +$.fn.timepicker.defaults = $.extend(true, {}, $.fn.timepicker.defaults, { + icons: { + up: 'la la-angle-up', + down: 'la la-angle-down' + } +}); +/** +* @version: 2.1.30 +* @author: Dan Grossman http://www.dangrossman.info/ +* @copyright: Copyright (c) 2012-2017 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/ +*/ +// Follow 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.dateLimit = false; + this.autoApply = false; + this.singleDatePicker = false; + this.showDropdowns = false; + 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.applyClass = 'btn-success'; + this.cancelClass = '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.applyClass === 'string') + this.applyClass = options.applyClass; + + if (typeof options.cancelClass === 'string') + this.cancelClass = options.cancelClass; + + if (typeof options.dateLimit === 'object') + this.dateLimit = 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.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('input[type=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 dateLimit + // 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.dateLimit && maxDate && start.clone().add(this.dateLimit).isAfter(maxDate)) + maxDate = start.clone().add(this.dateLimit); + 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 && typeof options.ranges !== 'object') { + this.container.find('.ranges').hide(); + } else if (this.autoApply) { + this.container.find('.applyBtn, .cancelBtn').addClass('hide'); + } + + if (this.singleDatePicker) { + this.container.addClass('single'); + this.container.find('.calendar.left').addClass('single'); + this.container.find('.calendar.left').show(); + this.container.find('.calendar.right').hide(); + this.container.find('.daterangepicker_input input, .daterangepicker_input > i').hide(); + if (this.timePicker) { + this.container.find('.ranges ul').hide(); + } else { + this.container.find('.ranges').hide(); + } + } + + if ((typeof options.ranges === 'undefined' && !this.singleDatePicker) || this.alwaysShowCalendars) { + this.container.addClass('show-calendar'); + } + + this.container.addClass('opens' + this.opens); + + //swap the position of the predefined ranges if opens right + if (typeof options.ranges !== 'undefined' && this.opens == 'right') { + this.container.find('.ranges').prependTo( this.container.find('.calendar.left').parent() ); + } + + //apply CSS classes and labels to buttons + this.container.find('.applyBtn, .cancelBtn').addClass(this.buttonClasses); + if (this.applyClass.length) + this.container.find('.applyBtn').addClass(this.applyClass); + if (this.cancelClass.length) + this.container.find('.cancelBtn').addClass(this.cancelClass); + this.container.find('.applyBtn').html(this.locale.applyLabel); + this.container.find('.cancelBtn').html(this.locale.cancelLabel); + + // + // event listeners + // + + this.container.find('.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('mouseleave.daterangepicker', 'td.available', $.proxy(this.updateFormInputs, 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)) + .on('click.daterangepicker', '.daterangepicker_input input', $.proxy(this.showCalendars, this)) + .on('focus.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsFocused, this)) + .on('blur.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsBlurred, this)) + .on('change.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsChanged, this)) + .on('keydown.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsKeydown, this)); + + this.container.find('.ranges') + .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this)) + .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this)) + .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this)) + .on('mouseenter.daterangepicker', 'li', $.proxy(this.hoverRange, this)) + .on('mouseleave.daterangepicker', 'li', $.proxy(this.updateFormInputs, 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 + // + + if (this.element.is('input') && !this.singleDatePicker && this.autoUpdateInput) { + this.element.val(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format)); + this.element.trigger('change'); + } else if (this.element.is('input') && this.autoUpdateInput) { + this.element.val(this.startDate.format(this.locale.format)); + this.element.trigger('change'); + } + + }; + + 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.dateLimit && this.startDate.clone().add(this.dateLimit).isBefore(this.endDate)) + this.endDate = this.startDate.clone().add(this.dateLimit); + + this.previousRightTime = this.endDate.clone(); + + 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('input[name="daterangepicker_end"]').removeClass('active'); + this.container.find('input[name="daterangepicker_start"]').addClass('active'); + } else { + this.container.find('input[name="daterangepicker_end"]').addClass('active'); + this.container.find('input[name="daterangepicker_start"]').removeClass('active'); + } + 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()) || (currentYear + 5); + var minYear = (minDate && minDate.year()) || (currentYear - 50); + 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 dateLimit setting in order to + //grey out end dates beyond the dateLimit + if (this.endDate == null && this.dateLimit) { + var maxLimit = this.startDate.clone().add(this.dateLimit).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('.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.dateLimit && (!this.maxDate || this.startDate.clone().add(this.dateLimit).isAfter(this.maxDate))) + maxDate = this.startDate.clone().add(this.dateLimit); + + 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('.calendar.right .calendar-time div'); + if (timeSelector.html() != '') { + + selected.hour(timeSelector.find('.hourselect option:selected').val() || selected.hour()); + selected.minute(timeSelector.find('.minuteselect option:selected').val() || selected.minute()); + selected.second(timeSelector.find('.secondselect option:selected').val() || selected.second()); + + 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('.calendar.' + side + ' .calendar-time div').html(html); + + }, + + updateFormInputs: function() { + + //ignore mouse movements while an above-calendar text input has focus + if (this.container.find('input[name=daterangepicker_start]').is(":focus") || this.container.find('input[name=daterangepicker_end]').is(":focus")) + return; + + this.container.find('input[name=daterangepicker_start]').val(this.startDate.format(this.locale.format)); + if (this.endDate) + this.container.find('input[name=daterangepicker_end]').val(this.endDate.format(this.locale.format)); + + 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']('dropup'); + + 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, this.endDate, 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); + }, + + hoverRange: function(e) { + + //ignore mouse movements while an above-calendar text input has focus + if (this.container.find('input[name=daterangepicker_start]').is(":focus") || this.container.find('input[name=daterangepicker_end]').is(":focus")) + return; + + var label = e.target.getAttribute('data-range-key'); + + if (label == this.locale.customRangeLabel) { + this.updateView(); + } else { + var dates = this.ranges[label]; + this.container.find('input[name=daterangepicker_start]').val(dates[0].format(this.locale.format)); + this.container.find('input[name=daterangepicker_end]').val(dates[1].format(this.locale.format)); + } + + }, + + 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('.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('.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 mouse movements while an above-calendar text input has focus + //if (this.container.find('input[name=daterangepicker_start]').is(":focus") || this.container.find('input[name=daterangepicker_end]').is(":focus")) + // return; + + //ignore dates that can't be selected + if (!$(e.target).hasClass('available')) return; + + //have the text inputs above calendars reflect the date being hovered over + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.calendar'); + var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col]; + + if (this.endDate && !this.container.find('input[name=daterangepicker_start]').is(":focus")) { + this.container.find('input[name=daterangepicker_start]').val(date.format(this.locale.format)); + } else if (!this.endDate && !this.container.find('input[name=daterangepicker_end]').is(":focus")) { + this.container.find('input[name=daterangepicker_end]').val(date.format(this.locale.format)); + } + + //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('.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('.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('.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').html(); + 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').html(); + break; + } + } + i++; + } + if (customRange) { + if (this.showCustomRangeLabel) { + this.chosenLabel = this.container.find('.ranges li:last').addClass('active').html(); + } 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('.calendar').hasClass('left'), + leftOrRight = isLeft ? 'left' : 'right', + cal = this.container.find('.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('.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'); + + }, + + formInputsChanged: function(e) { + var isRight = $(e.target).closest('.calendar').hasClass('right'); + var start = moment(this.container.find('input[name="daterangepicker_start"]').val(), this.locale.format); + var end = moment(this.container.find('input[name="daterangepicker_end"]').val(), this.locale.format); + + if (start.isValid() && end.isValid()) { + + if (isRight && end.isBefore(start)) + start = end.clone(); + + this.setStartDate(start); + this.setEndDate(end); + + if (isRight) { + this.container.find('input[name="daterangepicker_start"]').val(this.startDate.format(this.locale.format)); + } else { + this.container.find('input[name="daterangepicker_end"]').val(this.endDate.format(this.locale.format)); + } + + } + + this.updateView(); + }, + + formInputsFocused: function(e) { + + // Highlight the focused input + this.container.find('input[name="daterangepicker_start"], input[name="daterangepicker_end"]').removeClass('active'); + $(e.target).addClass('active'); + + // Set the state such that if the user goes back to using a mouse, + // the calendars are aware we're selecting the end of the range, not + // the start. This allows someone to edit the end of a date range without + // re-selecting the beginning, by clicking on the end date input then + // using the calendar. + var isRight = $(e.target).closest('.calendar').hasClass('right'); + if (isRight) { + this.endDate = null; + this.setStartDate(this.startDate.clone()); + this.updateView(); + } + + }, + + formInputsBlurred: function(e) { + + // this function has one purpose right now: if you tab from the first + // text input to the second in the UI, the endDate is nulled so that + // you can click another, but if you tab out without clicking anything + // or changing the input value, the old endDate should be retained + + if (!this.endDate) { + var val = this.container.find('input[name="daterangepicker_end"]').val(); + var end = moment(val, this.locale.format); + if (end.isValid()) { + this.setEndDate(end); + this.updateView(); + } + } + + }, + + formInputsKeydown: function(e) { + // This function ensures that if the 'enter' key was pressed in the input, then the calendars + // are updated with the startDate and endDate. + // This behaviour is automatic in Chrome/Firefox/Edge but not in IE 11 hence why this exists. + // Other browsers and versions of IE are untested and the behaviour is unknown. + if (e.keyCode === 13) { + // Prevent the calendar from being updated twice on Chrome/Firefox/Edge + e.preventDefault(); + this.formInputsChanged(e); + } + }, + + + 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.singleDatePicker && this.autoUpdateInput) { + this.element.val(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format)); + this.element.trigger('change'); + } else if (this.element.is('input') && this.autoUpdateInput) { + this.element.val(this.startDate.format(this.locale.format)); + this.element.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; + +})); + + +/* + * Bootstrap TouchSpin - v3.1.1 + * A mobile and touch friendly input spinner component for Bootstrap 3. + * http://www.virtuosoft.eu/code/bootstrap-touchspin/ + * + * Made by István Ujj-Mészáros + * Under Apache License v2.0 License + */ +(function($) { + 'use strict'; + + var _currentSpinnerId = 0; + + function _scopedEventName(name, id) { + return name + '.touchspin_' + id; + } + + function _scopeEventNames(names, id) { + return $.map(names, function(name) { + return _scopedEventName(name, id); + }); + } + + $.fn.TouchSpin = function(options) { + + if (options === 'destroy') { + this.each(function() { + var originalinput = $(this), + originalinput_data = originalinput.data(); + $(document).off(_scopeEventNames([ + 'mouseup', + 'touchend', + 'touchcancel', + 'mousemove', + 'touchmove', + 'scroll', + 'scrollstart'], originalinput_data.spinnerid).join(' ')); + }); + return; + } + + var defaults = { + min: 0, + max: 100, + initval: '', + replacementval: '', + step: 1, + decimals: 0, + stepinterval: 100, + forcestepdivisibility: 'round', // none | floor | round | ceil + stepintervaldelay: 500, + verticalbuttons: false, + verticalupclass: 'glyphicon glyphicon-chevron-up', + verticaldownclass: 'glyphicon glyphicon-chevron-down', + prefix: '', + postfix: '', + prefix_extraclass: '', + postfix_extraclass: '', + booster: true, + boostat: 10, + maxboostedstep: false, + mousewheel: true, + buttondown_class: 'btn btn-default', + buttonup_class: 'btn btn-default', + buttondown_txt: '-', + buttonup_txt: '+' + }; + + var attributeMap = { + min: 'min', + max: 'max', + initval: 'init-val', + replacementval: 'replacement-val', + step: 'step', + decimals: 'decimals', + stepinterval: 'step-interval', + verticalbuttons: 'vertical-buttons', + verticalupclass: 'vertical-up-class', + verticaldownclass: 'vertical-down-class', + forcestepdivisibility: 'force-step-divisibility', + stepintervaldelay: 'step-interval-delay', + prefix: 'prefix', + postfix: 'postfix', + prefix_extraclass: 'prefix-extra-class', + postfix_extraclass: 'postfix-extra-class', + booster: 'booster', + boostat: 'boostat', + maxboostedstep: 'max-boosted-step', + mousewheel: 'mouse-wheel', + buttondown_class: 'button-down-class', + buttonup_class: 'button-up-class', + buttondown_txt: 'button-down-txt', + buttonup_txt: 'button-up-txt' + }; + + return this.each(function() { + + var settings, + originalinput = $(this), + originalinput_data = originalinput.data(), + container, + elements, + value, + downSpinTimer, + upSpinTimer, + downDelayTimeout, + upDelayTimeout, + spincount = 0, + spinning = false; + + init(); + + + function init() { + if (originalinput.data('alreadyinitialized')) { + return; + } + + originalinput.data('alreadyinitialized', true); + _currentSpinnerId += 1; + originalinput.data('spinnerid', _currentSpinnerId); + + + if (!originalinput.is('input')) { + console.log('Must be an input.'); + return; + } + + _initSettings(); + _setInitval(); + _checkValue(); + _buildHtml(); + _initElements(); + _hideEmptyPrefixPostfix(); + _bindEvents(); + _bindEventsInterface(); + elements.input.css('display', 'block'); + } + + function _setInitval() { + if (settings.initval !== '' && originalinput.val() === '') { + originalinput.val(settings.initval); + } + } + + function changeSettings(newsettings) { + _updateSettings(newsettings); + _checkValue(); + + var value = elements.input.val(); + + if (value !== '') { + value = Number(elements.input.val()); + elements.input.val(value.toFixed(settings.decimals)); + } + } + + function _initSettings() { + settings = $.extend({}, defaults, originalinput_data, _parseAttributes(), options); + } + + function _parseAttributes() { + var data = {}; + $.each(attributeMap, function(key, value) { + var attrName = 'bts-' + value + ''; + if (originalinput.is('[data-' + attrName + ']')) { + data[key] = originalinput.data(attrName); + } + }); + return data; + } + + function _updateSettings(newsettings) { + settings = $.extend({}, settings, newsettings); + } + + function _buildHtml() { + var initval = originalinput.val(), + parentelement = originalinput.parent(); + + if (initval !== '') { + initval = Number(initval).toFixed(settings.decimals); + } + + originalinput.data('initvalue', initval).val(initval); + originalinput.addClass('form-control'); + + if (parentelement.hasClass('input-group')) { + _advanceInputGroup(parentelement); + } + else { + _buildInputGroup(); + } + } + + function _advanceInputGroup(parentelement) { + parentelement.addClass('bootstrap-touchspin'); + + var prev = originalinput.prev(), + next = originalinput.next(); + + var downhtml, + uphtml, + prefixhtml = '' + settings.prefix + '', + postfixhtml = '' + settings.postfix + ''; + + if (prev.hasClass('input-group-btn')) { + downhtml = ''; + prev.append(downhtml); + } + else { + downhtml = ''; + $(downhtml).insertBefore(originalinput); + } + + if (next.hasClass('input-group-btn')) { + uphtml = ''; + next.prepend(uphtml); + } + else { + uphtml = ''; + $(uphtml).insertAfter(originalinput); + } + + $(prefixhtml).insertBefore(originalinput); + $(postfixhtml).insertAfter(originalinput); + + container = parentelement; + } + + function _buildInputGroup() { + var html; + + if (settings.verticalbuttons) { + html = '
' + settings.prefix + '' + settings.postfix + '
'; + } + else { + html = '
' + settings.prefix + '' + settings.postfix + '
'; + } + + container = $(html).insertBefore(originalinput); + + $('.bootstrap-touchspin-prefix', container).after(originalinput); + + if (originalinput.hasClass('input-sm')) { + container.addClass('input-group-sm'); + } + else if (originalinput.hasClass('input-lg')) { + container.addClass('input-group-lg'); + } + } + + function _initElements() { + elements = { + down: $('.bootstrap-touchspin-down', container), + up: $('.bootstrap-touchspin-up', container), + input: $('input', container), + prefix: $('.bootstrap-touchspin-prefix', container).addClass(settings.prefix_extraclass), + postfix: $('.bootstrap-touchspin-postfix', container).addClass(settings.postfix_extraclass) + }; + } + + function _hideEmptyPrefixPostfix() { + if (settings.prefix === '') { + elements.prefix.hide(); + } + + if (settings.postfix === '') { + elements.postfix.hide(); + } + } + + function _bindEvents() { + originalinput.on('keydown', function(ev) { + var code = ev.keyCode || ev.which; + + if (code === 38) { + if (spinning !== 'up') { + upOnce(); + startUpSpin(); + } + ev.preventDefault(); + } + else if (code === 40) { + if (spinning !== 'down') { + downOnce(); + startDownSpin(); + } + ev.preventDefault(); + } + }); + + originalinput.on('keyup', function(ev) { + var code = ev.keyCode || ev.which; + + if (code === 38) { + stopSpin(); + } + else if (code === 40) { + stopSpin(); + } + }); + + originalinput.on('blur', function() { + _checkValue(); + }); + + elements.down.on('keydown', function(ev) { + var code = ev.keyCode || ev.which; + + if (code === 32 || code === 13) { + if (spinning !== 'down') { + downOnce(); + startDownSpin(); + } + ev.preventDefault(); + } + }); + + elements.down.on('keyup', function(ev) { + var code = ev.keyCode || ev.which; + + if (code === 32 || code === 13) { + stopSpin(); + } + }); + + elements.up.on('keydown', function(ev) { + var code = ev.keyCode || ev.which; + + if (code === 32 || code === 13) { + if (spinning !== 'up') { + upOnce(); + startUpSpin(); + } + ev.preventDefault(); + } + }); + + elements.up.on('keyup', function(ev) { + var code = ev.keyCode || ev.which; + + if (code === 32 || code === 13) { + stopSpin(); + } + }); + + elements.down.on('mousedown.touchspin', function(ev) { + elements.down.off('touchstart.touchspin'); // android 4 workaround + + if (originalinput.is(':disabled')) { + return; + } + + downOnce(); + startDownSpin(); + + ev.preventDefault(); + ev.stopPropagation(); + }); + + elements.down.on('touchstart.touchspin', function(ev) { + elements.down.off('mousedown.touchspin'); // android 4 workaround + + if (originalinput.is(':disabled')) { + return; + } + + downOnce(); + startDownSpin(); + + ev.preventDefault(); + ev.stopPropagation(); + }); + + elements.up.on('mousedown.touchspin', function(ev) { + elements.up.off('touchstart.touchspin'); // android 4 workaround + + if (originalinput.is(':disabled')) { + return; + } + + upOnce(); + startUpSpin(); + + ev.preventDefault(); + ev.stopPropagation(); + }); + + elements.up.on('touchstart.touchspin', function(ev) { + elements.up.off('mousedown.touchspin'); // android 4 workaround + + if (originalinput.is(':disabled')) { + return; + } + + upOnce(); + startUpSpin(); + + ev.preventDefault(); + ev.stopPropagation(); + }); + + elements.up.on('mouseout touchleave touchend touchcancel', function(ev) { + if (!spinning) { + return; + } + + ev.stopPropagation(); + stopSpin(); + }); + + elements.down.on('mouseout touchleave touchend touchcancel', function(ev) { + if (!spinning) { + return; + } + + ev.stopPropagation(); + stopSpin(); + }); + + elements.down.on('mousemove touchmove', function(ev) { + if (!spinning) { + return; + } + + ev.stopPropagation(); + ev.preventDefault(); + }); + + elements.up.on('mousemove touchmove', function(ev) { + if (!spinning) { + return; + } + + ev.stopPropagation(); + ev.preventDefault(); + }); + + $(document).on(_scopeEventNames(['mouseup', 'touchend', 'touchcancel'], _currentSpinnerId).join(' '), function(ev) { + if (!spinning) { + return; + } + + ev.preventDefault(); + stopSpin(); + }); + + $(document).on(_scopeEventNames(['mousemove', 'touchmove', 'scroll', 'scrollstart'], _currentSpinnerId).join(' '), function(ev) { + if (!spinning) { + return; + } + + ev.preventDefault(); + stopSpin(); + }); + + originalinput.on('mousewheel DOMMouseScroll', function(ev) { + if (!settings.mousewheel || !originalinput.is(':focus')) { + return; + } + + var delta = ev.originalEvent.wheelDelta || -ev.originalEvent.deltaY || -ev.originalEvent.detail; + + ev.stopPropagation(); + ev.preventDefault(); + + if (delta < 0) { + downOnce(); + } + else { + upOnce(); + } + }); + } + + function _bindEventsInterface() { + originalinput.on('touchspin.uponce', function() { + stopSpin(); + upOnce(); + }); + + originalinput.on('touchspin.downonce', function() { + stopSpin(); + downOnce(); + }); + + originalinput.on('touchspin.startupspin', function() { + startUpSpin(); + }); + + originalinput.on('touchspin.startdownspin', function() { + startDownSpin(); + }); + + originalinput.on('touchspin.stopspin', function() { + stopSpin(); + }); + + originalinput.on('touchspin.updatesettings', function(e, newsettings) { + changeSettings(newsettings); + }); + } + + function _forcestepdivisibility(value) { + switch (settings.forcestepdivisibility) { + case 'round': + return (Math.round(value / settings.step) * settings.step).toFixed(settings.decimals); + case 'floor': + return (Math.floor(value / settings.step) * settings.step).toFixed(settings.decimals); + case 'ceil': + return (Math.ceil(value / settings.step) * settings.step).toFixed(settings.decimals); + default: + return value; + } + } + + function _checkValue() { + var val, parsedval, returnval; + + val = originalinput.val(); + + if (val === '') { + if (settings.replacementval !== '') { + originalinput.val(settings.replacementval); + originalinput.trigger('change'); + } + return; + } + + if (settings.decimals > 0 && val === '.') { + return; + } + + parsedval = parseFloat(val); + + if (isNaN(parsedval)) { + if (settings.replacementval !== '') { + parsedval = settings.replacementval; + } + else { + parsedval = 0; + } + } + + returnval = parsedval; + + if (parsedval.toString() !== val) { + returnval = parsedval; + } + + if (parsedval < settings.min) { + returnval = settings.min; + } + + if (parsedval > settings.max) { + returnval = settings.max; + } + + returnval = _forcestepdivisibility(returnval); + + if (Number(val).toString() !== returnval.toString()) { + originalinput.val(returnval); + originalinput.trigger('change'); + } + } + + function _getBoostedStep() { + if (!settings.booster) { + return settings.step; + } + else { + var boosted = Math.pow(2, Math.floor(spincount / settings.boostat)) * settings.step; + + if (settings.maxboostedstep) { + if (boosted > settings.maxboostedstep) { + boosted = settings.maxboostedstep; + value = Math.round((value / boosted)) * boosted; + } + } + + return Math.max(settings.step, boosted); + } + } + + function upOnce() { + _checkValue(); + + value = parseFloat(elements.input.val()); + if (isNaN(value)) { + value = 0; + } + + var initvalue = value, + boostedstep = _getBoostedStep(); + + value = value + boostedstep; + + if (value > settings.max) { + value = settings.max; + originalinput.trigger('touchspin.on.max'); + stopSpin(); + } + + elements.input.val(Number(value).toFixed(settings.decimals)); + + if (initvalue !== value) { + originalinput.trigger('change'); + } + } + + function downOnce() { + _checkValue(); + + value = parseFloat(elements.input.val()); + if (isNaN(value)) { + value = 0; + } + + var initvalue = value, + boostedstep = _getBoostedStep(); + + value = value - boostedstep; + + if (value < settings.min) { + value = settings.min; + originalinput.trigger('touchspin.on.min'); + stopSpin(); + } + + elements.input.val(value.toFixed(settings.decimals)); + + if (initvalue !== value) { + originalinput.trigger('change'); + } + } + + function startDownSpin() { + stopSpin(); + + spincount = 0; + spinning = 'down'; + + originalinput.trigger('touchspin.on.startspin'); + originalinput.trigger('touchspin.on.startdownspin'); + + downDelayTimeout = setTimeout(function() { + downSpinTimer = setInterval(function() { + spincount++; + downOnce(); + }, settings.stepinterval); + }, settings.stepintervaldelay); + } + + function startUpSpin() { + stopSpin(); + + spincount = 0; + spinning = 'up'; + + originalinput.trigger('touchspin.on.startspin'); + originalinput.trigger('touchspin.on.startupspin'); + + upDelayTimeout = setTimeout(function() { + upSpinTimer = setInterval(function() { + spincount++; + upOnce(); + }, settings.stepinterval); + }, settings.stepintervaldelay); + } + + function stopSpin() { + clearTimeout(downDelayTimeout); + clearTimeout(upDelayTimeout); + clearInterval(downSpinTimer); + clearInterval(upSpinTimer); + + switch (spinning) { + case 'up': + originalinput.trigger('touchspin.on.stopupspin'); + originalinput.trigger('touchspin.on.stopspin'); + break; + case 'down': + originalinput.trigger('touchspin.on.stopdownspin'); + originalinput.trigger('touchspin.on.stopspin'); + break; + } + + spincount = 0; + spinning = false; + } + + }); + + }; + +})(jQuery); + +(function ($) { + 'use strict'; + /** + * We need an event when the elements are destroyed + * because if an input is removed, we have to remove the + * maxlength object associated (if any). + * From: + * http://stackoverflow.com/questions/2200494/jquery-trigger-event-when-an-element-is-removed-from-the-dom + */ + if (!$.event.special.destroyed) { + $.event.special.destroyed = { + remove: function (o) { + if (o.handler) { + o.handler(); + } + } + }; + } + + + $.fn.extend({ + maxlength: function (options, callback) { + var documentBody = $('body'), + defaults = { + showOnReady: false, // true to always show when indicator is ready + alwaysShow: false, // if true the indicator it's always shown. + threshold: 10, // Represents how many chars left are needed to show up the counter + warningClass: 'label label-success', + limitReachedClass: 'label label-important label-danger', + separator: ' / ', + preText: '', + postText: '', + showMaxLength: true, + placement: 'bottom', + message: null, // an alternative way to provide the message text + showCharsTyped: true, // show the number of characters typed and not the number of characters remaining + validate: false, // if the browser doesn't support the maxlength attribute, attempt to type more than + // the indicated chars, will be prevented. + utf8: false, // counts using bytesize rather than length. eg: '£' is counted as 2 characters. + appendToParent: false, // append the indicator to the input field's parent instead of body + twoCharLinebreak: true, // count linebreak as 2 characters to match IE/Chrome textarea validation. As well as DB storage. + allowOverMax: false // false = use maxlength attribute and browswer functionality. + // true = removes maxlength attribute and replaces with 'data-bs-mxl'. + // Form submit validation is handled on your own. when maxlength has been exceeded 'overmax' class added to element + }; + + if ($.isFunction(options) && !callback) { + callback = options; + options = {}; + } + options = $.extend(defaults, options); + + /** + * Return the length of the specified input. + * + * @param input + * @return {number} + */ + function inputLength(input) { + var text = input.val(); + + if (options.twoCharLinebreak) { + // Count all line breaks as 2 characters + text = text.replace(/\r(?!\n)|\n(?!\r)/g, '\r\n'); + } else { + // Remove all double-character (\r\n) linebreaks, so they're counted only once. + text = text.replace(new RegExp('\r?\n', 'g'), '\n'); + } + + var currentLength = 0; + + if (options.utf8) { + currentLength = utf8Length(text); + } else { + currentLength = text.length; + } + return currentLength; + } + + /** + * Truncate the text of the specified input. + * + * @param input + * @param limit + */ + function truncateChars(input, maxlength) { + var text = input.val(); + var newlines = 0; + + if (options.twoCharLinebreak) { + text = text.replace(/\r(?!\n)|\n(?!\r)/g, '\r\n'); + + if (text.substr(text.length - 1) === '\n' && text.length % 2 === 1) { + newlines = 1; + } + } + + input.val(text.substr(0, maxlength - newlines)); + } + + /** + * Return the length of the specified input in UTF8 encoding. + * + * @param input + * @return {number} + */ + function utf8Length(string) { + var utf8length = 0; + for (var n = 0; n < string.length; n++) { + var c = string.charCodeAt(n); + if (c < 128) { + utf8length++; + } + else if ((c > 127) && (c < 2048)) { + utf8length = utf8length + 2; + } + else { + utf8length = utf8length + 3; + } + } + return utf8length; + } + + /** + * Return true if the indicator should be showing up. + * + * @param input + * @param thereshold + * @param maxlength + * @return {number} + */ + function charsLeftThreshold(input, thereshold, maxlength) { + var output = true; + if (!options.alwaysShow && (maxlength - inputLength(input) > thereshold)) { + output = false; + } + return output; + } + + /** + * Returns how many chars are left to complete the fill up of the form. + * + * @param input + * @param maxlength + * @return {number} + */ + function remainingChars(input, maxlength) { + var length = maxlength - inputLength(input); + return length; + } + + /** + * When called displays the indicator. + * + * @param indicator + */ + function showRemaining(currentInput, indicator) { + indicator.css({ + display: 'block' + }); + currentInput.trigger('maxlength.shown'); + } + + /** + * When called shows the indicator. + * + * @param indicator + */ + function hideRemaining(currentInput, indicator) { + indicator.css({ + display: 'none' + }); + currentInput.trigger('maxlength.hidden'); + } + + /** + * This function updates the value in the indicator + * + * @param maxLengthThisInput + * @param typedChars + * @return String + */ + function updateMaxLengthHTML(currentInputText, maxLengthThisInput, typedChars) { + var output = ''; + if (options.message) { + if (typeof options.message === 'function') { + output = options.message(currentInputText, maxLengthThisInput); + } else { + output = options.message.replace('%charsTyped%', typedChars) + .replace('%charsRemaining%', maxLengthThisInput - typedChars) + .replace('%charsTotal%', maxLengthThisInput); + } + } else { + if (options.preText) { + output += options.preText; + } + if (!options.showCharsTyped) { + output += maxLengthThisInput - typedChars; + } + else { + output += typedChars; + } + if (options.showMaxLength) { + output += options.separator + maxLengthThisInput; + } + if (options.postText) { + output += options.postText; + } + } + return output; + } + + /** + * This function updates the value of the counter in the indicator. + * Wants as parameters: the number of remaining chars, the element currently managed, + * the maxLength for the current input and the indicator generated for it. + * + * @param remaining + * @param currentInput + * @param maxLengthCurrentInput + * @param maxLengthIndicator + */ + function manageRemainingVisibility(remaining, currentInput, maxLengthCurrentInput, maxLengthIndicator) { + if (maxLengthIndicator) { + maxLengthIndicator.html(updateMaxLengthHTML(currentInput.val(), maxLengthCurrentInput, (maxLengthCurrentInput - remaining))); + + if (remaining > 0) { + if (charsLeftThreshold(currentInput, options.threshold, maxLengthCurrentInput)) { + showRemaining(currentInput, maxLengthIndicator.removeClass(options.limitReachedClass).addClass(options.warningClass)); + } else { + hideRemaining(currentInput, maxLengthIndicator); + } + } else { + showRemaining(currentInput, maxLengthIndicator.removeClass(options.warningClass).addClass(options.limitReachedClass)); + } + } + + if (options.allowOverMax) { + // class to use for form validation on custom maxlength attribute + if (remaining < 0) { + currentInput.addClass('overmax'); + } else { + currentInput.removeClass('overmax'); + } + } + } + + /** + * This function returns an object containing all the + * informations about the position of the current input + * + * @param currentInput + * @return object {bottom height left right top width} + * + */ + function getPosition(currentInput) { + var el = currentInput[0]; + return $.extend({}, (typeof el.getBoundingClientRect === 'function') ? el.getBoundingClientRect() : { + width: el.offsetWidth, + height: el.offsetHeight + }, currentInput.offset()); + } + + /** + * This function places the maxLengthIndicator at the + * top / bottom / left / right of the currentInput + * + * @param currentInput + * @param maxLengthIndicator + * @return null + * + */ + function place(currentInput, maxLengthIndicator) { + var pos = getPosition(currentInput); + + // Supports custom placement handler + if ($.type(options.placement) === 'function'){ + options.placement(currentInput, maxLengthIndicator, pos); + return; + } + + // Supports custom placement via css positional properties + if ($.isPlainObject(options.placement)){ + placeWithCSS(options.placement, maxLengthIndicator); + return; + } + + var inputOuter = currentInput.outerWidth(), + outerWidth = maxLengthIndicator.outerWidth(), + actualWidth = maxLengthIndicator.width(), + actualHeight = maxLengthIndicator.height(); + + // get the right position if the indicator is appended to the input's parent + if (options.appendToParent) { + pos.top -= currentInput.parent().offset().top; + pos.left -= currentInput.parent().offset().left; + } + + switch (options.placement) { + case 'bottom': + maxLengthIndicator.css({ top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 }); + break; + case 'top': + maxLengthIndicator.css({ top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 }); + break; + case 'left': + maxLengthIndicator.css({ top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth }); + break; + case 'right': + maxLengthIndicator.css({ top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }); + break; + case 'bottom-right': + maxLengthIndicator.css({ top: pos.top + pos.height, left: pos.left + pos.width }); + break; + case 'top-right': + maxLengthIndicator.css({ top: pos.top - actualHeight, left: pos.left + inputOuter }); + break; + case 'top-left': + maxLengthIndicator.css({ top: pos.top - actualHeight, left: pos.left - outerWidth }); + break; + case 'bottom-left': + maxLengthIndicator.css({ top: pos.top + currentInput.outerHeight(), left: pos.left - outerWidth }); + break; + case 'centered-right': + maxLengthIndicator.css({ top: pos.top + (actualHeight / 2), left: pos.left + inputOuter - outerWidth - 3 }); + break; + + // Some more options for placements + case 'bottom-right-inside': + maxLengthIndicator.css({ top: pos.top + pos.height, left: pos.left + pos.width - outerWidth }); + break; + case 'top-right-inside': + maxLengthIndicator.css({ top: pos.top - actualHeight, left: pos.left + inputOuter - outerWidth }); + break; + case 'top-left-inside': + maxLengthIndicator.css({ top: pos.top - actualHeight, left: pos.left }); + break; + case 'bottom-left-inside': + maxLengthIndicator.css({ top: pos.top + currentInput.outerHeight(), left: pos.left }); + break; + } + } + + /** + * This function places the maxLengthIndicator based on placement config object. + * + * @param {object} placement + * @param {$} maxLengthIndicator + * @return null + * + */ + function placeWithCSS(placement, maxLengthIndicator) { + if (!placement || !maxLengthIndicator){ + return; + } + + var POSITION_KEYS = [ + 'top', + 'bottom', + 'left', + 'right', + 'position' + ]; + + var cssPos = {}; + + // filter css properties to position + $.each(POSITION_KEYS, function (i, key) { + var val = options.placement[key]; + if (typeof val !== 'undefined'){ + cssPos[key] = val; + } + }); + + maxLengthIndicator.css(cssPos); + + return; + } + + /** + * This function retrieves the maximum length of currentInput + * + * @param currentInput + * @return {number} + * + */ + function getMaxLength(currentInput) { + var attr = 'maxlength'; + if (options.allowOverMax) { + attr = 'data-bs-mxl'; + } + return currentInput.attr(attr) || currentInput.attr('size'); + } + + return this.each(function () { + + var currentInput = $(this), + maxLengthCurrentInput, + maxLengthIndicator; + + $(window).resize(function () { + if (maxLengthIndicator) { + place(currentInput, maxLengthIndicator); + } + }); + + if (options.allowOverMax) { + $(this).attr('data-bs-mxl', $(this).attr('maxlength')); + $(this).removeAttr('maxlength'); + } + + function firstInit() { + var maxlengthContent = updateMaxLengthHTML(currentInput.val(), maxLengthCurrentInput, '0'); + maxLengthCurrentInput = getMaxLength(currentInput); + + if (!maxLengthIndicator) { + maxLengthIndicator = $('').css({ + display: 'none', + position: 'absolute', + whiteSpace: 'nowrap', + zIndex: 1099 + }).html(maxlengthContent); + } + + // We need to detect resizes if we are dealing with a textarea: + if (currentInput.is('textarea')) { + currentInput.data('maxlenghtsizex', currentInput.outerWidth()); + currentInput.data('maxlenghtsizey', currentInput.outerHeight()); + + currentInput.mouseup(function () { + if (currentInput.outerWidth() !== currentInput.data('maxlenghtsizex') || currentInput.outerHeight() !== currentInput.data('maxlenghtsizey')) { + place(currentInput, maxLengthIndicator); + } + + currentInput.data('maxlenghtsizex', currentInput.outerWidth()); + currentInput.data('maxlenghtsizey', currentInput.outerHeight()); + }); + } + + if (options.appendToParent) { + currentInput.parent().append(maxLengthIndicator); + currentInput.parent().css('position', 'relative'); + } else { + documentBody.append(maxLengthIndicator); + } + + var remaining = remainingChars(currentInput, getMaxLength(currentInput)); + manageRemainingVisibility(remaining, currentInput, maxLengthCurrentInput, maxLengthIndicator); + place(currentInput, maxLengthIndicator); + } + + if (options.showOnReady) { + currentInput.ready(function () { + firstInit(); + }); + } else { + currentInput.focus(function () { + firstInit(); + }); + } + + currentInput.on('maxlength.reposition', function () { + place(currentInput, maxLengthIndicator); + }); + + + currentInput.on('destroyed', function () { + if (maxLengthIndicator) { + maxLengthIndicator.remove(); + } + }); + + currentInput.on('blur', function () { + if (maxLengthIndicator && !options.showOnReady) { + maxLengthIndicator.remove(); + } + }); + + currentInput.on('input', function () { + var maxlength = getMaxLength(currentInput), + remaining = remainingChars(currentInput, maxlength), + output = true; + + if (options.validate && remaining < 0) { + truncateChars(currentInput, maxlength); + output = false; + } else { + manageRemainingVisibility(remaining, currentInput, maxLengthCurrentInput, maxLengthIndicator); + } + + //reposition the indicator if placement "bottom-right-inside" & "top-right-inside" is used + if (options.placement === 'bottom-right-inside' || options.placement === 'top-right-inside') { + place(currentInput, maxLengthIndicator); + } + + return output; + }); + }); + } + }); +}(jQuery)); + +/** + * bootstrap-switch - Turn checkboxes and radio buttons into toggle switches. + * + * @version v3.3.4 + * @homepage https://bttstrp.github.io/bootstrap-switch + * @author Mattia Larentis (http://larentis.eu) + * @license Apache-2.0 + */ + +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(['jquery'], factory); + } else if (typeof exports !== "undefined") { + factory(require('jquery')); + } else { + var mod = { + exports: {} + }; + factory(global.jquery); + global.bootstrapSwitch = mod.exports; + } +})(this, function (_jquery) { + 'use strict'; + + var _jquery2 = _interopRequireDefault(_jquery); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; + } + + var _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + var $ = _jquery2.default || window.jQuery || window.$; + + var BootstrapSwitch = function () { + function BootstrapSwitch(element) { + var _this = this; + + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, BootstrapSwitch); + + this.$element = $(element); + this.options = $.extend({}, $.fn.bootstrapSwitch.defaults, this._getElementOptions(), options); + this.prevOptions = {}; + this.$wrapper = $('
', { + class: function _class() { + var classes = []; + classes.push(_this.options.state ? 'on' : 'off'); + if (_this.options.size) { + classes.push(_this.options.size); + } + if (_this.options.disabled) { + classes.push('disabled'); + } + if (_this.options.readonly) { + classes.push('readonly'); + } + if (_this.options.indeterminate) { + classes.push('indeterminate'); + } + if (_this.options.inverse) { + classes.push('inverse'); + } + if (_this.$element.attr('id')) { + classes.push('id-' + _this.$element.attr('id')); + } + return classes.map(_this._getClass.bind(_this)).concat([_this.options.baseClass], _this._getClasses(_this.options.wrapperClass)).join(' '); + } + }); + this.$container = $('
', { class: this._getClass('container') }); + this.$on = $('', { + html: this.options.onText, + class: this._getClass('handle-on') + ' ' + this._getClass(this.options.onColor) + }); + this.$off = $('', { + html: this.options.offText, + class: this._getClass('handle-off') + ' ' + this._getClass(this.options.offColor) + }); + this.$label = $('', { + html: this.options.labelText, + class: this._getClass('label') + }); + + this.$element.on('init.bootstrapSwitch', this.options.onInit.bind(this, element)); + this.$element.on('switchChange.bootstrapSwitch', function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + if (_this.options.onSwitchChange.apply(element, args) === false) { + if (_this.$element.is(':radio')) { + $('[name="' + _this.$element.attr('name') + '"]').trigger('previousState.bootstrapSwitch', true); + } else { + _this.$element.trigger('previousState.bootstrapSwitch', true); + } + } + }); + + this.$container = this.$element.wrap(this.$container).parent(); + this.$wrapper = this.$container.wrap(this.$wrapper).parent(); + this.$element.before(this.options.inverse ? this.$off : this.$on).before(this.$label).before(this.options.inverse ? this.$on : this.$off); + + if (this.options.indeterminate) { + this.$element.prop('indeterminate', true); + } + + this._init(); + this._elementHandlers(); + this._handleHandlers(); + this._labelHandlers(); + this._formHandler(); + this._externalLabelHandler(); + this.$element.trigger('init.bootstrapSwitch', this.options.state); + } + + _createClass(BootstrapSwitch, [{ + key: 'setPrevOptions', + value: function setPrevOptions() { + this.prevOptions = _extends({}, this.options); + } + }, { + key: 'state', + value: function state(value, skip) { + if (typeof value === 'undefined') { + return this.options.state; + } + if (this.options.disabled || this.options.readonly || this.options.state && !this.options.radioAllOff && this.$element.is(':radio')) { + return this.$element; + } + if (this.$element.is(':radio')) { + $('[name="' + this.$element.attr('name') + '"]').trigger('setPreviousOptions.bootstrapSwitch'); + } else { + this.$element.trigger('setPreviousOptions.bootstrapSwitch'); + } + if (this.options.indeterminate) { + this.indeterminate(false); + } + this.$element.prop('checked', Boolean(value)).trigger('change.bootstrapSwitch', skip); + return this.$element; + } + }, { + key: 'toggleState', + value: function toggleState(skip) { + if (this.options.disabled || this.options.readonly) { + return this.$element; + } + if (this.options.indeterminate) { + this.indeterminate(false); + return this.state(true); + } else { + return this.$element.prop('checked', !this.options.state).trigger('change.bootstrapSwitch', skip); + } + } + }, { + key: 'size', + value: function size(value) { + if (typeof value === 'undefined') { + return this.options.size; + } + if (this.options.size != null) { + this.$wrapper.removeClass(this._getClass(this.options.size)); + } + if (value) { + this.$wrapper.addClass(this._getClass(value)); + } + this._width(); + this._containerPosition(); + this.options.size = value; + return this.$element; + } + }, { + key: 'animate', + value: function animate(value) { + if (typeof value === 'undefined') { + return this.options.animate; + } + if (this.options.animate === Boolean(value)) { + return this.$element; + } + return this.toggleAnimate(); + } + }, { + key: 'toggleAnimate', + value: function toggleAnimate() { + this.options.animate = !this.options.animate; + this.$wrapper.toggleClass(this._getClass('animate')); + return this.$element; + } + }, { + key: 'disabled', + value: function disabled(value) { + if (typeof value === 'undefined') { + return this.options.disabled; + } + if (this.options.disabled === Boolean(value)) { + return this.$element; + } + return this.toggleDisabled(); + } + }, { + key: 'toggleDisabled', + value: function toggleDisabled() { + this.options.disabled = !this.options.disabled; + this.$element.prop('disabled', this.options.disabled); + this.$wrapper.toggleClass(this._getClass('disabled')); + return this.$element; + } + }, { + key: 'readonly', + value: function readonly(value) { + if (typeof value === 'undefined') { + return this.options.readonly; + } + if (this.options.readonly === Boolean(value)) { + return this.$element; + } + return this.toggleReadonly(); + } + }, { + key: 'toggleReadonly', + value: function toggleReadonly() { + this.options.readonly = !this.options.readonly; + this.$element.prop('readonly', this.options.readonly); + this.$wrapper.toggleClass(this._getClass('readonly')); + return this.$element; + } + }, { + key: 'indeterminate', + value: function indeterminate(value) { + if (typeof value === 'undefined') { + return this.options.indeterminate; + } + if (this.options.indeterminate === Boolean(value)) { + return this.$element; + } + return this.toggleIndeterminate(); + } + }, { + key: 'toggleIndeterminate', + value: function toggleIndeterminate() { + this.options.indeterminate = !this.options.indeterminate; + this.$element.prop('indeterminate', this.options.indeterminate); + this.$wrapper.toggleClass(this._getClass('indeterminate')); + this._containerPosition(); + return this.$element; + } + }, { + key: 'inverse', + value: function inverse(value) { + if (typeof value === 'undefined') { + return this.options.inverse; + } + if (this.options.inverse === Boolean(value)) { + return this.$element; + } + return this.toggleInverse(); + } + }, { + key: 'toggleInverse', + value: function toggleInverse() { + this.$wrapper.toggleClass(this._getClass('inverse')); + var $on = this.$on.clone(true); + var $off = this.$off.clone(true); + this.$on.replaceWith($off); + this.$off.replaceWith($on); + this.$on = $off; + this.$off = $on; + this.options.inverse = !this.options.inverse; + return this.$element; + } + }, { + key: 'onColor', + value: function onColor(value) { + if (typeof value === 'undefined') { + return this.options.onColor; + } + if (this.options.onColor) { + this.$on.removeClass(this._getClass(this.options.onColor)); + } + this.$on.addClass(this._getClass(value)); + this.options.onColor = value; + return this.$element; + } + }, { + key: 'offColor', + value: function offColor(value) { + if (typeof value === 'undefined') { + return this.options.offColor; + } + if (this.options.offColor) { + this.$off.removeClass(this._getClass(this.options.offColor)); + } + this.$off.addClass(this._getClass(value)); + this.options.offColor = value; + return this.$element; + } + }, { + key: 'onText', + value: function onText(value) { + if (typeof value === 'undefined') { + return this.options.onText; + } + this.$on.html(value); + this._width(); + this._containerPosition(); + this.options.onText = value; + return this.$element; + } + }, { + key: 'offText', + value: function offText(value) { + if (typeof value === 'undefined') { + return this.options.offText; + } + this.$off.html(value); + this._width(); + this._containerPosition(); + this.options.offText = value; + return this.$element; + } + }, { + key: 'labelText', + value: function labelText(value) { + if (typeof value === 'undefined') { + return this.options.labelText; + } + this.$label.html(value); + this._width(); + this.options.labelText = value; + return this.$element; + } + }, { + key: 'handleWidth', + value: function handleWidth(value) { + if (typeof value === 'undefined') { + return this.options.handleWidth; + } + this.options.handleWidth = value; + this._width(); + this._containerPosition(); + return this.$element; + } + }, { + key: 'labelWidth', + value: function labelWidth(value) { + if (typeof value === 'undefined') { + return this.options.labelWidth; + } + this.options.labelWidth = value; + this._width(); + this._containerPosition(); + return this.$element; + } + }, { + key: 'baseClass', + value: function baseClass(value) { + return this.options.baseClass; + } + }, { + key: 'wrapperClass', + value: function wrapperClass(value) { + if (typeof value === 'undefined') { + return this.options.wrapperClass; + } + if (!value) { + value = $.fn.bootstrapSwitch.defaults.wrapperClass; + } + this.$wrapper.removeClass(this._getClasses(this.options.wrapperClass).join(' ')); + this.$wrapper.addClass(this._getClasses(value).join(' ')); + this.options.wrapperClass = value; + return this.$element; + } + }, { + key: 'radioAllOff', + value: function radioAllOff(value) { + if (typeof value === 'undefined') { + return this.options.radioAllOff; + } + var val = Boolean(value); + if (this.options.radioAllOff === val) { + return this.$element; + } + this.options.radioAllOff = val; + return this.$element; + } + }, { + key: 'onInit', + value: function onInit(value) { + if (typeof value === 'undefined') { + return this.options.onInit; + } + if (!value) { + value = $.fn.bootstrapSwitch.defaults.onInit; + } + this.options.onInit = value; + return this.$element; + } + }, { + key: 'onSwitchChange', + value: function onSwitchChange(value) { + if (typeof value === 'undefined') { + return this.options.onSwitchChange; + } + if (!value) { + value = $.fn.bootstrapSwitch.defaults.onSwitchChange; + } + this.options.onSwitchChange = value; + return this.$element; + } + }, { + key: 'destroy', + value: function destroy() { + var $form = this.$element.closest('form'); + if ($form.length) { + $form.off('reset.bootstrapSwitch').removeData('bootstrap-switch'); + } + this.$container.children().not(this.$element).remove(); + this.$element.unwrap().unwrap().off('.bootstrapSwitch').removeData('bootstrap-switch'); + return this.$element; + } + }, { + key: '_getElementOptions', + value: function _getElementOptions() { + return { + state: this.$element.is(':checked'), + size: this.$element.data('size'), + animate: this.$element.data('animate'), + disabled: this.$element.is(':disabled'), + readonly: this.$element.is('[readonly]'), + indeterminate: this.$element.data('indeterminate'), + inverse: this.$element.data('inverse'), + radioAllOff: this.$element.data('radio-all-off'), + onColor: this.$element.data('on-color'), + offColor: this.$element.data('off-color'), + onText: this.$element.data('on-text'), + offText: this.$element.data('off-text'), + labelText: this.$element.data('label-text'), + handleWidth: this.$element.data('handle-width'), + labelWidth: this.$element.data('label-width'), + baseClass: this.$element.data('base-class'), + wrapperClass: this.$element.data('wrapper-class') + }; + } + }, { + key: '_width', + value: function _width() { + var _this2 = this; + + var $handles = this.$on.add(this.$off).add(this.$label).css('width', ''); + var handleWidth = this.options.handleWidth === 'auto' ? Math.round(Math.max(this.$on.width(), this.$off.width())) : this.options.handleWidth; + $handles.width(handleWidth); + this.$label.width(function (index, width) { + if (_this2.options.labelWidth !== 'auto') { + return _this2.options.labelWidth; + } + if (width < handleWidth) { + return handleWidth; + } + return width; + }); + this._handleWidth = this.$on.outerWidth(); + this._labelWidth = this.$label.outerWidth(); + this.$container.width(this._handleWidth * 2 + this._labelWidth); + return this.$wrapper.width(this._handleWidth + this._labelWidth); + } + }, { + key: '_containerPosition', + value: function _containerPosition() { + var _this3 = this; + + var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.options.state; + var callback = arguments[1]; + + this.$container.css('margin-left', function () { + var values = [0, '-' + _this3._handleWidth + 'px']; + if (_this3.options.indeterminate) { + return '-' + _this3._handleWidth / 2 + 'px'; + } + if (state) { + if (_this3.options.inverse) { + return values[1]; + } else { + return values[0]; + } + } else { + if (_this3.options.inverse) { + return values[0]; + } else { + return values[1]; + } + } + }); + } + }, { + key: '_init', + value: function _init() { + var _this4 = this; + + var init = function init() { + _this4.setPrevOptions(); + _this4._width(); + _this4._containerPosition(); + setTimeout(function () { + if (_this4.options.animate) { + return _this4.$wrapper.addClass(_this4._getClass('animate')); + } + }, 50); + }; + if (this.$wrapper.is(':visible')) { + init(); + return; + } + var initInterval = window.setInterval(function () { + if (_this4.$wrapper.is(':visible')) { + init(); + return window.clearInterval(initInterval); + } + }, 50); + } + }, { + key: '_elementHandlers', + value: function _elementHandlers() { + var _this5 = this; + + return this.$element.on({ + 'setPreviousOptions.bootstrapSwitch': this.setPrevOptions.bind(this), + + 'previousState.bootstrapSwitch': function previousStateBootstrapSwitch() { + _this5.options = _this5.prevOptions; + if (_this5.options.indeterminate) { + _this5.$wrapper.addClass(_this5._getClass('indeterminate')); + } + _this5.$element.prop('checked', _this5.options.state).trigger('change.bootstrapSwitch', true); + }, + + 'change.bootstrapSwitch': function changeBootstrapSwitch(event, skip) { + event.preventDefault(); + event.stopImmediatePropagation(); + var state = _this5.$element.is(':checked'); + _this5._containerPosition(state); + if (state === _this5.options.state) { + return; + } + _this5.options.state = state; + _this5.$wrapper.toggleClass(_this5._getClass('off')).toggleClass(_this5._getClass('on')); + if (!skip) { + if (_this5.$element.is(':radio')) { + $('[name="' + _this5.$element.attr('name') + '"]').not(_this5.$element).prop('checked', false).trigger('change.bootstrapSwitch', true); + } + _this5.$element.trigger('switchChange.bootstrapSwitch', [state]); + } + }, + + 'focus.bootstrapSwitch': function focusBootstrapSwitch(event) { + event.preventDefault(); + _this5.$wrapper.addClass(_this5._getClass('focused')); + }, + + 'blur.bootstrapSwitch': function blurBootstrapSwitch(event) { + event.preventDefault(); + _this5.$wrapper.removeClass(_this5._getClass('focused')); + }, + + 'keydown.bootstrapSwitch': function keydownBootstrapSwitch(event) { + if (!event.which || _this5.options.disabled || _this5.options.readonly) { + return; + } + if (event.which === 37 || event.which === 39) { + event.preventDefault(); + event.stopImmediatePropagation(); + _this5.state(event.which === 39); + } + } + }); + } + }, { + key: '_handleHandlers', + value: function _handleHandlers() { + var _this6 = this; + + this.$on.on('click.bootstrapSwitch', function (event) { + event.preventDefault(); + event.stopPropagation(); + _this6.state(false); + return _this6.$element.trigger('focus.bootstrapSwitch'); + }); + return this.$off.on('click.bootstrapSwitch', function (event) { + event.preventDefault(); + event.stopPropagation(); + _this6.state(true); + return _this6.$element.trigger('focus.bootstrapSwitch'); + }); + } + }, { + key: '_labelHandlers', + value: function _labelHandlers() { + var _this7 = this; + + var handlers = { + click: function click(event) { + event.stopPropagation(); + }, + + + 'mousedown.bootstrapSwitch touchstart.bootstrapSwitch': function mousedownBootstrapSwitchTouchstartBootstrapSwitch(event) { + if (_this7._dragStart || _this7.options.disabled || _this7.options.readonly) { + return; + } + event.preventDefault(); + event.stopPropagation(); + _this7._dragStart = (event.pageX || event.originalEvent.touches[0].pageX) - parseInt(_this7.$container.css('margin-left'), 10); + if (_this7.options.animate) { + _this7.$wrapper.removeClass(_this7._getClass('animate')); + } + _this7.$element.trigger('focus.bootstrapSwitch'); + }, + + 'mousemove.bootstrapSwitch touchmove.bootstrapSwitch': function mousemoveBootstrapSwitchTouchmoveBootstrapSwitch(event) { + if (_this7._dragStart == null) { + return; + } + var difference = (event.pageX || event.originalEvent.touches[0].pageX) - _this7._dragStart; + event.preventDefault(); + if (difference < -_this7._handleWidth || difference > 0) { + return; + } + _this7._dragEnd = difference; + _this7.$container.css('margin-left', _this7._dragEnd + 'px'); + }, + + 'mouseup.bootstrapSwitch touchend.bootstrapSwitch': function mouseupBootstrapSwitchTouchendBootstrapSwitch(event) { + if (!_this7._dragStart) { + return; + } + event.preventDefault(); + if (_this7.options.animate) { + _this7.$wrapper.addClass(_this7._getClass('animate')); + } + if (_this7._dragEnd) { + var state = _this7._dragEnd > -(_this7._handleWidth / 2); + _this7._dragEnd = false; + _this7.state(_this7.options.inverse ? !state : state); + } else { + _this7.state(!_this7.options.state); + } + _this7._dragStart = false; + }, + + 'mouseleave.bootstrapSwitch': function mouseleaveBootstrapSwitch() { + _this7.$label.trigger('mouseup.bootstrapSwitch'); + } + }; + this.$label.on(handlers); + } + }, { + key: '_externalLabelHandler', + value: function _externalLabelHandler() { + var _this8 = this; + + var $externalLabel = this.$element.closest('label'); + $externalLabel.on('click', function (event) { + event.preventDefault(); + event.stopImmediatePropagation(); + if (event.target === $externalLabel[0]) { + _this8.toggleState(); + } + }); + } + }, { + key: '_formHandler', + value: function _formHandler() { + var $form = this.$element.closest('form'); + if ($form.data('bootstrap-switch')) { + return; + } + $form.on('reset.bootstrapSwitch', function () { + window.setTimeout(function () { + $form.find('input').filter(function () { + return $(this).data('bootstrap-switch'); + }).each(function () { + return $(this).bootstrapSwitch('state', this.checked); + }); + }, 1); + }).data('bootstrap-switch', true); + } + }, { + key: '_getClass', + value: function _getClass(name) { + return this.options.baseClass + '-' + name; + } + }, { + key: '_getClasses', + value: function _getClasses(classes) { + if (!$.isArray(classes)) { + return [this._getClass(classes)]; + } + return classes.map(this._getClass.bind(this)); + } + }]); + + return BootstrapSwitch; + }(); + + $.fn.bootstrapSwitch = function (option) { + for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + function reducer(ret, next) { + var $this = $(next); + var existingData = $this.data('bootstrap-switch'); + var data = existingData || new BootstrapSwitch(next, option); + if (!existingData) { + $this.data('bootstrap-switch', data); + } + if (typeof option === 'string') { + return data[option].apply(data, args); + } + return ret; + } + return Array.prototype.reduce.call(this, reducer, this); + }; + $.fn.bootstrapSwitch.Constructor = BootstrapSwitch; + $.fn.bootstrapSwitch.defaults = { + state: true, + size: null, + animate: true, + disabled: false, + readonly: false, + indeterminate: false, + inverse: false, + radioAllOff: false, + onColor: 'primary', + offColor: 'default', + onText: 'ON', + offText: 'OFF', + labelText: ' ', + handleWidth: 'auto', + labelWidth: 'auto', + baseClass: 'bootstrap-switch', + wrapperClass: 'wrapper', + onInit: function onInit() {}, + onSwitchChange: function onSwitchChange() {} + }; +}); + +//$.fn.bootstrapSwitch.defaults.size = 'large'; +//$.fn.bootstrapSwitch.defaults.onColor = 'success'; ++function(a){"use strict";function c(c){return this.each(function(){var d=a(this),e=d.data("multiselectsplitter"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("multiselectsplitter",e=new b(this,f)),"string"==typeof c&&e[c]())})}var b=function(a,b){this.init("multiselectsplitter",a,b)};b.DEFAULTS={selectSize:null,maxSelectSize:null,clearOnFirstChange:!1,onlySameGroup:!1,groupCounter:!1,maximumSelected:null,afterInitialize:null,maximumAlert:function(a){alert("Only "+a+" values can be selected")},createFirstSelect:function(a,b){return""},createSecondSelect:function(a,b){return""},template:'
'},b.prototype.init=function(c,d,e){var f=this;f.type=c,f.last$ElementSelected=[],f.initialized=!1,f.$element=a(d),f.$element.hide(),f.options=a.extend({},b.DEFAULTS,e),f.$element.after(f.options.template),f.$wrapper=f.$element.next("div[data-multiselectsplitter-wrapper-selector]"),f.$firstSelect=a("select[data-multiselectsplitter-firstselect-selector]",f.$wrapper),f.$secondSelect=a("select[data-multiselectsplitter-secondselect-selector]",f.$wrapper);var g=0,h=0;if(0!=f.$element.find("optgroup").length){f.$element.find("optgroup").each(function(){var b=a(this).attr("label"),c=a(f.options.createFirstSelect(b,f.$element));c.val(b),c.attr("data-current-label",c.text()),f.$firstSelect.append(c);var d=a(this).find("option").length;d>h&&(h=d),g++});var i=Math.max(g,h);i=Math.min(i,10),f.options.selectSize?i=f.options.selectSize:f.options.maxSelectSize&&(i=Math.min(i,f.options.maxSelectSize)),f.$firstSelect.attr("size",i),f.$secondSelect.attr("size",i),f.$element.attr("multiple")&&f.$secondSelect.attr("multiple","multiple"),f.$element.is(":disabled")&&f.disable(),f.$firstSelect.on("change",a.proxy(f.updateParentCategory,f)),f.$secondSelect.on("click change",a.proxy(f.updateChildCategory,f)),f.update=function(){if(!(f.$element.find("option").length<1)){var b,a=f.$element.find("option:selected:first");b=a.length?a.parent().attr("label"):f.$element.find("option:first").parent().attr("label"),f.$firstSelect.find('option[value="'+b+'"]').prop("selected",!0),f.$firstSelect.trigger("change")}},f.update(),f.initialized=!0,f.options.afterInitialize&&f.options.afterInitialize(f.$firstSelect,f.$secondSelect)}},b.prototype.disable=function(){this.$secondSelect.prop("disabled",!0),this.$firstSelect.prop("disabled",!0)},b.prototype.enable=function(){this.$secondSelect.prop("disabled",!1),this.$firstSelect.prop("disabled",!1)},b.prototype.createSecondSelect=function(){var b=this;b.$secondSelect.empty(),a.each(b.$element.find('optgroup[label="'+b.$firstSelect.val()+'"] option'),function(c,d){var e=a(this).val(),f=a(this).text(),g=a(b.options.createSecondSelect(f,b.$firstSelect));g.val(e),a.each(b.$element.find("option:selected"),function(b,c){a(c).val()==e&&g.prop("selected",!0)}),b.$secondSelect.append(g)})},b.prototype.updateParentCategory=function(){var a=this;a.last$ElementSelected=a.$element.find("option:selected"),a.options.clearOnFirstChange&&a.initialized&&a.$element.find("option:selected").prop("selected",!1),a.createSecondSelect(),a.checkSelected(),a.updateCounter()},b.prototype.updateCounter=function(){var b=this;b.$element.attr("multiple")&&b.options.groupCounter&&a.each(b.$firstSelect.find("option"),function(c,d){var e=a(d).val(),f=a(d).data("currentLabel"),g=b.$element.find('optgroup[label="'+e+'"] option:selected').length;g>0&&(f+=" ("+g+")"),a(d).html(f)})},b.prototype.checkSelected=function(){var b=this;if(b.$element.attr("multiple")&&b.options.maximumSelected){var c=0;if(c="function"==typeof b.options.maximumSelected?b.options.maximumSelected(b.$firstSelect,b.$secondSelect):b.options.maximumSelected,!(c<1)){var d=b.$element.find("option:selected");if(d.length>c){b.$firstSelect.find("option:selected").prop("selected",!1),b.$secondSelect.find("option:selected").prop("selected",!1),b.initialized?(b.$element.find("option:selected").prop("selected",!1),b.last$ElementSelected.prop("selected",!0)):a.each(b.$element.find("option:selected"),function(b,d){b>c-1&&a(d).prop("selected",!1)});var e=b.last$ElementSelected.first().parent().attr("label");b.$firstSelect.find('option[value="'+e+'"]').prop("selected",!0),b.createSecondSelect(),b.options.maximumAlert(c)}}}},b.prototype.basicUpdateChildCategory=function(b,c){var d=this;d.last$ElementSelected=d.$element.find("option:selected");var e=d.$secondSelect.val();a.isArray(e)||(e=[e]);var f=d.$firstSelect.val(),g=!1;d.$element.attr("multiple")?d.options.onlySameGroup?a.each(d.$element.find("option:selected"),function(b,c){if(a(c).parent().attr("label")!=f)return g=!0,!1}):c||(g=!0):g=!0,g?d.$element.find("option:selected").prop("selected",!1):a.each(d.$element.find("option:selected"),function(b,c){f==a(c).parent().attr("label")&&a.inArray(a(c).val(),e)==-1&&a(c).prop("selected",!1)}),a.each(e,function(a,b){d.$element.find('option[value="'+b+'"]').prop("selected",!0)}),d.checkSelected(),d.updateCounter(),d.$element.trigger("change")},b.prototype.updateChildCategory=function(b){"change"==b.type?this.timeOut=setTimeout(a.proxy(function(){this.basicUpdateChildCategory(b,b.ctrlKey)},this),10):"click"==b.type&&(clearTimeout(this.timeOut),this.basicUpdateChildCategory(b,b.ctrlKey))},b.prototype.destroy=function(){this.$wrapper.remove(),this.$element.removeData(this.type),this.$element.show()},a.fn.multiselectsplitter=c,a.fn.multiselectsplitter.Constructor=b,a.fn.multiselectsplitter.VERSION="1.0.1"}(jQuery); +/*! + * Bootstrap-select v1.12.4 (http://silviomoreto.github.io/bootstrap-select) + * + * Copyright 2013-2017 bootstrap-select + * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE) + */ + +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module unless amdModuleId is set + define(["jquery"], function (a0) { + return (factory(a0)); + }); + } else if (typeof module === 'object' && module.exports) { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +}(this, function (jQuery) { + +(function ($) { + 'use strict'; + + // + if (!String.prototype.includes) { + (function () { + 'use strict'; // needed to support `apply`/`call` with `undefined`/`null` + var toString = {}.toString; + var defineProperty = (function () { + // IE 8 only supports `Object.defineProperty` on DOM elements + try { + var object = {}; + var $defineProperty = Object.defineProperty; + var result = $defineProperty(object, object, object) && $defineProperty; + } catch (error) { + } + return result; + }()); + var indexOf = ''.indexOf; + var includes = function (search) { + if (this == null) { + throw new TypeError(); + } + var string = String(this); + if (search && toString.call(search) == '[object RegExp]') { + throw new TypeError(); + } + var stringLength = string.length; + var searchString = String(search); + var searchLength = searchString.length; + var position = arguments.length > 1 ? arguments[1] : undefined; + // `ToInteger` + var pos = position ? Number(position) : 0; + if (pos != pos) { // better `isNaN` + pos = 0; + } + var start = Math.min(Math.max(pos, 0), stringLength); + // Avoid the `indexOf` call if no match is possible + if (searchLength + start > stringLength) { + return false; + } + return indexOf.call(string, searchString, pos) != -1; + }; + if (defineProperty) { + defineProperty(String.prototype, 'includes', { + 'value': includes, + 'configurable': true, + 'writable': true + }); + } else { + String.prototype.includes = includes; + } + }()); + } + + if (!String.prototype.startsWith) { + (function () { + 'use strict'; // needed to support `apply`/`call` with `undefined`/`null` + var defineProperty = (function () { + // IE 8 only supports `Object.defineProperty` on DOM elements + try { + var object = {}; + var $defineProperty = Object.defineProperty; + var result = $defineProperty(object, object, object) && $defineProperty; + } catch (error) { + } + return result; + }()); + var toString = {}.toString; + var startsWith = function (search) { + if (this == null) { + throw new TypeError(); + } + var string = String(this); + if (search && toString.call(search) == '[object RegExp]') { + throw new TypeError(); + } + var stringLength = string.length; + var searchString = String(search); + var searchLength = searchString.length; + var position = arguments.length > 1 ? arguments[1] : undefined; + // `ToInteger` + var pos = position ? Number(position) : 0; + if (pos != pos) { // better `isNaN` + pos = 0; + } + var start = Math.min(Math.max(pos, 0), stringLength); + // Avoid the `indexOf` call if no match is possible + if (searchLength + start > stringLength) { + return false; + } + var index = -1; + while (++index < searchLength) { + if (string.charCodeAt(start + index) != searchString.charCodeAt(index)) { + return false; + } + } + return true; + }; + if (defineProperty) { + defineProperty(String.prototype, 'startsWith', { + 'value': startsWith, + 'configurable': true, + 'writable': true + }); + } else { + String.prototype.startsWith = startsWith; + } + }()); + } + + if (!Object.keys) { + Object.keys = function ( + o, // object + k, // key + r // result array + ){ + // initialize object and result + r=[]; + // iterate over object keys + for (k in o) + // fill result array with non-prototypical keys + r.hasOwnProperty.call(o, k) && r.push(k); + // return result + return r; + }; + } + + // set data-selected on select element if the value has been programmatically selected + // prior to initialization of bootstrap-select + // * consider removing or replacing an alternative method * + var valHooks = { + useDefault: false, + _set: $.valHooks.select.set + }; + + $.valHooks.select.set = function(elem, value) { + if (value && !valHooks.useDefault) $(elem).data('selected', true); + + return valHooks._set.apply(this, arguments); + }; + + var changed_arguments = null; + + var EventIsSupported = (function() { + try { + new Event('change'); + return true; + } catch (e) { + return false; + } + })(); + + $.fn.triggerNative = function (eventName) { + var el = this[0], + event; + + if (el.dispatchEvent) { // for modern browsers & IE9+ + if (EventIsSupported) { + // For modern browsers + event = new Event(eventName, { + bubbles: true + }); + } else { + // For IE since it doesn't support Event constructor + event = document.createEvent('Event'); + event.initEvent(eventName, true, false); + } + + el.dispatchEvent(event); + } else if (el.fireEvent) { // for IE8 + event = document.createEventObject(); + event.eventType = eventName; + el.fireEvent('on' + eventName, event); + } else { + // fall back to jQuery.trigger + this.trigger(eventName); + } + }; + // + + // Case insensitive contains search + $.expr.pseudos.icontains = function (obj, index, meta) { + var $obj = $(obj).find('a'); + var haystack = ($obj.data('tokens') || $obj.text()).toString().toUpperCase(); + return haystack.includes(meta[3].toUpperCase()); + }; + + // Case insensitive begins search + $.expr.pseudos.ibegins = function (obj, index, meta) { + var $obj = $(obj).find('a'); + var haystack = ($obj.data('tokens') || $obj.text()).toString().toUpperCase(); + return haystack.startsWith(meta[3].toUpperCase()); + }; + + // Case and accent insensitive contains search + $.expr.pseudos.aicontains = function (obj, index, meta) { + var $obj = $(obj).find('a'); + var haystack = ($obj.data('tokens') || $obj.data('normalizedText') || $obj.text()).toString().toUpperCase(); + return haystack.includes(meta[3].toUpperCase()); + }; + + // Case and accent insensitive begins search + $.expr.pseudos.aibegins = function (obj, index, meta) { + var $obj = $(obj).find('a'); + var haystack = ($obj.data('tokens') || $obj.data('normalizedText') || $obj.text()).toString().toUpperCase(); + return haystack.startsWith(meta[3].toUpperCase()); + }; + + /** + * Remove all diatrics from the given text. + * @access private + * @param {String} text + * @returns {String} + */ + function normalizeToBase(text) { + var rExps = [ + {re: /[\xC0-\xC6]/g, ch: "A"}, + {re: /[\xE0-\xE6]/g, ch: "a"}, + {re: /[\xC8-\xCB]/g, ch: "E"}, + {re: /[\xE8-\xEB]/g, ch: "e"}, + {re: /[\xCC-\xCF]/g, ch: "I"}, + {re: /[\xEC-\xEF]/g, ch: "i"}, + {re: /[\xD2-\xD6]/g, ch: "O"}, + {re: /[\xF2-\xF6]/g, ch: "o"}, + {re: /[\xD9-\xDC]/g, ch: "U"}, + {re: /[\xF9-\xFC]/g, ch: "u"}, + {re: /[\xC7-\xE7]/g, ch: "c"}, + {re: /[\xD1]/g, ch: "N"}, + {re: /[\xF1]/g, ch: "n"} + ]; + $.each(rExps, function () { + text = text ? text.replace(this.re, this.ch) : ''; + }); + return text; + } + + + // List of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + + var unescapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'", + '`': '`' + }; + + // Functions for escaping and unescaping strings to/from HTML interpolation. + var createEscaper = function(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + Object.keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + }; + + var htmlEscape = createEscaper(escapeMap); + var htmlUnescape = createEscaper(unescapeMap); + + var Selectpicker = function (element, options) { + // bootstrap-select has been initialized - revert valHooks.select.set back to its original function + if (!valHooks.useDefault) { + $.valHooks.select.set = valHooks._set; + valHooks.useDefault = true; + } + + this.$element = $(element); + this.$newElement = null; + this.$button = null; + this.$menu = null; + this.$lis = null; + this.options = options; + + // If we have no title yet, try to pull it from the html title attribute (jQuery doesnt' pick it up as it's not a + // data-attribute) + if (this.options.title === null) { + this.options.title = this.$element.attr('title'); + } + + // Format window padding + var winPad = this.options.windowPadding; + if (typeof winPad === 'number') { + this.options.windowPadding = [winPad, winPad, winPad, winPad]; + } + + //Expose public methods + this.val = Selectpicker.prototype.val; + this.render = Selectpicker.prototype.render; + this.refresh = Selectpicker.prototype.refresh; + this.setStyle = Selectpicker.prototype.setStyle; + this.selectAll = Selectpicker.prototype.selectAll; + this.deselectAll = Selectpicker.prototype.deselectAll; + this.destroy = Selectpicker.prototype.destroy; + this.remove = Selectpicker.prototype.remove; + this.show = Selectpicker.prototype.show; + this.hide = Selectpicker.prototype.hide; + + this.init(); + }; + + Selectpicker.VERSION = '1.12.4'; + + // part of this is duplicated in i18n/defaults-en_US.js. Make sure to update both. + Selectpicker.DEFAULTS = { + noneSelectedText: 'Nothing selected', + noneResultsText: 'No results matched {0}', + countSelectedText: function (numSelected, numTotal) { + return (numSelected == 1) ? "{0} item selected" : "{0} items selected"; + }, + maxOptionsText: function (numAll, numGroup) { + return [ + (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)', + (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)' + ]; + }, + selectAllText: 'Select All', + deselectAllText: 'Deselect All', + doneButton: false, + doneButtonText: 'Close', + multipleSeparator: ', ', + styleBase: 'btn', + style: 'btn-default', + size: 'auto', + title: null, + selectedTextFormat: 'values', + width: false, + container: false, + hideDisabled: false, + showSubtext: false, + showIcon: true, + showContent: true, + dropupAuto: true, + header: false, + liveSearch: false, + liveSearchPlaceholder: null, + liveSearchNormalize: false, + liveSearchStyle: 'contains', + actionsBox: false, + iconBase: 'glyphicon', + tickIcon: 'glyphicon-ok', + showTick: false, + template: { + caret: '' + }, + maxOptions: false, + mobile: false, + selectOnTab: false, + dropdownAlignRight: false, + windowPadding: 0 + }; + + Selectpicker.prototype = { + + constructor: Selectpicker, + + init: function () { + var that = this, + id = this.$element.attr('id'); + + this.$element.addClass('bs-select-hidden'); + + // store originalIndex (key) and newIndex (value) in this.liObj for fast accessibility + // allows us to do this.$lis.eq(that.liObj[index]) instead of this.$lis.filter('[data-original-index="' + index + '"]') + this.liObj = {}; + this.multiple = this.$element.prop('multiple'); + this.autofocus = this.$element.prop('autofocus'); + this.$newElement = this.createView(); + this.$element + .after(this.$newElement) + .appendTo(this.$newElement); + this.$button = this.$newElement.children('button'); + this.$menu = this.$newElement.children('.dropdown-menu'); + this.$menuInner = this.$menu.children('.inner'); + this.$searchbox = this.$menu.find('input'); + + this.$element.removeClass('bs-select-hidden'); + + if (this.options.dropdownAlignRight === true) this.$menu.addClass('dropdown-menu-right'); + + if (typeof id !== 'undefined') { + this.$button.attr('data-id', id); + $('label[for="' + id + '"]').click(function (e) { + e.preventDefault(); + that.$button.focus(); + }); + } + + this.checkDisabled(); + this.clickListener(); + if (this.options.liveSearch) this.liveSearchListener(); + this.render(); + this.setStyle(); + this.setWidth(); + if (this.options.container) this.selectPosition(); + this.$menu.data('this', this); + this.$newElement.data('this', this); + if (this.options.mobile) this.mobile(); + + this.$newElement.on({ + 'hide.bs.dropdown': function (e) { + that.$menuInner.attr('aria-expanded', false); + that.$element.trigger('hide.bs.select', e); + }, + 'hidden.bs.dropdown': function (e) { + that.$element.trigger('hidden.bs.select', e); + }, + 'show.bs.dropdown': function (e) { + that.$menuInner.attr('aria-expanded', true); + that.$element.trigger('show.bs.select', e); + }, + 'shown.bs.dropdown': function (e) { + that.$element.trigger('shown.bs.select', e); + } + }); + + if (that.$element[0].hasAttribute('required')) { + this.$element.on('invalid', function () { + that.$button.addClass('bs-invalid'); + + that.$element.on({ + 'focus.bs.select': function () { + that.$button.focus(); + that.$element.off('focus.bs.select'); + }, + 'shown.bs.select': function () { + that.$element + .val(that.$element.val()) // set the value to hide the validation message in Chrome when menu is opened + .off('shown.bs.select'); + }, + 'rendered.bs.select': function () { + // if select is no longer invalid, remove the bs-invalid class + if (this.validity.valid) that.$button.removeClass('bs-invalid'); + that.$element.off('rendered.bs.select'); + } + }); + + that.$button.on('blur.bs.select', function() { + that.$element.focus().blur(); + that.$button.off('blur.bs.select'); + }); + }); + } + + setTimeout(function () { + that.$element.trigger('loaded.bs.select'); + }); + }, + + createDropdown: function () { + // Options + // If we are multiple or showTick option is set, then add the show-tick class + var showTick = (this.multiple || this.options.showTick) ? ' show-tick' : '', + inputGroup = this.$element.parent().hasClass('input-group') ? ' input-group-btn' : '', + autofocus = this.autofocus ? ' autofocus' : ''; + // Elements + var header = this.options.header ? '
' + this.options.header + '
' : ''; + var searchbox = this.options.liveSearch ? + '' + : ''; + var actionsbox = this.multiple && this.options.actionsBox ? + '
' + + '
' + + '' + + '' + + '
' + + '
' + : ''; + var donebutton = this.multiple && this.options.doneButton ? + '
' + + '
' + + '' + + '
' + + '
' + : ''; + var drop = + '
' + + '' + + '' + + '
'; + + return $(drop); + }, + + createView: function () { + var $drop = this.createDropdown(), + li = this.createLi(); + + $drop.find('ul')[0].innerHTML = li; + return $drop; + }, + + reloadLi: function () { + // rebuild + var li = this.createLi(); + this.$menuInner[0].innerHTML = li; + }, + + createLi: function () { + var that = this, + _li = [], + optID = 0, + titleOption = document.createElement('option'), + liIndex = -1; // increment liIndex whenever a new
  • element is created to ensure liObj is correct + + // Helper functions + /** + * @param content + * @param [index] + * @param [classes] + * @param [optgroup] + * @returns {string} + */ + var generateLI = function (content, index, classes, optgroup) { + return '' + content + '
  • '; + }; + + /** + * @param text + * @param [classes] + * @param [inline] + * @param [tokens] + * @returns {string} + */ + var generateA = function (text, classes, inline, tokens) { + return '' + text + + '' + + ''; + }; + + if (this.options.title && !this.multiple) { + // this option doesn't create a new
  • element, but does add a new option, so liIndex is decreased + // since liObj is recalculated on every refresh, liIndex needs to be decreased even if the titleOption is already appended + liIndex--; + + if (!this.$element.find('.bs-title-option').length) { + // Use native JS to prepend option (faster) + var element = this.$element[0]; + titleOption.className = 'bs-title-option'; + titleOption.innerHTML = this.options.title; + titleOption.value = ''; + element.insertBefore(titleOption, element.firstChild); + // Check if selected or data-selected attribute is already set on an option. If not, select the titleOption option. + // the selected item may have been changed by user or programmatically before the bootstrap select plugin runs, + // if so, the select will have the data-selected attribute + var $opt = $(element.options[element.selectedIndex]); + if ($opt.attr('selected') === undefined && this.$element.data('selected') === undefined) { + titleOption.selected = true; + } + } + } + + var $selectOptions = this.$element.find('option'); + + $selectOptions.each(function (index) { + var $this = $(this); + + liIndex++; + + if ($this.hasClass('bs-title-option')) return; + + // Get the class and text for the option + var optionClass = this.className || '', + inline = htmlEscape(this.style.cssText), + text = $this.data('content') ? $this.data('content') : $this.html(), + tokens = $this.data('tokens') ? $this.data('tokens') : null, + subtext = typeof $this.data('subtext') !== 'undefined' ? '' + $this.data('subtext') + '' : '', + icon = typeof $this.data('icon') !== 'undefined' ? ' ' : '', + $parent = $this.parent(), + isOptgroup = $parent[0].tagName === 'OPTGROUP', + isOptgroupDisabled = isOptgroup && $parent[0].disabled, + isDisabled = this.disabled || isOptgroupDisabled, + prevHiddenIndex; + + if (icon !== '' && isDisabled) { + icon = '' + icon + ''; + } + + if (that.options.hideDisabled && (isDisabled && !isOptgroup || isOptgroupDisabled)) { + // set prevHiddenIndex - the index of the first hidden option in a group of hidden options + // used to determine whether or not a divider should be placed after an optgroup if there are + // hidden options between the optgroup and the first visible option + prevHiddenIndex = $this.data('prevHiddenIndex'); + $this.next().data('prevHiddenIndex', (prevHiddenIndex !== undefined ? prevHiddenIndex : index)); + + liIndex--; + return; + } + + if (!$this.data('content')) { + // Prepend any icon and append any subtext to the main text. + text = icon + '' + text + subtext + ''; + } + + if (isOptgroup && $this.data('divider') !== true) { + if (that.options.hideDisabled && isDisabled) { + if ($parent.data('allOptionsDisabled') === undefined) { + var $options = $parent.children(); + $parent.data('allOptionsDisabled', $options.filter(':disabled').length === $options.length); + } + + if ($parent.data('allOptionsDisabled')) { + liIndex--; + return; + } + } + + var optGroupClass = ' ' + $parent[0].className || ''; + + if ($this.index() === 0) { // Is it the first option of the optgroup? + optID += 1; + + // Get the opt group label + var label = $parent[0].label, + labelSubtext = typeof $parent.data('subtext') !== 'undefined' ? '' + $parent.data('subtext') + '' : '', + labelIcon = $parent.data('icon') ? ' ' : ''; + + label = labelIcon + '' + htmlEscape(label) + labelSubtext + ''; + + if (index !== 0 && _li.length > 0) { // Is it NOT the first option of the select && are there elements in the dropdown? + liIndex++; + _li.push(generateLI('', null, 'divider', optID + 'div')); + } + liIndex++; + _li.push(generateLI(label, null, 'dropdown-header' + optGroupClass, optID)); + } + + if (that.options.hideDisabled && isDisabled) { + liIndex--; + return; + } + + _li.push(generateLI(generateA(text, 'opt ' + optionClass + optGroupClass, inline, tokens), index, '', optID)); + } else if ($this.data('divider') === true) { + _li.push(generateLI('', index, 'divider')); + } else if ($this.data('hidden') === true) { + // set prevHiddenIndex - the index of the first hidden option in a group of hidden options + // used to determine whether or not a divider should be placed after an optgroup if there are + // hidden options between the optgroup and the first visible option + prevHiddenIndex = $this.data('prevHiddenIndex'); + $this.next().data('prevHiddenIndex', (prevHiddenIndex !== undefined ? prevHiddenIndex : index)); + + _li.push(generateLI(generateA(text, optionClass, inline, tokens), index, 'hidden is-hidden')); + } else { + var showDivider = this.previousElementSibling && this.previousElementSibling.tagName === 'OPTGROUP'; + + // if previous element is not an optgroup and hideDisabled is true + if (!showDivider && that.options.hideDisabled) { + prevHiddenIndex = $this.data('prevHiddenIndex'); + + if (prevHiddenIndex !== undefined) { + // select the element **before** the first hidden element in the group + var prevHidden = $selectOptions.eq(prevHiddenIndex)[0].previousElementSibling; + + if (prevHidden && prevHidden.tagName === 'OPTGROUP' && !prevHidden.disabled) { + showDivider = true; + } + } + } + + if (showDivider) { + liIndex++; + _li.push(generateLI('', null, 'divider', optID + 'div')); + } + _li.push(generateLI(generateA(text, optionClass, inline, tokens), index)); + } + + that.liObj[index] = liIndex; + }); + + //If we are not multiple, we don't have a selected item, and we don't have a title, select the first element so something is set in the button + if (!this.multiple && this.$element.find('option:selected').length === 0 && !this.options.title) { + this.$element.find('option').eq(0).prop('selected', true).attr('selected', 'selected'); + } + + return _li.join(''); + }, + + findLis: function () { + if (this.$lis == null) this.$lis = this.$menu.find('li'); + return this.$lis; + }, + + /** + * @param [updateLi] defaults to true + */ + render: function (updateLi) { + var that = this, + notDisabled, + $selectOptions = this.$element.find('option'); + + //Update the LI to match the SELECT + if (updateLi !== false) { + $selectOptions.each(function (index) { + var $lis = that.findLis().eq(that.liObj[index]); + + that.setDisabled(index, this.disabled || this.parentNode.tagName === 'OPTGROUP' && this.parentNode.disabled, $lis); + that.setSelected(index, this.selected, $lis); + }); + } + + this.togglePlaceholder(); + + this.tabIndex(); + + var selectedItems = $selectOptions.map(function () { + if (this.selected) { + if (that.options.hideDisabled && (this.disabled || this.parentNode.tagName === 'OPTGROUP' && this.parentNode.disabled)) return; + + var $this = $(this), + icon = $this.data('icon') && that.options.showIcon ? ' ' : '', + subtext; + + if (that.options.showSubtext && $this.data('subtext') && !that.multiple) { + subtext = ' ' + $this.data('subtext') + ''; + } else { + subtext = ''; + } + if (typeof $this.attr('title') !== 'undefined') { + return $this.attr('title'); + } else if ($this.data('content') && that.options.showContent) { + return $this.data('content').toString(); + } else { + return icon + $this.html() + subtext; + } + } + }).toArray(); + + //Fixes issue in IE10 occurring when no default option is selected and at least one option is disabled + //Convert all the values into a comma delimited string + var title = !this.multiple ? selectedItems[0] : selectedItems.join(this.options.multipleSeparator); + + //If this is multi select, and the selectText type is count, the show 1 of 2 selected etc.. + if (this.multiple && this.options.selectedTextFormat.indexOf('count') > -1) { + var max = this.options.selectedTextFormat.split('>'); + if ((max.length > 1 && selectedItems.length > max[1]) || (max.length == 1 && selectedItems.length >= 2)) { + notDisabled = this.options.hideDisabled ? ', [disabled]' : ''; + var totalCount = $selectOptions.not('[data-divider="true"], [data-hidden="true"]' + notDisabled).length, + tr8nText = (typeof this.options.countSelectedText === 'function') ? this.options.countSelectedText(selectedItems.length, totalCount) : this.options.countSelectedText; + title = tr8nText.replace('{0}', selectedItems.length.toString()).replace('{1}', totalCount.toString()); + } + } + + if (this.options.title == undefined) { + this.options.title = this.$element.attr('title'); + } + + if (this.options.selectedTextFormat == 'static') { + title = this.options.title; + } + + //If we dont have a title, then use the default, or if nothing is set at all, use the not selected text + if (!title) { + title = typeof this.options.title !== 'undefined' ? this.options.title : this.options.noneSelectedText; + } + + //strip all HTML tags and trim the result, then unescape any escaped tags + this.$button.attr('title', htmlUnescape($.trim(title.replace(/<[^>]*>?/g, '')))); + this.$button.children('.filter-option').html(title); + + this.$element.trigger('rendered.bs.select'); + }, + + /** + * @param [style] + * @param [status] + */ + setStyle: function (style, status) { + if (this.$element.attr('class')) { + this.$newElement.addClass(this.$element.attr('class').replace(/selectpicker|mobile-device|bs-select-hidden|validate\[.*\]/gi, '')); + } + + var buttonClass = style ? style : this.options.style; + + if (status == 'add') { + this.$button.addClass(buttonClass); + } else if (status == 'remove') { + this.$button.removeClass(buttonClass); + } else { + this.$button.removeClass(this.options.style); + this.$button.addClass(buttonClass); + } + }, + + liHeight: function (refresh) { + if (!refresh && (this.options.size === false || this.sizeInfo)) return; + + var newElement = document.createElement('div'), + menu = document.createElement('div'), + menuInner = document.createElement('ul'), + divider = document.createElement('li'), + li = document.createElement('li'), + a = document.createElement('a'), + text = document.createElement('span'), + header = this.options.header && this.$menu.find('.popover-title').length > 0 ? this.$menu.find('.popover-title')[0].cloneNode(true) : null, + search = this.options.liveSearch ? document.createElement('div') : null, + actions = this.options.actionsBox && this.multiple && this.$menu.find('.bs-actionsbox').length > 0 ? this.$menu.find('.bs-actionsbox')[0].cloneNode(true) : null, + doneButton = this.options.doneButton && this.multiple && this.$menu.find('.bs-donebutton').length > 0 ? this.$menu.find('.bs-donebutton')[0].cloneNode(true) : null; + + text.className = 'text'; + newElement.className = this.$menu[0].parentNode.className + ' open'; + menu.className = 'dropdown-menu open'; + menuInner.className = 'dropdown-menu inner'; + divider.className = 'divider'; + + text.appendChild(document.createTextNode('Inner text')); + a.appendChild(text); + li.appendChild(a); + menuInner.appendChild(li); + menuInner.appendChild(divider); + if (header) menu.appendChild(header); + if (search) { + var input = document.createElement('input'); + search.className = 'bs-searchbox'; + input.className = 'form-control'; + search.appendChild(input); + menu.appendChild(search); + } + if (actions) menu.appendChild(actions); + menu.appendChild(menuInner); + if (doneButton) menu.appendChild(doneButton); + newElement.appendChild(menu); + + document.body.appendChild(newElement); + + var liHeight = a.offsetHeight, + headerHeight = header ? header.offsetHeight : 0, + searchHeight = search ? search.offsetHeight : 0, + actionsHeight = actions ? actions.offsetHeight : 0, + doneButtonHeight = doneButton ? doneButton.offsetHeight : 0, + dividerHeight = $(divider).outerHeight(true), + // fall back to jQuery if getComputedStyle is not supported + menuStyle = typeof getComputedStyle === 'function' ? getComputedStyle(menu) : false, + $menu = menuStyle ? null : $(menu), + menuPadding = { + vert: parseInt(menuStyle ? menuStyle.paddingTop : $menu.css('paddingTop')) + + parseInt(menuStyle ? menuStyle.paddingBottom : $menu.css('paddingBottom')) + + parseInt(menuStyle ? menuStyle.borderTopWidth : $menu.css('borderTopWidth')) + + parseInt(menuStyle ? menuStyle.borderBottomWidth : $menu.css('borderBottomWidth')), + horiz: parseInt(menuStyle ? menuStyle.paddingLeft : $menu.css('paddingLeft')) + + parseInt(menuStyle ? menuStyle.paddingRight : $menu.css('paddingRight')) + + parseInt(menuStyle ? menuStyle.borderLeftWidth : $menu.css('borderLeftWidth')) + + parseInt(menuStyle ? menuStyle.borderRightWidth : $menu.css('borderRightWidth')) + }, + menuExtras = { + vert: menuPadding.vert + + parseInt(menuStyle ? menuStyle.marginTop : $menu.css('marginTop')) + + parseInt(menuStyle ? menuStyle.marginBottom : $menu.css('marginBottom')) + 2, + horiz: menuPadding.horiz + + parseInt(menuStyle ? menuStyle.marginLeft : $menu.css('marginLeft')) + + parseInt(menuStyle ? menuStyle.marginRight : $menu.css('marginRight')) + 2 + } + + document.body.removeChild(newElement); + + this.sizeInfo = { + liHeight: liHeight, + headerHeight: headerHeight, + searchHeight: searchHeight, + actionsHeight: actionsHeight, + doneButtonHeight: doneButtonHeight, + dividerHeight: dividerHeight, + menuPadding: menuPadding, + menuExtras: menuExtras + }; + }, + + setSize: function () { + this.findLis(); + this.liHeight(); + + if (this.options.header) this.$menu.css('padding-top', 0); + if (this.options.size === false) return; + + var that = this, + $menu = this.$menu, + $menuInner = this.$menuInner, + $window = $(window), + selectHeight = this.$newElement[0].offsetHeight, + selectWidth = this.$newElement[0].offsetWidth, + liHeight = this.sizeInfo['liHeight'], + headerHeight = this.sizeInfo['headerHeight'], + searchHeight = this.sizeInfo['searchHeight'], + actionsHeight = this.sizeInfo['actionsHeight'], + doneButtonHeight = this.sizeInfo['doneButtonHeight'], + divHeight = this.sizeInfo['dividerHeight'], + menuPadding = this.sizeInfo['menuPadding'], + menuExtras = this.sizeInfo['menuExtras'], + notDisabled = this.options.hideDisabled ? '.disabled' : '', + menuHeight, + menuWidth, + getHeight, + getWidth, + selectOffsetTop, + selectOffsetBot, + selectOffsetLeft, + selectOffsetRight, + getPos = function() { + var pos = that.$newElement.offset(), + $container = $(that.options.container), + containerPos; + + if (that.options.container && !$container.is('body')) { + containerPos = $container.offset(); + containerPos.top += parseInt($container.css('borderTopWidth')); + containerPos.left += parseInt($container.css('borderLeftWidth')); + } else { + containerPos = { top: 0, left: 0 }; + } + + var winPad = that.options.windowPadding; + selectOffsetTop = pos.top - containerPos.top - $window.scrollTop(); + selectOffsetBot = $window.height() - selectOffsetTop - selectHeight - containerPos.top - winPad[2]; + selectOffsetLeft = pos.left - containerPos.left - $window.scrollLeft(); + selectOffsetRight = $window.width() - selectOffsetLeft - selectWidth - containerPos.left - winPad[1]; + selectOffsetTop -= winPad[0]; + selectOffsetLeft -= winPad[3]; + }; + + getPos(); + + if (this.options.size === 'auto') { + var getSize = function () { + var minHeight, + hasClass = function (className, include) { + return function (element) { + if (include) { + return (element.classList ? element.classList.contains(className) : $(element).hasClass(className)); + } else { + return !(element.classList ? element.classList.contains(className) : $(element).hasClass(className)); + } + }; + }, + lis = that.$menuInner[0].getElementsByTagName('li'), + lisVisible = Array.prototype.filter ? Array.prototype.filter.call(lis, hasClass('hidden', false)) : that.$lis.not('.hidden'), + optGroup = Array.prototype.filter ? Array.prototype.filter.call(lisVisible, hasClass('dropdown-header', true)) : lisVisible.filter('.dropdown-header'); + + getPos(); + menuHeight = selectOffsetBot - menuExtras.vert; + menuWidth = selectOffsetRight - menuExtras.horiz; + + if (that.options.container) { + if (!$menu.data('height')) $menu.data('height', $menu.height()); + getHeight = $menu.data('height'); + + if (!$menu.data('width')) $menu.data('width', $menu.width()); + getWidth = $menu.data('width'); + } else { + getHeight = $menu.height(); + getWidth = $menu.width(); + } + + if (that.options.dropupAuto) { + that.$newElement.toggleClass('dropup', selectOffsetTop > selectOffsetBot && (menuHeight - menuExtras.vert) < getHeight); + } + + if (that.$newElement.hasClass('dropup')) { + menuHeight = selectOffsetTop - menuExtras.vert; + } + + if (that.options.dropdownAlignRight === 'auto') { + $menu.toggleClass('dropdown-menu-right', selectOffsetLeft > selectOffsetRight && (menuWidth - menuExtras.horiz) < (getWidth - selectWidth)); + } + + if ((lisVisible.length + optGroup.length) > 3) { + minHeight = liHeight * 3 + menuExtras.vert - 2; + } else { + minHeight = 0; + } + + $menu.css({ + 'max-height': menuHeight + 'px', + 'overflow': 'hidden', + 'min-height': minHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight + 'px' + }); + $menuInner.css({ + 'max-height': menuHeight - headerHeight - searchHeight - actionsHeight - doneButtonHeight - menuPadding.vert + 'px', + 'overflow-y': 'auto', + 'min-height': Math.max(minHeight - menuPadding.vert, 0) + 'px' + }); + }; + getSize(); + this.$searchbox.off('input.getSize propertychange.getSize').on('input.getSize propertychange.getSize', getSize); + $window.off('resize.getSize scroll.getSize').on('resize.getSize scroll.getSize', getSize); + } else if (this.options.size && this.options.size != 'auto' && this.$lis.not(notDisabled).length > this.options.size) { + var optIndex = this.$lis.not('.divider').not(notDisabled).children().slice(0, this.options.size).last().parent().index(), + divLength = this.$lis.slice(0, optIndex + 1).filter('.divider').length; + menuHeight = liHeight * this.options.size + divLength * divHeight + menuPadding.vert; + + if (that.options.container) { + if (!$menu.data('height')) $menu.data('height', $menu.height()); + getHeight = $menu.data('height'); + } else { + getHeight = $menu.height(); + } + + if (that.options.dropupAuto) { + //noinspection JSUnusedAssignment + this.$newElement.toggleClass('dropup', selectOffsetTop > selectOffsetBot && (menuHeight - menuExtras.vert) < getHeight); + } + $menu.css({ + 'max-height': menuHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight + 'px', + 'overflow': 'hidden', + 'min-height': '' + }); + $menuInner.css({ + 'max-height': menuHeight - menuPadding.vert + 'px', + 'overflow-y': 'auto', + 'min-height': '' + }); + } + }, + + setWidth: function () { + if (this.options.width === 'auto') { + this.$menu.css('min-width', '0'); + + // Get correct width if element is hidden + var $selectClone = this.$menu.parent().clone().appendTo('body'), + $selectClone2 = this.options.container ? this.$newElement.clone().appendTo('body') : $selectClone, + ulWidth = $selectClone.children('.dropdown-menu').outerWidth(), + btnWidth = $selectClone2.css('width', 'auto').children('button').outerWidth(); + + $selectClone.remove(); + $selectClone2.remove(); + + // Set width to whatever's larger, button title or longest option + this.$newElement.css('width', Math.max(ulWidth, btnWidth) + 'px'); + } else if (this.options.width === 'fit') { + // Remove inline min-width so width can be changed from 'auto' + this.$menu.css('min-width', ''); + this.$newElement.css('width', '').addClass('fit-width'); + } else if (this.options.width) { + // Remove inline min-width so width can be changed from 'auto' + this.$menu.css('min-width', ''); + this.$newElement.css('width', this.options.width); + } else { + // Remove inline min-width/width so width can be changed + this.$menu.css('min-width', ''); + this.$newElement.css('width', ''); + } + // Remove fit-width class if width is changed programmatically + if (this.$newElement.hasClass('fit-width') && this.options.width !== 'fit') { + this.$newElement.removeClass('fit-width'); + } + }, + + selectPosition: function () { + this.$bsContainer = $('
    '); + + var that = this, + $container = $(this.options.container), + pos, + containerPos, + actualHeight, + getPlacement = function ($element) { + that.$bsContainer.addClass($element.attr('class').replace(/form-control|fit-width/gi, '')).toggleClass('dropup', $element.hasClass('dropup')); + pos = $element.offset(); + + if (!$container.is('body')) { + containerPos = $container.offset(); + containerPos.top += parseInt($container.css('borderTopWidth')) - $container.scrollTop(); + containerPos.left += parseInt($container.css('borderLeftWidth')) - $container.scrollLeft(); + } else { + containerPos = { top: 0, left: 0 }; + } + + actualHeight = $element.hasClass('dropup') ? 0 : $element[0].offsetHeight; + + that.$bsContainer.css({ + 'top': pos.top - containerPos.top + actualHeight, + 'left': pos.left - containerPos.left, + 'width': $element[0].offsetWidth + }); + }; + + this.$button.on('click', function () { + var $this = $(this); + + if (that.isDisabled()) { + return; + } + + getPlacement(that.$newElement); + + that.$bsContainer + .appendTo(that.options.container) + .toggleClass('open', !$this.hasClass('open')) + .append(that.$menu); + }); + + $(window).on('resize scroll', function () { + getPlacement(that.$newElement); + }); + + this.$element.on('hide.bs.select', function () { + that.$menu.data('height', that.$menu.height()); + that.$bsContainer.detach(); + }); + }, + + /** + * @param {number} index - the index of the option that is being changed + * @param {boolean} selected - true if the option is being selected, false if being deselected + * @param {JQuery} $lis - the 'li' element that is being modified + */ + setSelected: function (index, selected, $lis) { + if (!$lis) { + this.togglePlaceholder(); // check if setSelected is being called by changing the value of the select + $lis = this.findLis().eq(this.liObj[index]); + } + + $lis.toggleClass('selected', selected).find('a').attr('aria-selected', selected); + }, + + /** + * @param {number} index - the index of the option that is being disabled + * @param {boolean} disabled - true if the option is being disabled, false if being enabled + * @param {JQuery} $lis - the 'li' element that is being modified + */ + setDisabled: function (index, disabled, $lis) { + if (!$lis) { + $lis = this.findLis().eq(this.liObj[index]); + } + + if (disabled) { + $lis.addClass('disabled').children('a').attr('href', '#').attr('tabindex', -1).attr('aria-disabled', true); + } else { + $lis.removeClass('disabled').children('a').removeAttr('href').attr('tabindex', 0).attr('aria-disabled', false); + } + }, + + isDisabled: function () { + return this.$element[0].disabled; + }, + + checkDisabled: function () { + var that = this; + + if (this.isDisabled()) { + this.$newElement.addClass('disabled'); + this.$button.addClass('disabled').attr('tabindex', -1).attr('aria-disabled', true); + } else { + if (this.$button.hasClass('disabled')) { + this.$newElement.removeClass('disabled'); + this.$button.removeClass('disabled').attr('aria-disabled', false); + } + + if (this.$button.attr('tabindex') == -1 && !this.$element.data('tabindex')) { + this.$button.removeAttr('tabindex'); + } + } + + this.$button.click(function () { + return !that.isDisabled(); + }); + }, + + togglePlaceholder: function () { + var value = this.$element.val(); + this.$button.toggleClass('bs-placeholder', value === null || value === '' || (value.constructor === Array && value.length === 0)); + }, + + tabIndex: function () { + if (this.$element.data('tabindex') !== this.$element.attr('tabindex') && + (this.$element.attr('tabindex') !== -98 && this.$element.attr('tabindex') !== '-98')) { + this.$element.data('tabindex', this.$element.attr('tabindex')); + this.$button.attr('tabindex', this.$element.data('tabindex')); + } + + this.$element.attr('tabindex', -98); + }, + + clickListener: function () { + var that = this, + $document = $(document); + + $document.data('spaceSelect', false); + + this.$button.on('keyup', function (e) { + if (/(32)/.test(e.keyCode.toString(10)) && $document.data('spaceSelect')) { + e.preventDefault(); + $document.data('spaceSelect', false); + } + }); + + this.$button.on('click', function () { + that.setSize(); + }); + + this.$element.on('shown.bs.select', function () { + if (!that.options.liveSearch && !that.multiple) { + that.$menuInner.find('.selected a').focus(); + } else if (!that.multiple) { + var selectedIndex = that.liObj[that.$element[0].selectedIndex]; + + if (typeof selectedIndex !== 'number' || that.options.size === false) return; + + // scroll to selected option + var offset = that.$lis.eq(selectedIndex)[0].offsetTop - that.$menuInner[0].offsetTop; + offset = offset - that.$menuInner[0].offsetHeight/2 + that.sizeInfo.liHeight/2; + that.$menuInner[0].scrollTop = offset; + } + }); + + this.$menuInner.on('click', 'li a', function (e) { + var $this = $(this), + clickedIndex = $this.parent().data('originalIndex'), + prevValue = that.$element.val(), + prevIndex = that.$element.prop('selectedIndex'), + triggerChange = true; + + // Don't close on multi choice menu + if (that.multiple && that.options.maxOptions !== 1) { + e.stopPropagation(); + } + + e.preventDefault(); + + //Don't run if we have been disabled + if (!that.isDisabled() && !$this.parent().hasClass('disabled')) { + var $options = that.$element.find('option'), + $option = $options.eq(clickedIndex), + state = $option.prop('selected'), + $optgroup = $option.parent('optgroup'), + maxOptions = that.options.maxOptions, + maxOptionsGrp = $optgroup.data('maxOptions') || false; + + if (!that.multiple) { // Deselect all others if not multi select box + $options.prop('selected', false); + $option.prop('selected', true); + that.$menuInner.find('.selected').removeClass('selected').find('a').attr('aria-selected', false); + that.setSelected(clickedIndex, true); + } else { // Toggle the one we have chosen if we are multi select. + $option.prop('selected', !state); + that.setSelected(clickedIndex, !state); + $this.blur(); + + if (maxOptions !== false || maxOptionsGrp !== false) { + var maxReached = maxOptions < $options.filter(':selected').length, + maxReachedGrp = maxOptionsGrp < $optgroup.find('option:selected').length; + + if ((maxOptions && maxReached) || (maxOptionsGrp && maxReachedGrp)) { + if (maxOptions && maxOptions == 1) { + $options.prop('selected', false); + $option.prop('selected', true); + that.$menuInner.find('.selected').removeClass('selected'); + that.setSelected(clickedIndex, true); + } else if (maxOptionsGrp && maxOptionsGrp == 1) { + $optgroup.find('option:selected').prop('selected', false); + $option.prop('selected', true); + var optgroupID = $this.parent().data('optgroup'); + that.$menuInner.find('[data-optgroup="' + optgroupID + '"]').removeClass('selected'); + that.setSelected(clickedIndex, true); + } else { + var maxOptionsText = typeof that.options.maxOptionsText === 'string' ? [that.options.maxOptionsText, that.options.maxOptionsText] : that.options.maxOptionsText, + maxOptionsArr = typeof maxOptionsText === 'function' ? maxOptionsText(maxOptions, maxOptionsGrp) : maxOptionsText, + maxTxt = maxOptionsArr[0].replace('{n}', maxOptions), + maxTxtGrp = maxOptionsArr[1].replace('{n}', maxOptionsGrp), + $notify = $('
    '); + // If {var} is set in array, replace it + /** @deprecated */ + if (maxOptionsArr[2]) { + maxTxt = maxTxt.replace('{var}', maxOptionsArr[2][maxOptions > 1 ? 0 : 1]); + maxTxtGrp = maxTxtGrp.replace('{var}', maxOptionsArr[2][maxOptionsGrp > 1 ? 0 : 1]); + } + + $option.prop('selected', false); + + that.$menu.append($notify); + + if (maxOptions && maxReached) { + $notify.append($('
    ' + maxTxt + '
    ')); + triggerChange = false; + that.$element.trigger('maxReached.bs.select'); + } + + if (maxOptionsGrp && maxReachedGrp) { + $notify.append($('
    ' + maxTxtGrp + '
    ')); + triggerChange = false; + that.$element.trigger('maxReachedGrp.bs.select'); + } + + setTimeout(function () { + that.setSelected(clickedIndex, false); + }, 10); + + $notify.delay(750).fadeOut(300, function () { + $(this).remove(); + }); + } + } + } + } + + if (!that.multiple || (that.multiple && that.options.maxOptions === 1)) { + that.$button.focus(); + } else if (that.options.liveSearch) { + that.$searchbox.focus(); + } + + // Trigger select 'change' + if (triggerChange) { + if ((prevValue != that.$element.val() && that.multiple) || (prevIndex != that.$element.prop('selectedIndex') && !that.multiple)) { + // $option.prop('selected') is current option state (selected/unselected). state is previous option state. + changed_arguments = [clickedIndex, $option.prop('selected'), state]; + that.$element + .triggerNative('change'); + } + } + } + }); + + this.$menu.on('click', 'li.disabled a, .popover-title, .popover-title :not(.close)', function (e) { + if (e.currentTarget == this) { + e.preventDefault(); + e.stopPropagation(); + if (that.options.liveSearch && !$(e.target).hasClass('close')) { + that.$searchbox.focus(); + } else { + that.$button.focus(); + } + } + }); + + this.$menuInner.on('click', '.divider, .dropdown-header', function (e) { + e.preventDefault(); + e.stopPropagation(); + if (that.options.liveSearch) { + that.$searchbox.focus(); + } else { + that.$button.focus(); + } + }); + + this.$menu.on('click', '.popover-title .close', function () { + that.$button.click(); + }); + + this.$searchbox.on('click', function (e) { + e.stopPropagation(); + }); + + this.$menu.on('click', '.actions-btn', function (e) { + if (that.options.liveSearch) { + that.$searchbox.focus(); + } else { + that.$button.focus(); + } + + e.preventDefault(); + e.stopPropagation(); + + if ($(this).hasClass('bs-select-all')) { + that.selectAll(); + } else { + that.deselectAll(); + } + }); + + this.$element.change(function () { + that.render(false); + that.$element.trigger('changed.bs.select', changed_arguments); + changed_arguments = null; + }); + }, + + liveSearchListener: function () { + var that = this, + $no_results = $('
  • '); + + this.$button.on('click.dropdown.data-api', function () { + that.$menuInner.find('.active').removeClass('active'); + if (!!that.$searchbox.val()) { + that.$searchbox.val(''); + that.$lis.not('.is-hidden').removeClass('hidden'); + if (!!$no_results.parent().length) $no_results.remove(); + } + if (!that.multiple) that.$menuInner.find('.selected').addClass('active'); + setTimeout(function () { + that.$searchbox.focus(); + }, 10); + }); + + this.$searchbox.on('click.dropdown.data-api focus.dropdown.data-api touchend.dropdown.data-api', function (e) { + e.stopPropagation(); + }); + + this.$searchbox.on('input propertychange', function () { + that.$lis.not('.is-hidden').removeClass('hidden'); + that.$lis.filter('.active').removeClass('active'); + $no_results.remove(); + + if (that.$searchbox.val()) { + var $searchBase = that.$lis.not('.is-hidden, .divider, .dropdown-header'), + $hideItems; + if (that.options.liveSearchNormalize) { + $hideItems = $searchBase.not(':a' + that._searchStyle() + '("' + normalizeToBase(that.$searchbox.val()) + '")'); + } else { + $hideItems = $searchBase.not(':' + that._searchStyle() + '("' + that.$searchbox.val() + '")'); + } + + if ($hideItems.length === $searchBase.length) { + $no_results.html(that.options.noneResultsText.replace('{0}', '"' + htmlEscape(that.$searchbox.val()) + '"')); + that.$menuInner.append($no_results); + that.$lis.addClass('hidden'); + } else { + $hideItems.addClass('hidden'); + + var $lisVisible = that.$lis.not('.hidden'), + $foundDiv; + + // hide divider if first or last visible, or if followed by another divider + $lisVisible.each(function (index) { + var $this = $(this); + + if ($this.hasClass('divider')) { + if ($foundDiv === undefined) { + $this.addClass('hidden'); + } else { + if ($foundDiv) $foundDiv.addClass('hidden'); + $foundDiv = $this; + } + } else if ($this.hasClass('dropdown-header') && $lisVisible.eq(index + 1).data('optgroup') !== $this.data('optgroup')) { + $this.addClass('hidden'); + } else { + $foundDiv = null; + } + }); + if ($foundDiv) $foundDiv.addClass('hidden'); + + $searchBase.not('.hidden').first().addClass('active'); + that.$menuInner.scrollTop(0); + } + } + }); + }, + + _searchStyle: function () { + var styles = { + begins: 'ibegins', + startsWith: 'ibegins' + }; + + return styles[this.options.liveSearchStyle] || 'icontains'; + }, + + val: function (value) { + if (typeof value !== 'undefined') { + this.$element.val(value); + this.render(); + + return this.$element; + } else { + return this.$element.val(); + } + }, + + changeAll: function (status) { + if (!this.multiple) return; + if (typeof status === 'undefined') status = true; + + this.findLis(); + + var $options = this.$element.find('option'), + $lisVisible = this.$lis.not('.divider, .dropdown-header, .disabled, .hidden'), + lisVisLen = $lisVisible.length, + selectedOptions = []; + + if (status) { + if ($lisVisible.filter('.selected').length === $lisVisible.length) return; + } else { + if ($lisVisible.filter('.selected').length === 0) return; + } + + $lisVisible.toggleClass('selected', status); + + for (var i = 0; i < lisVisLen; i++) { + var origIndex = $lisVisible[i].getAttribute('data-original-index'); + selectedOptions[selectedOptions.length] = $options.eq(origIndex)[0]; + } + + $(selectedOptions).prop('selected', status); + + this.render(false); + + this.togglePlaceholder(); + + this.$element + .triggerNative('change'); + }, + + selectAll: function () { + return this.changeAll(true); + }, + + deselectAll: function () { + return this.changeAll(false); + }, + + toggle: function (e) { + e = e || window.event; + + if (e) e.stopPropagation(); + + this.$button.trigger('click'); + }, + + keydown: function (e) { + var $this = $(this), + $parent = $this.is('input') ? $this.parent().parent() : $this.parent(), + $items, + that = $parent.data('this'), + index, + prevIndex, + isActive, + selector = ':not(.disabled, .hidden, .dropdown-header, .divider)', + keyCodeMap = { + 32: ' ', + 48: '0', + 49: '1', + 50: '2', + 51: '3', + 52: '4', + 53: '5', + 54: '6', + 55: '7', + 56: '8', + 57: '9', + 59: ';', + 65: 'a', + 66: 'b', + 67: 'c', + 68: 'd', + 69: 'e', + 70: 'f', + 71: 'g', + 72: 'h', + 73: 'i', + 74: 'j', + 75: 'k', + 76: 'l', + 77: 'm', + 78: 'n', + 79: 'o', + 80: 'p', + 81: 'q', + 82: 'r', + 83: 's', + 84: 't', + 85: 'u', + 86: 'v', + 87: 'w', + 88: 'x', + 89: 'y', + 90: 'z', + 96: '0', + 97: '1', + 98: '2', + 99: '3', + 100: '4', + 101: '5', + 102: '6', + 103: '7', + 104: '8', + 105: '9' + }; + + + isActive = that.$newElement.hasClass('open'); + + if (!isActive && (e.keyCode >= 48 && e.keyCode <= 57 || e.keyCode >= 96 && e.keyCode <= 105 || e.keyCode >= 65 && e.keyCode <= 90)) { + if (!that.options.container) { + that.setSize(); + that.$menu.parent().addClass('open'); + isActive = true; + } else { + that.$button.trigger('click'); + } + that.$searchbox.focus(); + return; + } + + if (that.options.liveSearch) { + if (/(^9$|27)/.test(e.keyCode.toString(10)) && isActive) { + e.preventDefault(); + e.stopPropagation(); + that.$menuInner.click(); + that.$button.focus(); + } + } + + if (/(38|40)/.test(e.keyCode.toString(10))) { + $items = that.$lis.filter(selector); + if (!$items.length) return; + + if (!that.options.liveSearch) { + index = $items.index($items.find('a').filter(':focus').parent()); + } else { + index = $items.index($items.filter('.active')); + } + + prevIndex = that.$menuInner.data('prevIndex'); + + if (e.keyCode == 38) { + if ((that.options.liveSearch || index == prevIndex) && index != -1) index--; + if (index < 0) index += $items.length; + } else if (e.keyCode == 40) { + if (that.options.liveSearch || index == prevIndex) index++; + index = index % $items.length; + } + + that.$menuInner.data('prevIndex', index); + + if (!that.options.liveSearch) { + $items.eq(index).children('a').focus(); + } else { + e.preventDefault(); + if (!$this.hasClass('dropdown-toggle')) { + $items.removeClass('active').eq(index).addClass('active').children('a').focus(); + $this.focus(); + } + } + + } else if (!$this.is('input')) { + var keyIndex = [], + count, + prevKey; + + $items = that.$lis.filter(selector); + $items.each(function (i) { + if ($.trim($(this).children('a').text().toLowerCase()).substring(0, 1) == keyCodeMap[e.keyCode]) { + keyIndex.push(i); + } + }); + + count = $(document).data('keycount'); + count++; + $(document).data('keycount', count); + + prevKey = $.trim($(':focus').text().toLowerCase()).substring(0, 1); + + if (prevKey != keyCodeMap[e.keyCode]) { + count = 1; + $(document).data('keycount', count); + } else if (count >= keyIndex.length) { + $(document).data('keycount', 0); + if (count > keyIndex.length) count = 1; + } + + $items.eq(keyIndex[count - 1]).children('a').focus(); + } + + // Select focused option if "Enter", "Spacebar" or "Tab" (when selectOnTab is true) are pressed inside the menu. + if ((/(13|32)/.test(e.keyCode.toString(10)) || (/(^9$)/.test(e.keyCode.toString(10)) && that.options.selectOnTab)) && isActive) { + if (!/(32)/.test(e.keyCode.toString(10))) e.preventDefault(); + if (!that.options.liveSearch) { + var elem = $(':focus'); + elem.click(); + // Bring back focus for multiselects + elem.focus(); + // Prevent screen from scrolling if the user hit the spacebar + e.preventDefault(); + // Fixes spacebar selection of dropdown items in FF & IE + $(document).data('spaceSelect', true); + } else if (!/(32)/.test(e.keyCode.toString(10))) { + that.$menuInner.find('.active a').click(); + $this.focus(); + } + $(document).data('keycount', 0); + } + + if ((/(^9$|27)/.test(e.keyCode.toString(10)) && isActive && (that.multiple || that.options.liveSearch)) || (/(27)/.test(e.keyCode.toString(10)) && !isActive)) { + that.$menu.parent().removeClass('open'); + if (that.options.container) that.$newElement.removeClass('open'); + that.$button.focus(); + } + }, + + mobile: function () { + this.$element.addClass('mobile-device'); + }, + + refresh: function () { + this.$lis = null; + this.liObj = {}; + this.reloadLi(); + this.render(); + this.checkDisabled(); + this.liHeight(true); + this.setStyle(); + this.setWidth(); + if (this.$lis) this.$searchbox.trigger('propertychange'); + + this.$element.trigger('refreshed.bs.select'); + }, + + hide: function () { + this.$newElement.hide(); + }, + + show: function () { + this.$newElement.show(); + }, + + remove: function () { + this.$newElement.remove(); + this.$element.remove(); + }, + + destroy: function () { + this.$newElement.before(this.$element).remove(); + + if (this.$bsContainer) { + this.$bsContainer.remove(); + } else { + this.$menu.remove(); + } + + this.$element + .off('.bs.select') + .removeData('selectpicker') + .removeClass('bs-select-hidden selectpicker'); + } + }; + + // SELECTPICKER PLUGIN DEFINITION + // ============================== + function Plugin(option) { + // get the args of the outer function.. + var args = arguments; + // The arguments of the function are explicitly re-defined from the argument list, because the shift causes them + // to get lost/corrupted in android 2.3 and IE9 #715 #775 + var _option = option; + + [].shift.apply(args); + + var value; + var chain = this.each(function () { + var $this = $(this); + if ($this.is('select')) { + var data = $this.data('selectpicker'), + options = typeof _option == 'object' && _option; + + if (!data) { + var config = $.extend({}, Selectpicker.DEFAULTS, $.fn.selectpicker.defaults || {}, $this.data(), options); + config.template = $.extend({}, Selectpicker.DEFAULTS.template, ($.fn.selectpicker.defaults ? $.fn.selectpicker.defaults.template : {}), $this.data().template, options.template); + $this.data('selectpicker', (data = new Selectpicker(this, config))); + } else if (options) { + for (var i in options) { + if (options.hasOwnProperty(i)) { + data.options[i] = options[i]; + } + } + } + + if (typeof _option == 'string') { + if (data[_option] instanceof Function) { + value = data[_option].apply(data, args); + } else { + value = data.options[_option]; + } + } + } + }); + + if (typeof value !== 'undefined') { + //noinspection JSUnusedAssignment + return value; + } else { + return chain; + } + } + + var old = $.fn.selectpicker; + $.fn.selectpicker = Plugin; + $.fn.selectpicker.Constructor = Selectpicker; + + // SELECTPICKER NO CONFLICT + // ======================== + $.fn.selectpicker.noConflict = function () { + $.fn.selectpicker = old; + return this; + }; + + $(document) + .data('keycount', 0) + .on('keydown.bs.select', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role="listbox"], .bs-searchbox input', Selectpicker.prototype.keydown) + .on('focusin.modal', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role="listbox"], .bs-searchbox input', function (e) { + e.stopPropagation(); + }); + + // SELECTPICKER DATA-API + // ===================== + $(window).on('load.bs.select.data-api', function () { + $('.selectpicker').each(function () { + var $selectpicker = $(this); + Plugin.call($selectpicker, $selectpicker.data()); + }) + }); +})(jQuery); + + +})); + +/*! + * Select2 4.0.6-rc.1 + * https://select2.github.io + * + * Released under the MIT license + * https://github.com/select2/select2/blob/master/LICENSE.md + */ +;(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof module === 'object' && module.exports) { + // Node/CommonJS + module.exports = function (root, jQuery) { + if (jQuery === undefined) { + // require('jQuery') returns a factory that requires window to + // build a jQuery instance, we normalize how we use modules + // that require this pattern but the window provided is a noop + // if it's defined (how jquery works) + if (typeof window !== 'undefined') { + jQuery = require('jquery'); + } + else { + jQuery = require('jquery')(root); + } + } + factory(jQuery); + return jQuery; + }; + } else { + // Browser globals + factory(jQuery); + } +} (function (jQuery) { + // This is needed so we can catch the AMD loader configuration and use it + // The inner file should be wrapped (by `banner.start.js`) in a function that + // returns the AMD loader references. + var S2 =(function () { + // Restore the Select2 AMD loader so it can be used + // Needed mostly in the language files, where the loader is not inserted + if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { + var S2 = jQuery.fn.select2.amd; + } +var S2;(function () { if (!S2 || !S2.requirejs) { +if (!S2) { S2 = {}; } else { require = S2; } +/** + * @license almond 0.3.3 Copyright jQuery Foundation and other contributors. + * Released under MIT license, http://github.com/requirejs/almond/LICENSE + */ +//Going sloppy to avoid 'use strict' string cost, but strict practices should +//be followed. +/*global setTimeout: false */ + +var requirejs, require, define; +(function (undef) { + var main, req, makeMap, handlers, + defined = {}, + waiting = {}, + config = {}, + defining = {}, + hasOwn = Object.prototype.hasOwnProperty, + aps = [].slice, + jsSuffixRegExp = /\.js$/; + + function hasProp(obj, prop) { + return hasOwn.call(obj, prop); + } + + /** + * Given a relative module name, like ./something, normalize it to + * a real name that can be mapped to a path. + * @param {String} name the relative name + * @param {String} baseName a real name that the name arg is relative + * to. + * @returns {String} normalized name + */ + function normalize(name, baseName) { + var nameParts, nameSegment, mapValue, foundMap, lastIndex, + foundI, foundStarMap, starI, i, j, part, normalizedBaseParts, + baseParts = baseName && baseName.split("/"), + map = config.map, + starMap = (map && map['*']) || {}; + + //Adjust any relative paths. + if (name) { + name = name.split('/'); + lastIndex = name.length - 1; + + // If wanting node ID compatibility, strip .js from end + // of IDs. Have to do this here, and not in nameToUrl + // because node allows either .js or non .js to map + // to same file. + if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { + name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); + } + + // Starts with a '.' so need the baseName + if (name[0].charAt(0) === '.' && baseParts) { + //Convert baseName to array, and lop off the last part, + //so that . matches that 'directory' and not name of the baseName's + //module. For instance, baseName of 'one/two/three', maps to + //'one/two/three.js', but we want the directory, 'one/two' for + //this normalization. + normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); + name = normalizedBaseParts.concat(name); + } + + //start trimDots + for (i = 0; i < name.length; i++) { + part = name[i]; + if (part === '.') { + name.splice(i, 1); + i -= 1; + } else if (part === '..') { + // If at the start, or previous value is still .., + // keep them so that when converted to a path it may + // still work when converted to a path, even though + // as an ID it is less than ideal. In larger point + // releases, may be better to just kick out an error. + if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') { + continue; + } else if (i > 0) { + name.splice(i - 1, 2); + i -= 2; + } + } + } + //end trimDots + + name = name.join('/'); + } + + //Apply map config if available. + if ((baseParts || starMap) && map) { + nameParts = name.split('/'); + + for (i = nameParts.length; i > 0; i -= 1) { + nameSegment = nameParts.slice(0, i).join("/"); + + if (baseParts) { + //Find the longest baseName segment match in the config. + //So, do joins on the biggest to smallest lengths of baseParts. + for (j = baseParts.length; j > 0; j -= 1) { + mapValue = map[baseParts.slice(0, j).join('/')]; + + //baseName segment has config, find if it has one for + //this name. + if (mapValue) { + mapValue = mapValue[nameSegment]; + if (mapValue) { + //Match, update name to the new value. + foundMap = mapValue; + foundI = i; + break; + } + } + } + } + + if (foundMap) { + break; + } + + //Check for a star map match, but just hold on to it, + //if there is a shorter segment match later in a matching + //config, then favor over this star map. + if (!foundStarMap && starMap && starMap[nameSegment]) { + foundStarMap = starMap[nameSegment]; + starI = i; + } + } + + if (!foundMap && foundStarMap) { + foundMap = foundStarMap; + foundI = starI; + } + + if (foundMap) { + nameParts.splice(0, foundI, foundMap); + name = nameParts.join('/'); + } + } + + return name; + } + + function makeRequire(relName, forceSync) { + return function () { + //A version of a require function that passes a moduleName + //value for items that may need to + //look up paths relative to the moduleName + var args = aps.call(arguments, 0); + + //If first arg is not require('string'), and there is only + //one arg, it is the array form without a callback. Insert + //a null so that the following concat is correct. + if (typeof args[0] !== 'string' && args.length === 1) { + args.push(null); + } + return req.apply(undef, args.concat([relName, forceSync])); + }; + } + + function makeNormalize(relName) { + return function (name) { + return normalize(name, relName); + }; + } + + function makeLoad(depName) { + return function (value) { + defined[depName] = value; + }; + } + + function callDep(name) { + if (hasProp(waiting, name)) { + var args = waiting[name]; + delete waiting[name]; + defining[name] = true; + main.apply(undef, args); + } + + if (!hasProp(defined, name) && !hasProp(defining, name)) { + throw new Error('No ' + name); + } + return defined[name]; + } + + //Turns a plugin!resource to [plugin, resource] + //with the plugin being undefined if the name + //did not have a plugin prefix. + function splitPrefix(name) { + var prefix, + index = name ? name.indexOf('!') : -1; + if (index > -1) { + prefix = name.substring(0, index); + name = name.substring(index + 1, name.length); + } + return [prefix, name]; + } + + //Creates a parts array for a relName where first part is plugin ID, + //second part is resource ID. Assumes relName has already been normalized. + function makeRelParts(relName) { + return relName ? splitPrefix(relName) : []; + } + + /** + * Makes a name map, normalizing the name, and using a plugin + * for normalization if necessary. Grabs a ref to plugin + * too, as an optimization. + */ + makeMap = function (name, relParts) { + var plugin, + parts = splitPrefix(name), + prefix = parts[0], + relResourceName = relParts[1]; + + name = parts[1]; + + if (prefix) { + prefix = normalize(prefix, relResourceName); + plugin = callDep(prefix); + } + + //Normalize according + if (prefix) { + if (plugin && plugin.normalize) { + name = plugin.normalize(name, makeNormalize(relResourceName)); + } else { + name = normalize(name, relResourceName); + } + } else { + name = normalize(name, relResourceName); + parts = splitPrefix(name); + prefix = parts[0]; + name = parts[1]; + if (prefix) { + plugin = callDep(prefix); + } + } + + //Using ridiculous property names for space reasons + return { + f: prefix ? prefix + '!' + name : name, //fullName + n: name, + pr: prefix, + p: plugin + }; + }; + + function makeConfig(name) { + return function () { + return (config && config.config && config.config[name]) || {}; + }; + } + + handlers = { + require: function (name) { + return makeRequire(name); + }, + exports: function (name) { + var e = defined[name]; + if (typeof e !== 'undefined') { + return e; + } else { + return (defined[name] = {}); + } + }, + module: function (name) { + return { + id: name, + uri: '', + exports: defined[name], + config: makeConfig(name) + }; + } + }; + + main = function (name, deps, callback, relName) { + var cjsModule, depName, ret, map, i, relParts, + args = [], + callbackType = typeof callback, + usingExports; + + //Use name if no relName + relName = relName || name; + relParts = makeRelParts(relName); + + //Call the callback to define the module, if necessary. + if (callbackType === 'undefined' || callbackType === 'function') { + //Pull out the defined dependencies and pass the ordered + //values to the callback. + //Default to [require, exports, module] if no deps + deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; + for (i = 0; i < deps.length; i += 1) { + map = makeMap(deps[i], relParts); + depName = map.f; + + //Fast path CommonJS standard dependencies. + if (depName === "require") { + args[i] = handlers.require(name); + } else if (depName === "exports") { + //CommonJS module spec 1.1 + args[i] = handlers.exports(name); + usingExports = true; + } else if (depName === "module") { + //CommonJS module spec 1.1 + cjsModule = args[i] = handlers.module(name); + } else if (hasProp(defined, depName) || + hasProp(waiting, depName) || + hasProp(defining, depName)) { + args[i] = callDep(depName); + } else if (map.p) { + map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); + args[i] = defined[depName]; + } else { + throw new Error(name + ' missing ' + depName); + } + } + + ret = callback ? callback.apply(defined[name], args) : undefined; + + if (name) { + //If setting exports via "module" is in play, + //favor that over return value and exports. After that, + //favor a non-undefined return value over exports use. + if (cjsModule && cjsModule.exports !== undef && + cjsModule.exports !== defined[name]) { + defined[name] = cjsModule.exports; + } else if (ret !== undef || !usingExports) { + //Use the return value from the function. + defined[name] = ret; + } + } + } else if (name) { + //May just be an object definition for the module. Only + //worry about defining if have a module name. + defined[name] = callback; + } + }; + + requirejs = require = req = function (deps, callback, relName, forceSync, alt) { + if (typeof deps === "string") { + if (handlers[deps]) { + //callback in this case is really relName + return handlers[deps](callback); + } + //Just return the module wanted. In this scenario, the + //deps arg is the module name, and second arg (if passed) + //is just the relName. + //Normalize module name, if it contains . or .. + return callDep(makeMap(deps, makeRelParts(callback)).f); + } else if (!deps.splice) { + //deps is a config object, not an array. + config = deps; + if (config.deps) { + req(config.deps, config.callback); + } + if (!callback) { + return; + } + + if (callback.splice) { + //callback is an array, which means it is a dependency list. + //Adjust args if there are dependencies + deps = callback; + callback = relName; + relName = null; + } else { + deps = undef; + } + } + + //Support require(['a']) + callback = callback || function () {}; + + //If relName is a function, it is an errback handler, + //so remove it. + if (typeof relName === 'function') { + relName = forceSync; + forceSync = alt; + } + + //Simulate async callback; + if (forceSync) { + main(undef, deps, callback, relName); + } else { + //Using a non-zero value because of concern for what old browsers + //do, and latest browsers "upgrade" to 4 if lower value is used: + //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: + //If want a value immediately, use require('id') instead -- something + //that works in almond on the global level, but not guaranteed and + //unlikely to work in other AMD implementations. + setTimeout(function () { + main(undef, deps, callback, relName); + }, 4); + } + + return req; + }; + + /** + * Just drops the config on the floor, but returns req in case + * the config return value is used. + */ + req.config = function (cfg) { + return req(cfg); + }; + + /** + * Expose module registry for debugging and tooling + */ + requirejs._defined = defined; + + define = function (name, deps, callback) { + if (typeof name !== 'string') { + throw new Error('See almond README: incorrect module build, no module name'); + } + + //This module may not have dependencies + if (!deps.splice) { + //deps is not an array, so probably means + //an object literal or factory function for + //the value. Adjust args. + callback = deps; + deps = []; + } + + if (!hasProp(defined, name) && !hasProp(waiting, name)) { + waiting[name] = [name, deps, callback]; + } + }; + + define.amd = { + jQuery: true + }; +}()); + +S2.requirejs = requirejs;S2.require = require;S2.define = define; +} +}()); +S2.define("almond", function(){}); + +/* global jQuery:false, $:false */ +S2.define('jquery',[],function () { + var _$ = jQuery || $; + + if (_$ == null && console && console.error) { + console.error( + 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + + 'found. Make sure that you are including jQuery before Select2 on your ' + + 'web page.' + ); + } + + return _$; +}); + +S2.define('select2/utils',[ + 'jquery' +], function ($) { + var Utils = {}; + + Utils.Extend = function (ChildClass, SuperClass) { + var __hasProp = {}.hasOwnProperty; + + function BaseConstructor () { + this.constructor = ChildClass; + } + + for (var key in SuperClass) { + if (__hasProp.call(SuperClass, key)) { + ChildClass[key] = SuperClass[key]; + } + } + + BaseConstructor.prototype = SuperClass.prototype; + ChildClass.prototype = new BaseConstructor(); + ChildClass.__super__ = SuperClass.prototype; + + return ChildClass; + }; + + function getMethods (theClass) { + var proto = theClass.prototype; + + var methods = []; + + for (var methodName in proto) { + var m = proto[methodName]; + + if (typeof m !== 'function') { + continue; + } + + if (methodName === 'constructor') { + continue; + } + + methods.push(methodName); + } + + return methods; + } + + Utils.Decorate = function (SuperClass, DecoratorClass) { + var decoratedMethods = getMethods(DecoratorClass); + var superMethods = getMethods(SuperClass); + + function DecoratedClass () { + var unshift = Array.prototype.unshift; + + var argCount = DecoratorClass.prototype.constructor.length; + + var calledConstructor = SuperClass.prototype.constructor; + + if (argCount > 0) { + unshift.call(arguments, SuperClass.prototype.constructor); + + calledConstructor = DecoratorClass.prototype.constructor; + } + + calledConstructor.apply(this, arguments); + } + + DecoratorClass.displayName = SuperClass.displayName; + + function ctr () { + this.constructor = DecoratedClass; + } + + DecoratedClass.prototype = new ctr(); + + for (var m = 0; m < superMethods.length; m++) { + var superMethod = superMethods[m]; + + DecoratedClass.prototype[superMethod] = + SuperClass.prototype[superMethod]; + } + + var calledMethod = function (methodName) { + // Stub out the original method if it's not decorating an actual method + var originalMethod = function () {}; + + if (methodName in DecoratedClass.prototype) { + originalMethod = DecoratedClass.prototype[methodName]; + } + + var decoratedMethod = DecoratorClass.prototype[methodName]; + + return function () { + var unshift = Array.prototype.unshift; + + unshift.call(arguments, originalMethod); + + return decoratedMethod.apply(this, arguments); + }; + }; + + for (var d = 0; d < decoratedMethods.length; d++) { + var decoratedMethod = decoratedMethods[d]; + + DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); + } + + return DecoratedClass; + }; + + var Observable = function () { + this.listeners = {}; + }; + + Observable.prototype.on = function (event, callback) { + this.listeners = this.listeners || {}; + + if (event in this.listeners) { + this.listeners[event].push(callback); + } else { + this.listeners[event] = [callback]; + } + }; + + Observable.prototype.trigger = function (event) { + var slice = Array.prototype.slice; + var params = slice.call(arguments, 1); + + this.listeners = this.listeners || {}; + + // Params should always come in as an array + if (params == null) { + params = []; + } + + // If there are no arguments to the event, use a temporary object + if (params.length === 0) { + params.push({}); + } + + // Set the `_type` of the first object to the event + params[0]._type = event; + + if (event in this.listeners) { + this.invoke(this.listeners[event], slice.call(arguments, 1)); + } + + if ('*' in this.listeners) { + this.invoke(this.listeners['*'], arguments); + } + }; + + Observable.prototype.invoke = function (listeners, params) { + for (var i = 0, len = listeners.length; i < len; i++) { + listeners[i].apply(this, params); + } + }; + + Utils.Observable = Observable; + + Utils.generateChars = function (length) { + var chars = ''; + + for (var i = 0; i < length; i++) { + var randomChar = Math.floor(Math.random() * 36); + chars += randomChar.toString(36); + } + + return chars; + }; + + Utils.bind = function (func, context) { + return function () { + func.apply(context, arguments); + }; + }; + + Utils._convertData = function (data) { + for (var originalKey in data) { + var keys = originalKey.split('-'); + + var dataLevel = data; + + if (keys.length === 1) { + continue; + } + + for (var k = 0; k < keys.length; k++) { + var key = keys[k]; + + // Lowercase the first letter + // By default, dash-separated becomes camelCase + key = key.substring(0, 1).toLowerCase() + key.substring(1); + + if (!(key in dataLevel)) { + dataLevel[key] = {}; + } + + if (k == keys.length - 1) { + dataLevel[key] = data[originalKey]; + } + + dataLevel = dataLevel[key]; + } + + delete data[originalKey]; + } + + return data; + }; + + Utils.hasScroll = function (index, el) { + // Adapted from the function created by @ShadowScripter + // and adapted by @BillBarry on the Stack Exchange Code Review website. + // The original code can be found at + // http://codereview.stackexchange.com/q/13338 + // and was designed to be used with the Sizzle selector engine. + + var $el = $(el); + var overflowX = el.style.overflowX; + var overflowY = el.style.overflowY; + + //Check both x and y declarations + if (overflowX === overflowY && + (overflowY === 'hidden' || overflowY === 'visible')) { + return false; + } + + if (overflowX === 'scroll' || overflowY === 'scroll') { + return true; + } + + return ($el.innerHeight() < el.scrollHeight || + $el.innerWidth() < el.scrollWidth); + }; + + Utils.escapeMarkup = function (markup) { + var replaceMap = { + '\\': '\', + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''', + '/': '/' + }; + + // Do not try to escape the markup if it's not a string + if (typeof markup !== 'string') { + return markup; + } + + return String(markup).replace(/[&<>"'\/\\]/g, function (match) { + return replaceMap[match]; + }); + }; + + // Append an array of jQuery nodes to a given element. + Utils.appendMany = function ($element, $nodes) { + // jQuery 1.7.x does not support $.fn.append() with an array + // Fall back to a jQuery object collection using $.fn.add() + if ($.fn.jquery.substr(0, 3) === '1.7') { + var $jqNodes = $(); + + $.map($nodes, function (node) { + $jqNodes = $jqNodes.add(node); + }); + + $nodes = $jqNodes; + } + + $element.append($nodes); + }; + + // Cache objects in Utils.__cache instead of $.data (see #4346) + Utils.__cache = {}; + + var id = 0; + Utils.GetUniqueElementId = function (element) { + // Get a unique element Id. If element has no id, + // creates a new unique number, stores it in the id + // attribute and returns the new id. + // If an id already exists, it simply returns it. + + var select2Id = element.getAttribute('data-select2-id'); + if (select2Id == null) { + // If element has id, use it. + if (element.id) { + select2Id = element.id; + element.setAttribute('data-select2-id', select2Id); + } else { + element.setAttribute('data-select2-id', ++id); + select2Id = id.toString(); + } + } + return select2Id; + }; + + Utils.StoreData = function (element, name, value) { + // Stores an item in the cache for a specified element. + // name is the cache key. + var id = Utils.GetUniqueElementId(element); + if (!Utils.__cache[id]) { + Utils.__cache[id] = {}; + } + + Utils.__cache[id][name] = value; + }; + + Utils.GetData = function (element, name) { + // Retrieves a value from the cache by its key (name) + // name is optional. If no name specified, return + // all cache items for the specified element. + // and for a specified element. + var id = Utils.GetUniqueElementId(element); + if (name) { + if (Utils.__cache[id]) { + return Utils.__cache[id][name] != null ? + Utils.__cache[id][name]: + $(element).data(name); // Fallback to HTML5 data attribs. + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } else { + return Utils.__cache[id]; + } + }; + + Utils.RemoveData = function (element) { + // Removes all cached items for a specified element. + var id = Utils.GetUniqueElementId(element); + if (Utils.__cache[id] != null) { + delete Utils.__cache[id]; + } + }; + + return Utils; +}); + +S2.define('select2/results',[ + 'jquery', + './utils' +], function ($, Utils) { + function Results ($element, options, dataAdapter) { + this.$element = $element; + this.data = dataAdapter; + this.options = options; + + Results.__super__.constructor.call(this); + } + + Utils.Extend(Results, Utils.Observable); + + Results.prototype.render = function () { + var $results = $( + '
      ' + ); + + if (this.options.get('multiple')) { + $results.attr('aria-multiselectable', 'true'); + } + + this.$results = $results; + + return $results; + }; + + Results.prototype.clear = function () { + this.$results.empty(); + }; + + Results.prototype.displayMessage = function (params) { + var escapeMarkup = this.options.get('escapeMarkup'); + + this.clear(); + this.hideLoading(); + + var $message = $( + '
    • ' + ); + + var message = this.options.get('translations').get(params.message); + + $message.append( + escapeMarkup( + message(params.args) + ) + ); + + $message[0].className += ' select2-results__message'; + + this.$results.append($message); + }; + + Results.prototype.hideMessages = function () { + this.$results.find('.select2-results__message').remove(); + }; + + Results.prototype.append = function (data) { + this.hideLoading(); + + var $options = []; + + if (data.results == null || data.results.length === 0) { + if (this.$results.children().length === 0) { + this.trigger('results:message', { + message: 'noResults' + }); + } + + return; + } + + data.results = this.sort(data.results); + + for (var d = 0; d < data.results.length; d++) { + var item = data.results[d]; + + var $option = this.option(item); + + $options.push($option); + } + + this.$results.append($options); + }; + + Results.prototype.position = function ($results, $dropdown) { + var $resultsContainer = $dropdown.find('.select2-results'); + $resultsContainer.append($results); + }; + + Results.prototype.sort = function (data) { + var sorter = this.options.get('sorter'); + + return sorter(data); + }; + + Results.prototype.highlightFirstItem = function () { + var $options = this.$results + .find('.select2-results__option[aria-selected]'); + + var $selected = $options.filter('[aria-selected=true]'); + + // Check if there are any selected options + if ($selected.length > 0) { + // If there are selected options, highlight the first + $selected.first().trigger('mouseenter'); + } else { + // If there are no selected options, highlight the first option + // in the dropdown + $options.first().trigger('mouseenter'); + } + + this.ensureHighlightVisible(); + }; + + Results.prototype.setClasses = function () { + var self = this; + + this.data.current(function (selected) { + var selectedIds = $.map(selected, function (s) { + return s.id.toString(); + }); + + var $options = self.$results + .find('.select2-results__option[aria-selected]'); + + $options.each(function () { + var $option = $(this); + + var item = Utils.GetData(this, 'data'); + + // id needs to be converted to a string when comparing + var id = '' + item.id; + + if ((item.element != null && item.element.selected) || + (item.element == null && $.inArray(id, selectedIds) > -1)) { + $option.attr('aria-selected', 'true'); + } else { + $option.attr('aria-selected', 'false'); + } + }); + + }); + }; + + Results.prototype.showLoading = function (params) { + this.hideLoading(); + + var loadingMore = this.options.get('translations').get('searching'); + + var loading = { + disabled: true, + loading: true, + text: loadingMore(params) + }; + var $loading = this.option(loading); + $loading.className += ' loading-results'; + + this.$results.prepend($loading); + }; + + Results.prototype.hideLoading = function () { + this.$results.find('.loading-results').remove(); + }; + + Results.prototype.option = function (data) { + var option = document.createElement('li'); + option.className = 'select2-results__option'; + + var attrs = { + 'role': 'treeitem', + 'aria-selected': 'false' + }; + + if (data.disabled) { + delete attrs['aria-selected']; + attrs['aria-disabled'] = 'true'; + } + + if (data.id == null) { + delete attrs['aria-selected']; + } + + if (data._resultId != null) { + option.id = data._resultId; + } + + if (data.title) { + option.title = data.title; + } + + if (data.children) { + attrs.role = 'group'; + attrs['aria-label'] = data.text; + delete attrs['aria-selected']; + } + + for (var attr in attrs) { + var val = attrs[attr]; + + option.setAttribute(attr, val); + } + + if (data.children) { + var $option = $(option); + + var label = document.createElement('strong'); + label.className = 'select2-results__group'; + + var $label = $(label); + this.template(data, label); + + var $children = []; + + for (var c = 0; c < data.children.length; c++) { + var child = data.children[c]; + + var $child = this.option(child); + + $children.push($child); + } + + var $childrenContainer = $('
        ', { + 'class': 'select2-results__options select2-results__options--nested' + }); + + $childrenContainer.append($children); + + $option.append(label); + $option.append($childrenContainer); + } else { + this.template(data, option); + } + + Utils.StoreData(option, 'data', data); + + return option; + }; + + Results.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-results'; + + this.$results.attr('id', id); + + container.on('results:all', function (params) { + self.clear(); + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + self.highlightFirstItem(); + } + }); + + container.on('results:append', function (params) { + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + } + }); + + container.on('query', function (params) { + self.hideMessages(); + self.showLoading(params); + }); + + container.on('select', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + self.highlightFirstItem(); + }); + + container.on('unselect', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + self.highlightFirstItem(); + }); + + container.on('open', function () { + // When the dropdown is open, aria-expended="true" + self.$results.attr('aria-expanded', 'true'); + self.$results.attr('aria-hidden', 'false'); + + self.setClasses(); + self.ensureHighlightVisible(); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expended="false" + self.$results.attr('aria-expanded', 'false'); + self.$results.attr('aria-hidden', 'true'); + self.$results.removeAttr('aria-activedescendant'); + }); + + container.on('results:toggle', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + $highlighted.trigger('mouseup'); + }); + + container.on('results:select', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var data = Utils.GetData($highlighted[0], 'data'); + + if ($highlighted.attr('aria-selected') == 'true') { + self.trigger('close', {}); + } else { + self.trigger('select', { + data: data + }); + } + }); + + container.on('results:previous', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + // If we are already at te top, don't move further + // If no options, currentIndex will be -1 + if (currentIndex <= 0) { + return; + } + + var nextIndex = currentIndex - 1; + + // If none are highlighted, highlight the first + if ($highlighted.length === 0) { + nextIndex = 0; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top; + var nextTop = $next.offset().top; + var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextTop - currentOffset < 0) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:next', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var nextIndex = currentIndex + 1; + + // If we are at the last option, stay there + if (nextIndex >= $options.length) { + return; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var nextBottom = $next.offset().top + $next.outerHeight(false); + var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextBottom > currentOffset) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:focus', function (params) { + params.element.addClass('select2-results__option--highlighted'); + }); + + container.on('results:message', function (params) { + self.displayMessage(params); + }); + + if ($.fn.mousewheel) { + this.$results.on('mousewheel', function (e) { + var top = self.$results.scrollTop(); + + var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; + + var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; + var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); + + if (isAtTop) { + self.$results.scrollTop(0); + + e.preventDefault(); + e.stopPropagation(); + } else if (isAtBottom) { + self.$results.scrollTop( + self.$results.get(0).scrollHeight - self.$results.height() + ); + + e.preventDefault(); + e.stopPropagation(); + } + }); + } + + this.$results.on('mouseup', '.select2-results__option[aria-selected]', + function (evt) { + var $this = $(this); + + var data = Utils.GetData(this, 'data'); + + if ($this.attr('aria-selected') === 'true') { + if (self.options.get('multiple')) { + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } else { + self.trigger('close', {}); + } + + return; + } + + self.trigger('select', { + originalEvent: evt, + data: data + }); + }); + + this.$results.on('mouseenter', '.select2-results__option[aria-selected]', + function (evt) { + var data = Utils.GetData(this, 'data'); + + self.getHighlightedResults() + .removeClass('select2-results__option--highlighted'); + + self.trigger('results:focus', { + data: data, + element: $(this) + }); + }); + }; + + Results.prototype.getHighlightedResults = function () { + var $highlighted = this.$results + .find('.select2-results__option--highlighted'); + + return $highlighted; + }; + + Results.prototype.destroy = function () { + this.$results.remove(); + }; + + Results.prototype.ensureHighlightVisible = function () { + var $highlighted = this.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var $options = this.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var currentOffset = this.$results.offset().top; + var nextTop = $highlighted.offset().top; + var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); + + var offsetDelta = nextTop - currentOffset; + nextOffset -= $highlighted.outerHeight(false) * 2; + + if (currentIndex <= 2) { + this.$results.scrollTop(0); + } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { + this.$results.scrollTop(nextOffset); + } + }; + + Results.prototype.template = function (result, container) { + var template = this.options.get('templateResult'); + var escapeMarkup = this.options.get('escapeMarkup'); + + var content = template(result, container); + + if (content == null) { + container.style.display = 'none'; + } else if (typeof content === 'string') { + container.innerHTML = escapeMarkup(content); + } else { + $(container).append(content); + } + }; + + return Results; +}); + +S2.define('select2/keys',[ + +], function () { + var KEYS = { + BACKSPACE: 8, + TAB: 9, + ENTER: 13, + SHIFT: 16, + CTRL: 17, + ALT: 18, + ESC: 27, + SPACE: 32, + PAGE_UP: 33, + PAGE_DOWN: 34, + END: 35, + HOME: 36, + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, + DELETE: 46 + }; + + return KEYS; +}); + +S2.define('select2/selection/base',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function BaseSelection ($element, options) { + this.$element = $element; + this.options = options; + + BaseSelection.__super__.constructor.call(this); + } + + Utils.Extend(BaseSelection, Utils.Observable); + + BaseSelection.prototype.render = function () { + var $selection = $( + '' + ); + + this._tabindex = 0; + + if (Utils.GetData(this.$element[0], 'old-tabindex') != null) { + this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex'); + } else if (this.$element.attr('tabindex') != null) { + this._tabindex = this.$element.attr('tabindex'); + } + + $selection.attr('title', this.$element.attr('title')); + $selection.attr('tabindex', this._tabindex); + + this.$selection = $selection; + + return $selection; + }; + + BaseSelection.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-container'; + var resultsId = container.id + '-results'; + + this.container = container; + + this.$selection.on('focus', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('blur', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', function (evt) { + self.trigger('keypress', evt); + + if (evt.which === KEYS.SPACE) { + evt.preventDefault(); + } + }); + + container.on('results:focus', function (params) { + self.$selection.attr('aria-activedescendant', params.data._resultId); + }); + + container.on('selection:update', function (params) { + self.update(params.data); + }); + + container.on('open', function () { + // When the dropdown is open, aria-expanded="true" + self.$selection.attr('aria-expanded', 'true'); + self.$selection.attr('aria-owns', resultsId); + + self._attachCloseHandler(container); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expanded="false" + self.$selection.attr('aria-expanded', 'false'); + self.$selection.removeAttr('aria-activedescendant'); + self.$selection.removeAttr('aria-owns'); + + self.$selection.focus(); + window.setTimeout(function () { + self.$selection.focus(); + }, 0); + + self._detachCloseHandler(container); + }); + + container.on('enable', function () { + self.$selection.attr('tabindex', self._tabindex); + }); + + container.on('disable', function () { + self.$selection.attr('tabindex', '-1'); + }); + }; + + BaseSelection.prototype._handleBlur = function (evt) { + var self = this; + + // This needs to be delayed as the active element is the body when the tab + // key is pressed, possibly along with others. + window.setTimeout(function () { + // Don't trigger `blur` if the focus is still in the selection + if ( + (document.activeElement == self.$selection[0]) || + ($.contains(self.$selection[0], document.activeElement)) + ) { + return; + } + + self.trigger('blur', evt); + }, 1); + }; + + BaseSelection.prototype._attachCloseHandler = function (container) { + var self = this; + + $(document.body).on('mousedown.select2.' + container.id, function (e) { + var $target = $(e.target); + + var $select = $target.closest('.select2'); + + var $all = $('.select2.select2-container--open'); + + $all.each(function () { + var $this = $(this); + + if (this == $select[0]) { + return; + } + + var $element = Utils.GetData(this, 'element'); + + $element.select2('close'); + }); + }); + }; + + BaseSelection.prototype._detachCloseHandler = function (container) { + $(document.body).off('mousedown.select2.' + container.id); + }; + + BaseSelection.prototype.position = function ($selection, $container) { + var $selectionContainer = $container.find('.selection'); + $selectionContainer.append($selection); + }; + + BaseSelection.prototype.destroy = function () { + this._detachCloseHandler(this.container); + }; + + BaseSelection.prototype.update = function (data) { + throw new Error('The `update` method must be defined in child classes.'); + }; + + return BaseSelection; +}); + +S2.define('select2/selection/single',[ + 'jquery', + './base', + '../utils', + '../keys' +], function ($, BaseSelection, Utils, KEYS) { + function SingleSelection () { + SingleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(SingleSelection, BaseSelection); + + SingleSelection.prototype.render = function () { + var $selection = SingleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--single'); + + $selection.html( + '' + + '' + + '' + + '' + ); + + return $selection; + }; + + SingleSelection.prototype.bind = function (container, $container) { + var self = this; + + SingleSelection.__super__.bind.apply(this, arguments); + + var id = container.id + '-container'; + + this.$selection.find('.select2-selection__rendered') + .attr('id', id) + .attr('role', 'textbox') + .attr('aria-readonly', 'true'); + this.$selection.attr('aria-labelledby', id); + + this.$selection.on('mousedown', function (evt) { + // Only respond to left clicks + if (evt.which !== 1) { + return; + } + + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on('focus', function (evt) { + // User focuses on the container + }); + + this.$selection.on('blur', function (evt) { + // User exits the container + }); + + container.on('focus', function (evt) { + if (!container.isOpen()) { + self.$selection.focus(); + } + }); + }; + + SingleSelection.prototype.clear = function () { + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); // clear tooltip on empty + }; + + SingleSelection.prototype.display = function (data, container) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data, container)); + }; + + SingleSelection.prototype.selectionContainer = function () { + return $(''); + }; + + SingleSelection.prototype.update = function (data) { + if (data.length === 0) { + this.clear(); + return; + } + + var selection = data[0]; + + var $rendered = this.$selection.find('.select2-selection__rendered'); + var formatted = this.display(selection, $rendered); + + $rendered.empty().append(formatted); + $rendered.attr('title', selection.title || selection.text); + }; + + return SingleSelection; +}); + +S2.define('select2/selection/multiple',[ + 'jquery', + './base', + '../utils' +], function ($, BaseSelection, Utils) { + function MultipleSelection ($element, options) { + MultipleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(MultipleSelection, BaseSelection); + + MultipleSelection.prototype.render = function () { + var $selection = MultipleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--multiple'); + + $selection.html( + '
          ' + ); + + return $selection; + }; + + MultipleSelection.prototype.bind = function (container, $container) { + var self = this; + + MultipleSelection.__super__.bind.apply(this, arguments); + + this.$selection.on('click', function (evt) { + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on( + 'click', + '.select2-selection__choice__remove', + function (evt) { + // Ignore the event if it is disabled + if (self.options.get('disabled')) { + return; + } + + var $remove = $(this); + var $selection = $remove.parent(); + + var data = Utils.GetData($selection[0], 'data'); + + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } + ); + }; + + MultipleSelection.prototype.clear = function () { + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); + }; + + MultipleSelection.prototype.display = function (data, container) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data, container)); + }; + + MultipleSelection.prototype.selectionContainer = function () { + var $container = $( + '
        • ' + + '' + + '×' + + '' + + '
        • ' + ); + + return $container; + }; + + MultipleSelection.prototype.update = function (data) { + this.clear(); + + if (data.length === 0) { + return; + } + + var $selections = []; + + for (var d = 0; d < data.length; d++) { + var selection = data[d]; + + var $selection = this.selectionContainer(); + var formatted = this.display(selection, $selection); + + $selection.append(formatted); + $selection.attr('title', selection.title || selection.text); + + Utils.StoreData($selection[0], 'data', selection); + + $selections.push($selection); + } + + var $rendered = this.$selection.find('.select2-selection__rendered'); + + Utils.appendMany($rendered, $selections); + }; + + return MultipleSelection; +}); + +S2.define('select2/selection/placeholder',[ + '../utils' +], function (Utils) { + function Placeholder (decorated, $element, options) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options); + } + + Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { + var $placeholder = this.selectionContainer(); + + $placeholder.html(this.display(placeholder)); + $placeholder.addClass('select2-selection__placeholder') + .removeClass('select2-selection__choice'); + + return $placeholder; + }; + + Placeholder.prototype.update = function (decorated, data) { + var singlePlaceholder = ( + data.length == 1 && data[0].id != this.placeholder.id + ); + var multipleSelections = data.length > 1; + + if (multipleSelections || singlePlaceholder) { + return decorated.call(this, data); + } + + this.clear(); + + var $placeholder = this.createPlaceholder(this.placeholder); + + this.$selection.find('.select2-selection__rendered').append($placeholder); + }; + + return Placeholder; +}); + +S2.define('select2/selection/allowClear',[ + 'jquery', + '../keys', + '../utils' +], function ($, KEYS, Utils) { + function AllowClear () { } + + AllowClear.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + if (this.placeholder == null) { + if (this.options.get('debug') && window.console && console.error) { + console.error( + 'Select2: The `allowClear` option should be used in combination ' + + 'with the `placeholder` option.' + ); + } + } + + this.$selection.on('mousedown', '.select2-selection__clear', + function (evt) { + self._handleClear(evt); + }); + + container.on('keypress', function (evt) { + self._handleKeyboardClear(evt, container); + }); + }; + + AllowClear.prototype._handleClear = function (_, evt) { + // Ignore the event if it is disabled + if (this.options.get('disabled')) { + return; + } + + var $clear = this.$selection.find('.select2-selection__clear'); + + // Ignore the event if nothing has been selected + if ($clear.length === 0) { + return; + } + + evt.stopPropagation(); + + var data = Utils.GetData($clear[0], 'data'); + + var previousVal = this.$element.val(); + this.$element.val(this.placeholder.id); + + var unselectData = { + data: data + }; + this.trigger('clear', unselectData); + if (unselectData.prevented) { + this.$element.val(previousVal); + return; + } + + for (var d = 0; d < data.length; d++) { + unselectData = { + data: data[d] + }; + + // Trigger the `unselect` event, so people can prevent it from being + // cleared. + this.trigger('unselect', unselectData); + + // If the event was prevented, don't clear it out. + if (unselectData.prevented) { + this.$element.val(previousVal); + return; + } + } + + this.$element.trigger('change'); + + this.trigger('toggle', {}); + }; + + AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { + if (container.isOpen()) { + return; + } + + if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { + this._handleClear(evt); + } + }; + + AllowClear.prototype.update = function (decorated, data) { + decorated.call(this, data); + + if (this.$selection.find('.select2-selection__placeholder').length > 0 || + data.length === 0) { + return; + } + + var $remove = $( + '' + + '×' + + '' + ); + Utils.StoreData($remove[0], 'data', data); + + this.$selection.find('.select2-selection__rendered').prepend($remove); + }; + + return AllowClear; +}); + +S2.define('select2/selection/search',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function Search (decorated, $element, options) { + decorated.call(this, $element, options); + } + + Search.prototype.render = function (decorated) { + var $search = $( + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + var $rendered = decorated.call(this); + + this._transferTabIndex(); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('open', function () { + self.$search.trigger('focus'); + }); + + container.on('close', function () { + self.$search.val(''); + self.$search.removeAttr('aria-activedescendant'); + self.$search.trigger('focus'); + }); + + container.on('enable', function () { + self.$search.prop('disabled', false); + + self._transferTabIndex(); + }); + + container.on('disable', function () { + self.$search.prop('disabled', true); + }); + + container.on('focus', function (evt) { + self.$search.trigger('focus'); + }); + + container.on('results:focus', function (params) { + self.$search.attr('aria-activedescendant', params.id); + }); + + this.$selection.on('focusin', '.select2-search--inline', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('focusout', '.select2-search--inline', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', '.select2-search--inline', function (evt) { + evt.stopPropagation(); + + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + + var key = evt.which; + + if (key === KEYS.BACKSPACE && self.$search.val() === '') { + var $previousChoice = self.$searchContainer + .prev('.select2-selection__choice'); + + if ($previousChoice.length > 0) { + var item = Utils.GetData($previousChoice[0], 'data'); + + self.searchRemoveChoice(item); + + evt.preventDefault(); + } + } + }); + + // Try to detect the IE version should the `documentMode` property that + // is stored on the document. This is only implemented in IE and is + // slightly cleaner than doing a user agent check. + // This property is not available in Edge, but Edge also doesn't have + // this bug. + var msie = document.documentMode; + var disableInputEvents = msie && msie <= 11; + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$selection.on( + 'input.searchcheck', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents) { + self.$selection.off('input.search input.searchcheck'); + return; + } + + // Unbind the duplicated `keyup` event + self.$selection.off('keyup.search'); + } + ); + + this.$selection.on( + 'keyup.search input.search', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents && evt.type === 'input') { + self.$selection.off('input.search input.searchcheck'); + return; + } + + var key = evt.which; + + // We can freely ignore events from modifier keys + if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { + return; + } + + // Tabbing will be handled during the `keydown` phase + if (key == KEYS.TAB) { + return; + } + + self.handleSearch(evt); + } + ); + }; + + /** + * This method will transfer the tabindex attribute from the rendered + * selection to the search box. This allows for the search box to be used as + * the primary focus instead of the selection container. + * + * @private + */ + Search.prototype._transferTabIndex = function (decorated) { + this.$search.attr('tabindex', this.$selection.attr('tabindex')); + this.$selection.attr('tabindex', '-1'); + }; + + Search.prototype.createPlaceholder = function (decorated, placeholder) { + this.$search.attr('placeholder', placeholder.text); + }; + + Search.prototype.update = function (decorated, data) { + var searchHadFocus = this.$search[0] == document.activeElement; + + this.$search.attr('placeholder', ''); + + decorated.call(this, data); + + this.$selection.find('.select2-selection__rendered') + .append(this.$searchContainer); + + this.resizeSearch(); + if (searchHadFocus) { + var isTagInput = this.$element.find('[data-select2-tag]').length; + if (isTagInput) { + // fix IE11 bug where tag input lost focus + this.$element.focus(); + } else { + this.$search.focus(); + } + } + }; + + Search.prototype.handleSearch = function () { + this.resizeSearch(); + + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.searchRemoveChoice = function (decorated, item) { + this.trigger('unselect', { + data: item + }); + + this.$search.val(item.text); + this.handleSearch(); + }; + + Search.prototype.resizeSearch = function () { + this.$search.css('width', '25px'); + + var width = ''; + + if (this.$search.attr('placeholder') !== '') { + width = this.$selection.find('.select2-selection__rendered').innerWidth(); + } else { + var minimumWidth = this.$search.val().length + 1; + + width = (minimumWidth * 0.75) + 'em'; + } + + this.$search.css('width', width); + }; + + return Search; +}); + +S2.define('select2/selection/eventRelay',[ + 'jquery' +], function ($) { + function EventRelay () { } + + EventRelay.prototype.bind = function (decorated, container, $container) { + var self = this; + var relayEvents = [ + 'open', 'opening', + 'close', 'closing', + 'select', 'selecting', + 'unselect', 'unselecting', + 'clear', 'clearing' + ]; + + var preventableEvents = [ + 'opening', 'closing', 'selecting', 'unselecting', 'clearing' + ]; + + decorated.call(this, container, $container); + + container.on('*', function (name, params) { + // Ignore events that should not be relayed + if ($.inArray(name, relayEvents) === -1) { + return; + } + + // The parameters should always be an object + params = params || {}; + + // Generate the jQuery event for the Select2 event + var evt = $.Event('select2:' + name, { + params: params + }); + + self.$element.trigger(evt); + + // Only handle preventable events if it was one + if ($.inArray(name, preventableEvents) === -1) { + return; + } + + params.prevented = evt.isDefaultPrevented(); + }); + }; + + return EventRelay; +}); + +S2.define('select2/translation',[ + 'jquery', + 'require' +], function ($, require) { + function Translation (dict) { + this.dict = dict || {}; + } + + Translation.prototype.all = function () { + return this.dict; + }; + + Translation.prototype.get = function (key) { + return this.dict[key]; + }; + + Translation.prototype.extend = function (translation) { + this.dict = $.extend({}, translation.all(), this.dict); + }; + + // Static functions + + Translation._cache = {}; + + Translation.loadPath = function (path) { + if (!(path in Translation._cache)) { + var translations = require(path); + + Translation._cache[path] = translations; + } + + return new Translation(Translation._cache[path]); + }; + + return Translation; +}); + +S2.define('select2/diacritics',[ + +], function () { + var diacritics = { + '\u24B6': 'A', + '\uFF21': 'A', + '\u00C0': 'A', + '\u00C1': 'A', + '\u00C2': 'A', + '\u1EA6': 'A', + '\u1EA4': 'A', + '\u1EAA': 'A', + '\u1EA8': 'A', + '\u00C3': 'A', + '\u0100': 'A', + '\u0102': 'A', + '\u1EB0': 'A', + '\u1EAE': 'A', + '\u1EB4': 'A', + '\u1EB2': 'A', + '\u0226': 'A', + '\u01E0': 'A', + '\u00C4': 'A', + '\u01DE': 'A', + '\u1EA2': 'A', + '\u00C5': 'A', + '\u01FA': 'A', + '\u01CD': 'A', + '\u0200': 'A', + '\u0202': 'A', + '\u1EA0': 'A', + '\u1EAC': 'A', + '\u1EB6': 'A', + '\u1E00': 'A', + '\u0104': 'A', + '\u023A': 'A', + '\u2C6F': 'A', + '\uA732': 'AA', + '\u00C6': 'AE', + '\u01FC': 'AE', + '\u01E2': 'AE', + '\uA734': 'AO', + '\uA736': 'AU', + '\uA738': 'AV', + '\uA73A': 'AV', + '\uA73C': 'AY', + '\u24B7': 'B', + '\uFF22': 'B', + '\u1E02': 'B', + '\u1E04': 'B', + '\u1E06': 'B', + '\u0243': 'B', + '\u0182': 'B', + '\u0181': 'B', + '\u24B8': 'C', + '\uFF23': 'C', + '\u0106': 'C', + '\u0108': 'C', + '\u010A': 'C', + '\u010C': 'C', + '\u00C7': 'C', + '\u1E08': 'C', + '\u0187': 'C', + '\u023B': 'C', + '\uA73E': 'C', + '\u24B9': 'D', + '\uFF24': 'D', + '\u1E0A': 'D', + '\u010E': 'D', + '\u1E0C': 'D', + '\u1E10': 'D', + '\u1E12': 'D', + '\u1E0E': 'D', + '\u0110': 'D', + '\u018B': 'D', + '\u018A': 'D', + '\u0189': 'D', + '\uA779': 'D', + '\u01F1': 'DZ', + '\u01C4': 'DZ', + '\u01F2': 'Dz', + '\u01C5': 'Dz', + '\u24BA': 'E', + '\uFF25': 'E', + '\u00C8': 'E', + '\u00C9': 'E', + '\u00CA': 'E', + '\u1EC0': 'E', + '\u1EBE': 'E', + '\u1EC4': 'E', + '\u1EC2': 'E', + '\u1EBC': 'E', + '\u0112': 'E', + '\u1E14': 'E', + '\u1E16': 'E', + '\u0114': 'E', + '\u0116': 'E', + '\u00CB': 'E', + '\u1EBA': 'E', + '\u011A': 'E', + '\u0204': 'E', + '\u0206': 'E', + '\u1EB8': 'E', + '\u1EC6': 'E', + '\u0228': 'E', + '\u1E1C': 'E', + '\u0118': 'E', + '\u1E18': 'E', + '\u1E1A': 'E', + '\u0190': 'E', + '\u018E': 'E', + '\u24BB': 'F', + '\uFF26': 'F', + '\u1E1E': 'F', + '\u0191': 'F', + '\uA77B': 'F', + '\u24BC': 'G', + '\uFF27': 'G', + '\u01F4': 'G', + '\u011C': 'G', + '\u1E20': 'G', + '\u011E': 'G', + '\u0120': 'G', + '\u01E6': 'G', + '\u0122': 'G', + '\u01E4': 'G', + '\u0193': 'G', + '\uA7A0': 'G', + '\uA77D': 'G', + '\uA77E': 'G', + '\u24BD': 'H', + '\uFF28': 'H', + '\u0124': 'H', + '\u1E22': 'H', + '\u1E26': 'H', + '\u021E': 'H', + '\u1E24': 'H', + '\u1E28': 'H', + '\u1E2A': 'H', + '\u0126': 'H', + '\u2C67': 'H', + '\u2C75': 'H', + '\uA78D': 'H', + '\u24BE': 'I', + '\uFF29': 'I', + '\u00CC': 'I', + '\u00CD': 'I', + '\u00CE': 'I', + '\u0128': 'I', + '\u012A': 'I', + '\u012C': 'I', + '\u0130': 'I', + '\u00CF': 'I', + '\u1E2E': 'I', + '\u1EC8': 'I', + '\u01CF': 'I', + '\u0208': 'I', + '\u020A': 'I', + '\u1ECA': 'I', + '\u012E': 'I', + '\u1E2C': 'I', + '\u0197': 'I', + '\u24BF': 'J', + '\uFF2A': 'J', + '\u0134': 'J', + '\u0248': 'J', + '\u24C0': 'K', + '\uFF2B': 'K', + '\u1E30': 'K', + '\u01E8': 'K', + '\u1E32': 'K', + '\u0136': 'K', + '\u1E34': 'K', + '\u0198': 'K', + '\u2C69': 'K', + '\uA740': 'K', + '\uA742': 'K', + '\uA744': 'K', + '\uA7A2': 'K', + '\u24C1': 'L', + '\uFF2C': 'L', + '\u013F': 'L', + '\u0139': 'L', + '\u013D': 'L', + '\u1E36': 'L', + '\u1E38': 'L', + '\u013B': 'L', + '\u1E3C': 'L', + '\u1E3A': 'L', + '\u0141': 'L', + '\u023D': 'L', + '\u2C62': 'L', + '\u2C60': 'L', + '\uA748': 'L', + '\uA746': 'L', + '\uA780': 'L', + '\u01C7': 'LJ', + '\u01C8': 'Lj', + '\u24C2': 'M', + '\uFF2D': 'M', + '\u1E3E': 'M', + '\u1E40': 'M', + '\u1E42': 'M', + '\u2C6E': 'M', + '\u019C': 'M', + '\u24C3': 'N', + '\uFF2E': 'N', + '\u01F8': 'N', + '\u0143': 'N', + '\u00D1': 'N', + '\u1E44': 'N', + '\u0147': 'N', + '\u1E46': 'N', + '\u0145': 'N', + '\u1E4A': 'N', + '\u1E48': 'N', + '\u0220': 'N', + '\u019D': 'N', + '\uA790': 'N', + '\uA7A4': 'N', + '\u01CA': 'NJ', + '\u01CB': 'Nj', + '\u24C4': 'O', + '\uFF2F': 'O', + '\u00D2': 'O', + '\u00D3': 'O', + '\u00D4': 'O', + '\u1ED2': 'O', + '\u1ED0': 'O', + '\u1ED6': 'O', + '\u1ED4': 'O', + '\u00D5': 'O', + '\u1E4C': 'O', + '\u022C': 'O', + '\u1E4E': 'O', + '\u014C': 'O', + '\u1E50': 'O', + '\u1E52': 'O', + '\u014E': 'O', + '\u022E': 'O', + '\u0230': 'O', + '\u00D6': 'O', + '\u022A': 'O', + '\u1ECE': 'O', + '\u0150': 'O', + '\u01D1': 'O', + '\u020C': 'O', + '\u020E': 'O', + '\u01A0': 'O', + '\u1EDC': 'O', + '\u1EDA': 'O', + '\u1EE0': 'O', + '\u1EDE': 'O', + '\u1EE2': 'O', + '\u1ECC': 'O', + '\u1ED8': 'O', + '\u01EA': 'O', + '\u01EC': 'O', + '\u00D8': 'O', + '\u01FE': 'O', + '\u0186': 'O', + '\u019F': 'O', + '\uA74A': 'O', + '\uA74C': 'O', + '\u01A2': 'OI', + '\uA74E': 'OO', + '\u0222': 'OU', + '\u24C5': 'P', + '\uFF30': 'P', + '\u1E54': 'P', + '\u1E56': 'P', + '\u01A4': 'P', + '\u2C63': 'P', + '\uA750': 'P', + '\uA752': 'P', + '\uA754': 'P', + '\u24C6': 'Q', + '\uFF31': 'Q', + '\uA756': 'Q', + '\uA758': 'Q', + '\u024A': 'Q', + '\u24C7': 'R', + '\uFF32': 'R', + '\u0154': 'R', + '\u1E58': 'R', + '\u0158': 'R', + '\u0210': 'R', + '\u0212': 'R', + '\u1E5A': 'R', + '\u1E5C': 'R', + '\u0156': 'R', + '\u1E5E': 'R', + '\u024C': 'R', + '\u2C64': 'R', + '\uA75A': 'R', + '\uA7A6': 'R', + '\uA782': 'R', + '\u24C8': 'S', + '\uFF33': 'S', + '\u1E9E': 'S', + '\u015A': 'S', + '\u1E64': 'S', + '\u015C': 'S', + '\u1E60': 'S', + '\u0160': 'S', + '\u1E66': 'S', + '\u1E62': 'S', + '\u1E68': 'S', + '\u0218': 'S', + '\u015E': 'S', + '\u2C7E': 'S', + '\uA7A8': 'S', + '\uA784': 'S', + '\u24C9': 'T', + '\uFF34': 'T', + '\u1E6A': 'T', + '\u0164': 'T', + '\u1E6C': 'T', + '\u021A': 'T', + '\u0162': 'T', + '\u1E70': 'T', + '\u1E6E': 'T', + '\u0166': 'T', + '\u01AC': 'T', + '\u01AE': 'T', + '\u023E': 'T', + '\uA786': 'T', + '\uA728': 'TZ', + '\u24CA': 'U', + '\uFF35': 'U', + '\u00D9': 'U', + '\u00DA': 'U', + '\u00DB': 'U', + '\u0168': 'U', + '\u1E78': 'U', + '\u016A': 'U', + '\u1E7A': 'U', + '\u016C': 'U', + '\u00DC': 'U', + '\u01DB': 'U', + '\u01D7': 'U', + '\u01D5': 'U', + '\u01D9': 'U', + '\u1EE6': 'U', + '\u016E': 'U', + '\u0170': 'U', + '\u01D3': 'U', + '\u0214': 'U', + '\u0216': 'U', + '\u01AF': 'U', + '\u1EEA': 'U', + '\u1EE8': 'U', + '\u1EEE': 'U', + '\u1EEC': 'U', + '\u1EF0': 'U', + '\u1EE4': 'U', + '\u1E72': 'U', + '\u0172': 'U', + '\u1E76': 'U', + '\u1E74': 'U', + '\u0244': 'U', + '\u24CB': 'V', + '\uFF36': 'V', + '\u1E7C': 'V', + '\u1E7E': 'V', + '\u01B2': 'V', + '\uA75E': 'V', + '\u0245': 'V', + '\uA760': 'VY', + '\u24CC': 'W', + '\uFF37': 'W', + '\u1E80': 'W', + '\u1E82': 'W', + '\u0174': 'W', + '\u1E86': 'W', + '\u1E84': 'W', + '\u1E88': 'W', + '\u2C72': 'W', + '\u24CD': 'X', + '\uFF38': 'X', + '\u1E8A': 'X', + '\u1E8C': 'X', + '\u24CE': 'Y', + '\uFF39': 'Y', + '\u1EF2': 'Y', + '\u00DD': 'Y', + '\u0176': 'Y', + '\u1EF8': 'Y', + '\u0232': 'Y', + '\u1E8E': 'Y', + '\u0178': 'Y', + '\u1EF6': 'Y', + '\u1EF4': 'Y', + '\u01B3': 'Y', + '\u024E': 'Y', + '\u1EFE': 'Y', + '\u24CF': 'Z', + '\uFF3A': 'Z', + '\u0179': 'Z', + '\u1E90': 'Z', + '\u017B': 'Z', + '\u017D': 'Z', + '\u1E92': 'Z', + '\u1E94': 'Z', + '\u01B5': 'Z', + '\u0224': 'Z', + '\u2C7F': 'Z', + '\u2C6B': 'Z', + '\uA762': 'Z', + '\u24D0': 'a', + '\uFF41': 'a', + '\u1E9A': 'a', + '\u00E0': 'a', + '\u00E1': 'a', + '\u00E2': 'a', + '\u1EA7': 'a', + '\u1EA5': 'a', + '\u1EAB': 'a', + '\u1EA9': 'a', + '\u00E3': 'a', + '\u0101': 'a', + '\u0103': 'a', + '\u1EB1': 'a', + '\u1EAF': 'a', + '\u1EB5': 'a', + '\u1EB3': 'a', + '\u0227': 'a', + '\u01E1': 'a', + '\u00E4': 'a', + '\u01DF': 'a', + '\u1EA3': 'a', + '\u00E5': 'a', + '\u01FB': 'a', + '\u01CE': 'a', + '\u0201': 'a', + '\u0203': 'a', + '\u1EA1': 'a', + '\u1EAD': 'a', + '\u1EB7': 'a', + '\u1E01': 'a', + '\u0105': 'a', + '\u2C65': 'a', + '\u0250': 'a', + '\uA733': 'aa', + '\u00E6': 'ae', + '\u01FD': 'ae', + '\u01E3': 'ae', + '\uA735': 'ao', + '\uA737': 'au', + '\uA739': 'av', + '\uA73B': 'av', + '\uA73D': 'ay', + '\u24D1': 'b', + '\uFF42': 'b', + '\u1E03': 'b', + '\u1E05': 'b', + '\u1E07': 'b', + '\u0180': 'b', + '\u0183': 'b', + '\u0253': 'b', + '\u24D2': 'c', + '\uFF43': 'c', + '\u0107': 'c', + '\u0109': 'c', + '\u010B': 'c', + '\u010D': 'c', + '\u00E7': 'c', + '\u1E09': 'c', + '\u0188': 'c', + '\u023C': 'c', + '\uA73F': 'c', + '\u2184': 'c', + '\u24D3': 'd', + '\uFF44': 'd', + '\u1E0B': 'd', + '\u010F': 'd', + '\u1E0D': 'd', + '\u1E11': 'd', + '\u1E13': 'd', + '\u1E0F': 'd', + '\u0111': 'd', + '\u018C': 'd', + '\u0256': 'd', + '\u0257': 'd', + '\uA77A': 'd', + '\u01F3': 'dz', + '\u01C6': 'dz', + '\u24D4': 'e', + '\uFF45': 'e', + '\u00E8': 'e', + '\u00E9': 'e', + '\u00EA': 'e', + '\u1EC1': 'e', + '\u1EBF': 'e', + '\u1EC5': 'e', + '\u1EC3': 'e', + '\u1EBD': 'e', + '\u0113': 'e', + '\u1E15': 'e', + '\u1E17': 'e', + '\u0115': 'e', + '\u0117': 'e', + '\u00EB': 'e', + '\u1EBB': 'e', + '\u011B': 'e', + '\u0205': 'e', + '\u0207': 'e', + '\u1EB9': 'e', + '\u1EC7': 'e', + '\u0229': 'e', + '\u1E1D': 'e', + '\u0119': 'e', + '\u1E19': 'e', + '\u1E1B': 'e', + '\u0247': 'e', + '\u025B': 'e', + '\u01DD': 'e', + '\u24D5': 'f', + '\uFF46': 'f', + '\u1E1F': 'f', + '\u0192': 'f', + '\uA77C': 'f', + '\u24D6': 'g', + '\uFF47': 'g', + '\u01F5': 'g', + '\u011D': 'g', + '\u1E21': 'g', + '\u011F': 'g', + '\u0121': 'g', + '\u01E7': 'g', + '\u0123': 'g', + '\u01E5': 'g', + '\u0260': 'g', + '\uA7A1': 'g', + '\u1D79': 'g', + '\uA77F': 'g', + '\u24D7': 'h', + '\uFF48': 'h', + '\u0125': 'h', + '\u1E23': 'h', + '\u1E27': 'h', + '\u021F': 'h', + '\u1E25': 'h', + '\u1E29': 'h', + '\u1E2B': 'h', + '\u1E96': 'h', + '\u0127': 'h', + '\u2C68': 'h', + '\u2C76': 'h', + '\u0265': 'h', + '\u0195': 'hv', + '\u24D8': 'i', + '\uFF49': 'i', + '\u00EC': 'i', + '\u00ED': 'i', + '\u00EE': 'i', + '\u0129': 'i', + '\u012B': 'i', + '\u012D': 'i', + '\u00EF': 'i', + '\u1E2F': 'i', + '\u1EC9': 'i', + '\u01D0': 'i', + '\u0209': 'i', + '\u020B': 'i', + '\u1ECB': 'i', + '\u012F': 'i', + '\u1E2D': 'i', + '\u0268': 'i', + '\u0131': 'i', + '\u24D9': 'j', + '\uFF4A': 'j', + '\u0135': 'j', + '\u01F0': 'j', + '\u0249': 'j', + '\u24DA': 'k', + '\uFF4B': 'k', + '\u1E31': 'k', + '\u01E9': 'k', + '\u1E33': 'k', + '\u0137': 'k', + '\u1E35': 'k', + '\u0199': 'k', + '\u2C6A': 'k', + '\uA741': 'k', + '\uA743': 'k', + '\uA745': 'k', + '\uA7A3': 'k', + '\u24DB': 'l', + '\uFF4C': 'l', + '\u0140': 'l', + '\u013A': 'l', + '\u013E': 'l', + '\u1E37': 'l', + '\u1E39': 'l', + '\u013C': 'l', + '\u1E3D': 'l', + '\u1E3B': 'l', + '\u017F': 'l', + '\u0142': 'l', + '\u019A': 'l', + '\u026B': 'l', + '\u2C61': 'l', + '\uA749': 'l', + '\uA781': 'l', + '\uA747': 'l', + '\u01C9': 'lj', + '\u24DC': 'm', + '\uFF4D': 'm', + '\u1E3F': 'm', + '\u1E41': 'm', + '\u1E43': 'm', + '\u0271': 'm', + '\u026F': 'm', + '\u24DD': 'n', + '\uFF4E': 'n', + '\u01F9': 'n', + '\u0144': 'n', + '\u00F1': 'n', + '\u1E45': 'n', + '\u0148': 'n', + '\u1E47': 'n', + '\u0146': 'n', + '\u1E4B': 'n', + '\u1E49': 'n', + '\u019E': 'n', + '\u0272': 'n', + '\u0149': 'n', + '\uA791': 'n', + '\uA7A5': 'n', + '\u01CC': 'nj', + '\u24DE': 'o', + '\uFF4F': 'o', + '\u00F2': 'o', + '\u00F3': 'o', + '\u00F4': 'o', + '\u1ED3': 'o', + '\u1ED1': 'o', + '\u1ED7': 'o', + '\u1ED5': 'o', + '\u00F5': 'o', + '\u1E4D': 'o', + '\u022D': 'o', + '\u1E4F': 'o', + '\u014D': 'o', + '\u1E51': 'o', + '\u1E53': 'o', + '\u014F': 'o', + '\u022F': 'o', + '\u0231': 'o', + '\u00F6': 'o', + '\u022B': 'o', + '\u1ECF': 'o', + '\u0151': 'o', + '\u01D2': 'o', + '\u020D': 'o', + '\u020F': 'o', + '\u01A1': 'o', + '\u1EDD': 'o', + '\u1EDB': 'o', + '\u1EE1': 'o', + '\u1EDF': 'o', + '\u1EE3': 'o', + '\u1ECD': 'o', + '\u1ED9': 'o', + '\u01EB': 'o', + '\u01ED': 'o', + '\u00F8': 'o', + '\u01FF': 'o', + '\u0254': 'o', + '\uA74B': 'o', + '\uA74D': 'o', + '\u0275': 'o', + '\u01A3': 'oi', + '\u0223': 'ou', + '\uA74F': 'oo', + '\u24DF': 'p', + '\uFF50': 'p', + '\u1E55': 'p', + '\u1E57': 'p', + '\u01A5': 'p', + '\u1D7D': 'p', + '\uA751': 'p', + '\uA753': 'p', + '\uA755': 'p', + '\u24E0': 'q', + '\uFF51': 'q', + '\u024B': 'q', + '\uA757': 'q', + '\uA759': 'q', + '\u24E1': 'r', + '\uFF52': 'r', + '\u0155': 'r', + '\u1E59': 'r', + '\u0159': 'r', + '\u0211': 'r', + '\u0213': 'r', + '\u1E5B': 'r', + '\u1E5D': 'r', + '\u0157': 'r', + '\u1E5F': 'r', + '\u024D': 'r', + '\u027D': 'r', + '\uA75B': 'r', + '\uA7A7': 'r', + '\uA783': 'r', + '\u24E2': 's', + '\uFF53': 's', + '\u00DF': 's', + '\u015B': 's', + '\u1E65': 's', + '\u015D': 's', + '\u1E61': 's', + '\u0161': 's', + '\u1E67': 's', + '\u1E63': 's', + '\u1E69': 's', + '\u0219': 's', + '\u015F': 's', + '\u023F': 's', + '\uA7A9': 's', + '\uA785': 's', + '\u1E9B': 's', + '\u24E3': 't', + '\uFF54': 't', + '\u1E6B': 't', + '\u1E97': 't', + '\u0165': 't', + '\u1E6D': 't', + '\u021B': 't', + '\u0163': 't', + '\u1E71': 't', + '\u1E6F': 't', + '\u0167': 't', + '\u01AD': 't', + '\u0288': 't', + '\u2C66': 't', + '\uA787': 't', + '\uA729': 'tz', + '\u24E4': 'u', + '\uFF55': 'u', + '\u00F9': 'u', + '\u00FA': 'u', + '\u00FB': 'u', + '\u0169': 'u', + '\u1E79': 'u', + '\u016B': 'u', + '\u1E7B': 'u', + '\u016D': 'u', + '\u00FC': 'u', + '\u01DC': 'u', + '\u01D8': 'u', + '\u01D6': 'u', + '\u01DA': 'u', + '\u1EE7': 'u', + '\u016F': 'u', + '\u0171': 'u', + '\u01D4': 'u', + '\u0215': 'u', + '\u0217': 'u', + '\u01B0': 'u', + '\u1EEB': 'u', + '\u1EE9': 'u', + '\u1EEF': 'u', + '\u1EED': 'u', + '\u1EF1': 'u', + '\u1EE5': 'u', + '\u1E73': 'u', + '\u0173': 'u', + '\u1E77': 'u', + '\u1E75': 'u', + '\u0289': 'u', + '\u24E5': 'v', + '\uFF56': 'v', + '\u1E7D': 'v', + '\u1E7F': 'v', + '\u028B': 'v', + '\uA75F': 'v', + '\u028C': 'v', + '\uA761': 'vy', + '\u24E6': 'w', + '\uFF57': 'w', + '\u1E81': 'w', + '\u1E83': 'w', + '\u0175': 'w', + '\u1E87': 'w', + '\u1E85': 'w', + '\u1E98': 'w', + '\u1E89': 'w', + '\u2C73': 'w', + '\u24E7': 'x', + '\uFF58': 'x', + '\u1E8B': 'x', + '\u1E8D': 'x', + '\u24E8': 'y', + '\uFF59': 'y', + '\u1EF3': 'y', + '\u00FD': 'y', + '\u0177': 'y', + '\u1EF9': 'y', + '\u0233': 'y', + '\u1E8F': 'y', + '\u00FF': 'y', + '\u1EF7': 'y', + '\u1E99': 'y', + '\u1EF5': 'y', + '\u01B4': 'y', + '\u024F': 'y', + '\u1EFF': 'y', + '\u24E9': 'z', + '\uFF5A': 'z', + '\u017A': 'z', + '\u1E91': 'z', + '\u017C': 'z', + '\u017E': 'z', + '\u1E93': 'z', + '\u1E95': 'z', + '\u01B6': 'z', + '\u0225': 'z', + '\u0240': 'z', + '\u2C6C': 'z', + '\uA763': 'z', + '\u0386': '\u0391', + '\u0388': '\u0395', + '\u0389': '\u0397', + '\u038A': '\u0399', + '\u03AA': '\u0399', + '\u038C': '\u039F', + '\u038E': '\u03A5', + '\u03AB': '\u03A5', + '\u038F': '\u03A9', + '\u03AC': '\u03B1', + '\u03AD': '\u03B5', + '\u03AE': '\u03B7', + '\u03AF': '\u03B9', + '\u03CA': '\u03B9', + '\u0390': '\u03B9', + '\u03CC': '\u03BF', + '\u03CD': '\u03C5', + '\u03CB': '\u03C5', + '\u03B0': '\u03C5', + '\u03C9': '\u03C9', + '\u03C2': '\u03C3' + }; + + return diacritics; +}); + +S2.define('select2/data/base',[ + '../utils' +], function (Utils) { + function BaseAdapter ($element, options) { + BaseAdapter.__super__.constructor.call(this); + } + + Utils.Extend(BaseAdapter, Utils.Observable); + + BaseAdapter.prototype.current = function (callback) { + throw new Error('The `current` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.query = function (params, callback) { + throw new Error('The `query` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.bind = function (container, $container) { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.destroy = function () { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.generateResultId = function (container, data) { + var id = container.id + '-result-'; + + id += Utils.generateChars(4); + + if (data.id != null) { + id += '-' + data.id.toString(); + } else { + id += '-' + Utils.generateChars(4); + } + return id; + }; + + return BaseAdapter; +}); + +S2.define('select2/data/select',[ + './base', + '../utils', + 'jquery' +], function (BaseAdapter, Utils, $) { + function SelectAdapter ($element, options) { + this.$element = $element; + this.options = options; + + SelectAdapter.__super__.constructor.call(this); + } + + Utils.Extend(SelectAdapter, BaseAdapter); + + SelectAdapter.prototype.current = function (callback) { + var data = []; + var self = this; + + this.$element.find(':selected').each(function () { + var $option = $(this); + + var option = self.item($option); + + data.push(option); + }); + + callback(data); + }; + + SelectAdapter.prototype.select = function (data) { + var self = this; + + data.selected = true; + + // If data.element is a DOM node, use it instead + if ($(data.element).is('option')) { + data.element.selected = true; + + this.$element.trigger('change'); + + return; + } + + if (this.$element.prop('multiple')) { + this.current(function (currentData) { + var val = []; + + data = [data]; + data.push.apply(data, currentData); + + for (var d = 0; d < data.length; d++) { + var id = data[d].id; + + if ($.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + self.$element.trigger('change'); + }); + } else { + var val = data.id; + + this.$element.val(val); + this.$element.trigger('change'); + } + }; + + SelectAdapter.prototype.unselect = function (data) { + var self = this; + + if (!this.$element.prop('multiple')) { + return; + } + + data.selected = false; + + if ($(data.element).is('option')) { + data.element.selected = false; + + this.$element.trigger('change'); + + return; + } + + this.current(function (currentData) { + var val = []; + + for (var d = 0; d < currentData.length; d++) { + var id = currentData[d].id; + + if (id !== data.id && $.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + + self.$element.trigger('change'); + }); + }; + + SelectAdapter.prototype.bind = function (container, $container) { + var self = this; + + this.container = container; + + container.on('select', function (params) { + self.select(params.data); + }); + + container.on('unselect', function (params) { + self.unselect(params.data); + }); + }; + + SelectAdapter.prototype.destroy = function () { + // Remove anything added to child elements + this.$element.find('*').each(function () { + // Remove any custom data set by Select2 + Utils.RemoveData(this); + }); + }; + + SelectAdapter.prototype.query = function (params, callback) { + var data = []; + var self = this; + + var $options = this.$element.children(); + + $options.each(function () { + var $option = $(this); + + if (!$option.is('option') && !$option.is('optgroup')) { + return; + } + + var option = self.item($option); + + var matches = self.matches(params, option); + + if (matches !== null) { + data.push(matches); + } + }); + + callback({ + results: data + }); + }; + + SelectAdapter.prototype.addOptions = function ($options) { + Utils.appendMany(this.$element, $options); + }; + + SelectAdapter.prototype.option = function (data) { + var option; + + if (data.children) { + option = document.createElement('optgroup'); + option.label = data.text; + } else { + option = document.createElement('option'); + + if (option.textContent !== undefined) { + option.textContent = data.text; + } else { + option.innerText = data.text; + } + } + + if (data.id !== undefined) { + option.value = data.id; + } + + if (data.disabled) { + option.disabled = true; + } + + if (data.selected) { + option.selected = true; + } + + if (data.title) { + option.title = data.title; + } + + var $option = $(option); + + var normalizedData = this._normalizeItem(data); + normalizedData.element = option; + + // Override the option's data with the combined data + Utils.StoreData(option, 'data', normalizedData); + + return $option; + }; + + SelectAdapter.prototype.item = function ($option) { + var data = {}; + + data = Utils.GetData($option[0], 'data'); + + if (data != null) { + return data; + } + + if ($option.is('option')) { + data = { + id: $option.val(), + text: $option.text(), + disabled: $option.prop('disabled'), + selected: $option.prop('selected'), + title: $option.prop('title') + }; + } else if ($option.is('optgroup')) { + data = { + text: $option.prop('label'), + children: [], + title: $option.prop('title') + }; + + var $children = $option.children('option'); + var children = []; + + for (var c = 0; c < $children.length; c++) { + var $child = $($children[c]); + + var child = this.item($child); + + children.push(child); + } + + data.children = children; + } + + data = this._normalizeItem(data); + data.element = $option[0]; + + Utils.StoreData($option[0], 'data', data); + + return data; + }; + + SelectAdapter.prototype._normalizeItem = function (item) { + if (item !== Object(item)) { + item = { + id: item, + text: item + }; + } + + item = $.extend({}, { + text: '' + }, item); + + var defaults = { + selected: false, + disabled: false + }; + + if (item.id != null) { + item.id = item.id.toString(); + } + + if (item.text != null) { + item.text = item.text.toString(); + } + + if (item._resultId == null && item.id && this.container != null) { + item._resultId = this.generateResultId(this.container, item); + } + + return $.extend({}, defaults, item); + }; + + SelectAdapter.prototype.matches = function (params, data) { + var matcher = this.options.get('matcher'); + + return matcher(params, data); + }; + + return SelectAdapter; +}); + +S2.define('select2/data/array',[ + './select', + '../utils', + 'jquery' +], function (SelectAdapter, Utils, $) { + function ArrayAdapter ($element, options) { + var data = options.get('data') || []; + + ArrayAdapter.__super__.constructor.call(this, $element, options); + + this.addOptions(this.convertToOptions(data)); + } + + Utils.Extend(ArrayAdapter, SelectAdapter); + + ArrayAdapter.prototype.select = function (data) { + var $option = this.$element.find('option').filter(function (i, elm) { + return elm.value == data.id.toString(); + }); + + if ($option.length === 0) { + $option = this.option(data); + + this.addOptions($option); + } + + ArrayAdapter.__super__.select.call(this, data); + }; + + ArrayAdapter.prototype.convertToOptions = function (data) { + var self = this; + + var $existing = this.$element.find('option'); + var existingIds = $existing.map(function () { + return self.item($(this)).id; + }).get(); + + var $options = []; + + // Filter out all items except for the one passed in the argument + function onlyItem (item) { + return function () { + return $(this).val() == item.id; + }; + } + + for (var d = 0; d < data.length; d++) { + var item = this._normalizeItem(data[d]); + + // Skip items which were pre-loaded, only merge the data + if ($.inArray(item.id, existingIds) >= 0) { + var $existingOption = $existing.filter(onlyItem(item)); + + var existingData = this.item($existingOption); + var newData = $.extend(true, {}, item, existingData); + + var $newOption = this.option(newData); + + $existingOption.replaceWith($newOption); + + continue; + } + + var $option = this.option(item); + + if (item.children) { + var $children = this.convertToOptions(item.children); + + Utils.appendMany($option, $children); + } + + $options.push($option); + } + + return $options; + }; + + return ArrayAdapter; +}); + +S2.define('select2/data/ajax',[ + './array', + '../utils', + 'jquery' +], function (ArrayAdapter, Utils, $) { + function AjaxAdapter ($element, options) { + this.ajaxOptions = this._applyDefaults(options.get('ajax')); + + if (this.ajaxOptions.processResults != null) { + this.processResults = this.ajaxOptions.processResults; + } + + AjaxAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(AjaxAdapter, ArrayAdapter); + + AjaxAdapter.prototype._applyDefaults = function (options) { + var defaults = { + data: function (params) { + return $.extend({}, params, { + q: params.term + }); + }, + transport: function (params, success, failure) { + var $request = $.ajax(params); + + $request.then(success); + $request.fail(failure); + + return $request; + } + }; + + return $.extend({}, defaults, options, true); + }; + + AjaxAdapter.prototype.processResults = function (results) { + return results; + }; + + AjaxAdapter.prototype.query = function (params, callback) { + var matches = []; + var self = this; + + if (this._request != null) { + // JSONP requests cannot always be aborted + if ($.isFunction(this._request.abort)) { + this._request.abort(); + } + + this._request = null; + } + + var options = $.extend({ + type: 'GET' + }, this.ajaxOptions); + + if (typeof options.url === 'function') { + options.url = options.url.call(this.$element, params); + } + + if (typeof options.data === 'function') { + options.data = options.data.call(this.$element, params); + } + + function request () { + var $request = options.transport(options, function (data) { + var results = self.processResults(data, params); + + if (self.options.get('debug') && window.console && console.error) { + // Check to make sure that the response included a `results` key. + if (!results || !results.results || !$.isArray(results.results)) { + console.error( + 'Select2: The AJAX results did not return an array in the ' + + '`results` key of the response.' + ); + } + } + + callback(results); + }, function () { + // Attempt to detect if a request was aborted + // Only works if the transport exposes a status property + if ('status' in $request && + ($request.status === 0 || $request.status === '0')) { + return; + } + + self.trigger('results:message', { + message: 'errorLoading' + }); + }); + + self._request = $request; + } + + if (this.ajaxOptions.delay && params.term != null) { + if (this._queryTimeout) { + window.clearTimeout(this._queryTimeout); + } + + this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); + } else { + request(); + } + }; + + return AjaxAdapter; +}); + +S2.define('select2/data/tags',[ + 'jquery' +], function ($) { + function Tags (decorated, $element, options) { + var tags = options.get('tags'); + + var createTag = options.get('createTag'); + + if (createTag !== undefined) { + this.createTag = createTag; + } + + var insertTag = options.get('insertTag'); + + if (insertTag !== undefined) { + this.insertTag = insertTag; + } + + decorated.call(this, $element, options); + + if ($.isArray(tags)) { + for (var t = 0; t < tags.length; t++) { + var tag = tags[t]; + var item = this._normalizeItem(tag); + + var $option = this.option(item); + + this.$element.append($option); + } + } + } + + Tags.prototype.query = function (decorated, params, callback) { + var self = this; + + this._removeOldTags(); + + if (params.term == null || params.page != null) { + decorated.call(this, params, callback); + return; + } + + function wrapper (obj, child) { + var data = obj.results; + + for (var i = 0; i < data.length; i++) { + var option = data[i]; + + var checkChildren = ( + option.children != null && + !wrapper({ + results: option.children + }, true) + ); + + var optionText = (option.text || '').toUpperCase(); + var paramsTerm = (params.term || '').toUpperCase(); + + var checkText = optionText === paramsTerm; + + if (checkText || checkChildren) { + if (child) { + return false; + } + + obj.data = data; + callback(obj); + + return; + } + } + + if (child) { + return true; + } + + var tag = self.createTag(params); + + if (tag != null) { + var $option = self.option(tag); + $option.attr('data-select2-tag', true); + + self.addOptions([$option]); + + self.insertTag(data, tag); + } + + obj.results = data; + + callback(obj); + } + + decorated.call(this, params, wrapper); + }; + + Tags.prototype.createTag = function (decorated, params) { + var term = $.trim(params.term); + + if (term === '') { + return null; + } + + return { + id: term, + text: term + }; + }; + + Tags.prototype.insertTag = function (_, data, tag) { + data.unshift(tag); + }; + + Tags.prototype._removeOldTags = function (_) { + var tag = this._lastTag; + + var $options = this.$element.find('option[data-select2-tag]'); + + $options.each(function () { + if (this.selected) { + return; + } + + $(this).remove(); + }); + }; + + return Tags; +}); + +S2.define('select2/data/tokenizer',[ + 'jquery' +], function ($) { + function Tokenizer (decorated, $element, options) { + var tokenizer = options.get('tokenizer'); + + if (tokenizer !== undefined) { + this.tokenizer = tokenizer; + } + + decorated.call(this, $element, options); + } + + Tokenizer.prototype.bind = function (decorated, container, $container) { + decorated.call(this, container, $container); + + this.$search = container.dropdown.$search || container.selection.$search || + $container.find('.select2-search__field'); + }; + + Tokenizer.prototype.query = function (decorated, params, callback) { + var self = this; + + function createAndSelect (data) { + // Normalize the data object so we can use it for checks + var item = self._normalizeItem(data); + + // Check if the data object already exists as a tag + // Select it if it doesn't + var $existingOptions = self.$element.find('option').filter(function () { + return $(this).val() === item.id; + }); + + // If an existing option wasn't found for it, create the option + if (!$existingOptions.length) { + var $option = self.option(item); + $option.attr('data-select2-tag', true); + + self._removeOldTags(); + self.addOptions([$option]); + } + + // Select the item, now that we know there is an option for it + select(item); + } + + function select (data) { + self.trigger('select', { + data: data + }); + } + + params.term = params.term || ''; + + var tokenData = this.tokenizer(params, this.options, createAndSelect); + + if (tokenData.term !== params.term) { + // Replace the search term if we have the search box + if (this.$search.length) { + this.$search.val(tokenData.term); + this.$search.focus(); + } + + params.term = tokenData.term; + } + + decorated.call(this, params, callback); + }; + + Tokenizer.prototype.tokenizer = function (_, params, options, callback) { + var separators = options.get('tokenSeparators') || []; + var term = params.term; + var i = 0; + + var createTag = this.createTag || function (params) { + return { + id: params.term, + text: params.term + }; + }; + + while (i < term.length) { + var termChar = term[i]; + + if ($.inArray(termChar, separators) === -1) { + i++; + + continue; + } + + var part = term.substr(0, i); + var partParams = $.extend({}, params, { + term: part + }); + + var data = createTag(partParams); + + if (data == null) { + i++; + continue; + } + + callback(data); + + // Reset the term to not include the tokenized portion + term = term.substr(i + 1) || ''; + i = 0; + } + + return { + term: term + }; + }; + + return Tokenizer; +}); + +S2.define('select2/data/minimumInputLength',[ + +], function () { + function MinimumInputLength (decorated, $e, options) { + this.minimumInputLength = options.get('minimumInputLength'); + + decorated.call(this, $e, options); + } + + MinimumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (params.term.length < this.minimumInputLength) { + this.trigger('results:message', { + message: 'inputTooShort', + args: { + minimum: this.minimumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MinimumInputLength; +}); + +S2.define('select2/data/maximumInputLength',[ + +], function () { + function MaximumInputLength (decorated, $e, options) { + this.maximumInputLength = options.get('maximumInputLength'); + + decorated.call(this, $e, options); + } + + MaximumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (this.maximumInputLength > 0 && + params.term.length > this.maximumInputLength) { + this.trigger('results:message', { + message: 'inputTooLong', + args: { + maximum: this.maximumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MaximumInputLength; +}); + +S2.define('select2/data/maximumSelectionLength',[ + +], function (){ + function MaximumSelectionLength (decorated, $e, options) { + this.maximumSelectionLength = options.get('maximumSelectionLength'); + + decorated.call(this, $e, options); + } + + MaximumSelectionLength.prototype.query = + function (decorated, params, callback) { + var self = this; + + this.current(function (currentData) { + var count = currentData != null ? currentData.length : 0; + if (self.maximumSelectionLength > 0 && + count >= self.maximumSelectionLength) { + self.trigger('results:message', { + message: 'maximumSelected', + args: { + maximum: self.maximumSelectionLength + } + }); + return; + } + decorated.call(self, params, callback); + }); + }; + + return MaximumSelectionLength; +}); + +S2.define('select2/dropdown',[ + 'jquery', + './utils' +], function ($, Utils) { + function Dropdown ($element, options) { + this.$element = $element; + this.options = options; + + Dropdown.__super__.constructor.call(this); + } + + Utils.Extend(Dropdown, Utils.Observable); + + Dropdown.prototype.render = function () { + var $dropdown = $( + '' + + '' + + '' + ); + + $dropdown.attr('dir', this.options.get('dir')); + + this.$dropdown = $dropdown; + + return $dropdown; + }; + + Dropdown.prototype.bind = function () { + // Should be implemented in subclasses + }; + + Dropdown.prototype.position = function ($dropdown, $container) { + // Should be implmented in subclasses + }; + + Dropdown.prototype.destroy = function () { + // Remove the dropdown from the DOM + this.$dropdown.remove(); + }; + + return Dropdown; +}); + +S2.define('select2/dropdown/search',[ + 'jquery', + '../utils' +], function ($, Utils) { + function Search () { } + + Search.prototype.render = function (decorated) { + var $rendered = decorated.call(this); + + var $search = $( + '' + + '' + + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + $rendered.prepend($search); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + this.$search.on('keydown', function (evt) { + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + }); + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$search.on('input', function (evt) { + // Unbind the duplicated `keyup` event + $(this).off('keyup'); + }); + + this.$search.on('keyup input', function (evt) { + self.handleSearch(evt); + }); + + container.on('open', function () { + self.$search.attr('tabindex', 0); + + self.$search.focus(); + + window.setTimeout(function () { + self.$search.focus(); + }, 0); + }); + + container.on('close', function () { + self.$search.attr('tabindex', -1); + + self.$search.val(''); + self.$search.blur(); + }); + + container.on('focus', function () { + if (!container.isOpen()) { + self.$search.focus(); + } + }); + + container.on('results:all', function (params) { + if (params.query.term == null || params.query.term === '') { + var showSearch = self.showSearch(params); + + if (showSearch) { + self.$searchContainer.removeClass('select2-search--hide'); + } else { + self.$searchContainer.addClass('select2-search--hide'); + } + } + }); + }; + + Search.prototype.handleSearch = function (evt) { + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.showSearch = function (_, params) { + return true; + }; + + return Search; +}); + +S2.define('select2/dropdown/hidePlaceholder',[ + +], function () { + function HidePlaceholder (decorated, $element, options, dataAdapter) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options, dataAdapter); + } + + HidePlaceholder.prototype.append = function (decorated, data) { + data.results = this.removePlaceholder(data.results); + + decorated.call(this, data); + }; + + HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + HidePlaceholder.prototype.removePlaceholder = function (_, data) { + var modifiedData = data.slice(0); + + for (var d = data.length - 1; d >= 0; d--) { + var item = data[d]; + + if (this.placeholder.id === item.id) { + modifiedData.splice(d, 1); + } + } + + return modifiedData; + }; + + return HidePlaceholder; +}); + +S2.define('select2/dropdown/infiniteScroll',[ + 'jquery' +], function ($) { + function InfiniteScroll (decorated, $element, options, dataAdapter) { + this.lastParams = {}; + + decorated.call(this, $element, options, dataAdapter); + + this.$loadingMore = this.createLoadingMore(); + this.loading = false; + } + + InfiniteScroll.prototype.append = function (decorated, data) { + this.$loadingMore.remove(); + this.loading = false; + + decorated.call(this, data); + + if (this.showLoadingMore(data)) { + this.$results.append(this.$loadingMore); + } + }; + + InfiniteScroll.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('query', function (params) { + self.lastParams = params; + self.loading = true; + }); + + container.on('query:append', function (params) { + self.lastParams = params; + self.loading = true; + }); + + this.$results.on('scroll', function () { + var isLoadMoreVisible = $.contains( + document.documentElement, + self.$loadingMore[0] + ); + + if (self.loading || !isLoadMoreVisible) { + return; + } + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var loadingMoreOffset = self.$loadingMore.offset().top + + self.$loadingMore.outerHeight(false); + + if (currentOffset + 50 >= loadingMoreOffset) { + self.loadMore(); + } + }); + }; + + InfiniteScroll.prototype.loadMore = function () { + this.loading = true; + + var params = $.extend({}, {page: 1}, this.lastParams); + + params.page++; + + this.trigger('query:append', params); + }; + + InfiniteScroll.prototype.showLoadingMore = function (_, data) { + return data.pagination && data.pagination.more; + }; + + InfiniteScroll.prototype.createLoadingMore = function () { + var $option = $( + '
        • ' + ); + + var message = this.options.get('translations').get('loadingMore'); + + $option.html(message(this.lastParams)); + + return $option; + }; + + return InfiniteScroll; +}); + +S2.define('select2/dropdown/attachBody',[ + 'jquery', + '../utils' +], function ($, Utils) { + function AttachBody (decorated, $element, options) { + this.$dropdownParent = options.get('dropdownParent') || $(document.body); + + decorated.call(this, $element, options); + } + + AttachBody.prototype.bind = function (decorated, container, $container) { + var self = this; + + var setupResultsEvents = false; + + decorated.call(this, container, $container); + + container.on('open', function () { + self._showDropdown(); + self._attachPositioningHandler(container); + + if (!setupResultsEvents) { + setupResultsEvents = true; + + container.on('results:all', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:append', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + } + }); + + container.on('close', function () { + self._hideDropdown(); + self._detachPositioningHandler(container); + }); + + this.$dropdownContainer.on('mousedown', function (evt) { + evt.stopPropagation(); + }); + }; + + AttachBody.prototype.destroy = function (decorated) { + decorated.call(this); + + this.$dropdownContainer.remove(); + }; + + AttachBody.prototype.position = function (decorated, $dropdown, $container) { + // Clone all of the container classes + $dropdown.attr('class', $container.attr('class')); + + $dropdown.removeClass('select2'); + $dropdown.addClass('select2-container--open'); + + $dropdown.css({ + position: 'absolute', + top: -999999 + }); + + this.$container = $container; + }; + + AttachBody.prototype.render = function (decorated) { + var $container = $(''); + + var $dropdown = decorated.call(this); + $container.append($dropdown); + + this.$dropdownContainer = $container; + + return $container; + }; + + AttachBody.prototype._hideDropdown = function (decorated) { + this.$dropdownContainer.detach(); + }; + + AttachBody.prototype._attachPositioningHandler = + function (decorated, container) { + var self = this; + + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.each(function () { + Utils.StoreData(this, 'select2-scroll-position', { + x: $(this).scrollLeft(), + y: $(this).scrollTop() + }); + }); + + $watchers.on(scrollEvent, function (ev) { + var position = Utils.GetData(this, 'select2-scroll-position'); + $(this).scrollTop(position.y); + }); + + $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, + function (e) { + self._positionDropdown(); + self._resizeDropdown(); + }); + }; + + AttachBody.prototype._detachPositioningHandler = + function (decorated, container) { + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.off(scrollEvent); + + $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); + }; + + AttachBody.prototype._positionDropdown = function () { + var $window = $(window); + + var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); + var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); + + var newDirection = null; + + var offset = this.$container.offset(); + + offset.bottom = offset.top + this.$container.outerHeight(false); + + var container = { + height: this.$container.outerHeight(false) + }; + + container.top = offset.top; + container.bottom = offset.top + container.height; + + var dropdown = { + height: this.$dropdown.outerHeight(false) + }; + + var viewport = { + top: $window.scrollTop(), + bottom: $window.scrollTop() + $window.height() + }; + + var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); + var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); + + var css = { + left: offset.left, + top: container.bottom + }; + + // Determine what the parent element is to use for calciulating the offset + var $offsetParent = this.$dropdownParent; + + // For statically positoned elements, we need to get the element + // that is determining the offset + if ($offsetParent.css('position') === 'static') { + $offsetParent = $offsetParent.offsetParent(); + } + + var parentOffset = $offsetParent.offset(); + + css.top -= parentOffset.top; + css.left -= parentOffset.left; + + if (!isCurrentlyAbove && !isCurrentlyBelow) { + newDirection = 'below'; + } + + if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { + newDirection = 'above'; + } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { + newDirection = 'below'; + } + + if (newDirection == 'above' || + (isCurrentlyAbove && newDirection !== 'below')) { + css.top = container.top - parentOffset.top - dropdown.height; + } + + if (newDirection != null) { + this.$dropdown + .removeClass('select2-dropdown--below select2-dropdown--above') + .addClass('select2-dropdown--' + newDirection); + this.$container + .removeClass('select2-container--below select2-container--above') + .addClass('select2-container--' + newDirection); + } + + this.$dropdownContainer.css(css); + }; + + AttachBody.prototype._resizeDropdown = function () { + var css = { + width: this.$container.outerWidth(false) + 'px' + }; + + if (this.options.get('dropdownAutoWidth')) { + css.minWidth = css.width; + css.position = 'relative'; + css.width = 'auto'; + } + + this.$dropdown.css(css); + }; + + AttachBody.prototype._showDropdown = function (decorated) { + this.$dropdownContainer.appendTo(this.$dropdownParent); + + this._positionDropdown(); + this._resizeDropdown(); + }; + + return AttachBody; +}); + +S2.define('select2/dropdown/minimumResultsForSearch',[ + +], function () { + function countResults (data) { + var count = 0; + + for (var d = 0; d < data.length; d++) { + var item = data[d]; + + if (item.children) { + count += countResults(item.children); + } else { + count++; + } + } + + return count; + } + + function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { + this.minimumResultsForSearch = options.get('minimumResultsForSearch'); + + if (this.minimumResultsForSearch < 0) { + this.minimumResultsForSearch = Infinity; + } + + decorated.call(this, $element, options, dataAdapter); + } + + MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { + if (countResults(params.data.results) < this.minimumResultsForSearch) { + return false; + } + + return decorated.call(this, params); + }; + + return MinimumResultsForSearch; +}); + +S2.define('select2/dropdown/selectOnClose',[ + '../utils' +], function (Utils) { + function SelectOnClose () { } + + SelectOnClose.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('close', function (params) { + self._handleSelectOnClose(params); + }); + }; + + SelectOnClose.prototype._handleSelectOnClose = function (_, params) { + if (params && params.originalSelect2Event != null) { + var event = params.originalSelect2Event; + + // Don't select an item if the close event was triggered from a select or + // unselect event + if (event._type === 'select' || event._type === 'unselect') { + return; + } + } + + var $highlightedResults = this.getHighlightedResults(); + + // Only select highlighted results + if ($highlightedResults.length < 1) { + return; + } + + var data = Utils.GetData($highlightedResults[0], 'data'); + + // Don't re-select already selected resulte + if ( + (data.element != null && data.element.selected) || + (data.element == null && data.selected) + ) { + return; + } + + this.trigger('select', { + data: data + }); + }; + + return SelectOnClose; +}); + +S2.define('select2/dropdown/closeOnSelect',[ + +], function () { + function CloseOnSelect () { } + + CloseOnSelect.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function (evt) { + self._selectTriggered(evt); + }); + + container.on('unselect', function (evt) { + self._selectTriggered(evt); + }); + }; + + CloseOnSelect.prototype._selectTriggered = function (_, evt) { + var originalEvent = evt.originalEvent; + + // Don't close if the control key is being held + if (originalEvent && originalEvent.ctrlKey) { + return; + } + + this.trigger('close', { + originalEvent: originalEvent, + originalSelect2Event: evt + }); + }; + + return CloseOnSelect; +}); + +S2.define('select2/i18n/en',[],function () { + // English + return { + errorLoading: function () { + return 'The results could not be loaded.'; + }, + inputTooLong: function (args) { + var overChars = args.input.length - args.maximum; + + var message = 'Please delete ' + overChars + ' character'; + + if (overChars != 1) { + message += 's'; + } + + return message; + }, + inputTooShort: function (args) { + var remainingChars = args.minimum - args.input.length; + + var message = 'Please enter ' + remainingChars + ' or more characters'; + + return message; + }, + loadingMore: function () { + return 'Loading more results…'; + }, + maximumSelected: function (args) { + var message = 'You can only select ' + args.maximum + ' item'; + + if (args.maximum != 1) { + message += 's'; + } + + return message; + }, + noResults: function () { + return 'No results found'; + }, + searching: function () { + return 'Searching…'; + } + }; +}); + +S2.define('select2/defaults',[ + 'jquery', + 'require', + + './results', + + './selection/single', + './selection/multiple', + './selection/placeholder', + './selection/allowClear', + './selection/search', + './selection/eventRelay', + + './utils', + './translation', + './diacritics', + + './data/select', + './data/array', + './data/ajax', + './data/tags', + './data/tokenizer', + './data/minimumInputLength', + './data/maximumInputLength', + './data/maximumSelectionLength', + + './dropdown', + './dropdown/search', + './dropdown/hidePlaceholder', + './dropdown/infiniteScroll', + './dropdown/attachBody', + './dropdown/minimumResultsForSearch', + './dropdown/selectOnClose', + './dropdown/closeOnSelect', + + './i18n/en' +], function ($, require, + + ResultsList, + + SingleSelection, MultipleSelection, Placeholder, AllowClear, + SelectionSearch, EventRelay, + + Utils, Translation, DIACRITICS, + + SelectData, ArrayData, AjaxData, Tags, Tokenizer, + MinimumInputLength, MaximumInputLength, MaximumSelectionLength, + + Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, + AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, + + EnglishTranslation) { + function Defaults () { + this.reset(); + } + + Defaults.prototype.apply = function (options) { + options = $.extend(true, {}, this.defaults, options); + + if (options.dataAdapter == null) { + if (options.ajax != null) { + options.dataAdapter = AjaxData; + } else if (options.data != null) { + options.dataAdapter = ArrayData; + } else { + options.dataAdapter = SelectData; + } + + if (options.minimumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MinimumInputLength + ); + } + + if (options.maximumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumInputLength + ); + } + + if (options.maximumSelectionLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumSelectionLength + ); + } + + if (options.tags) { + options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); + } + + if (options.tokenSeparators != null || options.tokenizer != null) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Tokenizer + ); + } + + if (options.query != null) { + var Query = require(options.amdBase + 'compat/query'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Query + ); + } + + if (options.initSelection != null) { + var InitSelection = require(options.amdBase + 'compat/initSelection'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + InitSelection + ); + } + } + + if (options.resultsAdapter == null) { + options.resultsAdapter = ResultsList; + + if (options.ajax != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + InfiniteScroll + ); + } + + if (options.placeholder != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + HidePlaceholder + ); + } + + if (options.selectOnClose) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + SelectOnClose + ); + } + } + + if (options.dropdownAdapter == null) { + if (options.multiple) { + options.dropdownAdapter = Dropdown; + } else { + var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); + + options.dropdownAdapter = SearchableDropdown; + } + + if (options.minimumResultsForSearch !== 0) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + MinimumResultsForSearch + ); + } + + if (options.closeOnSelect) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + CloseOnSelect + ); + } + + if ( + options.dropdownCssClass != null || + options.dropdownCss != null || + options.adaptDropdownCssClass != null + ) { + var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + DropdownCSS + ); + } + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + AttachBody + ); + } + + if (options.selectionAdapter == null) { + if (options.multiple) { + options.selectionAdapter = MultipleSelection; + } else { + options.selectionAdapter = SingleSelection; + } + + // Add the placeholder mixin if a placeholder was specified + if (options.placeholder != null) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + Placeholder + ); + } + + if (options.allowClear) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + AllowClear + ); + } + + if (options.multiple) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + SelectionSearch + ); + } + + if ( + options.containerCssClass != null || + options.containerCss != null || + options.adaptContainerCssClass != null + ) { + var ContainerCSS = require(options.amdBase + 'compat/containerCss'); + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + ContainerCSS + ); + } + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + EventRelay + ); + } + + if (typeof options.language === 'string') { + // Check if the language is specified with a region + if (options.language.indexOf('-') > 0) { + // Extract the region information if it is included + var languageParts = options.language.split('-'); + var baseLanguage = languageParts[0]; + + options.language = [options.language, baseLanguage]; + } else { + options.language = [options.language]; + } + } + + if ($.isArray(options.language)) { + var languages = new Translation(); + options.language.push('en'); + + var languageNames = options.language; + + for (var l = 0; l < languageNames.length; l++) { + var name = languageNames[l]; + var language = {}; + + try { + // Try to load it with the original name + language = Translation.loadPath(name); + } catch (e) { + try { + // If we couldn't load it, check if it wasn't the full path + name = this.defaults.amdLanguageBase + name; + language = Translation.loadPath(name); + } catch (ex) { + // The translation could not be loaded at all. Sometimes this is + // because of a configuration problem, other times this can be + // because of how Select2 helps load all possible translation files. + if (options.debug && window.console && console.warn) { + console.warn( + 'Select2: The language file for "' + name + '" could not be ' + + 'automatically loaded. A fallback will be used instead.' + ); + } + + continue; + } + } + + languages.extend(language); + } + + options.translations = languages; + } else { + var baseTranslation = Translation.loadPath( + this.defaults.amdLanguageBase + 'en' + ); + var customTranslation = new Translation(options.language); + + customTranslation.extend(baseTranslation); + + options.translations = customTranslation; + } + + return options; + }; + + Defaults.prototype.reset = function () { + function stripDiacritics (text) { + // Used 'uni range + named function' from http://jsperf.com/diacritics/18 + function match(a) { + return DIACRITICS[a] || a; + } + + return text.replace(/[^\u0000-\u007E]/g, match); + } + + function matcher (params, data) { + // Always return the object if there is nothing to compare + if ($.trim(params.term) === '') { + return data; + } + + // Do a recursive check for options with children + if (data.children && data.children.length > 0) { + // Clone the data object if there are children + // This is required as we modify the object to remove any non-matches + var match = $.extend(true, {}, data); + + // Check each child of the option + for (var c = data.children.length - 1; c >= 0; c--) { + var child = data.children[c]; + + var matches = matcher(params, child); + + // If there wasn't a match, remove the object in the array + if (matches == null) { + match.children.splice(c, 1); + } + } + + // If any children matched, return the new object + if (match.children.length > 0) { + return match; + } + + // If there were no matching children, check just the plain object + return matcher(params, match); + } + + var original = stripDiacritics(data.text).toUpperCase(); + var term = stripDiacritics(params.term).toUpperCase(); + + // Check if the text contains the term + if (original.indexOf(term) > -1) { + return data; + } + + // If it doesn't contain the term, don't return anything + return null; + } + + this.defaults = { + amdBase: './', + amdLanguageBase: './i18n/', + closeOnSelect: true, + debug: false, + dropdownAutoWidth: false, + escapeMarkup: Utils.escapeMarkup, + language: EnglishTranslation, + matcher: matcher, + minimumInputLength: 0, + maximumInputLength: 0, + maximumSelectionLength: 0, + minimumResultsForSearch: 0, + selectOnClose: false, + sorter: function (data) { + return data; + }, + templateResult: function (result) { + return result.text; + }, + templateSelection: function (selection) { + return selection.text; + }, + theme: 'default', + width: 'resolve' + }; + }; + + Defaults.prototype.set = function (key, value) { + var camelKey = $.camelCase(key); + + var data = {}; + data[camelKey] = value; + + var convertedData = Utils._convertData(data); + + $.extend(true, this.defaults, convertedData); + }; + + var defaults = new Defaults(); + + return defaults; +}); + +S2.define('select2/options',[ + 'require', + 'jquery', + './defaults', + './utils' +], function (require, $, Defaults, Utils) { + function Options (options, $element) { + this.options = options; + + if ($element != null) { + this.fromElement($element); + } + + this.options = Defaults.apply(this.options); + + if ($element && $element.is('input')) { + var InputCompat = require(this.get('amdBase') + 'compat/inputData'); + + this.options.dataAdapter = Utils.Decorate( + this.options.dataAdapter, + InputCompat + ); + } + } + + Options.prototype.fromElement = function ($e) { + var excludedData = ['select2']; + + if (this.options.multiple == null) { + this.options.multiple = $e.prop('multiple'); + } + + if (this.options.disabled == null) { + this.options.disabled = $e.prop('disabled'); + } + + if (this.options.language == null) { + if ($e.prop('lang')) { + this.options.language = $e.prop('lang').toLowerCase(); + } else if ($e.closest('[lang]').prop('lang')) { + this.options.language = $e.closest('[lang]').prop('lang'); + } + } + + if (this.options.dir == null) { + if ($e.prop('dir')) { + this.options.dir = $e.prop('dir'); + } else if ($e.closest('[dir]').prop('dir')) { + this.options.dir = $e.closest('[dir]').prop('dir'); + } else { + this.options.dir = 'ltr'; + } + } + + $e.prop('disabled', this.options.disabled); + $e.prop('multiple', this.options.multiple); + + if (Utils.GetData($e[0], 'select2Tags')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-select2-tags` attribute has been changed to ' + + 'use the `data-data` and `data-tags="true"` attributes and will be ' + + 'removed in future versions of Select2.' + ); + } + + Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); + Utils.StoreData($e[0], 'tags', true); + } + + if (Utils.GetData($e[0], 'ajaxUrl')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-ajax-url` attribute has been changed to ' + + '`data-ajax--url` and support for the old attribute will be removed' + + ' in future versions of Select2.' + ); + } + + $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); + Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); + + } + + var dataset = {}; + + // Prefer the element's `dataset` attribute if it exists + // jQuery 1.x does not correctly handle data attributes with multiple dashes + if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { + dataset = $.extend(true, {}, $e[0].dataset, Utils.GetData($e[0])); + } else { + dataset = Utils.GetData($e[0]); + } + + var data = $.extend(true, {}, dataset); + + data = Utils._convertData(data); + + for (var key in data) { + if ($.inArray(key, excludedData) > -1) { + continue; + } + + if ($.isPlainObject(this.options[key])) { + $.extend(this.options[key], data[key]); + } else { + this.options[key] = data[key]; + } + } + + return this; + }; + + Options.prototype.get = function (key) { + return this.options[key]; + }; + + Options.prototype.set = function (key, val) { + this.options[key] = val; + }; + + return Options; +}); + +S2.define('select2/core',[ + 'jquery', + './options', + './utils', + './keys' +], function ($, Options, Utils, KEYS) { + var Select2 = function ($element, options) { + if (Utils.GetData($element[0], 'select2') != null) { + Utils.GetData($element[0], 'select2').destroy(); + } + + this.$element = $element; + + this.id = this._generateId($element); + + options = options || {}; + + this.options = new Options(options, $element); + + Select2.__super__.constructor.call(this); + + // Set up the tabindex + + var tabindex = $element.attr('tabindex') || 0; + Utils.StoreData($element[0], 'old-tabindex', tabindex); + $element.attr('tabindex', '-1'); + + // Set up containers and adapters + + var DataAdapter = this.options.get('dataAdapter'); + this.dataAdapter = new DataAdapter($element, this.options); + + var $container = this.render(); + + this._placeContainer($container); + + var SelectionAdapter = this.options.get('selectionAdapter'); + this.selection = new SelectionAdapter($element, this.options); + this.$selection = this.selection.render(); + + this.selection.position(this.$selection, $container); + + var DropdownAdapter = this.options.get('dropdownAdapter'); + this.dropdown = new DropdownAdapter($element, this.options); + this.$dropdown = this.dropdown.render(); + + this.dropdown.position(this.$dropdown, $container); + + var ResultsAdapter = this.options.get('resultsAdapter'); + this.results = new ResultsAdapter($element, this.options, this.dataAdapter); + this.$results = this.results.render(); + + this.results.position(this.$results, this.$dropdown); + + // Bind events + + var self = this; + + // Bind the container to all of the adapters + this._bindAdapters(); + + // Register any DOM event handlers + this._registerDomEvents(); + + // Register any internal event handlers + this._registerDataEvents(); + this._registerSelectionEvents(); + this._registerDropdownEvents(); + this._registerResultsEvents(); + this._registerEvents(); + + // Set the initial state + this.dataAdapter.current(function (initialData) { + self.trigger('selection:update', { + data: initialData + }); + }); + + // Hide the original select + $element.addClass('select2-hidden-accessible'); + $element.attr('aria-hidden', 'true'); + + // Synchronize any monitored attributes + this._syncAttributes(); + + Utils.StoreData($element[0], 'select2', this); + + // Ensure backwards compatibility with $element.data('select2'). + $element.data('select2', this); + }; + + Utils.Extend(Select2, Utils.Observable); + + Select2.prototype._generateId = function ($element) { + var id = ''; + + if ($element.attr('id') != null) { + id = $element.attr('id'); + } else if ($element.attr('name') != null) { + id = $element.attr('name') + '-' + Utils.generateChars(2); + } else { + id = Utils.generateChars(4); + } + + id = id.replace(/(:|\.|\[|\]|,)/g, ''); + id = 'select2-' + id; + + return id; + }; + + Select2.prototype._placeContainer = function ($container) { + $container.insertAfter(this.$element); + + var width = this._resolveWidth(this.$element, this.options.get('width')); + + if (width != null) { + $container.css('width', width); + } + }; + + Select2.prototype._resolveWidth = function ($element, method) { + var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; + + if (method == 'resolve') { + var styleWidth = this._resolveWidth($element, 'style'); + + if (styleWidth != null) { + return styleWidth; + } + + return this._resolveWidth($element, 'element'); + } + + if (method == 'element') { + var elementWidth = $element.outerWidth(false); + + if (elementWidth <= 0) { + return 'auto'; + } + + return elementWidth + 'px'; + } + + if (method == 'style') { + var style = $element.attr('style'); + + if (typeof(style) !== 'string') { + return null; + } + + var attrs = style.split(';'); + + for (var i = 0, l = attrs.length; i < l; i = i + 1) { + var attr = attrs[i].replace(/\s/g, ''); + var matches = attr.match(WIDTH); + + if (matches !== null && matches.length >= 1) { + return matches[1]; + } + } + + return null; + } + + return method; + }; + + Select2.prototype._bindAdapters = function () { + this.dataAdapter.bind(this, this.$container); + this.selection.bind(this, this.$container); + + this.dropdown.bind(this, this.$container); + this.results.bind(this, this.$container); + }; + + Select2.prototype._registerDomEvents = function () { + var self = this; + + this.$element.on('change.select2', function () { + self.dataAdapter.current(function (data) { + self.trigger('selection:update', { + data: data + }); + }); + }); + + this.$element.on('focus.select2', function (evt) { + self.trigger('focus', evt); + }); + + this._syncA = Utils.bind(this._syncAttributes, this); + this._syncS = Utils.bind(this._syncSubtree, this); + + if (this.$element[0].attachEvent) { + this.$element[0].attachEvent('onpropertychange', this._syncA); + } + + var observer = window.MutationObserver || + window.WebKitMutationObserver || + window.MozMutationObserver + ; + + if (observer != null) { + this._observer = new observer(function (mutations) { + $.each(mutations, self._syncA); + $.each(mutations, self._syncS); + }); + this._observer.observe(this.$element[0], { + attributes: true, + childList: true, + subtree: false + }); + } else if (this.$element[0].addEventListener) { + this.$element[0].addEventListener( + 'DOMAttrModified', + self._syncA, + false + ); + this.$element[0].addEventListener( + 'DOMNodeInserted', + self._syncS, + false + ); + this.$element[0].addEventListener( + 'DOMNodeRemoved', + self._syncS, + false + ); + } + }; + + Select2.prototype._registerDataEvents = function () { + var self = this; + + this.dataAdapter.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerSelectionEvents = function () { + var self = this; + var nonRelayEvents = ['toggle', 'focus']; + + this.selection.on('toggle', function () { + self.toggleDropdown(); + }); + + this.selection.on('focus', function (params) { + self.focus(params); + }); + + this.selection.on('*', function (name, params) { + if ($.inArray(name, nonRelayEvents) !== -1) { + return; + } + + self.trigger(name, params); + }); + }; + + Select2.prototype._registerDropdownEvents = function () { + var self = this; + + this.dropdown.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerResultsEvents = function () { + var self = this; + + this.results.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerEvents = function () { + var self = this; + + this.on('open', function () { + self.$container.addClass('select2-container--open'); + }); + + this.on('close', function () { + self.$container.removeClass('select2-container--open'); + }); + + this.on('enable', function () { + self.$container.removeClass('select2-container--disabled'); + }); + + this.on('disable', function () { + self.$container.addClass('select2-container--disabled'); + }); + + this.on('blur', function () { + self.$container.removeClass('select2-container--focus'); + }); + + this.on('query', function (params) { + if (!self.isOpen()) { + self.trigger('open', {}); + } + + this.dataAdapter.query(params, function (data) { + self.trigger('results:all', { + data: data, + query: params + }); + }); + }); + + this.on('query:append', function (params) { + this.dataAdapter.query(params, function (data) { + self.trigger('results:append', { + data: data, + query: params + }); + }); + }); + + this.on('keypress', function (evt) { + var key = evt.which; + + if (self.isOpen()) { + if (key === KEYS.ESC || key === KEYS.TAB || + (key === KEYS.UP && evt.altKey)) { + self.close(); + + evt.preventDefault(); + } else if (key === KEYS.ENTER) { + self.trigger('results:select', {}); + + evt.preventDefault(); + } else if ((key === KEYS.SPACE && evt.ctrlKey)) { + self.trigger('results:toggle', {}); + + evt.preventDefault(); + } else if (key === KEYS.UP) { + self.trigger('results:previous', {}); + + evt.preventDefault(); + } else if (key === KEYS.DOWN) { + self.trigger('results:next', {}); + + evt.preventDefault(); + } + } else { + if (key === KEYS.ENTER || key === KEYS.SPACE || + (key === KEYS.DOWN && evt.altKey)) { + self.open(); + + evt.preventDefault(); + } + } + }); + }; + + Select2.prototype._syncAttributes = function () { + this.options.set('disabled', this.$element.prop('disabled')); + + if (this.options.get('disabled')) { + if (this.isOpen()) { + this.close(); + } + + this.trigger('disable', {}); + } else { + this.trigger('enable', {}); + } + }; + + Select2.prototype._syncSubtree = function (evt, mutations) { + var changed = false; + var self = this; + + // Ignore any mutation events raised for elements that aren't options or + // optgroups. This handles the case when the select element is destroyed + if ( + evt && evt.target && ( + evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' + ) + ) { + return; + } + + if (!mutations) { + // If mutation events aren't supported, then we can only assume that the + // change affected the selections + changed = true; + } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { + for (var n = 0; n < mutations.addedNodes.length; n++) { + var node = mutations.addedNodes[n]; + + if (node.selected) { + changed = true; + } + } + } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { + changed = true; + } + + // Only re-pull the data if we think there is a change + if (changed) { + this.dataAdapter.current(function (currentData) { + self.trigger('selection:update', { + data: currentData + }); + }); + } + }; + + /** + * Override the trigger method to automatically trigger pre-events when + * there are events that can be prevented. + */ + Select2.prototype.trigger = function (name, args) { + var actualTrigger = Select2.__super__.trigger; + var preTriggerMap = { + 'open': 'opening', + 'close': 'closing', + 'select': 'selecting', + 'unselect': 'unselecting', + 'clear': 'clearing' + }; + + if (args === undefined) { + args = {}; + } + + if (name in preTriggerMap) { + var preTriggerName = preTriggerMap[name]; + var preTriggerArgs = { + prevented: false, + name: name, + args: args + }; + + actualTrigger.call(this, preTriggerName, preTriggerArgs); + + if (preTriggerArgs.prevented) { + args.prevented = true; + + return; + } + } + + actualTrigger.call(this, name, args); + }; + + Select2.prototype.toggleDropdown = function () { + if (this.options.get('disabled')) { + return; + } + + if (this.isOpen()) { + this.close(); + } else { + this.open(); + } + }; + + Select2.prototype.open = function () { + if (this.isOpen()) { + return; + } + + this.trigger('query', {}); + }; + + Select2.prototype.close = function () { + if (!this.isOpen()) { + return; + } + + this.trigger('close', {}); + }; + + Select2.prototype.isOpen = function () { + return this.$container.hasClass('select2-container--open'); + }; + + Select2.prototype.hasFocus = function () { + return this.$container.hasClass('select2-container--focus'); + }; + + Select2.prototype.focus = function (data) { + // No need to re-trigger focus events if we are already focused + if (this.hasFocus()) { + return; + } + + this.$container.addClass('select2-container--focus'); + this.trigger('focus', {}); + }; + + Select2.prototype.enable = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("enable")` method has been deprecated and will' + + ' be removed in later Select2 versions. Use $element.prop("disabled")' + + ' instead.' + ); + } + + if (args == null || args.length === 0) { + args = [true]; + } + + var disabled = !args[0]; + + this.$element.prop('disabled', disabled); + }; + + Select2.prototype.data = function () { + if (this.options.get('debug') && + arguments.length > 0 && window.console && console.warn) { + console.warn( + 'Select2: Data can no longer be set using `select2("data")`. You ' + + 'should consider setting the value instead using `$element.val()`.' + ); + } + + var data = []; + + this.dataAdapter.current(function (currentData) { + data = currentData; + }); + + return data; + }; + + Select2.prototype.val = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("val")` method has been deprecated and will be' + + ' removed in later Select2 versions. Use $element.val() instead.' + ); + } + + if (args == null || args.length === 0) { + return this.$element.val(); + } + + var newVal = args[0]; + + if ($.isArray(newVal)) { + newVal = $.map(newVal, function (obj) { + return obj.toString(); + }); + } + + this.$element.val(newVal).trigger('change'); + }; + + Select2.prototype.destroy = function () { + this.$container.remove(); + + if (this.$element[0].detachEvent) { + this.$element[0].detachEvent('onpropertychange', this._syncA); + } + + if (this._observer != null) { + this._observer.disconnect(); + this._observer = null; + } else if (this.$element[0].removeEventListener) { + this.$element[0] + .removeEventListener('DOMAttrModified', this._syncA, false); + this.$element[0] + .removeEventListener('DOMNodeInserted', this._syncS, false); + this.$element[0] + .removeEventListener('DOMNodeRemoved', this._syncS, false); + } + + this._syncA = null; + this._syncS = null; + + this.$element.off('.select2'); + this.$element.attr('tabindex', + Utils.GetData(this.$element[0], 'old-tabindex')); + + this.$element.removeClass('select2-hidden-accessible'); + this.$element.attr('aria-hidden', 'false'); + Utils.RemoveData(this.$element[0]); + this.$element.removeData('select2'); + + this.dataAdapter.destroy(); + this.selection.destroy(); + this.dropdown.destroy(); + this.results.destroy(); + + this.dataAdapter = null; + this.selection = null; + this.dropdown = null; + this.results = null; + }; + + Select2.prototype.render = function () { + var $container = $( + '' + + '' + + '' + + '' + ); + + $container.attr('dir', this.options.get('dir')); + + this.$container = $container; + + this.$container.addClass('select2-container--' + this.options.get('theme')); + + Utils.StoreData($container[0], 'element', this.$element); + + return $container; + }; + + return Select2; +}); + +S2.define('jquery-mousewheel',[ + 'jquery' +], function ($) { + // Used to shim jQuery.mousewheel for non-full builds. + return $; +}); + +S2.define('jquery.select2',[ + 'jquery', + 'jquery-mousewheel', + + './select2/core', + './select2/defaults', + './select2/utils' +], function ($, _, Select2, Defaults, Utils) { + if ($.fn.select2 == null) { + // All methods that should return the element + var thisMethods = ['open', 'close', 'destroy']; + + $.fn.select2 = function (options) { + options = options || {}; + + if (typeof options === 'object') { + this.each(function () { + var instanceOptions = $.extend(true, {}, options); + + var instance = new Select2($(this), instanceOptions); + }); + + return this; + } else if (typeof options === 'string') { + var ret; + var args = Array.prototype.slice.call(arguments, 1); + + this.each(function () { + var instance = Utils.GetData(this, 'select2'); + + if (instance == null && window.console && console.error) { + console.error( + 'The select2(\'' + options + '\') method was called on an ' + + 'element that is not using Select2.' + ); + } + + ret = instance[options].apply(instance, args); + }); + + // Check if we should be returning `this` + if ($.inArray(options, thisMethods) > -1) { + return this; + } + + return ret; + } else { + throw new Error('Invalid arguments for Select2: ' + options); + } + }; + } + + if ($.fn.select2.defaults == null) { + $.fn.select2.defaults = Defaults; + } + + return Select2; +}); + + // Return the AMD loader configuration so it can be used outside of this file + return { + define: S2.define, + require: S2.require + }; +}()); + + // Autoload the jQuery bindings + // We know that all of the modules exist above this, so we're safe + var select2 = S2.require('jquery.select2'); + + // Hold the AMD module references on the jQuery function that was just loaded + // This allows Select2 to use the internal loader outside of this file, such + // as in the language files. + jQuery.fn.select2.amd = S2; + + // Return the Select2 instance for anyone who is importing it. + return select2; +})); + +/*! + * typeahead.js 0.11.1 + * https://github.com/twitter/typeahead.js + * Copyright 2013-2015 Twitter, Inc. and other contributors; Licensed MIT + */ + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define("bloodhound", [ "jquery" ], function(a0) { + return root["Bloodhound"] = factory(a0); + }); + } else if (typeof exports === "object") { + module.exports = factory(require("jquery")); + } else { + root["Bloodhound"] = factory(jQuery); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), 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) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + noop: function() {} + }; + }(); + var VERSION = "0.11.1"; + var tokenizers = function() { + "use strict"; + return { + nonword: nonword, + whitespace: whitespace, + obj: { + nonword: getObjTokenizer(nonword), + whitespace: getObjTokenizer(whitespace) + } + }; + function whitespace(str) { + str = _.toStr(str); + return str ? str.split(/\s+/) : []; + } + function nonword(str) { + str = _.toStr(str); + return str ? str.split(/\W+/) : []; + } + function getObjTokenizer(tokenizer) { + return function setKey(keys) { + keys = _.isArray(keys) ? keys : [].slice.call(arguments, 0); + return function tokenize(o) { + var tokens = []; + _.each(keys, function(k) { + tokens = tokens.concat(tokenizer(_.toStr(o[k]))); + }); + return tokens; + }; + }; + } + }(); + var LruCache = function() { + "use strict"; + function LruCache(maxSize) { + this.maxSize = _.isNumber(maxSize) ? maxSize : 100; + this.reset(); + if (this.maxSize <= 0) { + this.set = this.get = $.noop; + } + } + _.mixin(LruCache.prototype, { + set: function set(key, val) { + var tailItem = this.list.tail, node; + if (this.size >= this.maxSize) { + this.list.remove(tailItem); + delete this.hash[tailItem.key]; + this.size--; + } + if (node = this.hash[key]) { + node.val = val; + this.list.moveToFront(node); + } else { + node = new Node(key, val); + this.list.add(node); + this.hash[key] = node; + this.size++; + } + }, + get: function get(key) { + var node = this.hash[key]; + if (node) { + this.list.moveToFront(node); + return node.val; + } + }, + reset: function reset() { + this.size = 0; + this.hash = {}; + this.list = new List(); + } + }); + function List() { + this.head = this.tail = null; + } + _.mixin(List.prototype, { + add: function add(node) { + if (this.head) { + node.next = this.head; + this.head.prev = node; + } + this.head = node; + this.tail = this.tail || node; + }, + remove: function remove(node) { + node.prev ? node.prev.next = node.next : this.head = node.next; + node.next ? node.next.prev = node.prev : this.tail = node.prev; + }, + moveToFront: function(node) { + this.remove(node); + this.add(node); + } + }); + function Node(key, val) { + this.key = key; + this.val = val; + this.prev = this.next = null; + } + return LruCache; + }(); + var PersistentStorage = function() { + "use strict"; + var LOCAL_STORAGE; + try { + LOCAL_STORAGE = window.localStorage; + LOCAL_STORAGE.setItem("~~~", "!"); + LOCAL_STORAGE.removeItem("~~~"); + } catch (err) { + LOCAL_STORAGE = null; + } + function PersistentStorage(namespace, override) { + this.prefix = [ "__", namespace, "__" ].join(""); + this.ttlKey = "__ttl__"; + this.keyMatcher = new RegExp("^" + _.escapeRegExChars(this.prefix)); + this.ls = override || LOCAL_STORAGE; + !this.ls && this._noop(); + } + _.mixin(PersistentStorage.prototype, { + _prefix: function(key) { + return this.prefix + key; + }, + _ttlKey: function(key) { + return this._prefix(key) + this.ttlKey; + }, + _noop: function() { + this.get = this.set = this.remove = this.clear = this.isExpired = _.noop; + }, + _safeSet: function(key, val) { + try { + this.ls.setItem(key, val); + } catch (err) { + if (err.name === "QuotaExceededError") { + this.clear(); + this._noop(); + } + } + }, + get: function(key) { + if (this.isExpired(key)) { + this.remove(key); + } + return decode(this.ls.getItem(this._prefix(key))); + }, + set: function(key, val, ttl) { + if (_.isNumber(ttl)) { + this._safeSet(this._ttlKey(key), encode(now() + ttl)); + } else { + this.ls.removeItem(this._ttlKey(key)); + } + return this._safeSet(this._prefix(key), encode(val)); + }, + remove: function(key) { + this.ls.removeItem(this._ttlKey(key)); + this.ls.removeItem(this._prefix(key)); + return this; + }, + clear: function() { + var i, keys = gatherMatchingKeys(this.keyMatcher); + for (i = keys.length; i--; ) { + this.remove(keys[i]); + } + return this; + }, + isExpired: function(key) { + var ttl = decode(this.ls.getItem(this._ttlKey(key))); + return _.isNumber(ttl) && now() > ttl ? true : false; + } + }); + return PersistentStorage; + function now() { + return new Date().getTime(); + } + function encode(val) { + return JSON.stringify(_.isUndefined(val) ? null : val); + } + function decode(val) { + return $.parseJSON(val); + } + function gatherMatchingKeys(keyMatcher) { + var i, key, keys = [], len = LOCAL_STORAGE.length; + for (i = 0; i < len; i++) { + if ((key = LOCAL_STORAGE.key(i)).match(keyMatcher)) { + keys.push(key.replace(keyMatcher, "")); + } + } + return keys; + } + }(); + var Transport = function() { + "use strict"; + var pendingRequestsCount = 0, pendingRequests = {}, maxPendingRequests = 6, sharedCache = new LruCache(10); + function Transport(o) { + o = o || {}; + this.cancelled = false; + this.lastReq = null; + this._send = o.transport; + this._get = o.limiter ? o.limiter(this._get) : this._get; + this._cache = o.cache === false ? new LruCache(0) : sharedCache; + } + Transport.setMaxPendingRequests = function setMaxPendingRequests(num) { + maxPendingRequests = num; + }; + Transport.resetCache = function resetCache() { + sharedCache.reset(); + }; + _.mixin(Transport.prototype, { + _fingerprint: function fingerprint(o) { + o = o || {}; + return o.url + o.type + $.param(o.data || {}); + }, + _get: function(o, cb) { + var that = this, fingerprint, jqXhr; + fingerprint = this._fingerprint(o); + if (this.cancelled || fingerprint !== this.lastReq) { + return; + } + if (jqXhr = pendingRequests[fingerprint]) { + jqXhr.done(done).fail(fail); + } else if (pendingRequestsCount < maxPendingRequests) { + pendingRequestsCount++; + pendingRequests[fingerprint] = this._send(o).done(done).fail(fail).always(always); + } else { + this.onDeckRequestArgs = [].slice.call(arguments, 0); + } + function done(resp) { + cb(null, resp); + that._cache.set(fingerprint, resp); + } + function fail() { + cb(true); + } + function always() { + pendingRequestsCount--; + delete pendingRequests[fingerprint]; + if (that.onDeckRequestArgs) { + that._get.apply(that, that.onDeckRequestArgs); + that.onDeckRequestArgs = null; + } + } + }, + get: function(o, cb) { + var resp, fingerprint; + cb = cb || $.noop; + o = _.isString(o) ? { + url: o + } : o || {}; + fingerprint = this._fingerprint(o); + this.cancelled = false; + this.lastReq = fingerprint; + if (resp = this._cache.get(fingerprint)) { + cb(null, resp); + } else { + this._get(o, cb); + } + }, + cancel: function() { + this.cancelled = true; + } + }); + return Transport; + }(); + var SearchIndex = window.SearchIndex = function() { + "use strict"; + var CHILDREN = "c", IDS = "i"; + function SearchIndex(o) { + o = o || {}; + if (!o.datumTokenizer || !o.queryTokenizer) { + $.error("datumTokenizer and queryTokenizer are both required"); + } + this.identify = o.identify || _.stringify; + this.datumTokenizer = o.datumTokenizer; + this.queryTokenizer = o.queryTokenizer; + this.reset(); + } + _.mixin(SearchIndex.prototype, { + bootstrap: function bootstrap(o) { + this.datums = o.datums; + this.trie = o.trie; + }, + add: function(data) { + var that = this; + data = _.isArray(data) ? data : [ data ]; + _.each(data, function(datum) { + var id, tokens; + that.datums[id = that.identify(datum)] = datum; + tokens = normalizeTokens(that.datumTokenizer(datum)); + _.each(tokens, function(token) { + var node, chars, ch; + node = that.trie; + chars = token.split(""); + while (ch = chars.shift()) { + node = node[CHILDREN][ch] || (node[CHILDREN][ch] = newNode()); + node[IDS].push(id); + } + }); + }); + }, + get: function get(ids) { + var that = this; + return _.map(ids, function(id) { + return that.datums[id]; + }); + }, + search: function search(query) { + var that = this, tokens, matches; + tokens = normalizeTokens(this.queryTokenizer(query)); + _.each(tokens, function(token) { + var node, chars, ch, ids; + if (matches && matches.length === 0) { + return false; + } + node = that.trie; + chars = token.split(""); + while (node && (ch = chars.shift())) { + node = node[CHILDREN][ch]; + } + if (node && chars.length === 0) { + ids = node[IDS].slice(0); + matches = matches ? getIntersection(matches, ids) : ids; + } else { + matches = []; + return false; + } + }); + return matches ? _.map(unique(matches), function(id) { + return that.datums[id]; + }) : []; + }, + all: function all() { + var values = []; + for (var key in this.datums) { + values.push(this.datums[key]); + } + return values; + }, + reset: function reset() { + this.datums = {}; + this.trie = newNode(); + }, + serialize: function serialize() { + return { + datums: this.datums, + trie: this.trie + }; + } + }); + return SearchIndex; + function normalizeTokens(tokens) { + tokens = _.filter(tokens, function(token) { + return !!token; + }); + tokens = _.map(tokens, function(token) { + return token.toLowerCase(); + }); + return tokens; + } + function newNode() { + var node = {}; + node[IDS] = []; + node[CHILDREN] = {}; + return node; + } + function unique(array) { + var seen = {}, uniques = []; + for (var i = 0, len = array.length; i < len; i++) { + if (!seen[array[i]]) { + seen[array[i]] = true; + uniques.push(array[i]); + } + } + return uniques; + } + function getIntersection(arrayA, arrayB) { + var ai = 0, bi = 0, intersection = []; + arrayA = arrayA.sort(); + arrayB = arrayB.sort(); + var lenArrayA = arrayA.length, lenArrayB = arrayB.length; + while (ai < lenArrayA && bi < lenArrayB) { + if (arrayA[ai] < arrayB[bi]) { + ai++; + } else if (arrayA[ai] > arrayB[bi]) { + bi++; + } else { + intersection.push(arrayA[ai]); + ai++; + bi++; + } + } + return intersection; + } + }(); + var Prefetch = function() { + "use strict"; + var keys; + keys = { + data: "data", + protocol: "protocol", + thumbprint: "thumbprint" + }; + function Prefetch(o) { + this.url = o.url; + this.ttl = o.ttl; + this.cache = o.cache; + this.prepare = o.prepare; + this.transform = o.transform; + this.transport = o.transport; + this.thumbprint = o.thumbprint; + this.storage = new PersistentStorage(o.cacheKey); + } + _.mixin(Prefetch.prototype, { + _settings: function settings() { + return { + url: this.url, + type: "GET", + dataType: "json" + }; + }, + store: function store(data) { + if (!this.cache) { + return; + } + this.storage.set(keys.data, data, this.ttl); + this.storage.set(keys.protocol, location.protocol, this.ttl); + this.storage.set(keys.thumbprint, this.thumbprint, this.ttl); + }, + fromCache: function fromCache() { + var stored = {}, isExpired; + if (!this.cache) { + return null; + } + stored.data = this.storage.get(keys.data); + stored.protocol = this.storage.get(keys.protocol); + stored.thumbprint = this.storage.get(keys.thumbprint); + isExpired = stored.thumbprint !== this.thumbprint || stored.protocol !== location.protocol; + return stored.data && !isExpired ? stored.data : null; + }, + fromNetwork: function(cb) { + var that = this, settings; + if (!cb) { + return; + } + settings = this.prepare(this._settings()); + this.transport(settings).fail(onError).done(onResponse); + function onError() { + cb(true); + } + function onResponse(resp) { + cb(null, that.transform(resp)); + } + }, + clear: function clear() { + this.storage.clear(); + return this; + } + }); + return Prefetch; + }(); + var Remote = function() { + "use strict"; + function Remote(o) { + this.url = o.url; + this.prepare = o.prepare; + this.transform = o.transform; + this.transport = new Transport({ + cache: o.cache, + limiter: o.limiter, + transport: o.transport + }); + } + _.mixin(Remote.prototype, { + _settings: function settings() { + return { + url: this.url, + type: "GET", + dataType: "json" + }; + }, + get: function get(query, cb) { + var that = this, settings; + if (!cb) { + return; + } + query = query || ""; + settings = this.prepare(query, this._settings()); + return this.transport.get(settings, onResponse); + function onResponse(err, resp) { + err ? cb([]) : cb(that.transform(resp)); + } + }, + cancelLastRequest: function cancelLastRequest() { + this.transport.cancel(); + } + }); + return Remote; + }(); + var oParser = function() { + "use strict"; + return function parse(o) { + var defaults, sorter; + defaults = { + initialize: true, + identify: _.stringify, + datumTokenizer: null, + queryTokenizer: null, + sufficient: 5, + sorter: null, + local: [], + prefetch: null, + remote: null + }; + o = _.mixin(defaults, o || {}); + !o.datumTokenizer && $.error("datumTokenizer is required"); + !o.queryTokenizer && $.error("queryTokenizer is required"); + sorter = o.sorter; + o.sorter = sorter ? function(x) { + return x.sort(sorter); + } : _.identity; + o.local = _.isFunction(o.local) ? o.local() : o.local; + o.prefetch = parsePrefetch(o.prefetch); + o.remote = parseRemote(o.remote); + return o; + }; + function parsePrefetch(o) { + var defaults; + if (!o) { + return null; + } + defaults = { + url: null, + ttl: 24 * 60 * 60 * 1e3, + cache: true, + cacheKey: null, + thumbprint: "", + prepare: _.identity, + transform: _.identity, + transport: null + }; + o = _.isString(o) ? { + url: o + } : o; + o = _.mixin(defaults, o); + !o.url && $.error("prefetch requires url to be set"); + o.transform = o.filter || o.transform; + o.cacheKey = o.cacheKey || o.url; + o.thumbprint = VERSION + o.thumbprint; + o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax; + return o; + } + function parseRemote(o) { + var defaults; + if (!o) { + return; + } + defaults = { + url: null, + cache: true, + prepare: null, + replace: null, + wildcard: null, + limiter: null, + rateLimitBy: "debounce", + rateLimitWait: 300, + transform: _.identity, + transport: null + }; + o = _.isString(o) ? { + url: o + } : o; + o = _.mixin(defaults, o); + !o.url && $.error("remote requires url to be set"); + o.transform = o.filter || o.transform; + o.prepare = toRemotePrepare(o); + o.limiter = toLimiter(o); + o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax; + delete o.replace; + delete o.wildcard; + delete o.rateLimitBy; + delete o.rateLimitWait; + return o; + } + function toRemotePrepare(o) { + var prepare, replace, wildcard; + prepare = o.prepare; + replace = o.replace; + wildcard = o.wildcard; + if (prepare) { + return prepare; + } + if (replace) { + prepare = prepareByReplace; + } else if (o.wildcard) { + prepare = prepareByWildcard; + } else { + prepare = idenityPrepare; + } + return prepare; + function prepareByReplace(query, settings) { + settings.url = replace(settings.url, query); + return settings; + } + function prepareByWildcard(query, settings) { + settings.url = settings.url.replace(wildcard, encodeURIComponent(query)); + return settings; + } + function idenityPrepare(query, settings) { + return settings; + } + } + function toLimiter(o) { + var limiter, method, wait; + limiter = o.limiter; + method = o.rateLimitBy; + wait = o.rateLimitWait; + if (!limiter) { + limiter = /^throttle$/i.test(method) ? throttle(wait) : debounce(wait); + } + return limiter; + function debounce(wait) { + return function debounce(fn) { + return _.debounce(fn, wait); + }; + } + function throttle(wait) { + return function throttle(fn) { + return _.throttle(fn, wait); + }; + } + } + function callbackToDeferred(fn) { + return function wrapper(o) { + var deferred = $.Deferred(); + fn(o, onSuccess, onError); + return deferred; + function onSuccess(resp) { + _.defer(function() { + deferred.resolve(resp); + }); + } + function onError(err) { + _.defer(function() { + deferred.reject(err); + }); + } + }; + } + }(); + var Bloodhound = function() { + "use strict"; + var old; + old = window && window.Bloodhound; + function Bloodhound(o) { + o = oParser(o); + this.sorter = o.sorter; + this.identify = o.identify; + this.sufficient = o.sufficient; + this.local = o.local; + this.remote = o.remote ? new Remote(o.remote) : null; + this.prefetch = o.prefetch ? new Prefetch(o.prefetch) : null; + this.index = new SearchIndex({ + identify: this.identify, + datumTokenizer: o.datumTokenizer, + queryTokenizer: o.queryTokenizer + }); + o.initialize !== false && this.initialize(); + } + Bloodhound.noConflict = function noConflict() { + window && (window.Bloodhound = old); + return Bloodhound; + }; + Bloodhound.tokenizers = tokenizers; + _.mixin(Bloodhound.prototype, { + __ttAdapter: function ttAdapter() { + var that = this; + return this.remote ? withAsync : withoutAsync; + function withAsync(query, sync, async) { + return that.search(query, sync, async); + } + function withoutAsync(query, sync) { + return that.search(query, sync); + } + }, + _loadPrefetch: function loadPrefetch() { + var that = this, deferred, serialized; + deferred = $.Deferred(); + if (!this.prefetch) { + deferred.resolve(); + } else if (serialized = this.prefetch.fromCache()) { + this.index.bootstrap(serialized); + deferred.resolve(); + } else { + this.prefetch.fromNetwork(done); + } + return deferred.promise(); + function done(err, data) { + if (err) { + return deferred.reject(); + } + that.add(data); + that.prefetch.store(that.index.serialize()); + deferred.resolve(); + } + }, + _initialize: function initialize() { + var that = this, deferred; + this.clear(); + (this.initPromise = this._loadPrefetch()).done(addLocalToIndex); + return this.initPromise; + function addLocalToIndex() { + that.add(that.local); + } + }, + initialize: function initialize(force) { + return !this.initPromise || force ? this._initialize() : this.initPromise; + }, + add: function add(data) { + this.index.add(data); + return this; + }, + get: function get(ids) { + ids = _.isArray(ids) ? ids : [].slice.call(arguments); + return this.index.get(ids); + }, + search: function search(query, sync, async) { + var that = this, local; + local = this.sorter(this.index.search(query)); + sync(this.remote ? local.slice() : local); + if (this.remote && local.length < this.sufficient) { + this.remote.get(query, processRemote); + } else if (this.remote) { + this.remote.cancelLastRequest(); + } + return this; + function processRemote(remote) { + var nonDuplicates = []; + _.each(remote, function(r) { + !_.some(local, function(l) { + return that.identify(r) === that.identify(l); + }) && nonDuplicates.push(r); + }); + async && async(nonDuplicates); + } + }, + all: function all() { + return this.index.all(); + }, + clear: function clear() { + this.index.reset(); + return this; + }, + clearPrefetchCache: function clearPrefetchCache() { + this.prefetch && this.prefetch.clear(); + return this; + }, + clearRemoteCache: function clearRemoteCache() { + Transport.resetCache(); + return this; + }, + ttAdapter: function ttAdapter() { + return this.__ttAdapter(); + } + }); + return Bloodhound; + }(); + return Bloodhound; +}); + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define("typeahead.js", [ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof exports === "object") { + module.exports = factory(require("jquery")); + } else { + factory(jQuery); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), 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) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
          ' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e; + $e = $.Event(namespace + type); + (args = args || []).unshift($e); + this.$el.trigger.apply(this.$el, args); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function getRegex(patterns, caseSensitive, wordsOnly) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + escapedPatterns.push(_.escapeRegExChars(patterns[i])); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
          "); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = o.name || nameGenerator(); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", this.name, suggestions, false); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", this.name, suggestions, true); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + rendered += suggestions.length; + that._append(query, suggestions.slice(0, that.limit - rendered)); + that.async && that.trigger("asyncReceived", query); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
          "); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion || suggestionTemplate + }; + function suggestionTemplate(context) { + return $("
          ").text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
          ").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, isDatasetEmpty); + function isDatasetEmpty(dataset) { + return dataset.isEmpty(); + } + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
          "); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
          "); + $menu = this.menu.$node || $("
          "); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, dataset, suggestions, async) { + this._updateHint(); + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, payload, cancelMove; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + payload = data ? data.obj : null; + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", payload)) { + this.menu.setCursor($candidate); + if (data) { + this.input.setInputValue(data.val); + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", payload); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(newVal); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop("readonly", true).removeAttr("id name placeholder required").attr({ + autocomplete: "off", + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + autocomplete: "off", + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); +/**! + + @license + handlebars v4.0.10 + +Copyright (C) 2011-2016 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.10'; + 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, + 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) + }; + } + +/***/ }), +/* 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) { + for (var _name in knownHelpers) { + /* istanbul ignore else */ + if (_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 (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']; + +/***/ }) +/******/ ]) +}); +; +/*! +* jquery.inputmask.bundle.js +* https://github.com/RobinHerbots/Inputmask +* Copyright (c) 2010 - 2017 Robin Herbots +* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) +* Version: 3.3.11 +*/ + +!function(modules) { + function __webpack_require__(moduleId) { + if (installedModules[moduleId]) return installedModules[moduleId].exports; + var module = installedModules[moduleId] = { + i: moduleId, + l: !1, + exports: {} + }; + return modules[moduleId].call(module.exports, module, module.exports, __webpack_require__), + module.l = !0, module.exports; + } + var installedModules = {}; + __webpack_require__.m = modules, __webpack_require__.c = installedModules, __webpack_require__.d = function(exports, name, getter) { + __webpack_require__.o(exports, name) || Object.defineProperty(exports, name, { + configurable: !1, + enumerable: !0, + get: getter + }); + }, __webpack_require__.n = function(module) { + var getter = module && module.__esModule ? function() { + return module.default; + } : function() { + return module; + }; + return __webpack_require__.d(getter, "a", getter), getter; + }, __webpack_require__.o = function(object, property) { + return Object.prototype.hasOwnProperty.call(object, property); + }, __webpack_require__.p = "", __webpack_require__(__webpack_require__.s = 3); +}([ function(module, exports, __webpack_require__) { + "use strict"; + var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__; + "function" == typeof Symbol && Symbol.iterator; + !function(factory) { + __WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(2) ], void 0 !== (__WEBPACK_AMD_DEFINE_RESULT__ = "function" == typeof (__WEBPACK_AMD_DEFINE_FACTORY__ = factory) ? __WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__) : __WEBPACK_AMD_DEFINE_FACTORY__) && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__); + }(function($) { + return $; + }); +}, function(module, exports, __webpack_require__) { + "use strict"; + var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__, _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + !function(factory) { + __WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(0), __webpack_require__(10), __webpack_require__(11) ], + void 0 !== (__WEBPACK_AMD_DEFINE_RESULT__ = "function" == typeof (__WEBPACK_AMD_DEFINE_FACTORY__ = factory) ? __WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__) : __WEBPACK_AMD_DEFINE_FACTORY__) && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__); + }(function($, window, document, undefined) { + function Inputmask(alias, options, internal) { + if (!(this instanceof Inputmask)) return new Inputmask(alias, options, internal); + this.el = undefined, this.events = {}, this.maskset = undefined, this.refreshValue = !1, + !0 !== internal && ($.isPlainObject(alias) ? options = alias : (options = options || {}).alias = alias, + this.opts = $.extend(!0, {}, this.defaults, options), this.noMasksCache = options && options.definitions !== undefined, + this.userOptions = options || {}, this.isRTL = this.opts.numericInput, resolveAlias(this.opts.alias, options, this.opts)); + } + function resolveAlias(aliasStr, options, opts) { + var aliasDefinition = Inputmask.prototype.aliases[aliasStr]; + return aliasDefinition ? (aliasDefinition.alias && resolveAlias(aliasDefinition.alias, undefined, opts), + $.extend(!0, opts, aliasDefinition), $.extend(!0, opts, options), !0) : (null === opts.mask && (opts.mask = aliasStr), + !1); + } + function generateMaskSet(opts, nocache) { + function generateMask(mask, metadata, opts) { + var regexMask = !1; + if (null !== mask && "" !== mask || ((regexMask = null !== opts.regex) ? mask = (mask = opts.regex).replace(/^(\^)(.*)(\$)$/, "$2") : (regexMask = !0, + mask = ".*")), 1 === mask.length && !1 === opts.greedy && 0 !== opts.repeat && (opts.placeholder = ""), + opts.repeat > 0 || "*" === opts.repeat || "+" === opts.repeat) { + var repeatStart = "*" === opts.repeat ? 0 : "+" === opts.repeat ? 1 : opts.repeat; + mask = opts.groupmarker.start + mask + opts.groupmarker.end + opts.quantifiermarker.start + repeatStart + "," + opts.repeat + opts.quantifiermarker.end; + } + var masksetDefinition, maskdefKey = regexMask ? "regex_" + opts.regex : opts.numericInput ? mask.split("").reverse().join("") : mask; + return Inputmask.prototype.masksCache[maskdefKey] === undefined || !0 === nocache ? (masksetDefinition = { + mask: mask, + maskToken: Inputmask.prototype.analyseMask(mask, regexMask, opts), + validPositions: {}, + _buffer: undefined, + buffer: undefined, + tests: {}, + metadata: metadata, + maskLength: undefined + }, !0 !== nocache && (Inputmask.prototype.masksCache[maskdefKey] = masksetDefinition, + masksetDefinition = $.extend(!0, {}, Inputmask.prototype.masksCache[maskdefKey]))) : masksetDefinition = $.extend(!0, {}, Inputmask.prototype.masksCache[maskdefKey]), + masksetDefinition; + } + if ($.isFunction(opts.mask) && (opts.mask = opts.mask(opts)), $.isArray(opts.mask)) { + if (opts.mask.length > 1) { + opts.keepStatic = null === opts.keepStatic || opts.keepStatic; + var altMask = opts.groupmarker.start; + return $.each(opts.numericInput ? opts.mask.reverse() : opts.mask, function(ndx, msk) { + altMask.length > 1 && (altMask += opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start), + msk.mask === undefined || $.isFunction(msk.mask) ? altMask += msk : altMask += msk.mask; + }), altMask += opts.groupmarker.end, generateMask(altMask, opts.mask, opts); + } + opts.mask = opts.mask.pop(); + } + return opts.mask && opts.mask.mask !== undefined && !$.isFunction(opts.mask.mask) ? generateMask(opts.mask.mask, opts.mask, opts) : generateMask(opts.mask, opts.mask, opts); + } + function maskScope(actionObj, maskset, opts) { + function getMaskTemplate(baseOnInput, minimalPos, includeMode) { + minimalPos = minimalPos || 0; + var ndxIntlzr, test, testPos, maskTemplate = [], pos = 0, lvp = getLastValidPosition(); + do { + !0 === baseOnInput && getMaskSet().validPositions[pos] ? (test = (testPos = getMaskSet().validPositions[pos]).match, + ndxIntlzr = testPos.locator.slice(), maskTemplate.push(!0 === includeMode ? testPos.input : !1 === includeMode ? test.nativeDef : getPlaceholder(pos, test))) : (test = (testPos = getTestTemplate(pos, ndxIntlzr, pos - 1)).match, + ndxIntlzr = testPos.locator.slice(), (!1 === opts.jitMasking || pos < lvp || "number" == typeof opts.jitMasking && isFinite(opts.jitMasking) && opts.jitMasking > pos) && maskTemplate.push(!1 === includeMode ? test.nativeDef : getPlaceholder(pos, test))), + pos++; + } while ((maxLength === undefined || pos < maxLength) && (null !== test.fn || "" !== test.def) || minimalPos > pos); + return "" === maskTemplate[maskTemplate.length - 1] && maskTemplate.pop(), getMaskSet().maskLength = pos + 1, + maskTemplate; + } + function getMaskSet() { + return maskset; + } + function resetMaskSet(soft) { + var maskset = getMaskSet(); + maskset.buffer = undefined, !0 !== soft && (maskset.validPositions = {}, maskset.p = 0); + } + function getLastValidPosition(closestTo, strict, validPositions) { + var before = -1, after = -1, valids = validPositions || getMaskSet().validPositions; + closestTo === undefined && (closestTo = -1); + for (var posNdx in valids) { + var psNdx = parseInt(posNdx); + valids[psNdx] && (strict || !0 !== valids[psNdx].generatedInput) && (psNdx <= closestTo && (before = psNdx), + psNdx >= closestTo && (after = psNdx)); + } + return -1 !== before && closestTo - before > 1 || after < closestTo ? before : after; + } + function stripValidPositions(start, end, nocheck, strict) { + var i, startPos = start, positionsClone = $.extend(!0, {}, getMaskSet().validPositions), needsValidation = !1; + for (getMaskSet().p = start, i = end - 1; i >= startPos; i--) getMaskSet().validPositions[i] !== undefined && (!0 !== nocheck && (!getMaskSet().validPositions[i].match.optionality && function(pos) { + var posMatch = getMaskSet().validPositions[pos]; + if (posMatch !== undefined && null === posMatch.match.fn) { + var prevMatch = getMaskSet().validPositions[pos - 1], nextMatch = getMaskSet().validPositions[pos + 1]; + return prevMatch !== undefined && nextMatch !== undefined; + } + return !1; + }(i) || !1 === opts.canClearPosition(getMaskSet(), i, getLastValidPosition(), strict, opts)) || delete getMaskSet().validPositions[i]); + for (resetMaskSet(!0), i = startPos + 1; i <= getLastValidPosition(); ) { + for (;getMaskSet().validPositions[startPos] !== undefined; ) startPos++; + if (i < startPos && (i = startPos + 1), getMaskSet().validPositions[i] === undefined && isMask(i)) i++; else { + var t = getTestTemplate(i); + !1 === needsValidation && positionsClone[startPos] && positionsClone[startPos].match.def === t.match.def ? (getMaskSet().validPositions[startPos] = $.extend(!0, {}, positionsClone[startPos]), + getMaskSet().validPositions[startPos].input = t.input, delete getMaskSet().validPositions[i], + i++) : positionCanMatchDefinition(startPos, t.match.def) ? !1 !== isValid(startPos, t.input || getPlaceholder(i), !0) && (delete getMaskSet().validPositions[i], + i++, needsValidation = !0) : isMask(i) || (i++, startPos--), startPos++; + } + } + resetMaskSet(!0); + } + function determineTestTemplate(tests, guessNextBest) { + for (var testPos, testPositions = tests, lvp = getLastValidPosition(), lvTest = getMaskSet().validPositions[lvp] || getTests(0)[0], lvTestAltArr = lvTest.alternation !== undefined ? lvTest.locator[lvTest.alternation].toString().split(",") : [], ndx = 0; ndx < testPositions.length && (!((testPos = testPositions[ndx]).match && (opts.greedy && !0 !== testPos.match.optionalQuantifier || (!1 === testPos.match.optionality || !1 === testPos.match.newBlockMarker) && !0 !== testPos.match.optionalQuantifier) && (lvTest.alternation === undefined || lvTest.alternation !== testPos.alternation || testPos.locator[lvTest.alternation] !== undefined && checkAlternationMatch(testPos.locator[lvTest.alternation].toString().split(","), lvTestAltArr))) || !0 === guessNextBest && (null !== testPos.match.fn || /[0-9a-bA-Z]/.test(testPos.match.def))); ndx++) ; + return testPos; + } + function getTestTemplate(pos, ndxIntlzr, tstPs) { + return getMaskSet().validPositions[pos] || determineTestTemplate(getTests(pos, ndxIntlzr ? ndxIntlzr.slice() : ndxIntlzr, tstPs)); + } + function getTest(pos) { + return getMaskSet().validPositions[pos] ? getMaskSet().validPositions[pos] : getTests(pos)[0]; + } + function positionCanMatchDefinition(pos, def) { + for (var valid = !1, tests = getTests(pos), tndx = 0; tndx < tests.length; tndx++) if (tests[tndx].match && tests[tndx].match.def === def) { + valid = !0; + break; + } + return valid; + } + function getTests(pos, ndxIntlzr, tstPs) { + function resolveTestFromToken(maskToken, ndxInitializer, loopNdx, quantifierRecurse) { + function handleMatch(match, loopNdx, quantifierRecurse) { + function isFirstMatch(latestMatch, tokenGroup) { + var firstMatch = 0 === $.inArray(latestMatch, tokenGroup.matches); + return firstMatch || $.each(tokenGroup.matches, function(ndx, match) { + if (!0 === match.isQuantifier && (firstMatch = isFirstMatch(latestMatch, tokenGroup.matches[ndx - 1]))) return !1; + }), firstMatch; + } + function resolveNdxInitializer(pos, alternateNdx, targetAlternation) { + var bestMatch, indexPos; + if (getMaskSet().validPositions[pos - 1] && targetAlternation && getMaskSet().tests[pos]) for (var vpAlternation = getMaskSet().validPositions[pos - 1].locator, tpAlternation = getMaskSet().tests[pos][0].locator, i = 0; i < targetAlternation; i++) if (vpAlternation[i] !== tpAlternation[i]) return vpAlternation.slice(targetAlternation + 1); + return (getMaskSet().tests[pos] || getMaskSet().validPositions[pos]) && $.each(getMaskSet().tests[pos] || [ getMaskSet().validPositions[pos] ], function(ndx, lmnt) { + var alternation = targetAlternation !== undefined ? targetAlternation : lmnt.alternation, ndxPos = lmnt.locator[alternation] !== undefined ? lmnt.locator[alternation].toString().indexOf(alternateNdx) : -1; + (indexPos === undefined || ndxPos < indexPos) && -1 !== ndxPos && (bestMatch = lmnt, + indexPos = ndxPos); + }), bestMatch ? bestMatch.locator.slice((targetAlternation !== undefined ? targetAlternation : bestMatch.alternation) + 1) : targetAlternation !== undefined ? resolveNdxInitializer(pos, alternateNdx) : undefined; + } + if (testPos > 1e4) throw "Inputmask: There is probably an error in your mask definition or in the code. Create an issue on github with an example of the mask you are using. " + getMaskSet().mask; + if (testPos === pos && match.matches === undefined) return matches.push({ + match: match, + locator: loopNdx.reverse(), + cd: cacheDependency + }), !0; + if (match.matches !== undefined) { + if (match.isGroup && quantifierRecurse !== match) { + if (match = handleMatch(maskToken.matches[$.inArray(match, maskToken.matches) + 1], loopNdx)) return !0; + } else if (match.isOptional) { + var optionalToken = match; + if (match = resolveTestFromToken(match, ndxInitializer, loopNdx, quantifierRecurse)) { + if (latestMatch = matches[matches.length - 1].match, !isFirstMatch(latestMatch, optionalToken)) return !0; + insertStop = !0, testPos = pos; + } + } else if (match.isAlternator) { + var maltMatches, alternateToken = match, malternateMatches = [], currentMatches = matches.slice(), loopNdxCnt = loopNdx.length, altIndex = ndxInitializer.length > 0 ? ndxInitializer.shift() : -1; + if (-1 === altIndex || "string" == typeof altIndex) { + var amndx, currentPos = testPos, ndxInitializerClone = ndxInitializer.slice(), altIndexArr = []; + if ("string" == typeof altIndex) altIndexArr = altIndex.split(","); else for (amndx = 0; amndx < alternateToken.matches.length; amndx++) altIndexArr.push(amndx); + for (var ndx = 0; ndx < altIndexArr.length; ndx++) { + if (amndx = parseInt(altIndexArr[ndx]), matches = [], ndxInitializer = resolveNdxInitializer(testPos, amndx, loopNdxCnt) || ndxInitializerClone.slice(), + !0 !== (match = handleMatch(alternateToken.matches[amndx] || maskToken.matches[amndx], [ amndx ].concat(loopNdx), quantifierRecurse) || match) && match !== undefined && altIndexArr[altIndexArr.length - 1] < alternateToken.matches.length) { + var ntndx = $.inArray(match, maskToken.matches) + 1; + maskToken.matches.length > ntndx && (match = handleMatch(maskToken.matches[ntndx], [ ntndx ].concat(loopNdx.slice(1, loopNdx.length)), quantifierRecurse)) && (altIndexArr.push(ntndx.toString()), + $.each(matches, function(ndx, lmnt) { + lmnt.alternation = loopNdx.length - 1; + })); + } + maltMatches = matches.slice(), testPos = currentPos, matches = []; + for (var ndx1 = 0; ndx1 < maltMatches.length; ndx1++) { + var altMatch = maltMatches[ndx1], dropMatch = !1; + altMatch.alternation = altMatch.alternation || loopNdxCnt; + for (var ndx2 = 0; ndx2 < malternateMatches.length; ndx2++) { + var altMatch2 = malternateMatches[ndx2]; + if ("string" != typeof altIndex || -1 !== $.inArray(altMatch.locator[altMatch.alternation].toString(), altIndexArr)) { + if (function(source, target) { + return source.match.nativeDef === target.match.nativeDef || source.match.def === target.match.nativeDef || source.match.nativeDef === target.match.def; + }(altMatch, altMatch2)) { + dropMatch = !0, altMatch.alternation === altMatch2.alternation && -1 === altMatch2.locator[altMatch2.alternation].toString().indexOf(altMatch.locator[altMatch.alternation]) && (altMatch2.locator[altMatch2.alternation] = altMatch2.locator[altMatch2.alternation] + "," + altMatch.locator[altMatch.alternation], + altMatch2.alternation = altMatch.alternation), altMatch.match.nativeDef === altMatch2.match.def && (altMatch.locator[altMatch.alternation] = altMatch2.locator[altMatch2.alternation], + malternateMatches.splice(malternateMatches.indexOf(altMatch2), 1, altMatch)); + break; + } + if (altMatch.match.def === altMatch2.match.def) { + dropMatch = !1; + break; + } + if (function(source, target) { + return null === source.match.fn && null !== target.match.fn && target.match.fn.test(source.match.def, getMaskSet(), pos, !1, opts, !1); + }(altMatch, altMatch2) || function(source, target) { + return null !== source.match.fn && null !== target.match.fn && target.match.fn.test(source.match.def.replace(/[\[\]]/g, ""), getMaskSet(), pos, !1, opts, !1); + }(altMatch, altMatch2)) { + altMatch.alternation === altMatch2.alternation && -1 === altMatch.locator[altMatch.alternation].toString().indexOf(altMatch2.locator[altMatch2.alternation].toString().split("")[0]) && (altMatch.na = altMatch.na || altMatch.locator[altMatch.alternation].toString(), + -1 === altMatch.na.indexOf(altMatch.locator[altMatch.alternation].toString().split("")[0]) && (altMatch.na = altMatch.na + "," + altMatch.locator[altMatch2.alternation].toString().split("")[0]), + dropMatch = !0, altMatch.locator[altMatch.alternation] = altMatch2.locator[altMatch2.alternation].toString().split("")[0] + "," + altMatch.locator[altMatch.alternation], + malternateMatches.splice(malternateMatches.indexOf(altMatch2), 0, altMatch)); + break; + } + } + } + dropMatch || malternateMatches.push(altMatch); + } + } + "string" == typeof altIndex && (malternateMatches = $.map(malternateMatches, function(lmnt, ndx) { + if (isFinite(ndx)) { + var alternation = lmnt.alternation, altLocArr = lmnt.locator[alternation].toString().split(","); + lmnt.locator[alternation] = undefined, lmnt.alternation = undefined; + for (var alndx = 0; alndx < altLocArr.length; alndx++) -1 !== $.inArray(altLocArr[alndx], altIndexArr) && (lmnt.locator[alternation] !== undefined ? (lmnt.locator[alternation] += ",", + lmnt.locator[alternation] += altLocArr[alndx]) : lmnt.locator[alternation] = parseInt(altLocArr[alndx]), + lmnt.alternation = alternation); + if (lmnt.locator[alternation] !== undefined) return lmnt; + } + })), matches = currentMatches.concat(malternateMatches), testPos = pos, insertStop = matches.length > 0, + match = malternateMatches.length > 0, ndxInitializer = ndxInitializerClone.slice(); + } else match = handleMatch(alternateToken.matches[altIndex] || maskToken.matches[altIndex], [ altIndex ].concat(loopNdx), quantifierRecurse); + if (match) return !0; + } else if (match.isQuantifier && quantifierRecurse !== maskToken.matches[$.inArray(match, maskToken.matches) - 1]) for (var qt = match, qndx = ndxInitializer.length > 0 ? ndxInitializer.shift() : 0; qndx < (isNaN(qt.quantifier.max) ? qndx + 1 : qt.quantifier.max) && testPos <= pos; qndx++) { + var tokenGroup = maskToken.matches[$.inArray(qt, maskToken.matches) - 1]; + if (match = handleMatch(tokenGroup, [ qndx ].concat(loopNdx), tokenGroup)) { + if (latestMatch = matches[matches.length - 1].match, latestMatch.optionalQuantifier = qndx > qt.quantifier.min - 1, + isFirstMatch(latestMatch, tokenGroup)) { + if (qndx > qt.quantifier.min - 1) { + insertStop = !0, testPos = pos; + break; + } + return !0; + } + return !0; + } + } else if (match = resolveTestFromToken(match, ndxInitializer, loopNdx, quantifierRecurse)) return !0; + } else testPos++; + } + for (var tndx = ndxInitializer.length > 0 ? ndxInitializer.shift() : 0; tndx < maskToken.matches.length; tndx++) if (!0 !== maskToken.matches[tndx].isQuantifier) { + var match = handleMatch(maskToken.matches[tndx], [ tndx ].concat(loopNdx), quantifierRecurse); + if (match && testPos === pos) return match; + if (testPos > pos) break; + } + } + function filterTests(tests) { + if (opts.keepStatic && pos > 0 && tests.length > 1 + ("" === tests[tests.length - 1].match.def ? 1 : 0) && !0 !== tests[0].match.optionality && !0 !== tests[0].match.optionalQuantifier && null === tests[0].match.fn && !/[0-9a-bA-Z]/.test(tests[0].match.def)) { + if (getMaskSet().validPositions[pos - 1] === undefined) return [ determineTestTemplate(tests) ]; + if (getMaskSet().validPositions[pos - 1].alternation === tests[0].alternation) return [ determineTestTemplate(tests) ]; + if (getMaskSet().validPositions[pos - 1]) return [ determineTestTemplate(tests) ]; + } + return tests; + } + var latestMatch, maskTokens = getMaskSet().maskToken, testPos = ndxIntlzr ? tstPs : 0, ndxInitializer = ndxIntlzr ? ndxIntlzr.slice() : [ 0 ], matches = [], insertStop = !1, cacheDependency = ndxIntlzr ? ndxIntlzr.join("") : ""; + if (pos > -1) { + if (ndxIntlzr === undefined) { + for (var test, previousPos = pos - 1; (test = getMaskSet().validPositions[previousPos] || getMaskSet().tests[previousPos]) === undefined && previousPos > -1; ) previousPos--; + test !== undefined && previousPos > -1 && (ndxInitializer = function(tests) { + var locator = []; + return $.isArray(tests) || (tests = [ tests ]), tests.length > 0 && (tests[0].alternation === undefined ? 0 === (locator = determineTestTemplate(tests.slice()).locator.slice()).length && (locator = tests[0].locator.slice()) : $.each(tests, function(ndx, tst) { + if ("" !== tst.def) if (0 === locator.length) locator = tst.locator.slice(); else for (var i = 0; i < locator.length; i++) tst.locator[i] && -1 === locator[i].toString().indexOf(tst.locator[i]) && (locator[i] += "," + tst.locator[i]); + })), locator; + }(test), cacheDependency = ndxInitializer.join(""), testPos = previousPos); + } + if (getMaskSet().tests[pos] && getMaskSet().tests[pos][0].cd === cacheDependency) return filterTests(getMaskSet().tests[pos]); + for (var mtndx = ndxInitializer.shift(); mtndx < maskTokens.length && !(resolveTestFromToken(maskTokens[mtndx], ndxInitializer, [ mtndx ]) && testPos === pos || testPos > pos); mtndx++) ; + } + return (0 === matches.length || insertStop) && matches.push({ + match: { + fn: null, + cardinality: 0, + optionality: !0, + casing: null, + def: "", + placeholder: "" + }, + locator: [], + cd: cacheDependency + }), ndxIntlzr !== undefined && getMaskSet().tests[pos] ? filterTests($.extend(!0, [], matches)) : (getMaskSet().tests[pos] = $.extend(!0, [], matches), + filterTests(getMaskSet().tests[pos])); + } + function getBufferTemplate() { + return getMaskSet()._buffer === undefined && (getMaskSet()._buffer = getMaskTemplate(!1, 1), + getMaskSet().buffer === undefined && (getMaskSet().buffer = getMaskSet()._buffer.slice())), + getMaskSet()._buffer; + } + function getBuffer(noCache) { + return getMaskSet().buffer !== undefined && !0 !== noCache || (getMaskSet().buffer = getMaskTemplate(!0, getLastValidPosition(), !0)), + getMaskSet().buffer; + } + function refreshFromBuffer(start, end, buffer) { + var i, p; + if (!0 === start) resetMaskSet(), start = 0, end = buffer.length; else for (i = start; i < end; i++) delete getMaskSet().validPositions[i]; + for (p = start, i = start; i < end; i++) if (resetMaskSet(!0), buffer[i] !== opts.skipOptionalPartCharacter) { + var valResult = isValid(p, buffer[i], !0, !0); + !1 !== valResult && (resetMaskSet(!0), p = valResult.caret !== undefined ? valResult.caret : valResult.pos + 1); + } + } + function casing(elem, test, pos) { + switch (opts.casing || test.casing) { + case "upper": + elem = elem.toUpperCase(); + break; + + case "lower": + elem = elem.toLowerCase(); + break; + + case "title": + var posBefore = getMaskSet().validPositions[pos - 1]; + elem = 0 === pos || posBefore && posBefore.input === String.fromCharCode(Inputmask.keyCode.SPACE) ? elem.toUpperCase() : elem.toLowerCase(); + break; + + default: + if ($.isFunction(opts.casing)) { + var args = Array.prototype.slice.call(arguments); + args.push(getMaskSet().validPositions), elem = opts.casing.apply(this, args); + } + } + return elem; + } + function checkAlternationMatch(altArr1, altArr2, na) { + for (var naNdx, altArrC = opts.greedy ? altArr2 : altArr2.slice(0, 1), isMatch = !1, naArr = na !== undefined ? na.split(",") : [], i = 0; i < naArr.length; i++) -1 !== (naNdx = altArr1.indexOf(naArr[i])) && altArr1.splice(naNdx, 1); + for (var alndx = 0; alndx < altArr1.length; alndx++) if (-1 !== $.inArray(altArr1[alndx], altArrC)) { + isMatch = !0; + break; + } + return isMatch; + } + function isValid(pos, c, strict, fromSetValid, fromAlternate, validateOnly) { + function isSelection(posObj) { + var selection = isRTL ? posObj.begin - posObj.end > 1 || posObj.begin - posObj.end == 1 : posObj.end - posObj.begin > 1 || posObj.end - posObj.begin == 1; + return selection && 0 === posObj.begin && posObj.end === getMaskSet().maskLength ? "full" : selection; + } + function _isValid(position, c, strict) { + var rslt = !1; + return $.each(getTests(position), function(ndx, tst) { + for (var test = tst.match, loopend = c ? 1 : 0, chrs = "", i = test.cardinality; i > loopend; i--) chrs += getBufferElement(position - (i - 1)); + if (c && (chrs += c), getBuffer(!0), !1 !== (rslt = null != test.fn ? test.fn.test(chrs, getMaskSet(), position, strict, opts, isSelection(pos)) : (c === test.def || c === opts.skipOptionalPartCharacter) && "" !== test.def && { + c: getPlaceholder(position, test, !0) || test.def, + pos: position + })) { + var elem = rslt.c !== undefined ? rslt.c : c; + elem = elem === opts.skipOptionalPartCharacter && null === test.fn ? getPlaceholder(position, test, !0) || test.def : elem; + var validatedPos = position, possibleModifiedBuffer = getBuffer(); + if (rslt.remove !== undefined && ($.isArray(rslt.remove) || (rslt.remove = [ rslt.remove ]), + $.each(rslt.remove.sort(function(a, b) { + return b - a; + }), function(ndx, lmnt) { + stripValidPositions(lmnt, lmnt + 1, !0); + })), rslt.insert !== undefined && ($.isArray(rslt.insert) || (rslt.insert = [ rslt.insert ]), + $.each(rslt.insert.sort(function(a, b) { + return a - b; + }), function(ndx, lmnt) { + isValid(lmnt.pos, lmnt.c, !0, fromSetValid); + })), rslt.refreshFromBuffer) { + var refresh = rslt.refreshFromBuffer; + if (refreshFromBuffer(!0 === refresh ? refresh : refresh.start, refresh.end, possibleModifiedBuffer), + rslt.pos === undefined && rslt.c === undefined) return rslt.pos = getLastValidPosition(), + !1; + if ((validatedPos = rslt.pos !== undefined ? rslt.pos : position) !== position) return rslt = $.extend(rslt, isValid(validatedPos, elem, !0, fromSetValid)), + !1; + } else if (!0 !== rslt && rslt.pos !== undefined && rslt.pos !== position && (validatedPos = rslt.pos, + refreshFromBuffer(position, validatedPos, getBuffer().slice()), validatedPos !== position)) return rslt = $.extend(rslt, isValid(validatedPos, elem, !0)), + !1; + return (!0 === rslt || rslt.pos !== undefined || rslt.c !== undefined) && (ndx > 0 && resetMaskSet(!0), + setValidPosition(validatedPos, $.extend({}, tst, { + input: casing(elem, test, validatedPos) + }), fromSetValid, isSelection(pos)) || (rslt = !1), !1); + } + }), rslt; + } + function setValidPosition(pos, validTest, fromSetValid, isSelection) { + if (isSelection || opts.insertMode && getMaskSet().validPositions[pos] !== undefined && fromSetValid === undefined) { + var i, positionsClone = $.extend(!0, {}, getMaskSet().validPositions), lvp = getLastValidPosition(undefined, !0); + for (i = pos; i <= lvp; i++) delete getMaskSet().validPositions[i]; + getMaskSet().validPositions[pos] = $.extend(!0, {}, validTest); + var j, valid = !0, vps = getMaskSet().validPositions, needsValidation = !1, initialLength = getMaskSet().maskLength; + for (i = j = pos; i <= lvp; i++) { + var t = positionsClone[i]; + if (t !== undefined) for (var posMatch = j; posMatch < getMaskSet().maskLength && (null === t.match.fn && vps[i] && (!0 === vps[i].match.optionalQuantifier || !0 === vps[i].match.optionality) || null != t.match.fn); ) { + if (posMatch++, !1 === needsValidation && positionsClone[posMatch] && positionsClone[posMatch].match.def === t.match.def) getMaskSet().validPositions[posMatch] = $.extend(!0, {}, positionsClone[posMatch]), + getMaskSet().validPositions[posMatch].input = t.input, fillMissingNonMask(posMatch), + j = posMatch, valid = !0; else if (positionCanMatchDefinition(posMatch, t.match.def)) { + var result = isValid(posMatch, t.input, !0, !0); + valid = !1 !== result, j = result.caret || result.insert ? getLastValidPosition() : posMatch, + needsValidation = !0; + } else if (!(valid = !0 === t.generatedInput) && posMatch >= getMaskSet().maskLength - 1) break; + if (getMaskSet().maskLength < initialLength && (getMaskSet().maskLength = initialLength), + valid) break; + } + if (!valid) break; + } + if (!valid) return getMaskSet().validPositions = $.extend(!0, {}, positionsClone), + resetMaskSet(!0), !1; + } else getMaskSet().validPositions[pos] = $.extend(!0, {}, validTest); + return resetMaskSet(!0), !0; + } + function fillMissingNonMask(maskPos) { + for (var pndx = maskPos - 1; pndx > -1 && !getMaskSet().validPositions[pndx]; pndx--) ; + var testTemplate, testsFromPos; + for (pndx++; pndx < maskPos; pndx++) getMaskSet().validPositions[pndx] === undefined && (!1 === opts.jitMasking || opts.jitMasking > pndx) && ("" === (testsFromPos = getTests(pndx, getTestTemplate(pndx - 1).locator, pndx - 1).slice())[testsFromPos.length - 1].match.def && testsFromPos.pop(), + (testTemplate = determineTestTemplate(testsFromPos)) && (testTemplate.match.def === opts.radixPointDefinitionSymbol || !isMask(pndx, !0) || $.inArray(opts.radixPoint, getBuffer()) < pndx && testTemplate.match.fn && testTemplate.match.fn.test(getPlaceholder(pndx), getMaskSet(), pndx, !1, opts)) && !1 !== (result = _isValid(pndx, getPlaceholder(pndx, testTemplate.match, !0) || (null == testTemplate.match.fn ? testTemplate.match.def : "" !== getPlaceholder(pndx) ? getPlaceholder(pndx) : getBuffer()[pndx]), !0)) && (getMaskSet().validPositions[result.pos || pndx].generatedInput = !0)); + } + strict = !0 === strict; + var maskPos = pos; + pos.begin !== undefined && (maskPos = isRTL && !isSelection(pos) ? pos.end : pos.begin); + var result = !0, positionsClone = $.extend(!0, {}, getMaskSet().validPositions); + if ($.isFunction(opts.preValidation) && !strict && !0 !== fromSetValid && !0 !== validateOnly && (result = opts.preValidation(getBuffer(), maskPos, c, isSelection(pos), opts)), + !0 === result) { + if (fillMissingNonMask(maskPos), isSelection(pos) && (handleRemove(undefined, Inputmask.keyCode.DELETE, pos, !0, !0), + maskPos = getMaskSet().p), maskPos < getMaskSet().maskLength && (maxLength === undefined || maskPos < maxLength) && (result = _isValid(maskPos, c, strict), + (!strict || !0 === fromSetValid) && !1 === result && !0 !== validateOnly)) { + var currentPosValid = getMaskSet().validPositions[maskPos]; + if (!currentPosValid || null !== currentPosValid.match.fn || currentPosValid.match.def !== c && c !== opts.skipOptionalPartCharacter) { + if ((opts.insertMode || getMaskSet().validPositions[seekNext(maskPos)] === undefined) && !isMask(maskPos, !0)) for (var nPos = maskPos + 1, snPos = seekNext(maskPos); nPos <= snPos; nPos++) if (!1 !== (result = _isValid(nPos, c, strict))) { + !function(originalPos, newPos) { + var vp = getMaskSet().validPositions[newPos]; + if (vp) for (var targetLocator = vp.locator, tll = targetLocator.length, ps = originalPos; ps < newPos; ps++) if (getMaskSet().validPositions[ps] === undefined && !isMask(ps, !0)) { + var tests = getTests(ps).slice(), bestMatch = determineTestTemplate(tests, !0), equality = -1; + "" === tests[tests.length - 1].match.def && tests.pop(), $.each(tests, function(ndx, tst) { + for (var i = 0; i < tll; i++) { + if (tst.locator[i] === undefined || !checkAlternationMatch(tst.locator[i].toString().split(","), targetLocator[i].toString().split(","), tst.na)) { + var targetAI = targetLocator[i], bestMatchAI = bestMatch.locator[i], tstAI = tst.locator[i]; + targetAI - bestMatchAI > Math.abs(targetAI - tstAI) && (bestMatch = tst); + break; + } + equality < i && (equality = i, bestMatch = tst); + } + }), (bestMatch = $.extend({}, bestMatch, { + input: getPlaceholder(ps, bestMatch.match, !0) || bestMatch.match.def + })).generatedInput = !0, setValidPosition(ps, bestMatch, !0), getMaskSet().validPositions[newPos] = undefined, + _isValid(newPos, vp.input, !0); + } + }(maskPos, result.pos !== undefined ? result.pos : nPos), maskPos = nPos; + break; + } + } else result = { + caret: seekNext(maskPos) + }; + } + !1 === result && opts.keepStatic && !strict && !0 !== fromAlternate && (result = function(pos, c, strict) { + var lastAlt, alternation, altPos, prevAltPos, i, validPos, altNdxs, decisionPos, validPsClone = $.extend(!0, {}, getMaskSet().validPositions), isValidRslt = !1, lAltPos = getLastValidPosition(); + for (prevAltPos = getMaskSet().validPositions[lAltPos]; lAltPos >= 0; lAltPos--) if ((altPos = getMaskSet().validPositions[lAltPos]) && altPos.alternation !== undefined) { + if (lastAlt = lAltPos, alternation = getMaskSet().validPositions[lastAlt].alternation, + prevAltPos.locator[altPos.alternation] !== altPos.locator[altPos.alternation]) break; + prevAltPos = altPos; + } + if (alternation !== undefined) { + decisionPos = parseInt(lastAlt); + var decisionTaker = prevAltPos.locator[prevAltPos.alternation || alternation] !== undefined ? prevAltPos.locator[prevAltPos.alternation || alternation] : altNdxs[0]; + decisionTaker.length > 0 && (decisionTaker = decisionTaker.split(",")[0]); + var possibilityPos = getMaskSet().validPositions[decisionPos], prevPos = getMaskSet().validPositions[decisionPos - 1]; + $.each(getTests(decisionPos, prevPos ? prevPos.locator : undefined, decisionPos - 1), function(ndx, test) { + altNdxs = test.locator[alternation] ? test.locator[alternation].toString().split(",") : []; + for (var mndx = 0; mndx < altNdxs.length; mndx++) { + var validInputs = [], staticInputsBeforePos = 0, staticInputsBeforePosAlternate = 0, verifyValidInput = !1; + if (decisionTaker < altNdxs[mndx] && (test.na === undefined || -1 === $.inArray(altNdxs[mndx], test.na.split(",")) || -1 === $.inArray(decisionTaker.toString(), altNdxs))) { + getMaskSet().validPositions[decisionPos] = $.extend(!0, {}, test); + var possibilities = getMaskSet().validPositions[decisionPos].locator; + for (getMaskSet().validPositions[decisionPos].locator[alternation] = parseInt(altNdxs[mndx]), + null == test.match.fn ? (possibilityPos.input !== test.match.def && (verifyValidInput = !0, + !0 !== possibilityPos.generatedInput && validInputs.push(possibilityPos.input)), + staticInputsBeforePosAlternate++, getMaskSet().validPositions[decisionPos].generatedInput = !/[0-9a-bA-Z]/.test(test.match.def), + getMaskSet().validPositions[decisionPos].input = test.match.def) : getMaskSet().validPositions[decisionPos].input = possibilityPos.input, + i = decisionPos + 1; i < getLastValidPosition(undefined, !0) + 1; i++) (validPos = getMaskSet().validPositions[i]) && !0 !== validPos.generatedInput && /[0-9a-bA-Z]/.test(validPos.input) ? validInputs.push(validPos.input) : i < pos && staticInputsBeforePos++, + delete getMaskSet().validPositions[i]; + for (verifyValidInput && validInputs[0] === test.match.def && validInputs.shift(), + resetMaskSet(!0), isValidRslt = !0; validInputs.length > 0; ) { + var input = validInputs.shift(); + if (input !== opts.skipOptionalPartCharacter && !(isValidRslt = isValid(getLastValidPosition(undefined, !0) + 1, input, !1, fromSetValid, !0))) break; + } + if (isValidRslt) { + getMaskSet().validPositions[decisionPos].locator = possibilities; + var targetLvp = getLastValidPosition(pos) + 1; + for (i = decisionPos + 1; i < getLastValidPosition() + 1; i++) ((validPos = getMaskSet().validPositions[i]) === undefined || null == validPos.match.fn) && i < pos + (staticInputsBeforePosAlternate - staticInputsBeforePos) && staticInputsBeforePosAlternate++; + isValidRslt = isValid((pos += staticInputsBeforePosAlternate - staticInputsBeforePos) > targetLvp ? targetLvp : pos, c, strict, fromSetValid, !0); + } + if (isValidRslt) return !1; + resetMaskSet(), getMaskSet().validPositions = $.extend(!0, {}, validPsClone); + } + } + }); + } + return isValidRslt; + }(maskPos, c, strict)), !0 === result && (result = { + pos: maskPos + }); + } + if ($.isFunction(opts.postValidation) && !1 !== result && !strict && !0 !== fromSetValid && !0 !== validateOnly) { + var postResult = opts.postValidation(getBuffer(!0), result, opts); + if (postResult.refreshFromBuffer && postResult.buffer) { + var refresh = postResult.refreshFromBuffer; + refreshFromBuffer(!0 === refresh ? refresh : refresh.start, refresh.end, postResult.buffer); + } + result = !0 === postResult ? result : postResult; + } + return result && result.pos === undefined && (result.pos = maskPos), !1 !== result && !0 !== validateOnly || (resetMaskSet(!0), + getMaskSet().validPositions = $.extend(!0, {}, positionsClone)), result; + } + function isMask(pos, strict) { + var test = getTestTemplate(pos).match; + if ("" === test.def && (test = getTest(pos).match), null != test.fn) return test.fn; + if (!0 !== strict && pos > -1) { + var tests = getTests(pos); + return tests.length > 1 + ("" === tests[tests.length - 1].match.def ? 1 : 0); + } + return !1; + } + function seekNext(pos, newBlock) { + var maskL = getMaskSet().maskLength; + if (pos >= maskL) return maskL; + var position = pos; + for (getTests(maskL + 1).length > 1 && (getMaskTemplate(!0, maskL + 1, !0), maskL = getMaskSet().maskLength); ++position < maskL && (!0 === newBlock && (!0 !== getTest(position).match.newBlockMarker || !isMask(position)) || !0 !== newBlock && !isMask(position)); ) ; + return position; + } + function seekPrevious(pos, newBlock) { + var tests, position = pos; + if (position <= 0) return 0; + for (;--position > 0 && (!0 === newBlock && !0 !== getTest(position).match.newBlockMarker || !0 !== newBlock && !isMask(position) && ((tests = getTests(position)).length < 2 || 2 === tests.length && "" === tests[1].match.def)); ) ; + return position; + } + function getBufferElement(position) { + return getMaskSet().validPositions[position] === undefined ? getPlaceholder(position) : getMaskSet().validPositions[position].input; + } + function writeBuffer(input, buffer, caretPos, event, triggerInputEvent) { + if (event && $.isFunction(opts.onBeforeWrite)) { + var result = opts.onBeforeWrite.call(inputmask, event, buffer, caretPos, opts); + if (result) { + if (result.refreshFromBuffer) { + var refresh = result.refreshFromBuffer; + refreshFromBuffer(!0 === refresh ? refresh : refresh.start, refresh.end, result.buffer || buffer), + buffer = getBuffer(!0); + } + caretPos !== undefined && (caretPos = result.caret !== undefined ? result.caret : caretPos); + } + } + input !== undefined && (input.inputmask._valueSet(buffer.join("")), caretPos === undefined || event !== undefined && "blur" === event.type ? renderColorMask(input, caretPos, 0 === buffer.length) : android && event && "input" === event.type ? setTimeout(function() { + caret(input, caretPos); + }, 0) : caret(input, caretPos), !0 === triggerInputEvent && (skipInputEvent = !0, + $(input).trigger("input"))); + } + function getPlaceholder(pos, test, returnPL) { + if ((test = test || getTest(pos).match).placeholder !== undefined || !0 === returnPL) return $.isFunction(test.placeholder) ? test.placeholder(opts) : test.placeholder; + if (null === test.fn) { + if (pos > -1 && getMaskSet().validPositions[pos] === undefined) { + var prevTest, tests = getTests(pos), staticAlternations = []; + if (tests.length > 1 + ("" === tests[tests.length - 1].match.def ? 1 : 0)) for (var i = 0; i < tests.length; i++) if (!0 !== tests[i].match.optionality && !0 !== tests[i].match.optionalQuantifier && (null === tests[i].match.fn || prevTest === undefined || !1 !== tests[i].match.fn.test(prevTest.match.def, getMaskSet(), pos, !0, opts)) && (staticAlternations.push(tests[i]), + null === tests[i].match.fn && (prevTest = tests[i]), staticAlternations.length > 1 && /[0-9a-bA-Z]/.test(staticAlternations[0].match.def))) return opts.placeholder.charAt(pos % opts.placeholder.length); + } + return test.def; + } + return opts.placeholder.charAt(pos % opts.placeholder.length); + } + function checkVal(input, writeOut, strict, nptvl, initiatingEvent) { + function isTemplateMatch(ndx, charCodes) { + return -1 !== getBufferTemplate().slice(ndx, seekNext(ndx)).join("").indexOf(charCodes) && !isMask(ndx) && getTest(ndx).match.nativeDef === charCodes.charAt(charCodes.length - 1); + } + var inputValue = nptvl.slice(), charCodes = "", initialNdx = -1, result = undefined; + if (resetMaskSet(), strict || !0 === opts.autoUnmask) initialNdx = seekNext(initialNdx); else { + var staticInput = getBufferTemplate().slice(0, seekNext(-1)).join(""), matches = inputValue.join("").match(new RegExp("^" + Inputmask.escapeRegex(staticInput), "g")); + matches && matches.length > 0 && (inputValue.splice(0, matches.length * staticInput.length), + initialNdx = seekNext(initialNdx)); + } + if (-1 === initialNdx ? (getMaskSet().p = seekNext(initialNdx), initialNdx = 0) : getMaskSet().p = initialNdx, + $.each(inputValue, function(ndx, charCode) { + if (charCode !== undefined) if (getMaskSet().validPositions[ndx] === undefined && inputValue[ndx] === getPlaceholder(ndx) && isMask(ndx, !0) && !1 === isValid(ndx, inputValue[ndx], !0, undefined, undefined, !0)) getMaskSet().p++; else { + var keypress = new $.Event("_checkval"); + keypress.which = charCode.charCodeAt(0), charCodes += charCode; + var lvp = getLastValidPosition(undefined, !0), lvTest = getMaskSet().validPositions[lvp], nextTest = getTestTemplate(lvp + 1, lvTest ? lvTest.locator.slice() : undefined, lvp); + if (!isTemplateMatch(initialNdx, charCodes) || strict || opts.autoUnmask) { + var pos = strict ? ndx : null == nextTest.match.fn && nextTest.match.optionality && lvp + 1 < getMaskSet().p ? lvp + 1 : getMaskSet().p; + result = EventHandlers.keypressEvent.call(input, keypress, !0, !1, strict, pos), + initialNdx = pos + 1, charCodes = ""; + } else result = EventHandlers.keypressEvent.call(input, keypress, !0, !1, !0, lvp + 1); + if (!1 !== result && !strict && $.isFunction(opts.onBeforeWrite)) { + var origResult = result; + if (result = opts.onBeforeWrite.call(inputmask, keypress, getBuffer(), result.forwardPosition, opts), + (result = $.extend(origResult, result)) && result.refreshFromBuffer) { + var refresh = result.refreshFromBuffer; + refreshFromBuffer(!0 === refresh ? refresh : refresh.start, refresh.end, result.buffer), + resetMaskSet(!0), result.caret && (getMaskSet().p = result.caret, result.forwardPosition = result.caret); + } + } + } + }), writeOut) { + var caretPos = undefined; + document.activeElement === input && result && (caretPos = opts.numericInput ? seekPrevious(result.forwardPosition) : result.forwardPosition), + writeBuffer(input, getBuffer(), caretPos, initiatingEvent || new $.Event("checkval"), initiatingEvent && "input" === initiatingEvent.type); + } + } + function unmaskedvalue(input) { + if (input) { + if (input.inputmask === undefined) return input.value; + input.inputmask && input.inputmask.refreshValue && EventHandlers.setValueEvent.call(input); + } + var umValue = [], vps = getMaskSet().validPositions; + for (var pndx in vps) vps[pndx].match && null != vps[pndx].match.fn && umValue.push(vps[pndx].input); + var unmaskedValue = 0 === umValue.length ? "" : (isRTL ? umValue.reverse() : umValue).join(""); + if ($.isFunction(opts.onUnMask)) { + var bufferValue = (isRTL ? getBuffer().slice().reverse() : getBuffer()).join(""); + unmaskedValue = opts.onUnMask.call(inputmask, bufferValue, unmaskedValue, opts); + } + return unmaskedValue; + } + function caret(input, begin, end, notranslate) { + function translatePosition(pos) { + return !0 === notranslate || !isRTL || "number" != typeof pos || opts.greedy && "" === opts.placeholder || (pos = getBuffer().join("").length - pos), + pos; + } + var range; + if (begin === undefined) return input.setSelectionRange ? (begin = input.selectionStart, + end = input.selectionEnd) : window.getSelection ? (range = window.getSelection().getRangeAt(0)).commonAncestorContainer.parentNode !== input && range.commonAncestorContainer !== input || (begin = range.startOffset, + end = range.endOffset) : document.selection && document.selection.createRange && (end = (begin = 0 - (range = document.selection.createRange()).duplicate().moveStart("character", -input.inputmask._valueGet().length)) + range.text.length), + { + begin: translatePosition(begin), + end: translatePosition(end) + }; + if (begin.begin !== undefined && (end = begin.end, begin = begin.begin), "number" == typeof begin) { + begin = translatePosition(begin), end = "number" == typeof (end = translatePosition(end)) ? end : begin; + var scrollCalc = parseInt(((input.ownerDocument.defaultView || window).getComputedStyle ? (input.ownerDocument.defaultView || window).getComputedStyle(input, null) : input.currentStyle).fontSize) * end; + if (input.scrollLeft = scrollCalc > input.scrollWidth ? scrollCalc : 0, mobile || !1 !== opts.insertMode || begin !== end || end++, + input.setSelectionRange) input.selectionStart = begin, input.selectionEnd = end; else if (window.getSelection) { + if (range = document.createRange(), input.firstChild === undefined || null === input.firstChild) { + var textNode = document.createTextNode(""); + input.appendChild(textNode); + } + range.setStart(input.firstChild, begin < input.inputmask._valueGet().length ? begin : input.inputmask._valueGet().length), + range.setEnd(input.firstChild, end < input.inputmask._valueGet().length ? end : input.inputmask._valueGet().length), + range.collapse(!0); + var sel = window.getSelection(); + sel.removeAllRanges(), sel.addRange(range); + } else input.createTextRange && ((range = input.createTextRange()).collapse(!0), + range.moveEnd("character", end), range.moveStart("character", begin), range.select()); + renderColorMask(input, { + begin: begin, + end: end + }); + } + } + function determineLastRequiredPosition(returnDefinition) { + var pos, testPos, buffer = getBuffer(), bl = buffer.length, lvp = getLastValidPosition(), positions = {}, lvTest = getMaskSet().validPositions[lvp], ndxIntlzr = lvTest !== undefined ? lvTest.locator.slice() : undefined; + for (pos = lvp + 1; pos < buffer.length; pos++) ndxIntlzr = (testPos = getTestTemplate(pos, ndxIntlzr, pos - 1)).locator.slice(), + positions[pos] = $.extend(!0, {}, testPos); + var lvTestAlt = lvTest && lvTest.alternation !== undefined ? lvTest.locator[lvTest.alternation] : undefined; + for (pos = bl - 1; pos > lvp && (((testPos = positions[pos]).match.optionality || testPos.match.optionalQuantifier && testPos.match.newBlockMarker || lvTestAlt && (lvTestAlt !== positions[pos].locator[lvTest.alternation] && null != testPos.match.fn || null === testPos.match.fn && testPos.locator[lvTest.alternation] && checkAlternationMatch(testPos.locator[lvTest.alternation].toString().split(","), lvTestAlt.toString().split(",")) && "" !== getTests(pos)[0].def)) && buffer[pos] === getPlaceholder(pos, testPos.match)); pos--) bl--; + return returnDefinition ? { + l: bl, + def: positions[bl] ? positions[bl].match : undefined + } : bl; + } + function clearOptionalTail(buffer) { + for (var validPos, rl = determineLastRequiredPosition(), bl = buffer.length, lv = getMaskSet().validPositions[getLastValidPosition()]; rl < bl && !isMask(rl, !0) && (validPos = lv !== undefined ? getTestTemplate(rl, lv.locator.slice(""), lv) : getTest(rl)) && !0 !== validPos.match.optionality && (!0 !== validPos.match.optionalQuantifier && !0 !== validPos.match.newBlockMarker || rl + 1 === bl && "" === (lv !== undefined ? getTestTemplate(rl + 1, lv.locator.slice(""), lv) : getTest(rl + 1)).match.def); ) rl++; + for (;(validPos = getMaskSet().validPositions[rl - 1]) && validPos && validPos.match.optionality && validPos.input === opts.skipOptionalPartCharacter; ) rl--; + return buffer.splice(rl), buffer; + } + function isComplete(buffer) { + if ($.isFunction(opts.isComplete)) return opts.isComplete(buffer, opts); + if ("*" === opts.repeat) return undefined; + var complete = !1, lrp = determineLastRequiredPosition(!0), aml = seekPrevious(lrp.l); + if (lrp.def === undefined || lrp.def.newBlockMarker || lrp.def.optionality || lrp.def.optionalQuantifier) { + complete = !0; + for (var i = 0; i <= aml; i++) { + var test = getTestTemplate(i).match; + if (null !== test.fn && getMaskSet().validPositions[i] === undefined && !0 !== test.optionality && !0 !== test.optionalQuantifier || null === test.fn && buffer[i] !== getPlaceholder(i, test)) { + complete = !1; + break; + } + } + } + return complete; + } + function handleRemove(input, k, pos, strict, fromIsValid) { + if ((opts.numericInput || isRTL) && (k === Inputmask.keyCode.BACKSPACE ? k = Inputmask.keyCode.DELETE : k === Inputmask.keyCode.DELETE && (k = Inputmask.keyCode.BACKSPACE), + isRTL)) { + var pend = pos.end; + pos.end = pos.begin, pos.begin = pend; + } + k === Inputmask.keyCode.BACKSPACE && (pos.end - pos.begin < 1 || !1 === opts.insertMode) ? (pos.begin = seekPrevious(pos.begin), + getMaskSet().validPositions[pos.begin] !== undefined && getMaskSet().validPositions[pos.begin].input === opts.groupSeparator && pos.begin--) : k === Inputmask.keyCode.DELETE && pos.begin === pos.end && (pos.end = isMask(pos.end, !0) && getMaskSet().validPositions[pos.end] && getMaskSet().validPositions[pos.end].input !== opts.radixPoint ? pos.end + 1 : seekNext(pos.end) + 1, + getMaskSet().validPositions[pos.begin] !== undefined && getMaskSet().validPositions[pos.begin].input === opts.groupSeparator && pos.end++), + stripValidPositions(pos.begin, pos.end, !1, strict), !0 !== strict && function() { + if (opts.keepStatic) { + for (var validInputs = [], lastAlt = getLastValidPosition(-1, !0), positionsClone = $.extend(!0, {}, getMaskSet().validPositions), prevAltPos = getMaskSet().validPositions[lastAlt]; lastAlt >= 0; lastAlt--) { + var altPos = getMaskSet().validPositions[lastAlt]; + if (altPos) { + if (!0 !== altPos.generatedInput && /[0-9a-bA-Z]/.test(altPos.input) && validInputs.push(altPos.input), + delete getMaskSet().validPositions[lastAlt], altPos.alternation !== undefined && altPos.locator[altPos.alternation] !== prevAltPos.locator[altPos.alternation]) break; + prevAltPos = altPos; + } + } + if (lastAlt > -1) for (getMaskSet().p = seekNext(getLastValidPosition(-1, !0)); validInputs.length > 0; ) { + var keypress = new $.Event("keypress"); + keypress.which = validInputs.pop().charCodeAt(0), EventHandlers.keypressEvent.call(input, keypress, !0, !1, !1, getMaskSet().p); + } else getMaskSet().validPositions = $.extend(!0, {}, positionsClone); + } + }(); + var lvp = getLastValidPosition(pos.begin, !0); + if (lvp < pos.begin) getMaskSet().p = seekNext(lvp); else if (!0 !== strict && (getMaskSet().p = pos.begin, + !0 !== fromIsValid)) for (;getMaskSet().p < lvp && getMaskSet().validPositions[getMaskSet().p] === undefined; ) getMaskSet().p++; + } + function initializeColorMask(input) { + function findCaretPos(clientx) { + var caretPos, e = document.createElement("span"); + for (var style in computedStyle) isNaN(style) && -1 !== style.indexOf("font") && (e.style[style] = computedStyle[style]); + e.style.textTransform = computedStyle.textTransform, e.style.letterSpacing = computedStyle.letterSpacing, + e.style.position = "absolute", e.style.height = "auto", e.style.width = "auto", + e.style.visibility = "hidden", e.style.whiteSpace = "nowrap", document.body.appendChild(e); + var itl, inputText = input.inputmask._valueGet(), previousWidth = 0; + for (caretPos = 0, itl = inputText.length; caretPos <= itl; caretPos++) { + if (e.innerHTML += inputText.charAt(caretPos) || "_", e.offsetWidth >= clientx) { + var offset1 = clientx - previousWidth, offset2 = e.offsetWidth - clientx; + e.innerHTML = inputText.charAt(caretPos), caretPos = (offset1 -= e.offsetWidth / 3) < offset2 ? caretPos - 1 : caretPos; + break; + } + previousWidth = e.offsetWidth; + } + return document.body.removeChild(e), caretPos; + } + var computedStyle = (input.ownerDocument.defaultView || window).getComputedStyle(input, null), template = document.createElement("div"); + template.style.width = computedStyle.width, template.style.textAlign = computedStyle.textAlign, + (colorMask = document.createElement("div")).className = "im-colormask", input.parentNode.insertBefore(colorMask, input), + input.parentNode.removeChild(input), colorMask.appendChild(template), colorMask.appendChild(input), + input.style.left = template.offsetLeft + "px", $(input).on("click", function(e) { + return caret(input, findCaretPos(e.clientX)), EventHandlers.clickEvent.call(input, [ e ]); + }), $(input).on("keydown", function(e) { + e.shiftKey || !1 === opts.insertMode || setTimeout(function() { + renderColorMask(input); + }, 0); + }); + } + function renderColorMask(input, caretPos, clear) { + function handleStatic() { + isStatic || null !== test.fn && testPos.input !== undefined ? isStatic && (null !== test.fn && testPos.input !== undefined || "" === test.def) && (isStatic = !1, + maskTemplate += "") : (isStatic = !0, maskTemplate += ""); + } + function handleCaret(force) { + !0 !== force && pos !== caretPos.begin || document.activeElement !== input || (maskTemplate += ""); + } + var test, testPos, ndxIntlzr, maskTemplate = "", isStatic = !1, pos = 0; + if (colorMask !== undefined) { + var buffer = getBuffer(); + if (caretPos === undefined ? caretPos = caret(input) : caretPos.begin === undefined && (caretPos = { + begin: caretPos, + end: caretPos + }), !0 !== clear) { + var lvp = getLastValidPosition(); + do { + handleCaret(), getMaskSet().validPositions[pos] ? (testPos = getMaskSet().validPositions[pos], + test = testPos.match, ndxIntlzr = testPos.locator.slice(), handleStatic(), maskTemplate += buffer[pos]) : (testPos = getTestTemplate(pos, ndxIntlzr, pos - 1), + test = testPos.match, ndxIntlzr = testPos.locator.slice(), (!1 === opts.jitMasking || pos < lvp || "number" == typeof opts.jitMasking && isFinite(opts.jitMasking) && opts.jitMasking > pos) && (handleStatic(), + maskTemplate += getPlaceholder(pos, test))), pos++; + } while ((maxLength === undefined || pos < maxLength) && (null !== test.fn || "" !== test.def) || lvp > pos || isStatic); + -1 === maskTemplate.indexOf("im-caret") && handleCaret(!0), isStatic && handleStatic(); + } + var template = colorMask.getElementsByTagName("div")[0]; + template.innerHTML = maskTemplate, input.inputmask.positionColorMask(input, template); + } + } + maskset = maskset || this.maskset, opts = opts || this.opts; + var undoValue, $el, maxLength, colorMask, inputmask = this, el = this.el, isRTL = this.isRTL, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, mouseEnter = !1, EventRuler = { + on: function(input, eventName, eventHandler) { + var ev = function(e) { + if (this.inputmask === undefined && "FORM" !== this.nodeName) { + var imOpts = $.data(this, "_inputmask_opts"); + imOpts ? new Inputmask(imOpts).mask(this) : EventRuler.off(this); + } else { + if ("setvalue" === e.type || "FORM" === this.nodeName || !(this.disabled || this.readOnly && !("keydown" === e.type && e.ctrlKey && 67 === e.keyCode || !1 === opts.tabThrough && e.keyCode === Inputmask.keyCode.TAB))) { + switch (e.type) { + case "input": + if (!0 === skipInputEvent) return skipInputEvent = !1, e.preventDefault(); + break; + + case "keydown": + skipKeyPressEvent = !1, skipInputEvent = !1; + break; + + case "keypress": + if (!0 === skipKeyPressEvent) return e.preventDefault(); + skipKeyPressEvent = !0; + break; + + case "click": + if (iemobile || iphone) { + var that = this, args = arguments; + return setTimeout(function() { + eventHandler.apply(that, args); + }, 0), !1; + } + } + var returnVal = eventHandler.apply(this, arguments); + return !1 === returnVal && (e.preventDefault(), e.stopPropagation()), returnVal; + } + e.preventDefault(); + } + }; + input.inputmask.events[eventName] = input.inputmask.events[eventName] || [], input.inputmask.events[eventName].push(ev), + -1 !== $.inArray(eventName, [ "submit", "reset" ]) ? null !== input.form && $(input.form).on(eventName, ev) : $(input).on(eventName, ev); + }, + off: function(input, event) { + if (input.inputmask && input.inputmask.events) { + var events; + event ? (events = [])[event] = input.inputmask.events[event] : events = input.inputmask.events, + $.each(events, function(eventName, evArr) { + for (;evArr.length > 0; ) { + var ev = evArr.pop(); + -1 !== $.inArray(eventName, [ "submit", "reset" ]) ? null !== input.form && $(input.form).off(eventName, ev) : $(input).off(eventName, ev); + } + delete input.inputmask.events[eventName]; + }); + } + } + }, EventHandlers = { + keydownEvent: function(e) { + var input = this, $input = $(input), k = e.keyCode, pos = caret(input); + if (k === Inputmask.keyCode.BACKSPACE || k === Inputmask.keyCode.DELETE || iphone && k === Inputmask.keyCode.BACKSPACE_SAFARI || e.ctrlKey && k === Inputmask.keyCode.X && !function(eventName) { + var el = document.createElement("input"), evName = "on" + eventName, isSupported = evName in el; + return isSupported || (el.setAttribute(evName, "return;"), isSupported = "function" == typeof el[evName]), + el = null, isSupported; + }("cut")) e.preventDefault(), handleRemove(input, k, pos), writeBuffer(input, getBuffer(!0), getMaskSet().p, e, input.inputmask._valueGet() !== getBuffer().join("")), + input.inputmask._valueGet() === getBufferTemplate().join("") ? $input.trigger("cleared") : !0 === isComplete(getBuffer()) && $input.trigger("complete"); else if (k === Inputmask.keyCode.END || k === Inputmask.keyCode.PAGE_DOWN) { + e.preventDefault(); + var caretPos = seekNext(getLastValidPosition()); + opts.insertMode || caretPos !== getMaskSet().maskLength || e.shiftKey || caretPos--, + caret(input, e.shiftKey ? pos.begin : caretPos, caretPos, !0); + } else k === Inputmask.keyCode.HOME && !e.shiftKey || k === Inputmask.keyCode.PAGE_UP ? (e.preventDefault(), + caret(input, 0, e.shiftKey ? pos.begin : 0, !0)) : (opts.undoOnEscape && k === Inputmask.keyCode.ESCAPE || 90 === k && e.ctrlKey) && !0 !== e.altKey ? (checkVal(input, !0, !1, undoValue.split("")), + $input.trigger("click")) : k !== Inputmask.keyCode.INSERT || e.shiftKey || e.ctrlKey ? !0 === opts.tabThrough && k === Inputmask.keyCode.TAB ? (!0 === e.shiftKey ? (null === getTest(pos.begin).match.fn && (pos.begin = seekNext(pos.begin)), + pos.end = seekPrevious(pos.begin, !0), pos.begin = seekPrevious(pos.end, !0)) : (pos.begin = seekNext(pos.begin, !0), + pos.end = seekNext(pos.begin, !0), pos.end < getMaskSet().maskLength && pos.end--), + pos.begin < getMaskSet().maskLength && (e.preventDefault(), caret(input, pos.begin, pos.end))) : e.shiftKey || !1 === opts.insertMode && (k === Inputmask.keyCode.RIGHT ? setTimeout(function() { + var caretPos = caret(input); + caret(input, caretPos.begin); + }, 0) : k === Inputmask.keyCode.LEFT && setTimeout(function() { + var caretPos = caret(input); + caret(input, isRTL ? caretPos.begin + 1 : caretPos.begin - 1); + }, 0)) : (opts.insertMode = !opts.insertMode, caret(input, opts.insertMode || pos.begin !== getMaskSet().maskLength ? pos.begin : pos.begin - 1)); + opts.onKeyDown.call(this, e, getBuffer(), caret(input).begin, opts), ignorable = -1 !== $.inArray(k, opts.ignorables); + }, + keypressEvent: function(e, checkval, writeOut, strict, ndx) { + var input = this, $input = $(input), k = e.which || e.charCode || e.keyCode; + if (!(!0 === checkval || e.ctrlKey && e.altKey) && (e.ctrlKey || e.metaKey || ignorable)) return k === Inputmask.keyCode.ENTER && undoValue !== getBuffer().join("") && (undoValue = getBuffer().join(""), + setTimeout(function() { + $input.trigger("change"); + }, 0)), !0; + if (k) { + 46 === k && !1 === e.shiftKey && "" !== opts.radixPoint && (k = opts.radixPoint.charCodeAt(0)); + var forwardPosition, pos = checkval ? { + begin: ndx, + end: ndx + } : caret(input), c = String.fromCharCode(k); + getMaskSet().writeOutBuffer = !0; + var valResult = isValid(pos, c, strict); + if (!1 !== valResult && (resetMaskSet(!0), forwardPosition = valResult.caret !== undefined ? valResult.caret : checkval ? valResult.pos + 1 : seekNext(valResult.pos), + getMaskSet().p = forwardPosition), !1 !== writeOut && (setTimeout(function() { + opts.onKeyValidation.call(input, k, valResult, opts); + }, 0), getMaskSet().writeOutBuffer && !1 !== valResult)) { + var buffer = getBuffer(); + writeBuffer(input, buffer, opts.numericInput && valResult.caret === undefined ? seekPrevious(forwardPosition) : forwardPosition, e, !0 !== checkval), + !0 !== checkval && setTimeout(function() { + !0 === isComplete(buffer) && $input.trigger("complete"); + }, 0); + } + if (e.preventDefault(), checkval) return !1 !== valResult && (valResult.forwardPosition = forwardPosition), + valResult; + } + }, + pasteEvent: function(e) { + var tempValue, input = this, ev = e.originalEvent || e, $input = $(input), inputValue = input.inputmask._valueGet(!0), caretPos = caret(input); + isRTL && (tempValue = caretPos.end, caretPos.end = caretPos.begin, caretPos.begin = tempValue); + var valueBeforeCaret = inputValue.substr(0, caretPos.begin), valueAfterCaret = inputValue.substr(caretPos.end, inputValue.length); + if (valueBeforeCaret === (isRTL ? getBufferTemplate().reverse() : getBufferTemplate()).slice(0, caretPos.begin).join("") && (valueBeforeCaret = ""), + valueAfterCaret === (isRTL ? getBufferTemplate().reverse() : getBufferTemplate()).slice(caretPos.end).join("") && (valueAfterCaret = ""), + isRTL && (tempValue = valueBeforeCaret, valueBeforeCaret = valueAfterCaret, valueAfterCaret = tempValue), + window.clipboardData && window.clipboardData.getData) inputValue = valueBeforeCaret + window.clipboardData.getData("Text") + valueAfterCaret; else { + if (!ev.clipboardData || !ev.clipboardData.getData) return !0; + inputValue = valueBeforeCaret + ev.clipboardData.getData("text/plain") + valueAfterCaret; + } + var pasteValue = inputValue; + if ($.isFunction(opts.onBeforePaste)) { + if (!1 === (pasteValue = opts.onBeforePaste.call(inputmask, inputValue, opts))) return e.preventDefault(); + pasteValue || (pasteValue = inputValue); + } + return checkVal(input, !1, !1, isRTL ? pasteValue.split("").reverse() : pasteValue.toString().split("")), + writeBuffer(input, getBuffer(), seekNext(getLastValidPosition()), e, undoValue !== getBuffer().join("")), + !0 === isComplete(getBuffer()) && $input.trigger("complete"), e.preventDefault(); + }, + inputFallBackEvent: function(e) { + var input = this, inputValue = input.inputmask._valueGet(); + if (getBuffer().join("") !== inputValue) { + var caretPos = caret(input); + if (!1 === function(input, inputValue, caretPos) { + if ("." === inputValue.charAt(caretPos.begin - 1) && "" !== opts.radixPoint && ((inputValue = inputValue.split(""))[caretPos.begin - 1] = opts.radixPoint.charAt(0), + inputValue = inputValue.join("")), inputValue.charAt(caretPos.begin - 1) === opts.radixPoint && inputValue.length > getBuffer().length) { + var keypress = new $.Event("keypress"); + return keypress.which = opts.radixPoint.charCodeAt(0), EventHandlers.keypressEvent.call(input, keypress, !0, !0, !1, caretPos.begin - 1), + !1; + } + }(input, inputValue, caretPos)) return !1; + if (inputValue = inputValue.replace(new RegExp("(" + Inputmask.escapeRegex(getBufferTemplate().join("")) + ")*"), ""), + !1 === function(input, inputValue, caretPos) { + if (iemobile) { + var inputChar = inputValue.replace(getBuffer().join(""), ""); + if (1 === inputChar.length) { + var keypress = new $.Event("keypress"); + return keypress.which = inputChar.charCodeAt(0), EventHandlers.keypressEvent.call(input, keypress, !0, !0, !1, getMaskSet().validPositions[caretPos.begin - 1] ? caretPos.begin : caretPos.begin - 1), + !1; + } + } + }(input, inputValue, caretPos)) return !1; + caretPos.begin > inputValue.length && (caret(input, inputValue.length), caretPos = caret(input)); + var buffer = getBuffer().join(""), frontPart = inputValue.substr(0, caretPos.begin), backPart = inputValue.substr(caretPos.begin), frontBufferPart = buffer.substr(0, caretPos.begin), backBufferPart = buffer.substr(caretPos.begin), selection = caretPos, entries = "", isEntry = !1; + if (frontPart !== frontBufferPart) { + selection.begin = 0; + for (var fpl = (isEntry = frontPart.length >= frontBufferPart.length) ? frontPart.length : frontBufferPart.length, i = 0; frontPart.charAt(i) === frontBufferPart.charAt(i) && i < fpl; i++) selection.begin++; + isEntry && (entries += frontPart.slice(selection.begin, selection.end)); + } + backPart !== backBufferPart && (backPart.length > backBufferPart.length ? isEntry && (selection.end = selection.begin) : backPart.length < backBufferPart.length ? selection.end += backBufferPart.length - backPart.length : backPart.charAt(0) !== backBufferPart.charAt(0) && selection.end++), + writeBuffer(input, getBuffer(), selection), entries.length > 0 ? $.each(entries.split(""), function(ndx, entry) { + var keypress = new $.Event("keypress"); + keypress.which = entry.charCodeAt(0), ignorable = !1, EventHandlers.keypressEvent.call(input, keypress); + }) : (selection.begin === selection.end - 1 && caret(input, seekPrevious(selection.begin + 1), selection.end), + e.keyCode = Inputmask.keyCode.DELETE, EventHandlers.keydownEvent.call(input, e)), + e.preventDefault(); + } + }, + setValueEvent: function(e) { + this.inputmask.refreshValue = !1; + var input = this, value = input.inputmask._valueGet(!0); + $.isFunction(opts.onBeforeMask) && (value = opts.onBeforeMask.call(inputmask, value, opts) || value), + value = value.split(""), checkVal(input, !0, !1, isRTL ? value.reverse() : value), + undoValue = getBuffer().join(""), (opts.clearMaskOnLostFocus || opts.clearIncomplete) && input.inputmask._valueGet() === getBufferTemplate().join("") && input.inputmask._valueSet(""); + }, + focusEvent: function(e) { + var input = this, nptValue = input.inputmask._valueGet(); + opts.showMaskOnFocus && (!opts.showMaskOnHover || opts.showMaskOnHover && "" === nptValue) && (input.inputmask._valueGet() !== getBuffer().join("") ? writeBuffer(input, getBuffer(), seekNext(getLastValidPosition())) : !1 === mouseEnter && caret(input, seekNext(getLastValidPosition()))), + !0 === opts.positionCaretOnTab && !1 === mouseEnter && "" !== nptValue && (writeBuffer(input, getBuffer(), caret(input)), + EventHandlers.clickEvent.apply(input, [ e, !0 ])), undoValue = getBuffer().join(""); + }, + mouseleaveEvent: function(e) { + var input = this; + if (mouseEnter = !1, opts.clearMaskOnLostFocus && document.activeElement !== input) { + var buffer = getBuffer().slice(), nptValue = input.inputmask._valueGet(); + nptValue !== input.getAttribute("placeholder") && "" !== nptValue && (-1 === getLastValidPosition() && nptValue === getBufferTemplate().join("") ? buffer = [] : clearOptionalTail(buffer), + writeBuffer(input, buffer)); + } + }, + clickEvent: function(e, tabbed) { + function doRadixFocus(clickPos) { + if ("" !== opts.radixPoint) { + var vps = getMaskSet().validPositions; + if (vps[clickPos] === undefined || vps[clickPos].input === getPlaceholder(clickPos)) { + if (clickPos < seekNext(-1)) return !0; + var radixPos = $.inArray(opts.radixPoint, getBuffer()); + if (-1 !== radixPos) { + for (var vp in vps) if (radixPos < vp && vps[vp].input !== getPlaceholder(vp)) return !1; + return !0; + } + } + } + return !1; + } + var input = this; + setTimeout(function() { + if (document.activeElement === input) { + var selectedCaret = caret(input); + if (tabbed && (isRTL ? selectedCaret.end = selectedCaret.begin : selectedCaret.begin = selectedCaret.end), + selectedCaret.begin === selectedCaret.end) switch (opts.positionCaretOnClick) { + case "none": + break; + + case "radixFocus": + if (doRadixFocus(selectedCaret.begin)) { + var radixPos = getBuffer().join("").indexOf(opts.radixPoint); + caret(input, opts.numericInput ? seekNext(radixPos) : radixPos); + break; + } + + default: + var clickPosition = selectedCaret.begin, lvclickPosition = getLastValidPosition(clickPosition, !0), lastPosition = seekNext(lvclickPosition); + if (clickPosition < lastPosition) caret(input, isMask(clickPosition, !0) || isMask(clickPosition - 1, !0) ? clickPosition : seekNext(clickPosition)); else { + var lvp = getMaskSet().validPositions[lvclickPosition], tt = getTestTemplate(lastPosition, lvp ? lvp.match.locator : undefined, lvp), placeholder = getPlaceholder(lastPosition, tt.match); + if ("" !== placeholder && getBuffer()[lastPosition] !== placeholder && !0 !== tt.match.optionalQuantifier && !0 !== tt.match.newBlockMarker || !isMask(lastPosition, !0) && tt.match.def === placeholder) { + var newPos = seekNext(lastPosition); + (clickPosition >= newPos || clickPosition === lastPosition) && (lastPosition = newPos); + } + caret(input, lastPosition); + } + } + } + }, 0); + }, + dblclickEvent: function(e) { + var input = this; + setTimeout(function() { + caret(input, 0, seekNext(getLastValidPosition())); + }, 0); + }, + cutEvent: function(e) { + var input = this, $input = $(input), pos = caret(input), ev = e.originalEvent || e, clipboardData = window.clipboardData || ev.clipboardData, clipData = isRTL ? getBuffer().slice(pos.end, pos.begin) : getBuffer().slice(pos.begin, pos.end); + clipboardData.setData("text", isRTL ? clipData.reverse().join("") : clipData.join("")), + document.execCommand && document.execCommand("copy"), handleRemove(input, Inputmask.keyCode.DELETE, pos), + writeBuffer(input, getBuffer(), getMaskSet().p, e, undoValue !== getBuffer().join("")), + input.inputmask._valueGet() === getBufferTemplate().join("") && $input.trigger("cleared"); + }, + blurEvent: function(e) { + var $input = $(this), input = this; + if (input.inputmask) { + var nptValue = input.inputmask._valueGet(), buffer = getBuffer().slice(); + "" !== nptValue && (opts.clearMaskOnLostFocus && (-1 === getLastValidPosition() && nptValue === getBufferTemplate().join("") ? buffer = [] : clearOptionalTail(buffer)), + !1 === isComplete(buffer) && (setTimeout(function() { + $input.trigger("incomplete"); + }, 0), opts.clearIncomplete && (resetMaskSet(), buffer = opts.clearMaskOnLostFocus ? [] : getBufferTemplate().slice())), + writeBuffer(input, buffer, undefined, e)), undoValue !== getBuffer().join("") && (undoValue = buffer.join(""), + $input.trigger("change")); + } + }, + mouseenterEvent: function(e) { + var input = this; + mouseEnter = !0, document.activeElement !== input && opts.showMaskOnHover && input.inputmask._valueGet() !== getBuffer().join("") && writeBuffer(input, getBuffer()); + }, + submitEvent: function(e) { + undoValue !== getBuffer().join("") && $el.trigger("change"), opts.clearMaskOnLostFocus && -1 === getLastValidPosition() && el.inputmask._valueGet && el.inputmask._valueGet() === getBufferTemplate().join("") && el.inputmask._valueSet(""), + opts.removeMaskOnSubmit && (el.inputmask._valueSet(el.inputmask.unmaskedvalue(), !0), + setTimeout(function() { + writeBuffer(el, getBuffer()); + }, 0)); + }, + resetEvent: function(e) { + el.inputmask.refreshValue = !0, setTimeout(function() { + $el.trigger("setvalue"); + }, 0); + } + }; + Inputmask.prototype.positionColorMask = function(input, template) { + input.style.left = template.offsetLeft + "px"; + }; + var valueBuffer; + if (actionObj !== undefined) switch (actionObj.action) { + case "isComplete": + return el = actionObj.el, isComplete(getBuffer()); + + case "unmaskedvalue": + return el !== undefined && actionObj.value === undefined || (valueBuffer = actionObj.value, + valueBuffer = ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask.call(inputmask, valueBuffer, opts) || valueBuffer : valueBuffer).split(""), + checkVal(undefined, !1, !1, isRTL ? valueBuffer.reverse() : valueBuffer), $.isFunction(opts.onBeforeWrite) && opts.onBeforeWrite.call(inputmask, undefined, getBuffer(), 0, opts)), + unmaskedvalue(el); + + case "mask": + !function(elem) { + EventRuler.off(elem); + var isSupported = function(input, opts) { + var elementType = input.getAttribute("type"), isSupported = "INPUT" === input.tagName && -1 !== $.inArray(elementType, opts.supportsInputType) || input.isContentEditable || "TEXTAREA" === input.tagName; + if (!isSupported) if ("INPUT" === input.tagName) { + var el = document.createElement("input"); + el.setAttribute("type", elementType), isSupported = "text" === el.type, el = null; + } else isSupported = "partial"; + return !1 !== isSupported ? function(npt) { + function getter() { + return this.inputmask ? this.inputmask.opts.autoUnmask ? this.inputmask.unmaskedvalue() : -1 !== getLastValidPosition() || !0 !== opts.nullable ? document.activeElement === this && opts.clearMaskOnLostFocus ? (isRTL ? clearOptionalTail(getBuffer().slice()).reverse() : clearOptionalTail(getBuffer().slice())).join("") : valueGet.call(this) : "" : valueGet.call(this); + } + function setter(value) { + valueSet.call(this, value), this.inputmask && $(this).trigger("setvalue"); + } + var valueGet, valueSet; + if (!npt.inputmask.__valueGet) { + if (!0 !== opts.noValuePatching) { + if (Object.getOwnPropertyDescriptor) { + "function" != typeof Object.getPrototypeOf && (Object.getPrototypeOf = "object" === _typeof("test".__proto__) ? function(object) { + return object.__proto__; + } : function(object) { + return object.constructor.prototype; + }); + var valueProperty = Object.getPrototypeOf ? Object.getOwnPropertyDescriptor(Object.getPrototypeOf(npt), "value") : undefined; + valueProperty && valueProperty.get && valueProperty.set ? (valueGet = valueProperty.get, + valueSet = valueProperty.set, Object.defineProperty(npt, "value", { + get: getter, + set: setter, + configurable: !0 + })) : "INPUT" !== npt.tagName && (valueGet = function() { + return this.textContent; + }, valueSet = function(value) { + this.textContent = value; + }, Object.defineProperty(npt, "value", { + get: getter, + set: setter, + configurable: !0 + })); + } else document.__lookupGetter__ && npt.__lookupGetter__("value") && (valueGet = npt.__lookupGetter__("value"), + valueSet = npt.__lookupSetter__("value"), npt.__defineGetter__("value", getter), + npt.__defineSetter__("value", setter)); + npt.inputmask.__valueGet = valueGet, npt.inputmask.__valueSet = valueSet; + } + npt.inputmask._valueGet = function(overruleRTL) { + return isRTL && !0 !== overruleRTL ? valueGet.call(this.el).split("").reverse().join("") : valueGet.call(this.el); + }, npt.inputmask._valueSet = function(value, overruleRTL) { + valueSet.call(this.el, null === value || value === undefined ? "" : !0 !== overruleRTL && isRTL ? value.split("").reverse().join("") : value); + }, valueGet === undefined && (valueGet = function() { + return this.value; + }, valueSet = function(value) { + this.value = value; + }, function(type) { + if ($.valHooks && ($.valHooks[type] === undefined || !0 !== $.valHooks[type].inputmaskpatch)) { + var valhookGet = $.valHooks[type] && $.valHooks[type].get ? $.valHooks[type].get : function(elem) { + return elem.value; + }, valhookSet = $.valHooks[type] && $.valHooks[type].set ? $.valHooks[type].set : function(elem, value) { + return elem.value = value, elem; + }; + $.valHooks[type] = { + get: function(elem) { + if (elem.inputmask) { + if (elem.inputmask.opts.autoUnmask) return elem.inputmask.unmaskedvalue(); + var result = valhookGet(elem); + return -1 !== getLastValidPosition(undefined, undefined, elem.inputmask.maskset.validPositions) || !0 !== opts.nullable ? result : ""; + } + return valhookGet(elem); + }, + set: function(elem, value) { + var result, $elem = $(elem); + return result = valhookSet(elem, value), elem.inputmask && $elem.trigger("setvalue"), + result; + }, + inputmaskpatch: !0 + }; + } + }(npt.type), function(npt) { + EventRuler.on(npt, "mouseenter", function(event) { + var $input = $(this); + this.inputmask._valueGet() !== getBuffer().join("") && $input.trigger("setvalue"); + }); + }(npt)); + } + }(input) : input.inputmask = undefined, isSupported; + }(elem, opts); + if (!1 !== isSupported && (el = elem, $el = $(el), -1 === (maxLength = el !== undefined ? el.maxLength : undefined) && (maxLength = undefined), + !0 === opts.colorMask && initializeColorMask(el), android && (el.hasOwnProperty("inputmode") && (el.inputmode = opts.inputmode, + el.setAttribute("inputmode", opts.inputmode)), "rtfm" === opts.androidHack && (!0 !== opts.colorMask && initializeColorMask(el), + el.type = "password")), !0 === isSupported && (EventRuler.on(el, "submit", EventHandlers.submitEvent), + EventRuler.on(el, "reset", EventHandlers.resetEvent), EventRuler.on(el, "mouseenter", EventHandlers.mouseenterEvent), + EventRuler.on(el, "blur", EventHandlers.blurEvent), EventRuler.on(el, "focus", EventHandlers.focusEvent), + EventRuler.on(el, "mouseleave", EventHandlers.mouseleaveEvent), !0 !== opts.colorMask && EventRuler.on(el, "click", EventHandlers.clickEvent), + EventRuler.on(el, "dblclick", EventHandlers.dblclickEvent), EventRuler.on(el, "paste", EventHandlers.pasteEvent), + EventRuler.on(el, "dragdrop", EventHandlers.pasteEvent), EventRuler.on(el, "drop", EventHandlers.pasteEvent), + EventRuler.on(el, "cut", EventHandlers.cutEvent), EventRuler.on(el, "complete", opts.oncomplete), + EventRuler.on(el, "incomplete", opts.onincomplete), EventRuler.on(el, "cleared", opts.oncleared), + android || !0 === opts.inputEventOnly ? el.removeAttribute("maxLength") : (EventRuler.on(el, "keydown", EventHandlers.keydownEvent), + EventRuler.on(el, "keypress", EventHandlers.keypressEvent)), EventRuler.on(el, "compositionstart", $.noop), + EventRuler.on(el, "compositionupdate", $.noop), EventRuler.on(el, "compositionend", $.noop), + EventRuler.on(el, "keyup", $.noop), EventRuler.on(el, "input", EventHandlers.inputFallBackEvent), + EventRuler.on(el, "beforeinput", $.noop)), EventRuler.on(el, "setvalue", EventHandlers.setValueEvent), + undoValue = getBufferTemplate().join(""), "" !== el.inputmask._valueGet(!0) || !1 === opts.clearMaskOnLostFocus || document.activeElement === el)) { + var initialValue = $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask.call(inputmask, el.inputmask._valueGet(!0), opts) || el.inputmask._valueGet(!0) : el.inputmask._valueGet(!0); + "" !== initialValue && checkVal(el, !0, !1, isRTL ? initialValue.split("").reverse() : initialValue.split("")); + var buffer = getBuffer().slice(); + undoValue = buffer.join(""), !1 === isComplete(buffer) && opts.clearIncomplete && resetMaskSet(), + opts.clearMaskOnLostFocus && document.activeElement !== el && (-1 === getLastValidPosition() ? buffer = [] : clearOptionalTail(buffer)), + writeBuffer(el, buffer), document.activeElement === el && caret(el, seekNext(getLastValidPosition())); + } + }(el); + break; + + case "format": + return valueBuffer = ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask.call(inputmask, actionObj.value, opts) || actionObj.value : actionObj.value).split(""), + checkVal(undefined, !0, !1, isRTL ? valueBuffer.reverse() : valueBuffer), actionObj.metadata ? { + value: isRTL ? getBuffer().slice().reverse().join("") : getBuffer().join(""), + metadata: maskScope.call(this, { + action: "getmetadata" + }, maskset, opts) + } : isRTL ? getBuffer().slice().reverse().join("") : getBuffer().join(""); + + case "isValid": + actionObj.value ? (valueBuffer = actionObj.value.split(""), checkVal(undefined, !0, !0, isRTL ? valueBuffer.reverse() : valueBuffer)) : actionObj.value = getBuffer().join(""); + for (var buffer = getBuffer(), rl = determineLastRequiredPosition(), lmib = buffer.length - 1; lmib > rl && !isMask(lmib); lmib--) ; + return buffer.splice(rl, lmib + 1 - rl), isComplete(buffer) && actionObj.value === getBuffer().join(""); + + case "getemptymask": + return getBufferTemplate().join(""); + + case "remove": + if (el && el.inputmask) { + $el = $(el), el.inputmask._valueSet(opts.autoUnmask ? unmaskedvalue(el) : el.inputmask._valueGet(!0)), + EventRuler.off(el); + Object.getOwnPropertyDescriptor && Object.getPrototypeOf ? Object.getOwnPropertyDescriptor(Object.getPrototypeOf(el), "value") && el.inputmask.__valueGet && Object.defineProperty(el, "value", { + get: el.inputmask.__valueGet, + set: el.inputmask.__valueSet, + configurable: !0 + }) : document.__lookupGetter__ && el.__lookupGetter__("value") && el.inputmask.__valueGet && (el.__defineGetter__("value", el.inputmask.__valueGet), + el.__defineSetter__("value", el.inputmask.__valueSet)), el.inputmask = undefined; + } + return el; + + case "getmetadata": + if ($.isArray(maskset.metadata)) { + var maskTarget = getMaskTemplate(!0, 0, !1).join(""); + return $.each(maskset.metadata, function(ndx, mtdt) { + if (mtdt.mask === maskTarget) return maskTarget = mtdt, !1; + }), maskTarget; + } + return maskset.metadata; + } + } + var ua = navigator.userAgent, mobile = /mobile/i.test(ua), iemobile = /iemobile/i.test(ua), iphone = /iphone/i.test(ua) && !iemobile, android = /android/i.test(ua) && !iemobile; + return Inputmask.prototype = { + dataAttribute: "data-inputmask", + defaults: { + placeholder: "_", + optionalmarker: { + start: "[", + end: "]" + }, + quantifiermarker: { + start: "{", + end: "}" + }, + groupmarker: { + start: "(", + end: ")" + }, + alternatormarker: "|", + escapeChar: "\\", + mask: null, + regex: null, + oncomplete: $.noop, + onincomplete: $.noop, + oncleared: $.noop, + repeat: 0, + greedy: !0, + autoUnmask: !1, + removeMaskOnSubmit: !1, + clearMaskOnLostFocus: !0, + insertMode: !0, + clearIncomplete: !1, + alias: null, + onKeyDown: $.noop, + onBeforeMask: null, + onBeforePaste: function(pastedValue, opts) { + return $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask.call(this, pastedValue, opts) : pastedValue; + }, + onBeforeWrite: null, + onUnMask: null, + showMaskOnFocus: !0, + showMaskOnHover: !0, + onKeyValidation: $.noop, + skipOptionalPartCharacter: " ", + numericInput: !1, + rightAlign: !1, + undoOnEscape: !0, + radixPoint: "", + radixPointDefinitionSymbol: undefined, + groupSeparator: "", + keepStatic: null, + positionCaretOnTab: !0, + tabThrough: !1, + supportsInputType: [ "text", "tel", "password" ], + ignorables: [ 8, 9, 13, 19, 27, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 93, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 0, 229 ], + isComplete: null, + canClearPosition: $.noop, + preValidation: null, + postValidation: null, + staticDefinitionSymbol: undefined, + jitMasking: !1, + nullable: !0, + inputEventOnly: !1, + noValuePatching: !1, + positionCaretOnClick: "lvp", + casing: null, + inputmode: "verbatim", + colorMask: !1, + androidHack: !1, + importDataAttributes: !0 + }, + definitions: { + "9": { + validator: "[0-91-9]", + cardinality: 1, + definitionSymbol: "*" + }, + a: { + validator: "[A-Za-zА-яЁёÀ-ÿµ]", + cardinality: 1, + definitionSymbol: "*" + }, + "*": { + validator: "[0-91-9A-Za-zА-яЁёÀ-ÿµ]", + cardinality: 1 + } + }, + aliases: {}, + masksCache: {}, + mask: function(elems) { + function importAttributeOptions(npt, opts, userOptions, dataAttribute) { + if (!0 === opts.importDataAttributes) { + var option, dataoptions, optionData, p, importOption = function(option, optionData) { + null !== (optionData = optionData !== undefined ? optionData : npt.getAttribute(dataAttribute + "-" + option)) && ("string" == typeof optionData && (0 === option.indexOf("on") ? optionData = window[optionData] : "false" === optionData ? optionData = !1 : "true" === optionData && (optionData = !0)), + userOptions[option] = optionData); + }, attrOptions = npt.getAttribute(dataAttribute); + if (attrOptions && "" !== attrOptions && (attrOptions = attrOptions.replace(new RegExp("'", "g"), '"'), + dataoptions = JSON.parse("{" + attrOptions + "}")), dataoptions) { + optionData = undefined; + for (p in dataoptions) if ("alias" === p.toLowerCase()) { + optionData = dataoptions[p]; + break; + } + } + importOption("alias", optionData), userOptions.alias && resolveAlias(userOptions.alias, userOptions, opts); + for (option in opts) { + if (dataoptions) { + optionData = undefined; + for (p in dataoptions) if (p.toLowerCase() === option.toLowerCase()) { + optionData = dataoptions[p]; + break; + } + } + importOption(option, optionData); + } + } + return $.extend(!0, opts, userOptions), ("rtl" === npt.dir || opts.rightAlign) && (npt.style.textAlign = "right"), + ("rtl" === npt.dir || opts.numericInput) && (npt.dir = "ltr", npt.removeAttribute("dir"), + opts.isRTL = !0), opts; + } + var that = this; + return "string" == typeof elems && (elems = document.getElementById(elems) || document.querySelectorAll(elems)), + elems = elems.nodeName ? [ elems ] : elems, $.each(elems, function(ndx, el) { + var scopedOpts = $.extend(!0, {}, that.opts); + importAttributeOptions(el, scopedOpts, $.extend(!0, {}, that.userOptions), that.dataAttribute); + var maskset = generateMaskSet(scopedOpts, that.noMasksCache); + maskset !== undefined && (el.inputmask !== undefined && (el.inputmask.opts.autoUnmask = !0, + el.inputmask.remove()), el.inputmask = new Inputmask(undefined, undefined, !0), + el.inputmask.opts = scopedOpts, el.inputmask.noMasksCache = that.noMasksCache, el.inputmask.userOptions = $.extend(!0, {}, that.userOptions), + el.inputmask.isRTL = scopedOpts.isRTL || scopedOpts.numericInput, el.inputmask.el = el, + el.inputmask.maskset = maskset, $.data(el, "_inputmask_opts", scopedOpts), maskScope.call(el.inputmask, { + action: "mask" + })); + }), elems && elems[0] ? elems[0].inputmask || this : this; + }, + option: function(options, noremask) { + return "string" == typeof options ? this.opts[options] : "object" === (void 0 === options ? "undefined" : _typeof(options)) ? ($.extend(this.userOptions, options), + this.el && !0 !== noremask && this.mask(this.el), this) : void 0; + }, + unmaskedvalue: function(value) { + return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache), + maskScope.call(this, { + action: "unmaskedvalue", + value: value + }); + }, + remove: function() { + return maskScope.call(this, { + action: "remove" + }); + }, + getemptymask: function() { + return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache), + maskScope.call(this, { + action: "getemptymask" + }); + }, + hasMaskedValue: function() { + return !this.opts.autoUnmask; + }, + isComplete: function() { + return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache), + maskScope.call(this, { + action: "isComplete" + }); + }, + getmetadata: function() { + return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache), + maskScope.call(this, { + action: "getmetadata" + }); + }, + isValid: function(value) { + return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache), + maskScope.call(this, { + action: "isValid", + value: value + }); + }, + format: function(value, metadata) { + return this.maskset = this.maskset || generateMaskSet(this.opts, this.noMasksCache), + maskScope.call(this, { + action: "format", + value: value, + metadata: metadata + }); + }, + analyseMask: function(mask, regexMask, opts) { + function MaskToken(isGroup, isOptional, isQuantifier, isAlternator) { + this.matches = [], this.openGroup = isGroup || !1, this.alternatorGroup = !1, this.isGroup = isGroup || !1, + this.isOptional = isOptional || !1, this.isQuantifier = isQuantifier || !1, this.isAlternator = isAlternator || !1, + this.quantifier = { + min: 1, + max: 1 + }; + } + function insertTestDefinition(mtoken, element, position) { + position = position !== undefined ? position : mtoken.matches.length; + var prevMatch = mtoken.matches[position - 1]; + if (regexMask) 0 === element.indexOf("[") || escaped && /\\d|\\s|\\w]/i.test(element) || "." === element ? mtoken.matches.splice(position++, 0, { + fn: new RegExp(element, opts.casing ? "i" : ""), + cardinality: 1, + optionality: mtoken.isOptional, + newBlockMarker: prevMatch === undefined || prevMatch.def !== element, + casing: null, + def: element, + placeholder: undefined, + nativeDef: element + }) : (escaped && (element = element[element.length - 1]), $.each(element.split(""), function(ndx, lmnt) { + prevMatch = mtoken.matches[position - 1], mtoken.matches.splice(position++, 0, { + fn: null, + cardinality: 0, + optionality: mtoken.isOptional, + newBlockMarker: prevMatch === undefined || prevMatch.def !== lmnt && null !== prevMatch.fn, + casing: null, + def: opts.staticDefinitionSymbol || lmnt, + placeholder: opts.staticDefinitionSymbol !== undefined ? lmnt : undefined, + nativeDef: lmnt + }); + })), escaped = !1; else { + var maskdef = (opts.definitions ? opts.definitions[element] : undefined) || Inputmask.prototype.definitions[element]; + if (maskdef && !escaped) { + for (var prevalidators = maskdef.prevalidator, prevalidatorsL = prevalidators ? prevalidators.length : 0, i = 1; i < maskdef.cardinality; i++) { + var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator.validator, cardinality = prevalidator.cardinality; + mtoken.matches.splice(position++, 0, { + fn: validator ? "string" == typeof validator ? new RegExp(validator, opts.casing ? "i" : "") : new function() { + this.test = validator; + }() : new RegExp("."), + cardinality: cardinality || 1, + optionality: mtoken.isOptional, + newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element), + casing: maskdef.casing, + def: maskdef.definitionSymbol || element, + placeholder: maskdef.placeholder, + nativeDef: element + }), prevMatch = mtoken.matches[position - 1]; + } + mtoken.matches.splice(position++, 0, { + fn: maskdef.validator ? "string" == typeof maskdef.validator ? new RegExp(maskdef.validator, opts.casing ? "i" : "") : new function() { + this.test = maskdef.validator; + }() : new RegExp("."), + cardinality: maskdef.cardinality, + optionality: mtoken.isOptional, + newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element), + casing: maskdef.casing, + def: maskdef.definitionSymbol || element, + placeholder: maskdef.placeholder, + nativeDef: element + }); + } else mtoken.matches.splice(position++, 0, { + fn: null, + cardinality: 0, + optionality: mtoken.isOptional, + newBlockMarker: prevMatch === undefined || prevMatch.def !== element && null !== prevMatch.fn, + casing: null, + def: opts.staticDefinitionSymbol || element, + placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined, + nativeDef: element + }), escaped = !1; + } + } + function verifyGroupMarker(maskToken) { + maskToken && maskToken.matches && $.each(maskToken.matches, function(ndx, token) { + var nextToken = maskToken.matches[ndx + 1]; + (nextToken === undefined || nextToken.matches === undefined || !1 === nextToken.isQuantifier) && token && token.isGroup && (token.isGroup = !1, + regexMask || (insertTestDefinition(token, opts.groupmarker.start, 0), !0 !== token.openGroup && insertTestDefinition(token, opts.groupmarker.end))), + verifyGroupMarker(token); + }); + } + function defaultCase() { + if (openenings.length > 0) { + if (currentOpeningToken = openenings[openenings.length - 1], insertTestDefinition(currentOpeningToken, m), + currentOpeningToken.isAlternator) { + alternator = openenings.pop(); + for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1; + openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1]).matches.push(alternator) : currentToken.matches.push(alternator); + } + } else insertTestDefinition(currentToken, m); + } + function reverseTokens(maskToken) { + maskToken.matches = maskToken.matches.reverse(); + for (var match in maskToken.matches) if (maskToken.matches.hasOwnProperty(match)) { + var intMatch = parseInt(match); + if (maskToken.matches[match].isQuantifier && maskToken.matches[intMatch + 1] && maskToken.matches[intMatch + 1].isGroup) { + var qt = maskToken.matches[match]; + maskToken.matches.splice(match, 1), maskToken.matches.splice(intMatch + 1, 0, qt); + } + maskToken.matches[match].matches !== undefined ? maskToken.matches[match] = reverseTokens(maskToken.matches[match]) : maskToken.matches[match] = function(st) { + return st === opts.optionalmarker.start ? st = opts.optionalmarker.end : st === opts.optionalmarker.end ? st = opts.optionalmarker.start : st === opts.groupmarker.start ? st = opts.groupmarker.end : st === opts.groupmarker.end && (st = opts.groupmarker.start), + st; + }(maskToken.matches[match]); + } + return maskToken; + } + var match, m, openingToken, currentOpeningToken, alternator, lastMatch, groupToken, tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g, regexTokenizer = /\[\^?]?(?:[^\\\]]+|\\[\S\s]?)*]?|\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9][0-9]*|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Za-z]|[\S\s]?)|\((?:\?[:=!]?)?|(?:[?*+]|\{[0-9]+(?:,[0-9]*)?\})\??|[^.?*+^${[()|\\]+|./g, escaped = !1, currentToken = new MaskToken(), openenings = [], maskTokens = []; + for (regexMask && (opts.optionalmarker.start = undefined, opts.optionalmarker.end = undefined); match = regexMask ? regexTokenizer.exec(mask) : tokenizer.exec(mask); ) { + if (m = match[0], regexMask) switch (m.charAt(0)) { + case "?": + m = "{0,1}"; + break; + + case "+": + case "*": + m = "{" + m + "}"; + } + if (escaped) defaultCase(); else switch (m.charAt(0)) { + case opts.escapeChar: + escaped = !0, regexMask && defaultCase(); + break; + + case opts.optionalmarker.end: + case opts.groupmarker.end: + if (openingToken = openenings.pop(), openingToken.openGroup = !1, openingToken !== undefined) if (openenings.length > 0) { + if ((currentOpeningToken = openenings[openenings.length - 1]).matches.push(openingToken), + currentOpeningToken.isAlternator) { + alternator = openenings.pop(); + for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1, + alternator.matches[mndx].alternatorGroup = !1; + openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1]).matches.push(alternator) : currentToken.matches.push(alternator); + } + } else currentToken.matches.push(openingToken); else defaultCase(); + break; + + case opts.optionalmarker.start: + openenings.push(new MaskToken(!1, !0)); + break; + + case opts.groupmarker.start: + openenings.push(new MaskToken(!0)); + break; + + case opts.quantifiermarker.start: + var quantifier = new MaskToken(!1, !1, !0), mq = (m = m.replace(/[{}]/g, "")).split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]); + if ("*" !== mq1 && "+" !== mq1 || (mq0 = "*" === mq1 ? 0 : 1), quantifier.quantifier = { + min: mq0, + max: mq1 + }, openenings.length > 0) { + var matches = openenings[openenings.length - 1].matches; + (match = matches.pop()).isGroup || ((groupToken = new MaskToken(!0)).matches.push(match), + match = groupToken), matches.push(match), matches.push(quantifier); + } else (match = currentToken.matches.pop()).isGroup || (regexMask && null === match.fn && "." === match.def && (match.fn = new RegExp(match.def, opts.casing ? "i" : "")), + (groupToken = new MaskToken(!0)).matches.push(match), match = groupToken), currentToken.matches.push(match), + currentToken.matches.push(quantifier); + break; + + case opts.alternatormarker: + if (openenings.length > 0) { + var subToken = (currentOpeningToken = openenings[openenings.length - 1]).matches[currentOpeningToken.matches.length - 1]; + lastMatch = currentOpeningToken.openGroup && (subToken.matches === undefined || !1 === subToken.isGroup && !1 === subToken.isAlternator) ? openenings.pop() : currentOpeningToken.matches.pop(); + } else lastMatch = currentToken.matches.pop(); + if (lastMatch.isAlternator) openenings.push(lastMatch); else if (lastMatch.alternatorGroup ? (alternator = openenings.pop(), + lastMatch.alternatorGroup = !1) : alternator = new MaskToken(!1, !1, !1, !0), alternator.matches.push(lastMatch), + openenings.push(alternator), lastMatch.openGroup) { + lastMatch.openGroup = !1; + var alternatorGroup = new MaskToken(!0); + alternatorGroup.alternatorGroup = !0, openenings.push(alternatorGroup); + } + break; + + default: + defaultCase(); + } + } + for (;openenings.length > 0; ) openingToken = openenings.pop(), currentToken.matches.push(openingToken); + return currentToken.matches.length > 0 && (verifyGroupMarker(currentToken), maskTokens.push(currentToken)), + (opts.numericInput || opts.isRTL) && reverseTokens(maskTokens[0]), maskTokens; + } + }, Inputmask.extendDefaults = function(options) { + $.extend(!0, Inputmask.prototype.defaults, options); + }, Inputmask.extendDefinitions = function(definition) { + $.extend(!0, Inputmask.prototype.definitions, definition); + }, Inputmask.extendAliases = function(alias) { + $.extend(!0, Inputmask.prototype.aliases, alias); + }, Inputmask.format = function(value, options, metadata) { + return Inputmask(options).format(value, metadata); + }, Inputmask.unmask = function(value, options) { + return Inputmask(options).unmaskedvalue(value); + }, Inputmask.isValid = function(value, options) { + return Inputmask(options).isValid(value); + }, Inputmask.remove = function(elems) { + $.each(elems, function(ndx, el) { + el.inputmask && el.inputmask.remove(); + }); + }, Inputmask.escapeRegex = function(str) { + var specials = [ "/", ".", "*", "+", "?", "|", "(", ")", "[", "]", "{", "}", "\\", "$", "^" ]; + return str.replace(new RegExp("(\\" + specials.join("|\\") + ")", "gim"), "\\$1"); + }, Inputmask.keyCode = { + ALT: 18, + BACKSPACE: 8, + BACKSPACE_SAFARI: 127, + CAPS_LOCK: 20, + COMMA: 188, + COMMAND: 91, + COMMAND_LEFT: 91, + COMMAND_RIGHT: 93, + CONTROL: 17, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + INSERT: 45, + LEFT: 37, + MENU: 93, + NUMPAD_ADD: 107, + NUMPAD_DECIMAL: 110, + NUMPAD_DIVIDE: 111, + NUMPAD_ENTER: 108, + NUMPAD_MULTIPLY: 106, + NUMPAD_SUBTRACT: 109, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SHIFT: 16, + SPACE: 32, + TAB: 9, + UP: 38, + WINDOWS: 91, + X: 88 + }, Inputmask; + }); +}, function(module, exports) { + module.exports = jQuery; +}, function(module, exports, __webpack_require__) { + "use strict"; + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; + } + __webpack_require__(4), __webpack_require__(9), __webpack_require__(12), __webpack_require__(13), + __webpack_require__(14), __webpack_require__(15); + var _inputmask2 = _interopRequireDefault(__webpack_require__(1)), _inputmask4 = _interopRequireDefault(__webpack_require__(0)), _jquery2 = _interopRequireDefault(__webpack_require__(2)); + _inputmask4.default === _jquery2.default && __webpack_require__(16), window.Inputmask = _inputmask2.default; +}, function(module, exports, __webpack_require__) { + var content = __webpack_require__(5); + "string" == typeof content && (content = [ [ module.i, content, "" ] ]); + var options = { + hmr: !0 + }; + options.transform = void 0; + __webpack_require__(7)(content, options); + content.locals && (module.exports = content.locals); +}, function(module, exports, __webpack_require__) { + (module.exports = __webpack_require__(6)(void 0)).push([ module.i, "span.im-caret {\r\n -webkit-animation: 1s blink step-end infinite;\r\n animation: 1s blink step-end infinite;\r\n}\r\n\r\n@keyframes blink {\r\n from, to {\r\n border-right-color: black;\r\n }\r\n 50% {\r\n border-right-color: transparent;\r\n }\r\n}\r\n\r\n@-webkit-keyframes blink {\r\n from, to {\r\n border-right-color: black;\r\n }\r\n 50% {\r\n border-right-color: transparent;\r\n }\r\n}\r\n\r\nspan.im-static {\r\n color: grey;\r\n}\r\n\r\ndiv.im-colormask {\r\n display: inline-block;\r\n border-style: inset;\r\n border-width: 2px;\r\n -webkit-appearance: textfield;\r\n -moz-appearance: textfield;\r\n appearance: textfield;\r\n}\r\n\r\ndiv.im-colormask > input {\r\n position: absolute;\r\n display: inline-block;\r\n background-color: transparent;\r\n color: transparent;\r\n -webkit-appearance: caret;\r\n -moz-appearance: caret;\r\n appearance: caret;\r\n border-style: none;\r\n left: 0; /*calculated*/\r\n}\r\n\r\ndiv.im-colormask > input:focus {\r\n outline: none;\r\n}\r\n\r\ndiv.im-colormask > input::-moz-selection{\r\n background: none;\r\n}\r\n\r\ndiv.im-colormask > input::selection{\r\n background: none;\r\n}\r\ndiv.im-colormask > input::-moz-selection{\r\n background: none;\r\n}\r\n\r\ndiv.im-colormask > div {\r\n color: black;\r\n display: inline-block;\r\n width: 100px; /*calculated*/\r\n}", "" ]); +}, function(module, exports) { + function cssWithMappingToString(item, useSourceMap) { + var content = item[1] || "", cssMapping = item[3]; + if (!cssMapping) return content; + if (useSourceMap && "function" == typeof btoa) { + var sourceMapping = toComment(cssMapping), sourceURLs = cssMapping.sources.map(function(source) { + return "/*# sourceURL=" + cssMapping.sourceRoot + source + " */"; + }); + return [ content ].concat(sourceURLs).concat([ sourceMapping ]).join("\n"); + } + return [ content ].join("\n"); + } + function toComment(sourceMap) { + return "/*# " + ("sourceMappingURL=data:application/json;charset=utf-8;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))))) + " */"; + } + module.exports = function(useSourceMap) { + var list = []; + return list.toString = function() { + return this.map(function(item) { + var content = cssWithMappingToString(item, useSourceMap); + return item[2] ? "@media " + item[2] + "{" + content + "}" : content; + }).join(""); + }, list.i = function(modules, mediaQuery) { + "string" == typeof modules && (modules = [ [ null, modules, "" ] ]); + for (var alreadyImportedModules = {}, i = 0; i < this.length; i++) { + var id = this[i][0]; + "number" == typeof id && (alreadyImportedModules[id] = !0); + } + for (i = 0; i < modules.length; i++) { + var item = modules[i]; + "number" == typeof item[0] && alreadyImportedModules[item[0]] || (mediaQuery && !item[2] ? item[2] = mediaQuery : mediaQuery && (item[2] = "(" + item[2] + ") and (" + mediaQuery + ")"), + list.push(item)); + } + }, list; + }; +}, function(module, exports, __webpack_require__) { + function addStylesToDom(styles, options) { + for (var i = 0; i < styles.length; i++) { + var item = styles[i], domStyle = stylesInDom[item.id]; + if (domStyle) { + domStyle.refs++; + for (j = 0; j < domStyle.parts.length; j++) domStyle.parts[j](item.parts[j]); + for (;j < item.parts.length; j++) domStyle.parts.push(addStyle(item.parts[j], options)); + } else { + for (var parts = [], j = 0; j < item.parts.length; j++) parts.push(addStyle(item.parts[j], options)); + stylesInDom[item.id] = { + id: item.id, + refs: 1, + parts: parts + }; + } + } + } + function listToStyles(list, options) { + for (var styles = [], newStyles = {}, i = 0; i < list.length; i++) { + var item = list[i], id = options.base ? item[0] + options.base : item[0], part = { + css: item[1], + media: item[2], + sourceMap: item[3] + }; + newStyles[id] ? newStyles[id].parts.push(part) : styles.push(newStyles[id] = { + id: id, + parts: [ part ] + }); + } + return styles; + } + function insertStyleElement(options, style) { + var target = getElement(options.insertInto); + if (!target) throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid."); + var lastStyleElementInsertedAtTop = stylesInsertedAtTop[stylesInsertedAtTop.length - 1]; + if ("top" === options.insertAt) lastStyleElementInsertedAtTop ? lastStyleElementInsertedAtTop.nextSibling ? target.insertBefore(style, lastStyleElementInsertedAtTop.nextSibling) : target.appendChild(style) : target.insertBefore(style, target.firstChild), + stylesInsertedAtTop.push(style); else if ("bottom" === options.insertAt) target.appendChild(style); else { + if ("object" != typeof options.insertAt || !options.insertAt.before) throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n"); + var nextSibling = getElement(options.insertInto + " " + options.insertAt.before); + target.insertBefore(style, nextSibling); + } + } + function removeStyleElement(style) { + if (null === style.parentNode) return !1; + style.parentNode.removeChild(style); + var idx = stylesInsertedAtTop.indexOf(style); + idx >= 0 && stylesInsertedAtTop.splice(idx, 1); + } + function createStyleElement(options) { + var style = document.createElement("style"); + return options.attrs.type = "text/css", addAttrs(style, options.attrs), insertStyleElement(options, style), + style; + } + function createLinkElement(options) { + var link = document.createElement("link"); + return options.attrs.type = "text/css", options.attrs.rel = "stylesheet", addAttrs(link, options.attrs), + insertStyleElement(options, link), link; + } + function addAttrs(el, attrs) { + Object.keys(attrs).forEach(function(key) { + el.setAttribute(key, attrs[key]); + }); + } + function addStyle(obj, options) { + var style, update, remove, result; + if (options.transform && obj.css) { + if (!(result = options.transform(obj.css))) return function() {}; + obj.css = result; + } + if (options.singleton) { + var styleIndex = singletonCounter++; + style = singleton || (singleton = createStyleElement(options)), update = applyToSingletonTag.bind(null, style, styleIndex, !1), + remove = applyToSingletonTag.bind(null, style, styleIndex, !0); + } else obj.sourceMap && "function" == typeof URL && "function" == typeof URL.createObjectURL && "function" == typeof URL.revokeObjectURL && "function" == typeof Blob && "function" == typeof btoa ? (style = createLinkElement(options), + update = updateLink.bind(null, style, options), remove = function() { + removeStyleElement(style), style.href && URL.revokeObjectURL(style.href); + }) : (style = createStyleElement(options), update = applyToTag.bind(null, style), + remove = function() { + removeStyleElement(style); + }); + return update(obj), function(newObj) { + if (newObj) { + if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) return; + update(obj = newObj); + } else remove(); + }; + } + function applyToSingletonTag(style, index, remove, obj) { + var css = remove ? "" : obj.css; + if (style.styleSheet) style.styleSheet.cssText = replaceText(index, css); else { + var cssNode = document.createTextNode(css), childNodes = style.childNodes; + childNodes[index] && style.removeChild(childNodes[index]), childNodes.length ? style.insertBefore(cssNode, childNodes[index]) : style.appendChild(cssNode); + } + } + function applyToTag(style, obj) { + var css = obj.css, media = obj.media; + if (media && style.setAttribute("media", media), style.styleSheet) style.styleSheet.cssText = css; else { + for (;style.firstChild; ) style.removeChild(style.firstChild); + style.appendChild(document.createTextNode(css)); + } + } + function updateLink(link, options, obj) { + var css = obj.css, sourceMap = obj.sourceMap, autoFixUrls = void 0 === options.convertToAbsoluteUrls && sourceMap; + (options.convertToAbsoluteUrls || autoFixUrls) && (css = fixUrls(css)), sourceMap && (css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + " */"); + var blob = new Blob([ css ], { + type: "text/css" + }), oldSrc = link.href; + link.href = URL.createObjectURL(blob), oldSrc && URL.revokeObjectURL(oldSrc); + } + var stylesInDom = {}, isOldIE = function(fn) { + var memo; + return function() { + return void 0 === memo && (memo = fn.apply(this, arguments)), memo; + }; + }(function() { + return window && document && document.all && !window.atob; + }), getElement = function(fn) { + var memo = {}; + return function(selector) { + if (void 0 === memo[selector]) { + var styleTarget = fn.call(this, selector); + if (styleTarget instanceof window.HTMLIFrameElement) try { + styleTarget = styleTarget.contentDocument.head; + } catch (e) { + styleTarget = null; + } + memo[selector] = styleTarget; + } + return memo[selector]; + }; + }(function(target) { + return document.querySelector(target); + }), singleton = null, singletonCounter = 0, stylesInsertedAtTop = [], fixUrls = __webpack_require__(8); + module.exports = function(list, options) { + if ("undefined" != typeof DEBUG && DEBUG && "object" != typeof document) throw new Error("The style-loader cannot be used in a non-browser environment"); + (options = options || {}).attrs = "object" == typeof options.attrs ? options.attrs : {}, + options.singleton || (options.singleton = isOldIE()), options.insertInto || (options.insertInto = "head"), + options.insertAt || (options.insertAt = "bottom"); + var styles = listToStyles(list, options); + return addStylesToDom(styles, options), function(newList) { + for (var mayRemove = [], i = 0; i < styles.length; i++) { + var item = styles[i]; + (domStyle = stylesInDom[item.id]).refs--, mayRemove.push(domStyle); + } + newList && addStylesToDom(listToStyles(newList, options), options); + for (i = 0; i < mayRemove.length; i++) { + var domStyle = mayRemove[i]; + if (0 === domStyle.refs) { + for (var j = 0; j < domStyle.parts.length; j++) domStyle.parts[j](); + delete stylesInDom[domStyle.id]; + } + } + }; + }; + var replaceText = function() { + var textStore = []; + return function(index, replacement) { + return textStore[index] = replacement, textStore.filter(Boolean).join("\n"); + }; + }(); +}, function(module, exports) { + module.exports = function(css) { + var location = "undefined" != typeof window && window.location; + if (!location) throw new Error("fixUrls requires window.location"); + if (!css || "string" != typeof css) return css; + var baseUrl = location.protocol + "//" + location.host, currentDir = baseUrl + location.pathname.replace(/\/[^\/]*$/, "/"); + return css.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi, function(fullMatch, origUrl) { + var unquotedOrigUrl = origUrl.trim().replace(/^"(.*)"$/, function(o, $1) { + return $1; + }).replace(/^'(.*)'$/, function(o, $1) { + return $1; + }); + if (/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/)/i.test(unquotedOrigUrl)) return fullMatch; + var newUrl; + return newUrl = 0 === unquotedOrigUrl.indexOf("//") ? unquotedOrigUrl : 0 === unquotedOrigUrl.indexOf("/") ? baseUrl + unquotedOrigUrl : currentDir + unquotedOrigUrl.replace(/^\.\//, ""), + "url(" + JSON.stringify(newUrl) + ")"; + }); + }; +}, function(module, exports, __webpack_require__) { + "use strict"; + var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__; + "function" == typeof Symbol && Symbol.iterator; + !function(factory) { + __WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(0), __webpack_require__(1) ], + void 0 !== (__WEBPACK_AMD_DEFINE_RESULT__ = "function" == typeof (__WEBPACK_AMD_DEFINE_FACTORY__ = factory) ? __WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__) : __WEBPACK_AMD_DEFINE_FACTORY__) && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__); + }(function($, Inputmask) { + function isLeapYear(year) { + return isNaN(year) || 29 === new Date(year, 2, 0).getDate(); + } + return Inputmask.extendAliases({ + "dd/mm/yyyy": { + mask: "1/2/y", + placeholder: "dd/mm/yyyy", + regex: { + val1pre: new RegExp("[0-3]"), + val1: new RegExp("0[1-9]|[12][0-9]|3[01]"), + val2pre: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[1-9]|[12][0-9]|3[01])" + escapedSeparator + "[01])"); + }, + val2: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[1-9]|[12][0-9])" + escapedSeparator + "(0[1-9]|1[012]))|(30" + escapedSeparator + "(0[13-9]|1[012]))|(31" + escapedSeparator + "(0[13578]|1[02]))"); + } + }, + leapday: "29/02/", + separator: "/", + yearrange: { + minyear: 1900, + maxyear: 2099 + }, + isInYearRange: function(chrs, minyear, maxyear) { + if (isNaN(chrs)) return !1; + var enteredyear = parseInt(chrs.concat(minyear.toString().slice(chrs.length))), enteredyear2 = parseInt(chrs.concat(maxyear.toString().slice(chrs.length))); + return !isNaN(enteredyear) && (minyear <= enteredyear && enteredyear <= maxyear) || !isNaN(enteredyear2) && (minyear <= enteredyear2 && enteredyear2 <= maxyear); + }, + determinebaseyear: function(minyear, maxyear, hint) { + var currentyear = new Date().getFullYear(); + if (minyear > currentyear) return minyear; + if (maxyear < currentyear) { + for (var maxYearPrefix = maxyear.toString().slice(0, 2), maxYearPostfix = maxyear.toString().slice(2, 4); maxyear < maxYearPrefix + hint; ) maxYearPrefix--; + var maxxYear = maxYearPrefix + maxYearPostfix; + return minyear > maxxYear ? minyear : maxxYear; + } + if (minyear <= currentyear && currentyear <= maxyear) { + for (var currentYearPrefix = currentyear.toString().slice(0, 2); maxyear < currentYearPrefix + hint; ) currentYearPrefix--; + var currentYearAndHint = currentYearPrefix + hint; + return currentYearAndHint < minyear ? minyear : currentYearAndHint; + } + return currentyear; + }, + onKeyDown: function(e, buffer, caretPos, opts) { + var $input = $(this); + if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { + var today = new Date(); + $input.val(today.getDate().toString() + (today.getMonth() + 1).toString() + today.getFullYear().toString()), + $input.trigger("setvalue"); + } + }, + getFrontValue: function(mask, buffer, opts) { + for (var start = 0, length = 0, i = 0; i < mask.length && "2" !== mask.charAt(i); i++) { + var definition = opts.definitions[mask.charAt(i)]; + definition ? (start += length, length = definition.cardinality) : length++; + } + return buffer.join("").substr(start, length); + }, + postValidation: function(buffer, currentResult, opts) { + var dayMonthValue, year, bufferStr = buffer.join(""); + return 0 === opts.mask.indexOf("y") ? (year = bufferStr.substr(0, 4), dayMonthValue = bufferStr.substring(4, 10)) : (year = bufferStr.substring(6, 10), + dayMonthValue = bufferStr.substr(0, 6)), currentResult && (dayMonthValue !== opts.leapday || isLeapYear(year)); + }, + definitions: { + "1": { + validator: function(chrs, maskset, pos, strict, opts) { + var isValid = opts.regex.val1.test(chrs); + return strict || isValid || chrs.charAt(1) !== opts.separator && -1 === "-./".indexOf(chrs.charAt(1)) || !(isValid = opts.regex.val1.test("0" + chrs.charAt(0))) ? isValid : (maskset.buffer[pos - 1] = "0", + { + refreshFromBuffer: { + start: pos - 1, + end: pos + }, + pos: pos, + c: chrs.charAt(0) + }); + }, + cardinality: 2, + prevalidator: [ { + validator: function(chrs, maskset, pos, strict, opts) { + var pchrs = chrs; + isNaN(maskset.buffer[pos + 1]) || (pchrs += maskset.buffer[pos + 1]); + var isValid = 1 === pchrs.length ? opts.regex.val1pre.test(pchrs) : opts.regex.val1.test(pchrs); + if (isValid && maskset.validPositions[pos] && (opts.regex.val2(opts.separator).test(chrs + maskset.validPositions[pos].input) || (maskset.validPositions[pos].input = "0" === chrs ? "1" : "0")), + !strict && !isValid) { + if (isValid = opts.regex.val1.test(chrs + "0")) return maskset.buffer[pos] = chrs, + maskset.buffer[++pos] = "0", { + pos: pos, + c: "0" + }; + if (isValid = opts.regex.val1.test("0" + chrs)) return maskset.buffer[pos] = "0", + pos++, { + pos: pos + }; + } + return isValid; + }, + cardinality: 1 + } ] + }, + "2": { + validator: function(chrs, maskset, pos, strict, opts) { + var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts); + -1 !== frontValue.indexOf(opts.placeholder[0]) && (frontValue = "01" + opts.separator); + var isValid = opts.regex.val2(opts.separator).test(frontValue + chrs); + return strict || isValid || chrs.charAt(1) !== opts.separator && -1 === "-./".indexOf(chrs.charAt(1)) || !(isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs.charAt(0))) ? isValid : (maskset.buffer[pos - 1] = "0", + { + refreshFromBuffer: { + start: pos - 1, + end: pos + }, + pos: pos, + c: chrs.charAt(0) + }); + }, + cardinality: 2, + prevalidator: [ { + validator: function(chrs, maskset, pos, strict, opts) { + isNaN(maskset.buffer[pos + 1]) || (chrs += maskset.buffer[pos + 1]); + var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts); + -1 !== frontValue.indexOf(opts.placeholder[0]) && (frontValue = "01" + opts.separator); + var isValid = 1 === chrs.length ? opts.regex.val2pre(opts.separator).test(frontValue + chrs) : opts.regex.val2(opts.separator).test(frontValue + chrs); + return isValid && maskset.validPositions[pos] && (opts.regex.val2(opts.separator).test(chrs + maskset.validPositions[pos].input) || (maskset.validPositions[pos].input = "0" === chrs ? "1" : "0")), + strict || isValid || !(isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", + pos++, { + pos: pos + }); + }, + cardinality: 1 + } ] + }, + y: { + validator: function(chrs, maskset, pos, strict, opts) { + return opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); + }, + cardinality: 4, + prevalidator: [ { + validator: function(chrs, maskset, pos, strict, opts) { + var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); + if (!strict && !isValid) { + var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 1); + if (isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(0), + { + pos: pos + }; + if (yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 2), + isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(0), + maskset.buffer[pos++] = yearPrefix.charAt(1), { + pos: pos + }; + } + return isValid; + }, + cardinality: 1 + }, { + validator: function(chrs, maskset, pos, strict, opts) { + var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); + if (!strict && !isValid) { + var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2); + if (isValid = opts.isInYearRange(chrs[0] + yearPrefix[1] + chrs[1], opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(1), + { + pos: pos + }; + if (yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2), + isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos - 1] = yearPrefix.charAt(0), + maskset.buffer[pos++] = yearPrefix.charAt(1), maskset.buffer[pos++] = chrs.charAt(0), + { + refreshFromBuffer: { + start: pos - 3, + end: pos + }, + pos: pos + }; + } + return isValid; + }, + cardinality: 2 + }, { + validator: function(chrs, maskset, pos, strict, opts) { + return opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); + }, + cardinality: 3 + } ] + } + }, + insertMode: !1, + autoUnmask: !1 + }, + "mm/dd/yyyy": { + placeholder: "mm/dd/yyyy", + alias: "dd/mm/yyyy", + regex: { + val2pre: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])"); + }, + val2: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)"); + }, + val1pre: new RegExp("[01]"), + val1: new RegExp("0[1-9]|1[012]") + }, + leapday: "02/29/", + onKeyDown: function(e, buffer, caretPos, opts) { + var $input = $(this); + if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { + var today = new Date(); + $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()), + $input.trigger("setvalue"); + } + } + }, + "yyyy/mm/dd": { + mask: "y/1/2", + placeholder: "yyyy/mm/dd", + alias: "mm/dd/yyyy", + leapday: "/02/29", + onKeyDown: function(e, buffer, caretPos, opts) { + var $input = $(this); + if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { + var today = new Date(); + $input.val(today.getFullYear().toString() + (today.getMonth() + 1).toString() + today.getDate().toString()), + $input.trigger("setvalue"); + } + } + }, + "dd.mm.yyyy": { + mask: "1.2.y", + placeholder: "dd.mm.yyyy", + leapday: "29.02.", + separator: ".", + alias: "dd/mm/yyyy" + }, + "dd-mm-yyyy": { + mask: "1-2-y", + placeholder: "dd-mm-yyyy", + leapday: "29-02-", + separator: "-", + alias: "dd/mm/yyyy" + }, + "mm.dd.yyyy": { + mask: "1.2.y", + placeholder: "mm.dd.yyyy", + leapday: "02.29.", + separator: ".", + alias: "mm/dd/yyyy" + }, + "mm-dd-yyyy": { + mask: "1-2-y", + placeholder: "mm-dd-yyyy", + leapday: "02-29-", + separator: "-", + alias: "mm/dd/yyyy" + }, + "yyyy.mm.dd": { + mask: "y.1.2", + placeholder: "yyyy.mm.dd", + leapday: ".02.29", + separator: ".", + alias: "yyyy/mm/dd" + }, + "yyyy-mm-dd": { + mask: "y-1-2", + placeholder: "yyyy-mm-dd", + leapday: "-02-29", + separator: "-", + alias: "yyyy/mm/dd" + }, + datetime: { + mask: "1/2/y h:s", + placeholder: "dd/mm/yyyy hh:mm", + alias: "dd/mm/yyyy", + regex: { + hrspre: new RegExp("[012]"), + hrs24: new RegExp("2[0-4]|1[3-9]"), + hrs: new RegExp("[01][0-9]|2[0-4]"), + ampm: new RegExp("^[a|p|A|P][m|M]"), + mspre: new RegExp("[0-5]"), + ms: new RegExp("[0-5][0-9]") + }, + timeseparator: ":", + hourFormat: "24", + definitions: { + h: { + validator: function(chrs, maskset, pos, strict, opts) { + if ("24" === opts.hourFormat && 24 === parseInt(chrs, 10)) return maskset.buffer[pos - 1] = "0", + maskset.buffer[pos] = "0", { + refreshFromBuffer: { + start: pos - 1, + end: pos + }, + c: "0" + }; + var isValid = opts.regex.hrs.test(chrs); + if (!strict && !isValid && (chrs.charAt(1) === opts.timeseparator || -1 !== "-.:".indexOf(chrs.charAt(1))) && (isValid = opts.regex.hrs.test("0" + chrs.charAt(0)))) return maskset.buffer[pos - 1] = "0", + maskset.buffer[pos] = chrs.charAt(0), pos++, { + refreshFromBuffer: { + start: pos - 2, + end: pos + }, + pos: pos, + c: opts.timeseparator + }; + if (isValid && "24" !== opts.hourFormat && opts.regex.hrs24.test(chrs)) { + var tmp = parseInt(chrs, 10); + return 24 === tmp ? (maskset.buffer[pos + 5] = "a", maskset.buffer[pos + 6] = "m") : (maskset.buffer[pos + 5] = "p", + maskset.buffer[pos + 6] = "m"), (tmp -= 12) < 10 ? (maskset.buffer[pos] = tmp.toString(), + maskset.buffer[pos - 1] = "0") : (maskset.buffer[pos] = tmp.toString().charAt(1), + maskset.buffer[pos - 1] = tmp.toString().charAt(0)), { + refreshFromBuffer: { + start: pos - 1, + end: pos + 6 + }, + c: maskset.buffer[pos] + }; + } + return isValid; + }, + cardinality: 2, + prevalidator: [ { + validator: function(chrs, maskset, pos, strict, opts) { + var isValid = opts.regex.hrspre.test(chrs); + return strict || isValid || !(isValid = opts.regex.hrs.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", + pos++, { + pos: pos + }); + }, + cardinality: 1 + } ] + }, + s: { + validator: "[0-5][0-9]", + cardinality: 2, + prevalidator: [ { + validator: function(chrs, maskset, pos, strict, opts) { + var isValid = opts.regex.mspre.test(chrs); + return strict || isValid || !(isValid = opts.regex.ms.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", + pos++, { + pos: pos + }); + }, + cardinality: 1 + } ] + }, + t: { + validator: function(chrs, maskset, pos, strict, opts) { + return opts.regex.ampm.test(chrs + "m"); + }, + casing: "lower", + cardinality: 1 + } + }, + insertMode: !1, + autoUnmask: !1 + }, + datetime12: { + mask: "1/2/y h:s t\\m", + placeholder: "dd/mm/yyyy hh:mm xm", + alias: "datetime", + hourFormat: "12" + }, + "mm/dd/yyyy hh:mm xm": { + mask: "1/2/y h:s t\\m", + placeholder: "mm/dd/yyyy hh:mm xm", + alias: "datetime12", + regex: { + val2pre: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])"); + }, + val2: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)"); + }, + val1pre: new RegExp("[01]"), + val1: new RegExp("0[1-9]|1[012]") + }, + leapday: "02/29/", + onKeyDown: function(e, buffer, caretPos, opts) { + var $input = $(this); + if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { + var today = new Date(); + $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()), + $input.trigger("setvalue"); + } + } + }, + "hh:mm t": { + mask: "h:s t\\m", + placeholder: "hh:mm xm", + alias: "datetime", + hourFormat: "12" + }, + "h:s t": { + mask: "h:s t\\m", + placeholder: "hh:mm xm", + alias: "datetime", + hourFormat: "12" + }, + "hh:mm:ss": { + mask: "h:s:s", + placeholder: "hh:mm:ss", + alias: "datetime", + autoUnmask: !1 + }, + "hh:mm": { + mask: "h:s", + placeholder: "hh:mm", + alias: "datetime", + autoUnmask: !1 + }, + date: { + alias: "dd/mm/yyyy" + }, + "mm/yyyy": { + mask: "1/y", + placeholder: "mm/yyyy", + leapday: "donotuse", + separator: "/", + alias: "mm/dd/yyyy" + }, + shamsi: { + regex: { + val2pre: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "[0-3])"); + }, + val2: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[1-9]|1[012])" + escapedSeparator + "30)|((0[1-6])" + escapedSeparator + "31)"); + }, + val1pre: new RegExp("[01]"), + val1: new RegExp("0[1-9]|1[012]") + }, + yearrange: { + minyear: 1300, + maxyear: 1499 + }, + mask: "y/1/2", + leapday: "/12/30", + placeholder: "yyyy/mm/dd", + alias: "mm/dd/yyyy", + clearIncomplete: !0 + }, + "yyyy-mm-dd hh:mm:ss": { + mask: "y-1-2 h:s:s", + placeholder: "yyyy-mm-dd hh:mm:ss", + alias: "datetime", + separator: "-", + leapday: "-02-29", + regex: { + val2pre: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])"); + }, + val2: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)"); + }, + val1pre: new RegExp("[01]"), + val1: new RegExp("0[1-9]|1[012]") + }, + onKeyDown: function(e, buffer, caretPos, opts) {} + } + }), Inputmask; + }); +}, function(module, exports, __webpack_require__) { + "use strict"; + var __WEBPACK_AMD_DEFINE_RESULT__; + "function" == typeof Symbol && Symbol.iterator; + void 0 !== (__WEBPACK_AMD_DEFINE_RESULT__ = function() { + return window; + }.call(exports, __webpack_require__, exports, module)) && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__); +}, function(module, exports, __webpack_require__) { + "use strict"; + var __WEBPACK_AMD_DEFINE_RESULT__; + "function" == typeof Symbol && Symbol.iterator; + void 0 !== (__WEBPACK_AMD_DEFINE_RESULT__ = function() { + return document; + }.call(exports, __webpack_require__, exports, module)) && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__); +}, function(module, exports, __webpack_require__) { + "use strict"; + var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__; + "function" == typeof Symbol && Symbol.iterator; + !function(factory) { + __WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(0), __webpack_require__(1) ], + void 0 !== (__WEBPACK_AMD_DEFINE_RESULT__ = "function" == typeof (__WEBPACK_AMD_DEFINE_FACTORY__ = factory) ? __WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__) : __WEBPACK_AMD_DEFINE_FACTORY__) && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__); + }(function($, Inputmask) { + return Inputmask.extendDefinitions({ + A: { + validator: "[A-Za-zА-яЁёÀ-ÿµ]", + cardinality: 1, + casing: "upper" + }, + "&": { + validator: "[0-9A-Za-zА-яЁёÀ-ÿµ]", + cardinality: 1, + casing: "upper" + }, + "#": { + validator: "[0-9A-Fa-f]", + cardinality: 1, + casing: "upper" + } + }), Inputmask.extendAliases({ + url: { + definitions: { + i: { + validator: ".", + cardinality: 1 + } + }, + mask: "(\\http://)|(\\http\\s://)|(ftp://)|(ftp\\s://)i{+}", + insertMode: !1, + autoUnmask: !1, + inputmode: "url" + }, + ip: { + mask: "i[i[i]].i[i[i]].i[i[i]].i[i[i]]", + definitions: { + i: { + validator: function(chrs, maskset, pos, strict, opts) { + return pos - 1 > -1 && "." !== maskset.buffer[pos - 1] ? (chrs = maskset.buffer[pos - 1] + chrs, + chrs = pos - 2 > -1 && "." !== maskset.buffer[pos - 2] ? maskset.buffer[pos - 2] + chrs : "0" + chrs) : chrs = "00" + chrs, + new RegExp("25[0-5]|2[0-4][0-9]|[01][0-9][0-9]").test(chrs); + }, + cardinality: 1 + } + }, + onUnMask: function(maskedValue, unmaskedValue, opts) { + return maskedValue; + }, + inputmode: "numeric" + }, + email: { + mask: "*{1,64}[.*{1,64}][.*{1,64}][.*{1,63}]@-{1,63}.-{1,63}[.-{1,63}][.-{1,63}]", + greedy: !1, + onBeforePaste: function(pastedValue, opts) { + return (pastedValue = pastedValue.toLowerCase()).replace("mailto:", ""); + }, + definitions: { + "*": { + validator: "[0-9A-Za-z!#$%&'*+/=?^_`{|}~-]", + cardinality: 1, + casing: "lower" + }, + "-": { + validator: "[0-9A-Za-z-]", + cardinality: 1, + casing: "lower" + } + }, + onUnMask: function(maskedValue, unmaskedValue, opts) { + return maskedValue; + }, + inputmode: "email" + }, + mac: { + mask: "##:##:##:##:##:##" + }, + vin: { + mask: "V{13}9{4}", + definitions: { + V: { + validator: "[A-HJ-NPR-Za-hj-npr-z\\d]", + cardinality: 1, + casing: "upper" + } + }, + clearIncomplete: !0, + autoUnmask: !0 + } + }), Inputmask; + }); +}, function(module, exports, __webpack_require__) { + "use strict"; + var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__; + "function" == typeof Symbol && Symbol.iterator; + !function(factory) { + __WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(0), __webpack_require__(1) ], + void 0 !== (__WEBPACK_AMD_DEFINE_RESULT__ = "function" == typeof (__WEBPACK_AMD_DEFINE_FACTORY__ = factory) ? __WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__) : __WEBPACK_AMD_DEFINE_FACTORY__) && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__); + }(function($, Inputmask, undefined) { + function autoEscape(txt, opts) { + for (var escapedTxt = "", i = 0; i < txt.length; i++) Inputmask.prototype.definitions[txt.charAt(i)] || opts.definitions[txt.charAt(i)] || opts.optionalmarker.start === txt.charAt(i) || opts.optionalmarker.end === txt.charAt(i) || opts.quantifiermarker.start === txt.charAt(i) || opts.quantifiermarker.end === txt.charAt(i) || opts.groupmarker.start === txt.charAt(i) || opts.groupmarker.end === txt.charAt(i) || opts.alternatormarker === txt.charAt(i) ? escapedTxt += "\\" + txt.charAt(i) : escapedTxt += txt.charAt(i); + return escapedTxt; + } + return Inputmask.extendAliases({ + numeric: { + mask: function(opts) { + if (0 !== opts.repeat && isNaN(opts.integerDigits) && (opts.integerDigits = opts.repeat), + opts.repeat = 0, opts.groupSeparator === opts.radixPoint && ("." === opts.radixPoint ? opts.groupSeparator = "," : "," === opts.radixPoint ? opts.groupSeparator = "." : opts.groupSeparator = ""), + " " === opts.groupSeparator && (opts.skipOptionalPartCharacter = undefined), opts.autoGroup = opts.autoGroup && "" !== opts.groupSeparator, + opts.autoGroup && ("string" == typeof opts.groupSize && isFinite(opts.groupSize) && (opts.groupSize = parseInt(opts.groupSize)), + isFinite(opts.integerDigits))) { + var seps = Math.floor(opts.integerDigits / opts.groupSize), mod = opts.integerDigits % opts.groupSize; + opts.integerDigits = parseInt(opts.integerDigits) + (0 === mod ? seps - 1 : seps), + opts.integerDigits < 1 && (opts.integerDigits = "*"); + } + opts.placeholder.length > 1 && (opts.placeholder = opts.placeholder.charAt(0)), + "radixFocus" === opts.positionCaretOnClick && "" === opts.placeholder && !1 === opts.integerOptional && (opts.positionCaretOnClick = "lvp"), + opts.definitions[";"] = opts.definitions["~"], opts.definitions[";"].definitionSymbol = "~", + !0 === opts.numericInput && (opts.positionCaretOnClick = "radixFocus" === opts.positionCaretOnClick ? "lvp" : opts.positionCaretOnClick, + opts.digitsOptional = !1, isNaN(opts.digits) && (opts.digits = 2), opts.decimalProtect = !1); + var mask = "[+]"; + if (mask += autoEscape(opts.prefix, opts), !0 === opts.integerOptional ? mask += "~{1," + opts.integerDigits + "}" : mask += "~{" + opts.integerDigits + "}", + opts.digits !== undefined) { + opts.radixPointDefinitionSymbol = opts.decimalProtect ? ":" : opts.radixPoint; + var dq = opts.digits.toString().split(","); + isFinite(dq[0] && dq[1] && isFinite(dq[1])) ? mask += opts.radixPointDefinitionSymbol + ";{" + opts.digits + "}" : (isNaN(opts.digits) || parseInt(opts.digits) > 0) && (opts.digitsOptional ? mask += "[" + opts.radixPointDefinitionSymbol + ";{1," + opts.digits + "}]" : mask += opts.radixPointDefinitionSymbol + ";{" + opts.digits + "}"); + } + return mask += autoEscape(opts.suffix, opts), mask += "[-]", opts.greedy = !1, mask; + }, + placeholder: "", + greedy: !1, + digits: "*", + digitsOptional: !0, + enforceDigitsOnBlur: !1, + radixPoint: ".", + positionCaretOnClick: "radixFocus", + groupSize: 3, + groupSeparator: "", + autoGroup: !1, + allowMinus: !0, + negationSymbol: { + front: "-", + back: "" + }, + integerDigits: "+", + integerOptional: !0, + prefix: "", + suffix: "", + rightAlign: !0, + decimalProtect: !0, + min: null, + max: null, + step: 1, + insertMode: !0, + autoUnmask: !1, + unmaskAsNumber: !1, + inputmode: "numeric", + preValidation: function(buffer, pos, c, isSelection, opts) { + if ("-" === c || c === opts.negationSymbol.front) return !0 === opts.allowMinus && (opts.isNegative = opts.isNegative === undefined || !opts.isNegative, + "" === buffer.join("") || { + caret: pos, + dopost: !0 + }); + if (!1 === isSelection && c === opts.radixPoint && opts.digits !== undefined && (isNaN(opts.digits) || parseInt(opts.digits) > 0)) { + var radixPos = $.inArray(opts.radixPoint, buffer); + if (-1 !== radixPos) return !0 === opts.numericInput ? pos === radixPos : { + caret: radixPos + 1 + }; + } + return !0; + }, + postValidation: function(buffer, currentResult, opts) { + var suffix = opts.suffix.split(""), prefix = opts.prefix.split(""); + if (currentResult.pos === undefined && currentResult.caret !== undefined && !0 !== currentResult.dopost) return currentResult; + var caretPos = currentResult.caret !== undefined ? currentResult.caret : currentResult.pos, maskedValue = buffer.slice(); + opts.numericInput && (caretPos = maskedValue.length - caretPos - 1, maskedValue = maskedValue.reverse()); + var charAtPos = maskedValue[caretPos]; + if (charAtPos === opts.groupSeparator && (charAtPos = maskedValue[caretPos += 1]), + caretPos === maskedValue.length - opts.suffix.length - 1 && charAtPos === opts.radixPoint) return currentResult; + charAtPos !== undefined && charAtPos !== opts.radixPoint && charAtPos !== opts.negationSymbol.front && charAtPos !== opts.negationSymbol.back && (maskedValue[caretPos] = "?", + opts.prefix.length > 0 && caretPos >= (!1 === opts.isNegative ? 1 : 0) && caretPos < opts.prefix.length - 1 + (!1 === opts.isNegative ? 1 : 0) ? prefix[caretPos - (!1 === opts.isNegative ? 1 : 0)] = "?" : opts.suffix.length > 0 && caretPos >= maskedValue.length - opts.suffix.length - (!1 === opts.isNegative ? 1 : 0) && (suffix[caretPos - (maskedValue.length - opts.suffix.length - (!1 === opts.isNegative ? 1 : 0))] = "?")), + prefix = prefix.join(""), suffix = suffix.join(""); + var processValue = maskedValue.join("").replace(prefix, ""); + if (processValue = processValue.replace(suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), + processValue = processValue.replace(new RegExp("[-" + Inputmask.escapeRegex(opts.negationSymbol.front) + "]", "g"), ""), + processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), ""), + isNaN(opts.placeholder) && (processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.placeholder), "g"), "")), + processValue.length > 1 && 1 !== processValue.indexOf(opts.radixPoint) && ("0" === charAtPos && (processValue = processValue.replace(/^\?/g, "")), + processValue = processValue.replace(/^0/g, "")), processValue.charAt(0) === opts.radixPoint && "" !== opts.radixPoint && !0 !== opts.numericInput && (processValue = "0" + processValue), + "" !== processValue) { + if (processValue = processValue.split(""), (!opts.digitsOptional || opts.enforceDigitsOnBlur && "blur" === currentResult.event) && isFinite(opts.digits)) { + var radixPosition = $.inArray(opts.radixPoint, processValue), rpb = $.inArray(opts.radixPoint, maskedValue); + -1 === radixPosition && (processValue.push(opts.radixPoint), radixPosition = processValue.length - 1); + for (var i = 1; i <= opts.digits; i++) opts.digitsOptional && (!opts.enforceDigitsOnBlur || "blur" !== currentResult.event) || processValue[radixPosition + i] !== undefined && processValue[radixPosition + i] !== opts.placeholder.charAt(0) ? -1 !== rpb && maskedValue[rpb + i] !== undefined && (processValue[radixPosition + i] = processValue[radixPosition + i] || maskedValue[rpb + i]) : processValue[radixPosition + i] = currentResult.placeholder || opts.placeholder.charAt(0); + } + if (!0 !== opts.autoGroup || "" === opts.groupSeparator || charAtPos === opts.radixPoint && currentResult.pos === undefined && !currentResult.dopost) processValue = processValue.join(""); else { + var addRadix = processValue[processValue.length - 1] === opts.radixPoint && currentResult.c === opts.radixPoint; + processValue = Inputmask(function(buffer, opts) { + var postMask = ""; + if (postMask += "(" + opts.groupSeparator + "*{" + opts.groupSize + "}){*}", "" !== opts.radixPoint) { + var radixSplit = buffer.join("").split(opts.radixPoint); + radixSplit[1] && (postMask += opts.radixPoint + "*{" + radixSplit[1].match(/^\d*\??\d*/)[0].length + "}"); + } + return postMask; + }(processValue, opts), { + numericInput: !0, + jitMasking: !0, + definitions: { + "*": { + validator: "[0-9?]", + cardinality: 1 + } + } + }).format(processValue.join("")), addRadix && (processValue += opts.radixPoint), + processValue.charAt(0) === opts.groupSeparator && processValue.substr(1); + } + } + if (opts.isNegative && "blur" === currentResult.event && (opts.isNegative = "0" !== processValue), + processValue = prefix + processValue, processValue += suffix, opts.isNegative && (processValue = opts.negationSymbol.front + processValue, + processValue += opts.negationSymbol.back), processValue = processValue.split(""), + charAtPos !== undefined) if (charAtPos !== opts.radixPoint && charAtPos !== opts.negationSymbol.front && charAtPos !== opts.negationSymbol.back) (caretPos = $.inArray("?", processValue)) > -1 ? processValue[caretPos] = charAtPos : caretPos = currentResult.caret || 0; else if (charAtPos === opts.radixPoint || charAtPos === opts.negationSymbol.front || charAtPos === opts.negationSymbol.back) { + var newCaretPos = $.inArray(charAtPos, processValue); + -1 !== newCaretPos && (caretPos = newCaretPos); + } + opts.numericInput && (caretPos = processValue.length - caretPos - 1, processValue = processValue.reverse()); + var rslt = { + caret: charAtPos === undefined || currentResult.pos !== undefined ? caretPos + (opts.numericInput ? -1 : 1) : caretPos, + buffer: processValue, + refreshFromBuffer: currentResult.dopost || buffer.join("") !== processValue.join("") + }; + return rslt.refreshFromBuffer ? rslt : currentResult; + }, + onBeforeWrite: function(e, buffer, caretPos, opts) { + if (e) switch (e.type) { + case "keydown": + return opts.postValidation(buffer, { + caret: caretPos, + dopost: !0 + }, opts); + + case "blur": + case "checkval": + var unmasked; + if (function(opts) { + opts.parseMinMaxOptions === undefined && (null !== opts.min && (opts.min = opts.min.toString().replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), + "," === opts.radixPoint && (opts.min = opts.min.replace(opts.radixPoint, ".")), + opts.min = isFinite(opts.min) ? parseFloat(opts.min) : NaN, isNaN(opts.min) && (opts.min = Number.MIN_VALUE)), + null !== opts.max && (opts.max = opts.max.toString().replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), + "," === opts.radixPoint && (opts.max = opts.max.replace(opts.radixPoint, ".")), + opts.max = isFinite(opts.max) ? parseFloat(opts.max) : NaN, isNaN(opts.max) && (opts.max = Number.MAX_VALUE)), + opts.parseMinMaxOptions = "done"); + }(opts), null !== opts.min || null !== opts.max) { + if (unmasked = opts.onUnMask(buffer.join(""), undefined, $.extend({}, opts, { + unmaskAsNumber: !0 + })), null !== opts.min && unmasked < opts.min) return opts.isNegative = opts.min < 0, + opts.postValidation(opts.min.toString().replace(".", opts.radixPoint).split(""), { + caret: caretPos, + dopost: !0, + placeholder: "0" + }, opts); + if (null !== opts.max && unmasked > opts.max) return opts.isNegative = opts.max < 0, + opts.postValidation(opts.max.toString().replace(".", opts.radixPoint).split(""), { + caret: caretPos, + dopost: !0, + placeholder: "0" + }, opts); + } + return opts.postValidation(buffer, { + caret: caretPos, + placeholder: "0", + event: "blur" + }, opts); + + case "_checkval": + return { + caret: caretPos + }; + } + }, + regex: { + integerPart: function(opts, emptyCheck) { + return emptyCheck ? new RegExp("[" + Inputmask.escapeRegex(opts.negationSymbol.front) + "+]?") : new RegExp("[" + Inputmask.escapeRegex(opts.negationSymbol.front) + "+]?\\d+"); + }, + integerNPart: function(opts) { + return new RegExp("[\\d" + Inputmask.escapeRegex(opts.groupSeparator) + Inputmask.escapeRegex(opts.placeholder.charAt(0)) + "]+"); + } + }, + definitions: { + "~": { + validator: function(chrs, maskset, pos, strict, opts, isSelection) { + var isValid = strict ? new RegExp("[0-9" + Inputmask.escapeRegex(opts.groupSeparator) + "]").test(chrs) : new RegExp("[0-9]").test(chrs); + if (!0 === isValid) { + if (!0 !== opts.numericInput && maskset.validPositions[pos] !== undefined && "~" === maskset.validPositions[pos].match.def && !isSelection) { + var processValue = maskset.buffer.join(""), pvRadixSplit = (processValue = (processValue = processValue.replace(new RegExp("[-" + Inputmask.escapeRegex(opts.negationSymbol.front) + "]", "g"), "")).replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), "")).split(opts.radixPoint); + pvRadixSplit.length > 1 && (pvRadixSplit[1] = pvRadixSplit[1].replace(/0/g, opts.placeholder.charAt(0))), + "0" === pvRadixSplit[0] && (pvRadixSplit[0] = pvRadixSplit[0].replace(/0/g, opts.placeholder.charAt(0))), + processValue = pvRadixSplit[0] + opts.radixPoint + pvRadixSplit[1] || ""; + var bufferTemplate = maskset._buffer.join(""); + for (processValue === opts.radixPoint && (processValue = bufferTemplate); null === processValue.match(Inputmask.escapeRegex(bufferTemplate) + "$"); ) bufferTemplate = bufferTemplate.slice(1); + isValid = (processValue = (processValue = processValue.replace(bufferTemplate, "")).split(""))[pos] === undefined ? { + pos: pos, + remove: pos + } : { + pos: pos + }; + } + } else strict || chrs !== opts.radixPoint || maskset.validPositions[pos - 1] !== undefined || (maskset.buffer[pos] = "0", + isValid = { + pos: pos + 1 + }); + return isValid; + }, + cardinality: 1 + }, + "+": { + validator: function(chrs, maskset, pos, strict, opts) { + return opts.allowMinus && ("-" === chrs || chrs === opts.negationSymbol.front); + }, + cardinality: 1, + placeholder: "" + }, + "-": { + validator: function(chrs, maskset, pos, strict, opts) { + return opts.allowMinus && chrs === opts.negationSymbol.back; + }, + cardinality: 1, + placeholder: "" + }, + ":": { + validator: function(chrs, maskset, pos, strict, opts) { + var radix = "[" + Inputmask.escapeRegex(opts.radixPoint) + "]", isValid = new RegExp(radix).test(chrs); + return isValid && maskset.validPositions[pos] && maskset.validPositions[pos].match.placeholder === opts.radixPoint && (isValid = { + caret: pos + 1 + }), isValid; + }, + cardinality: 1, + placeholder: function(opts) { + return opts.radixPoint; + } + } + }, + onUnMask: function(maskedValue, unmaskedValue, opts) { + if ("" === unmaskedValue && !0 === opts.nullable) return unmaskedValue; + var processValue = maskedValue.replace(opts.prefix, ""); + return processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), + "" !== opts.placeholder.charAt(0) && (processValue = processValue.replace(new RegExp(opts.placeholder.charAt(0), "g"), "0")), + opts.unmaskAsNumber ? ("" !== opts.radixPoint && -1 !== processValue.indexOf(opts.radixPoint) && (processValue = processValue.replace(Inputmask.escapeRegex.call(this, opts.radixPoint), ".")), + processValue = processValue.replace(new RegExp("^" + Inputmask.escapeRegex(opts.negationSymbol.front)), "-"), + processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), ""), + Number(processValue)) : processValue; + }, + isComplete: function(buffer, opts) { + var maskedValue = buffer.join(""); + if (buffer.slice().join("") !== maskedValue) return !1; + var processValue = maskedValue.replace(opts.prefix, ""); + return processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), + "," === opts.radixPoint && (processValue = processValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".")), + isFinite(processValue); + }, + onBeforeMask: function(initialValue, opts) { + if (opts.isNegative = undefined, initialValue = initialValue.toString().charAt(initialValue.length - 1) === opts.radixPoint ? initialValue.toString().substr(0, initialValue.length - 1) : initialValue.toString(), + "" !== opts.radixPoint && isFinite(initialValue)) { + var vs = initialValue.split("."), groupSize = "" !== opts.groupSeparator ? parseInt(opts.groupSize) : 0; + 2 === vs.length && (vs[0].length > groupSize || vs[1].length > groupSize || vs[0].length <= groupSize && vs[1].length < groupSize) && (initialValue = initialValue.replace(".", opts.radixPoint)); + } + var kommaMatches = initialValue.match(/,/g), dotMatches = initialValue.match(/\./g); + if (initialValue = dotMatches && kommaMatches ? dotMatches.length > kommaMatches.length ? (initialValue = initialValue.replace(/\./g, "")).replace(",", opts.radixPoint) : kommaMatches.length > dotMatches.length ? (initialValue = initialValue.replace(/,/g, "")).replace(".", opts.radixPoint) : initialValue.indexOf(".") < initialValue.indexOf(",") ? initialValue.replace(/\./g, "") : initialValue.replace(/,/g, "") : initialValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), + 0 === opts.digits && (-1 !== initialValue.indexOf(".") ? initialValue = initialValue.substring(0, initialValue.indexOf(".")) : -1 !== initialValue.indexOf(",") && (initialValue = initialValue.substring(0, initialValue.indexOf(",")))), + "" !== opts.radixPoint && isFinite(opts.digits) && -1 !== initialValue.indexOf(opts.radixPoint)) { + var decPart = initialValue.split(opts.radixPoint)[1].match(new RegExp("\\d*"))[0]; + if (parseInt(opts.digits) < decPart.toString().length) { + var digitsFactor = Math.pow(10, parseInt(opts.digits)); + initialValue = initialValue.replace(Inputmask.escapeRegex(opts.radixPoint), "."), + initialValue = (initialValue = Math.round(parseFloat(initialValue) * digitsFactor) / digitsFactor).toString().replace(".", opts.radixPoint); + } + } + return initialValue; + }, + canClearPosition: function(maskset, position, lvp, strict, opts) { + var vp = maskset.validPositions[position], canClear = vp.input !== opts.radixPoint || null !== maskset.validPositions[position].match.fn && !1 === opts.decimalProtect || vp.input === opts.radixPoint && maskset.validPositions[position + 1] && null === maskset.validPositions[position + 1].match.fn || isFinite(vp.input) || position === lvp || vp.input === opts.groupSeparator || vp.input === opts.negationSymbol.front || vp.input === opts.negationSymbol.back; + return !canClear || "+" !== vp.match.nativeDef && "-" !== vp.match.nativeDef || (opts.isNegative = !1), + canClear; + }, + onKeyDown: function(e, buffer, caretPos, opts) { + var $input = $(this); + if (e.ctrlKey) switch (e.keyCode) { + case Inputmask.keyCode.UP: + $input.val(parseFloat(this.inputmask.unmaskedvalue()) + parseInt(opts.step)), $input.trigger("setvalue"); + break; + + case Inputmask.keyCode.DOWN: + $input.val(parseFloat(this.inputmask.unmaskedvalue()) - parseInt(opts.step)), $input.trigger("setvalue"); + } + } + }, + currency: { + prefix: "$ ", + groupSeparator: ",", + alias: "numeric", + placeholder: "0", + autoGroup: !0, + digits: 2, + digitsOptional: !1, + clearMaskOnLostFocus: !1 + }, + decimal: { + alias: "numeric" + }, + integer: { + alias: "numeric", + digits: 0, + radixPoint: "" + }, + percentage: { + alias: "numeric", + digits: 2, + digitsOptional: !0, + radixPoint: ".", + placeholder: "0", + autoGroup: !1, + min: 0, + max: 100, + suffix: " %", + allowMinus: !1 + } + }), Inputmask; + }); +}, function(module, exports, __webpack_require__) { + "use strict"; + var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__; + "function" == typeof Symbol && Symbol.iterator; + !function(factory) { + __WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(0), __webpack_require__(1) ], + void 0 !== (__WEBPACK_AMD_DEFINE_RESULT__ = "function" == typeof (__WEBPACK_AMD_DEFINE_FACTORY__ = factory) ? __WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__) : __WEBPACK_AMD_DEFINE_FACTORY__) && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__); + }(function($, Inputmask) { + function maskSort(a, b) { + var maska = (a.mask || a).replace(/#/g, "9").replace(/\)/, "9").replace(/[+()#-]/g, ""), maskb = (b.mask || b).replace(/#/g, "9").replace(/\)/, "9").replace(/[+()#-]/g, ""), maskas = (a.mask || a).split("#")[0], maskbs = (b.mask || b).split("#")[0]; + return 0 === maskbs.indexOf(maskas) ? -1 : 0 === maskas.indexOf(maskbs) ? 1 : maska.localeCompare(maskb); + } + var analyseMaskBase = Inputmask.prototype.analyseMask; + return Inputmask.prototype.analyseMask = function(mask, regexMask, opts) { + function reduceVariations(masks, previousVariation, previousmaskGroup) { + previousVariation = previousVariation || "", previousmaskGroup = previousmaskGroup || maskGroups, + "" !== previousVariation && (previousmaskGroup[previousVariation] = {}); + for (var variation = "", maskGroup = previousmaskGroup[previousVariation] || previousmaskGroup, i = masks.length - 1; i >= 0; i--) maskGroup[variation = (mask = masks[i].mask || masks[i]).substr(0, 1)] = maskGroup[variation] || [], + maskGroup[variation].unshift(mask.substr(1)), masks.splice(i, 1); + for (var ndx in maskGroup) maskGroup[ndx].length > 500 && reduceVariations(maskGroup[ndx].slice(), ndx, maskGroup); + } + function rebuild(maskGroup) { + var mask = "", submasks = []; + for (var ndx in maskGroup) $.isArray(maskGroup[ndx]) ? 1 === maskGroup[ndx].length ? submasks.push(ndx + maskGroup[ndx]) : submasks.push(ndx + opts.groupmarker.start + maskGroup[ndx].join(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start) + opts.groupmarker.end) : submasks.push(ndx + rebuild(maskGroup[ndx])); + return 1 === submasks.length ? mask += submasks[0] : mask += opts.groupmarker.start + submasks.join(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start) + opts.groupmarker.end, + mask; + } + var maskGroups = {}; + return opts.phoneCodes && (opts.phoneCodes && opts.phoneCodes.length > 1e3 && (reduceVariations((mask = mask.substr(1, mask.length - 2)).split(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start)), + mask = rebuild(maskGroups)), mask = mask.replace(/9/g, "\\9")), analyseMaskBase.call(this, mask, regexMask, opts); + }, Inputmask.extendAliases({ + abstractphone: { + groupmarker: { + start: "<", + end: ">" + }, + countrycode: "", + phoneCodes: [], + mask: function(opts) { + return opts.definitions = { + "#": Inputmask.prototype.definitions[9] + }, opts.phoneCodes.sort(maskSort); + }, + keepStatic: !0, + onBeforeMask: function(value, opts) { + var processedValue = value.replace(/^0{1,2}/, "").replace(/[\s]/g, ""); + return (processedValue.indexOf(opts.countrycode) > 1 || -1 === processedValue.indexOf(opts.countrycode)) && (processedValue = "+" + opts.countrycode + processedValue), + processedValue; + }, + onUnMask: function(maskedValue, unmaskedValue, opts) { + return maskedValue.replace(/[()#-]/g, ""); + }, + inputmode: "tel" + } + }), Inputmask; + }); +}, function(module, exports, __webpack_require__) { + "use strict"; + var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__; + "function" == typeof Symbol && Symbol.iterator; + !function(factory) { + __WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(0), __webpack_require__(1) ], + void 0 !== (__WEBPACK_AMD_DEFINE_RESULT__ = "function" == typeof (__WEBPACK_AMD_DEFINE_FACTORY__ = factory) ? __WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__) : __WEBPACK_AMD_DEFINE_FACTORY__) && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__); + }(function($, Inputmask) { + return Inputmask.extendAliases({ + Regex: { + mask: "r", + greedy: !1, + repeat: "*", + regex: null, + regexTokens: null, + tokenizer: /\[\^?]?(?:[^\\\]]+|\\[\S\s]?)*]?|\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9][0-9]*|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Za-z]|[\S\s]?)|\((?:\?[:=!]?)?|(?:[?*+]|\{[0-9]+(?:,[0-9]*)?\})\??|[^.?*+^${[()|\\]+|./g, + quantifierFilter: /[0-9]+[^,]/, + isComplete: function(buffer, opts) { + return new RegExp(opts.regex, opts.casing ? "i" : "").test(buffer.join("")); + }, + definitions: { + r: { + validator: function(chrs, maskset, pos, strict, opts) { + function RegexToken(isGroup, isQuantifier) { + this.matches = [], this.isGroup = isGroup || !1, this.isQuantifier = isQuantifier || !1, + this.quantifier = { + min: 1, + max: 1 + }, this.repeaterPart = void 0; + } + function validateRegexToken(token, fromGroup) { + var isvalid = !1; + fromGroup && (regexPart += "(", openGroupCount++); + for (var mndx = 0; mndx < token.matches.length; mndx++) { + var matchToken = token.matches[mndx]; + if (!0 === matchToken.isGroup) isvalid = validateRegexToken(matchToken, !0); else if (!0 === matchToken.isQuantifier) { + var crrntndx = $.inArray(matchToken, token.matches), matchGroup = token.matches[crrntndx - 1], regexPartBak = regexPart; + if (isNaN(matchToken.quantifier.max)) { + for (;matchToken.repeaterPart && matchToken.repeaterPart !== regexPart && matchToken.repeaterPart.length > regexPart.length && !(isvalid = validateRegexToken(matchGroup, !0)); ) ; + (isvalid = isvalid || validateRegexToken(matchGroup, !0)) && (matchToken.repeaterPart = regexPart), + regexPart = regexPartBak + matchToken.quantifier.max; + } else { + for (var i = 0, qm = matchToken.quantifier.max - 1; i < qm && !(isvalid = validateRegexToken(matchGroup, !0)); i++) ; + regexPart = regexPartBak + "{" + matchToken.quantifier.min + "," + matchToken.quantifier.max + "}"; + } + } else if (void 0 !== matchToken.matches) for (var k = 0; k < matchToken.length && !(isvalid = validateRegexToken(matchToken[k], fromGroup)); k++) ; else { + var testExp; + if ("[" == matchToken.charAt(0)) { + testExp = regexPart, testExp += matchToken; + for (j = 0; j < openGroupCount; j++) testExp += ")"; + isvalid = (exp = new RegExp("^(" + testExp + ")$", opts.casing ? "i" : "")).test(bufferStr); + } else for (var l = 0, tl = matchToken.length; l < tl; l++) if ("\\" !== matchToken.charAt(l)) { + testExp = regexPart, testExp = (testExp += matchToken.substr(0, l + 1)).replace(/\|$/, ""); + for (var j = 0; j < openGroupCount; j++) testExp += ")"; + var exp = new RegExp("^(" + testExp + ")$", opts.casing ? "i" : ""); + if (isvalid = exp.test(bufferStr)) break; + } + regexPart += matchToken; + } + if (isvalid) break; + } + return fromGroup && (regexPart += ")", openGroupCount--), isvalid; + } + var bufferStr, groupToken, cbuffer = maskset.buffer.slice(), regexPart = "", isValid = !1, openGroupCount = 0; + null === opts.regexTokens && function() { + var match, m, currentToken = new RegexToken(), opengroups = []; + for (opts.regexTokens = []; match = opts.tokenizer.exec(opts.regex); ) switch ((m = match[0]).charAt(0)) { + case "(": + opengroups.push(new RegexToken(!0)); + break; + + case ")": + groupToken = opengroups.pop(), opengroups.length > 0 ? opengroups[opengroups.length - 1].matches.push(groupToken) : currentToken.matches.push(groupToken); + break; + + case "{": + case "+": + case "*": + var quantifierToken = new RegexToken(!1, !0), mq = (m = m.replace(/[{}]/g, "")).split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]); + if (quantifierToken.quantifier = { + min: mq0, + max: mq1 + }, opengroups.length > 0) { + var matches = opengroups[opengroups.length - 1].matches; + (match = matches.pop()).isGroup || ((groupToken = new RegexToken(!0)).matches.push(match), + match = groupToken), matches.push(match), matches.push(quantifierToken); + } else (match = currentToken.matches.pop()).isGroup || ((groupToken = new RegexToken(!0)).matches.push(match), + match = groupToken), currentToken.matches.push(match), currentToken.matches.push(quantifierToken); + break; + + default: + opengroups.length > 0 ? opengroups[opengroups.length - 1].matches.push(m) : currentToken.matches.push(m); + } + currentToken.matches.length > 0 && opts.regexTokens.push(currentToken); + }(), cbuffer.splice(pos, 0, chrs), bufferStr = cbuffer.join(""); + for (var i = 0; i < opts.regexTokens.length; i++) { + var regexToken = opts.regexTokens[i]; + if (isValid = validateRegexToken(regexToken, regexToken.isGroup)) break; + } + return isValid; + }, + cardinality: 1 + } + } + } + }), Inputmask; + }); +}, function(module, exports, __webpack_require__) { + "use strict"; + var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__, _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + !function(factory) { + __WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(2), __webpack_require__(1) ], + void 0 !== (__WEBPACK_AMD_DEFINE_RESULT__ = "function" == typeof (__WEBPACK_AMD_DEFINE_FACTORY__ = factory) ? __WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__) : __WEBPACK_AMD_DEFINE_FACTORY__) && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__); + }(function($, Inputmask) { + return void 0 === $.fn.inputmask && ($.fn.inputmask = function(fn, options) { + var nptmask, input = this[0]; + if (void 0 === options && (options = {}), "string" == typeof fn) switch (fn) { + case "unmaskedvalue": + return input && input.inputmask ? input.inputmask.unmaskedvalue() : $(input).val(); + + case "remove": + return this.each(function() { + this.inputmask && this.inputmask.remove(); + }); + + case "getemptymask": + return input && input.inputmask ? input.inputmask.getemptymask() : ""; + + case "hasMaskedValue": + return !(!input || !input.inputmask) && input.inputmask.hasMaskedValue(); + + case "isComplete": + return !input || !input.inputmask || input.inputmask.isComplete(); + + case "getmetadata": + return input && input.inputmask ? input.inputmask.getmetadata() : void 0; + + case "setvalue": + $(input).val(options), input && void 0 === input.inputmask && $(input).triggerHandler("setvalue"); + break; + + case "option": + if ("string" != typeof options) return this.each(function() { + if (void 0 !== this.inputmask) return this.inputmask.option(options); + }); + if (input && void 0 !== input.inputmask) return input.inputmask.option(options); + break; + + default: + return options.alias = fn, nptmask = new Inputmask(options), this.each(function() { + nptmask.mask(this); + }); + } else { + if ("object" == (void 0 === fn ? "undefined" : _typeof(fn))) return nptmask = new Inputmask(fn), + void 0 === fn.mask && void 0 === fn.alias ? this.each(function() { + if (void 0 !== this.inputmask) return this.inputmask.option(fn); + nptmask.mask(this); + }) : this.each(function() { + nptmask.mask(this); + }); + if (void 0 === fn) return this.each(function() { + (nptmask = new Inputmask(options)).mask(this); + }); + } + }), $.fn.inputmask; + }); +} ]); +/*! +* inputmask.date.extensions.js +* https://github.com/RobinHerbots/Inputmask +* Copyright (c) 2010 - 2017 Robin Herbots +* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) +* Version: 3.3.11 +*/ + +!function(factory) { + "function" == typeof define && define.amd ? define([ "./dependencyLibs/inputmask.dependencyLib", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./dependencyLibs/inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask); +}(function($, Inputmask) { + function isLeapYear(year) { + return isNaN(year) || 29 === new Date(year, 2, 0).getDate(); + } + return Inputmask.extendAliases({ + "dd/mm/yyyy": { + mask: "1/2/y", + placeholder: "dd/mm/yyyy", + regex: { + val1pre: new RegExp("[0-3]"), + val1: new RegExp("0[1-9]|[12][0-9]|3[01]"), + val2pre: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[1-9]|[12][0-9]|3[01])" + escapedSeparator + "[01])"); + }, + val2: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[1-9]|[12][0-9])" + escapedSeparator + "(0[1-9]|1[012]))|(30" + escapedSeparator + "(0[13-9]|1[012]))|(31" + escapedSeparator + "(0[13578]|1[02]))"); + } + }, + leapday: "29/02/", + separator: "/", + yearrange: { + minyear: 1900, + maxyear: 2099 + }, + isInYearRange: function(chrs, minyear, maxyear) { + if (isNaN(chrs)) return !1; + var enteredyear = parseInt(chrs.concat(minyear.toString().slice(chrs.length))), enteredyear2 = parseInt(chrs.concat(maxyear.toString().slice(chrs.length))); + return !isNaN(enteredyear) && (minyear <= enteredyear && enteredyear <= maxyear) || !isNaN(enteredyear2) && (minyear <= enteredyear2 && enteredyear2 <= maxyear); + }, + determinebaseyear: function(minyear, maxyear, hint) { + var currentyear = new Date().getFullYear(); + if (minyear > currentyear) return minyear; + if (maxyear < currentyear) { + for (var maxYearPrefix = maxyear.toString().slice(0, 2), maxYearPostfix = maxyear.toString().slice(2, 4); maxyear < maxYearPrefix + hint; ) maxYearPrefix--; + var maxxYear = maxYearPrefix + maxYearPostfix; + return minyear > maxxYear ? minyear : maxxYear; + } + if (minyear <= currentyear && currentyear <= maxyear) { + for (var currentYearPrefix = currentyear.toString().slice(0, 2); maxyear < currentYearPrefix + hint; ) currentYearPrefix--; + var currentYearAndHint = currentYearPrefix + hint; + return currentYearAndHint < minyear ? minyear : currentYearAndHint; + } + return currentyear; + }, + onKeyDown: function(e, buffer, caretPos, opts) { + var $input = $(this); + if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { + var today = new Date(); + $input.val(today.getDate().toString() + (today.getMonth() + 1).toString() + today.getFullYear().toString()), + $input.trigger("setvalue"); + } + }, + getFrontValue: function(mask, buffer, opts) { + for (var start = 0, length = 0, i = 0; i < mask.length && "2" !== mask.charAt(i); i++) { + var definition = opts.definitions[mask.charAt(i)]; + definition ? (start += length, length = definition.cardinality) : length++; + } + return buffer.join("").substr(start, length); + }, + postValidation: function(buffer, currentResult, opts) { + var dayMonthValue, year, bufferStr = buffer.join(""); + return 0 === opts.mask.indexOf("y") ? (year = bufferStr.substr(0, 4), dayMonthValue = bufferStr.substring(4, 10)) : (year = bufferStr.substring(6, 10), + dayMonthValue = bufferStr.substr(0, 6)), currentResult && (dayMonthValue !== opts.leapday || isLeapYear(year)); + }, + definitions: { + "1": { + validator: function(chrs, maskset, pos, strict, opts) { + var isValid = opts.regex.val1.test(chrs); + return strict || isValid || chrs.charAt(1) !== opts.separator && -1 === "-./".indexOf(chrs.charAt(1)) || !(isValid = opts.regex.val1.test("0" + chrs.charAt(0))) ? isValid : (maskset.buffer[pos - 1] = "0", + { + refreshFromBuffer: { + start: pos - 1, + end: pos + }, + pos: pos, + c: chrs.charAt(0) + }); + }, + cardinality: 2, + prevalidator: [ { + validator: function(chrs, maskset, pos, strict, opts) { + var pchrs = chrs; + isNaN(maskset.buffer[pos + 1]) || (pchrs += maskset.buffer[pos + 1]); + var isValid = 1 === pchrs.length ? opts.regex.val1pre.test(pchrs) : opts.regex.val1.test(pchrs); + if (isValid && maskset.validPositions[pos] && (opts.regex.val2(opts.separator).test(chrs + maskset.validPositions[pos].input) || (maskset.validPositions[pos].input = "0" === chrs ? "1" : "0")), + !strict && !isValid) { + if (isValid = opts.regex.val1.test(chrs + "0")) return maskset.buffer[pos] = chrs, + maskset.buffer[++pos] = "0", { + pos: pos, + c: "0" + }; + if (isValid = opts.regex.val1.test("0" + chrs)) return maskset.buffer[pos] = "0", + pos++, { + pos: pos + }; + } + return isValid; + }, + cardinality: 1 + } ] + }, + "2": { + validator: function(chrs, maskset, pos, strict, opts) { + var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts); + -1 !== frontValue.indexOf(opts.placeholder[0]) && (frontValue = "01" + opts.separator); + var isValid = opts.regex.val2(opts.separator).test(frontValue + chrs); + return strict || isValid || chrs.charAt(1) !== opts.separator && -1 === "-./".indexOf(chrs.charAt(1)) || !(isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs.charAt(0))) ? isValid : (maskset.buffer[pos - 1] = "0", + { + refreshFromBuffer: { + start: pos - 1, + end: pos + }, + pos: pos, + c: chrs.charAt(0) + }); + }, + cardinality: 2, + prevalidator: [ { + validator: function(chrs, maskset, pos, strict, opts) { + isNaN(maskset.buffer[pos + 1]) || (chrs += maskset.buffer[pos + 1]); + var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts); + -1 !== frontValue.indexOf(opts.placeholder[0]) && (frontValue = "01" + opts.separator); + var isValid = 1 === chrs.length ? opts.regex.val2pre(opts.separator).test(frontValue + chrs) : opts.regex.val2(opts.separator).test(frontValue + chrs); + return isValid && maskset.validPositions[pos] && (opts.regex.val2(opts.separator).test(chrs + maskset.validPositions[pos].input) || (maskset.validPositions[pos].input = "0" === chrs ? "1" : "0")), + strict || isValid || !(isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", + pos++, { + pos: pos + }); + }, + cardinality: 1 + } ] + }, + y: { + validator: function(chrs, maskset, pos, strict, opts) { + return opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); + }, + cardinality: 4, + prevalidator: [ { + validator: function(chrs, maskset, pos, strict, opts) { + var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); + if (!strict && !isValid) { + var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 1); + if (isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(0), + { + pos: pos + }; + if (yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 2), + isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(0), + maskset.buffer[pos++] = yearPrefix.charAt(1), { + pos: pos + }; + } + return isValid; + }, + cardinality: 1 + }, { + validator: function(chrs, maskset, pos, strict, opts) { + var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); + if (!strict && !isValid) { + var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2); + if (isValid = opts.isInYearRange(chrs[0] + yearPrefix[1] + chrs[1], opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(1), + { + pos: pos + }; + if (yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2), + isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos - 1] = yearPrefix.charAt(0), + maskset.buffer[pos++] = yearPrefix.charAt(1), maskset.buffer[pos++] = chrs.charAt(0), + { + refreshFromBuffer: { + start: pos - 3, + end: pos + }, + pos: pos + }; + } + return isValid; + }, + cardinality: 2 + }, { + validator: function(chrs, maskset, pos, strict, opts) { + return opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); + }, + cardinality: 3 + } ] + } + }, + insertMode: !1, + autoUnmask: !1 + }, + "mm/dd/yyyy": { + placeholder: "mm/dd/yyyy", + alias: "dd/mm/yyyy", + regex: { + val2pre: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])"); + }, + val2: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)"); + }, + val1pre: new RegExp("[01]"), + val1: new RegExp("0[1-9]|1[012]") + }, + leapday: "02/29/", + onKeyDown: function(e, buffer, caretPos, opts) { + var $input = $(this); + if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { + var today = new Date(); + $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()), + $input.trigger("setvalue"); + } + } + }, + "yyyy/mm/dd": { + mask: "y/1/2", + placeholder: "yyyy/mm/dd", + alias: "mm/dd/yyyy", + leapday: "/02/29", + onKeyDown: function(e, buffer, caretPos, opts) { + var $input = $(this); + if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { + var today = new Date(); + $input.val(today.getFullYear().toString() + (today.getMonth() + 1).toString() + today.getDate().toString()), + $input.trigger("setvalue"); + } + } + }, + "dd.mm.yyyy": { + mask: "1.2.y", + placeholder: "dd.mm.yyyy", + leapday: "29.02.", + separator: ".", + alias: "dd/mm/yyyy" + }, + "dd-mm-yyyy": { + mask: "1-2-y", + placeholder: "dd-mm-yyyy", + leapday: "29-02-", + separator: "-", + alias: "dd/mm/yyyy" + }, + "mm.dd.yyyy": { + mask: "1.2.y", + placeholder: "mm.dd.yyyy", + leapday: "02.29.", + separator: ".", + alias: "mm/dd/yyyy" + }, + "mm-dd-yyyy": { + mask: "1-2-y", + placeholder: "mm-dd-yyyy", + leapday: "02-29-", + separator: "-", + alias: "mm/dd/yyyy" + }, + "yyyy.mm.dd": { + mask: "y.1.2", + placeholder: "yyyy.mm.dd", + leapday: ".02.29", + separator: ".", + alias: "yyyy/mm/dd" + }, + "yyyy-mm-dd": { + mask: "y-1-2", + placeholder: "yyyy-mm-dd", + leapday: "-02-29", + separator: "-", + alias: "yyyy/mm/dd" + }, + datetime: { + mask: "1/2/y h:s", + placeholder: "dd/mm/yyyy hh:mm", + alias: "dd/mm/yyyy", + regex: { + hrspre: new RegExp("[012]"), + hrs24: new RegExp("2[0-4]|1[3-9]"), + hrs: new RegExp("[01][0-9]|2[0-4]"), + ampm: new RegExp("^[a|p|A|P][m|M]"), + mspre: new RegExp("[0-5]"), + ms: new RegExp("[0-5][0-9]") + }, + timeseparator: ":", + hourFormat: "24", + definitions: { + h: { + validator: function(chrs, maskset, pos, strict, opts) { + if ("24" === opts.hourFormat && 24 === parseInt(chrs, 10)) return maskset.buffer[pos - 1] = "0", + maskset.buffer[pos] = "0", { + refreshFromBuffer: { + start: pos - 1, + end: pos + }, + c: "0" + }; + var isValid = opts.regex.hrs.test(chrs); + if (!strict && !isValid && (chrs.charAt(1) === opts.timeseparator || -1 !== "-.:".indexOf(chrs.charAt(1))) && (isValid = opts.regex.hrs.test("0" + chrs.charAt(0)))) return maskset.buffer[pos - 1] = "0", + maskset.buffer[pos] = chrs.charAt(0), pos++, { + refreshFromBuffer: { + start: pos - 2, + end: pos + }, + pos: pos, + c: opts.timeseparator + }; + if (isValid && "24" !== opts.hourFormat && opts.regex.hrs24.test(chrs)) { + var tmp = parseInt(chrs, 10); + return 24 === tmp ? (maskset.buffer[pos + 5] = "a", maskset.buffer[pos + 6] = "m") : (maskset.buffer[pos + 5] = "p", + maskset.buffer[pos + 6] = "m"), (tmp -= 12) < 10 ? (maskset.buffer[pos] = tmp.toString(), + maskset.buffer[pos - 1] = "0") : (maskset.buffer[pos] = tmp.toString().charAt(1), + maskset.buffer[pos - 1] = tmp.toString().charAt(0)), { + refreshFromBuffer: { + start: pos - 1, + end: pos + 6 + }, + c: maskset.buffer[pos] + }; + } + return isValid; + }, + cardinality: 2, + prevalidator: [ { + validator: function(chrs, maskset, pos, strict, opts) { + var isValid = opts.regex.hrspre.test(chrs); + return strict || isValid || !(isValid = opts.regex.hrs.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", + pos++, { + pos: pos + }); + }, + cardinality: 1 + } ] + }, + s: { + validator: "[0-5][0-9]", + cardinality: 2, + prevalidator: [ { + validator: function(chrs, maskset, pos, strict, opts) { + var isValid = opts.regex.mspre.test(chrs); + return strict || isValid || !(isValid = opts.regex.ms.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", + pos++, { + pos: pos + }); + }, + cardinality: 1 + } ] + }, + t: { + validator: function(chrs, maskset, pos, strict, opts) { + return opts.regex.ampm.test(chrs + "m"); + }, + casing: "lower", + cardinality: 1 + } + }, + insertMode: !1, + autoUnmask: !1 + }, + datetime12: { + mask: "1/2/y h:s t\\m", + placeholder: "dd/mm/yyyy hh:mm xm", + alias: "datetime", + hourFormat: "12" + }, + "mm/dd/yyyy hh:mm xm": { + mask: "1/2/y h:s t\\m", + placeholder: "mm/dd/yyyy hh:mm xm", + alias: "datetime12", + regex: { + val2pre: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])"); + }, + val2: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)"); + }, + val1pre: new RegExp("[01]"), + val1: new RegExp("0[1-9]|1[012]") + }, + leapday: "02/29/", + onKeyDown: function(e, buffer, caretPos, opts) { + var $input = $(this); + if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { + var today = new Date(); + $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()), + $input.trigger("setvalue"); + } + } + }, + "hh:mm t": { + mask: "h:s t\\m", + placeholder: "hh:mm xm", + alias: "datetime", + hourFormat: "12" + }, + "h:s t": { + mask: "h:s t\\m", + placeholder: "hh:mm xm", + alias: "datetime", + hourFormat: "12" + }, + "hh:mm:ss": { + mask: "h:s:s", + placeholder: "hh:mm:ss", + alias: "datetime", + autoUnmask: !1 + }, + "hh:mm": { + mask: "h:s", + placeholder: "hh:mm", + alias: "datetime", + autoUnmask: !1 + }, + date: { + alias: "dd/mm/yyyy" + }, + "mm/yyyy": { + mask: "1/y", + placeholder: "mm/yyyy", + leapday: "donotuse", + separator: "/", + alias: "mm/dd/yyyy" + }, + shamsi: { + regex: { + val2pre: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "[0-3])"); + }, + val2: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[1-9]|1[012])" + escapedSeparator + "30)|((0[1-6])" + escapedSeparator + "31)"); + }, + val1pre: new RegExp("[01]"), + val1: new RegExp("0[1-9]|1[012]") + }, + yearrange: { + minyear: 1300, + maxyear: 1499 + }, + mask: "y/1/2", + leapday: "/12/30", + placeholder: "yyyy/mm/dd", + alias: "mm/dd/yyyy", + clearIncomplete: !0 + }, + "yyyy-mm-dd hh:mm:ss": { + mask: "y-1-2 h:s:s", + placeholder: "yyyy-mm-dd hh:mm:ss", + alias: "datetime", + separator: "-", + leapday: "-02-29", + regex: { + val2pre: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])"); + }, + val2: function(separator) { + var escapedSeparator = Inputmask.escapeRegex.call(this, separator); + return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)"); + }, + val1pre: new RegExp("[01]"), + val1: new RegExp("0[1-9]|1[012]") + }, + onKeyDown: function(e, buffer, caretPos, opts) {} + } + }), Inputmask; +}); +/*! +* inputmask.numeric.extensions.js +* https://github.com/RobinHerbots/Inputmask +* Copyright (c) 2010 - 2017 Robin Herbots +* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) +* Version: 3.3.11 +*/ + +!function(factory) { + "function" == typeof define && define.amd ? define([ "./dependencyLibs/inputmask.dependencyLib", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./dependencyLibs/inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask); +}(function($, Inputmask, undefined) { + function autoEscape(txt, opts) { + for (var escapedTxt = "", i = 0; i < txt.length; i++) Inputmask.prototype.definitions[txt.charAt(i)] || opts.definitions[txt.charAt(i)] || opts.optionalmarker.start === txt.charAt(i) || opts.optionalmarker.end === txt.charAt(i) || opts.quantifiermarker.start === txt.charAt(i) || opts.quantifiermarker.end === txt.charAt(i) || opts.groupmarker.start === txt.charAt(i) || opts.groupmarker.end === txt.charAt(i) || opts.alternatormarker === txt.charAt(i) ? escapedTxt += "\\" + txt.charAt(i) : escapedTxt += txt.charAt(i); + return escapedTxt; + } + return Inputmask.extendAliases({ + numeric: { + mask: function(opts) { + if (0 !== opts.repeat && isNaN(opts.integerDigits) && (opts.integerDigits = opts.repeat), + opts.repeat = 0, opts.groupSeparator === opts.radixPoint && ("." === opts.radixPoint ? opts.groupSeparator = "," : "," === opts.radixPoint ? opts.groupSeparator = "." : opts.groupSeparator = ""), + " " === opts.groupSeparator && (opts.skipOptionalPartCharacter = undefined), opts.autoGroup = opts.autoGroup && "" !== opts.groupSeparator, + opts.autoGroup && ("string" == typeof opts.groupSize && isFinite(opts.groupSize) && (opts.groupSize = parseInt(opts.groupSize)), + isFinite(opts.integerDigits))) { + var seps = Math.floor(opts.integerDigits / opts.groupSize), mod = opts.integerDigits % opts.groupSize; + opts.integerDigits = parseInt(opts.integerDigits) + (0 === mod ? seps - 1 : seps), + opts.integerDigits < 1 && (opts.integerDigits = "*"); + } + opts.placeholder.length > 1 && (opts.placeholder = opts.placeholder.charAt(0)), + "radixFocus" === opts.positionCaretOnClick && "" === opts.placeholder && !1 === opts.integerOptional && (opts.positionCaretOnClick = "lvp"), + opts.definitions[";"] = opts.definitions["~"], opts.definitions[";"].definitionSymbol = "~", + !0 === opts.numericInput && (opts.positionCaretOnClick = "radixFocus" === opts.positionCaretOnClick ? "lvp" : opts.positionCaretOnClick, + opts.digitsOptional = !1, isNaN(opts.digits) && (opts.digits = 2), opts.decimalProtect = !1); + var mask = "[+]"; + if (mask += autoEscape(opts.prefix, opts), !0 === opts.integerOptional ? mask += "~{1," + opts.integerDigits + "}" : mask += "~{" + opts.integerDigits + "}", + opts.digits !== undefined) { + opts.radixPointDefinitionSymbol = opts.decimalProtect ? ":" : opts.radixPoint; + var dq = opts.digits.toString().split(","); + isFinite(dq[0] && dq[1] && isFinite(dq[1])) ? mask += opts.radixPointDefinitionSymbol + ";{" + opts.digits + "}" : (isNaN(opts.digits) || parseInt(opts.digits) > 0) && (opts.digitsOptional ? mask += "[" + opts.radixPointDefinitionSymbol + ";{1," + opts.digits + "}]" : mask += opts.radixPointDefinitionSymbol + ";{" + opts.digits + "}"); + } + return mask += autoEscape(opts.suffix, opts), mask += "[-]", opts.greedy = !1, mask; + }, + placeholder: "", + greedy: !1, + digits: "*", + digitsOptional: !0, + enforceDigitsOnBlur: !1, + radixPoint: ".", + positionCaretOnClick: "radixFocus", + groupSize: 3, + groupSeparator: "", + autoGroup: !1, + allowMinus: !0, + negationSymbol: { + front: "-", + back: "" + }, + integerDigits: "+", + integerOptional: !0, + prefix: "", + suffix: "", + rightAlign: !0, + decimalProtect: !0, + min: null, + max: null, + step: 1, + insertMode: !0, + autoUnmask: !1, + unmaskAsNumber: !1, + inputmode: "numeric", + preValidation: function(buffer, pos, c, isSelection, opts) { + if ("-" === c || c === opts.negationSymbol.front) return !0 === opts.allowMinus && (opts.isNegative = opts.isNegative === undefined || !opts.isNegative, + "" === buffer.join("") || { + caret: pos, + dopost: !0 + }); + if (!1 === isSelection && c === opts.radixPoint && opts.digits !== undefined && (isNaN(opts.digits) || parseInt(opts.digits) > 0)) { + var radixPos = $.inArray(opts.radixPoint, buffer); + if (-1 !== radixPos) return !0 === opts.numericInput ? pos === radixPos : { + caret: radixPos + 1 + }; + } + return !0; + }, + postValidation: function(buffer, currentResult, opts) { + var suffix = opts.suffix.split(""), prefix = opts.prefix.split(""); + if (currentResult.pos === undefined && currentResult.caret !== undefined && !0 !== currentResult.dopost) return currentResult; + var caretPos = currentResult.caret !== undefined ? currentResult.caret : currentResult.pos, maskedValue = buffer.slice(); + opts.numericInput && (caretPos = maskedValue.length - caretPos - 1, maskedValue = maskedValue.reverse()); + var charAtPos = maskedValue[caretPos]; + if (charAtPos === opts.groupSeparator && (charAtPos = maskedValue[caretPos += 1]), + caretPos === maskedValue.length - opts.suffix.length - 1 && charAtPos === opts.radixPoint) return currentResult; + charAtPos !== undefined && charAtPos !== opts.radixPoint && charAtPos !== opts.negationSymbol.front && charAtPos !== opts.negationSymbol.back && (maskedValue[caretPos] = "?", + opts.prefix.length > 0 && caretPos >= (!1 === opts.isNegative ? 1 : 0) && caretPos < opts.prefix.length - 1 + (!1 === opts.isNegative ? 1 : 0) ? prefix[caretPos - (!1 === opts.isNegative ? 1 : 0)] = "?" : opts.suffix.length > 0 && caretPos >= maskedValue.length - opts.suffix.length - (!1 === opts.isNegative ? 1 : 0) && (suffix[caretPos - (maskedValue.length - opts.suffix.length - (!1 === opts.isNegative ? 1 : 0))] = "?")), + prefix = prefix.join(""), suffix = suffix.join(""); + var processValue = maskedValue.join("").replace(prefix, ""); + if (processValue = processValue.replace(suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), + processValue = processValue.replace(new RegExp("[-" + Inputmask.escapeRegex(opts.negationSymbol.front) + "]", "g"), ""), + processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), ""), + isNaN(opts.placeholder) && (processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.placeholder), "g"), "")), + processValue.length > 1 && 1 !== processValue.indexOf(opts.radixPoint) && ("0" === charAtPos && (processValue = processValue.replace(/^\?/g, "")), + processValue = processValue.replace(/^0/g, "")), processValue.charAt(0) === opts.radixPoint && "" !== opts.radixPoint && !0 !== opts.numericInput && (processValue = "0" + processValue), + "" !== processValue) { + if (processValue = processValue.split(""), (!opts.digitsOptional || opts.enforceDigitsOnBlur && "blur" === currentResult.event) && isFinite(opts.digits)) { + var radixPosition = $.inArray(opts.radixPoint, processValue), rpb = $.inArray(opts.radixPoint, maskedValue); + -1 === radixPosition && (processValue.push(opts.radixPoint), radixPosition = processValue.length - 1); + for (var i = 1; i <= opts.digits; i++) opts.digitsOptional && (!opts.enforceDigitsOnBlur || "blur" !== currentResult.event) || processValue[radixPosition + i] !== undefined && processValue[radixPosition + i] !== opts.placeholder.charAt(0) ? -1 !== rpb && maskedValue[rpb + i] !== undefined && (processValue[radixPosition + i] = processValue[radixPosition + i] || maskedValue[rpb + i]) : processValue[radixPosition + i] = currentResult.placeholder || opts.placeholder.charAt(0); + } + if (!0 !== opts.autoGroup || "" === opts.groupSeparator || charAtPos === opts.radixPoint && currentResult.pos === undefined && !currentResult.dopost) processValue = processValue.join(""); else { + var addRadix = processValue[processValue.length - 1] === opts.radixPoint && currentResult.c === opts.radixPoint; + processValue = Inputmask(function(buffer, opts) { + var postMask = ""; + if (postMask += "(" + opts.groupSeparator + "*{" + opts.groupSize + "}){*}", "" !== opts.radixPoint) { + var radixSplit = buffer.join("").split(opts.radixPoint); + radixSplit[1] && (postMask += opts.radixPoint + "*{" + radixSplit[1].match(/^\d*\??\d*/)[0].length + "}"); + } + return postMask; + }(processValue, opts), { + numericInput: !0, + jitMasking: !0, + definitions: { + "*": { + validator: "[0-9?]", + cardinality: 1 + } + } + }).format(processValue.join("")), addRadix && (processValue += opts.radixPoint), + processValue.charAt(0) === opts.groupSeparator && processValue.substr(1); + } + } + if (opts.isNegative && "blur" === currentResult.event && (opts.isNegative = "0" !== processValue), + processValue = prefix + processValue, processValue += suffix, opts.isNegative && (processValue = opts.negationSymbol.front + processValue, + processValue += opts.negationSymbol.back), processValue = processValue.split(""), + charAtPos !== undefined) if (charAtPos !== opts.radixPoint && charAtPos !== opts.negationSymbol.front && charAtPos !== opts.negationSymbol.back) (caretPos = $.inArray("?", processValue)) > -1 ? processValue[caretPos] = charAtPos : caretPos = currentResult.caret || 0; else if (charAtPos === opts.radixPoint || charAtPos === opts.negationSymbol.front || charAtPos === opts.negationSymbol.back) { + var newCaretPos = $.inArray(charAtPos, processValue); + -1 !== newCaretPos && (caretPos = newCaretPos); + } + opts.numericInput && (caretPos = processValue.length - caretPos - 1, processValue = processValue.reverse()); + var rslt = { + caret: charAtPos === undefined || currentResult.pos !== undefined ? caretPos + (opts.numericInput ? -1 : 1) : caretPos, + buffer: processValue, + refreshFromBuffer: currentResult.dopost || buffer.join("") !== processValue.join("") + }; + return rslt.refreshFromBuffer ? rslt : currentResult; + }, + onBeforeWrite: function(e, buffer, caretPos, opts) { + if (e) switch (e.type) { + case "keydown": + return opts.postValidation(buffer, { + caret: caretPos, + dopost: !0 + }, opts); + + case "blur": + case "checkval": + var unmasked; + if (function(opts) { + opts.parseMinMaxOptions === undefined && (null !== opts.min && (opts.min = opts.min.toString().replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), + "," === opts.radixPoint && (opts.min = opts.min.replace(opts.radixPoint, ".")), + opts.min = isFinite(opts.min) ? parseFloat(opts.min) : NaN, isNaN(opts.min) && (opts.min = Number.MIN_VALUE)), + null !== opts.max && (opts.max = opts.max.toString().replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), + "," === opts.radixPoint && (opts.max = opts.max.replace(opts.radixPoint, ".")), + opts.max = isFinite(opts.max) ? parseFloat(opts.max) : NaN, isNaN(opts.max) && (opts.max = Number.MAX_VALUE)), + opts.parseMinMaxOptions = "done"); + }(opts), null !== opts.min || null !== opts.max) { + if (unmasked = opts.onUnMask(buffer.join(""), undefined, $.extend({}, opts, { + unmaskAsNumber: !0 + })), null !== opts.min && unmasked < opts.min) return opts.isNegative = opts.min < 0, + opts.postValidation(opts.min.toString().replace(".", opts.radixPoint).split(""), { + caret: caretPos, + dopost: !0, + placeholder: "0" + }, opts); + if (null !== opts.max && unmasked > opts.max) return opts.isNegative = opts.max < 0, + opts.postValidation(opts.max.toString().replace(".", opts.radixPoint).split(""), { + caret: caretPos, + dopost: !0, + placeholder: "0" + }, opts); + } + return opts.postValidation(buffer, { + caret: caretPos, + placeholder: "0", + event: "blur" + }, opts); + + case "_checkval": + return { + caret: caretPos + }; + } + }, + regex: { + integerPart: function(opts, emptyCheck) { + return emptyCheck ? new RegExp("[" + Inputmask.escapeRegex(opts.negationSymbol.front) + "+]?") : new RegExp("[" + Inputmask.escapeRegex(opts.negationSymbol.front) + "+]?\\d+"); + }, + integerNPart: function(opts) { + return new RegExp("[\\d" + Inputmask.escapeRegex(opts.groupSeparator) + Inputmask.escapeRegex(opts.placeholder.charAt(0)) + "]+"); + } + }, + definitions: { + "~": { + validator: function(chrs, maskset, pos, strict, opts, isSelection) { + var isValid = strict ? new RegExp("[0-9" + Inputmask.escapeRegex(opts.groupSeparator) + "]").test(chrs) : new RegExp("[0-9]").test(chrs); + if (!0 === isValid) { + if (!0 !== opts.numericInput && maskset.validPositions[pos] !== undefined && "~" === maskset.validPositions[pos].match.def && !isSelection) { + var processValue = maskset.buffer.join(""), pvRadixSplit = (processValue = (processValue = processValue.replace(new RegExp("[-" + Inputmask.escapeRegex(opts.negationSymbol.front) + "]", "g"), "")).replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), "")).split(opts.radixPoint); + pvRadixSplit.length > 1 && (pvRadixSplit[1] = pvRadixSplit[1].replace(/0/g, opts.placeholder.charAt(0))), + "0" === pvRadixSplit[0] && (pvRadixSplit[0] = pvRadixSplit[0].replace(/0/g, opts.placeholder.charAt(0))), + processValue = pvRadixSplit[0] + opts.radixPoint + pvRadixSplit[1] || ""; + var bufferTemplate = maskset._buffer.join(""); + for (processValue === opts.radixPoint && (processValue = bufferTemplate); null === processValue.match(Inputmask.escapeRegex(bufferTemplate) + "$"); ) bufferTemplate = bufferTemplate.slice(1); + isValid = (processValue = (processValue = processValue.replace(bufferTemplate, "")).split(""))[pos] === undefined ? { + pos: pos, + remove: pos + } : { + pos: pos + }; + } + } else strict || chrs !== opts.radixPoint || maskset.validPositions[pos - 1] !== undefined || (maskset.buffer[pos] = "0", + isValid = { + pos: pos + 1 + }); + return isValid; + }, + cardinality: 1 + }, + "+": { + validator: function(chrs, maskset, pos, strict, opts) { + return opts.allowMinus && ("-" === chrs || chrs === opts.negationSymbol.front); + }, + cardinality: 1, + placeholder: "" + }, + "-": { + validator: function(chrs, maskset, pos, strict, opts) { + return opts.allowMinus && chrs === opts.negationSymbol.back; + }, + cardinality: 1, + placeholder: "" + }, + ":": { + validator: function(chrs, maskset, pos, strict, opts) { + var radix = "[" + Inputmask.escapeRegex(opts.radixPoint) + "]", isValid = new RegExp(radix).test(chrs); + return isValid && maskset.validPositions[pos] && maskset.validPositions[pos].match.placeholder === opts.radixPoint && (isValid = { + caret: pos + 1 + }), isValid; + }, + cardinality: 1, + placeholder: function(opts) { + return opts.radixPoint; + } + } + }, + onUnMask: function(maskedValue, unmaskedValue, opts) { + if ("" === unmaskedValue && !0 === opts.nullable) return unmaskedValue; + var processValue = maskedValue.replace(opts.prefix, ""); + return processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), + "" !== opts.placeholder.charAt(0) && (processValue = processValue.replace(new RegExp(opts.placeholder.charAt(0), "g"), "0")), + opts.unmaskAsNumber ? ("" !== opts.radixPoint && -1 !== processValue.indexOf(opts.radixPoint) && (processValue = processValue.replace(Inputmask.escapeRegex.call(this, opts.radixPoint), ".")), + processValue = processValue.replace(new RegExp("^" + Inputmask.escapeRegex(opts.negationSymbol.front)), "-"), + processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), ""), + Number(processValue)) : processValue; + }, + isComplete: function(buffer, opts) { + var maskedValue = buffer.join(""); + if (buffer.slice().join("") !== maskedValue) return !1; + var processValue = maskedValue.replace(opts.prefix, ""); + return processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), + "," === opts.radixPoint && (processValue = processValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".")), + isFinite(processValue); + }, + onBeforeMask: function(initialValue, opts) { + if (opts.isNegative = undefined, initialValue = initialValue.toString().charAt(initialValue.length - 1) === opts.radixPoint ? initialValue.toString().substr(0, initialValue.length - 1) : initialValue.toString(), + "" !== opts.radixPoint && isFinite(initialValue)) { + var vs = initialValue.split("."), groupSize = "" !== opts.groupSeparator ? parseInt(opts.groupSize) : 0; + 2 === vs.length && (vs[0].length > groupSize || vs[1].length > groupSize || vs[0].length <= groupSize && vs[1].length < groupSize) && (initialValue = initialValue.replace(".", opts.radixPoint)); + } + var kommaMatches = initialValue.match(/,/g), dotMatches = initialValue.match(/\./g); + if (initialValue = dotMatches && kommaMatches ? dotMatches.length > kommaMatches.length ? (initialValue = initialValue.replace(/\./g, "")).replace(",", opts.radixPoint) : kommaMatches.length > dotMatches.length ? (initialValue = initialValue.replace(/,/g, "")).replace(".", opts.radixPoint) : initialValue.indexOf(".") < initialValue.indexOf(",") ? initialValue.replace(/\./g, "") : initialValue.replace(/,/g, "") : initialValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), + 0 === opts.digits && (-1 !== initialValue.indexOf(".") ? initialValue = initialValue.substring(0, initialValue.indexOf(".")) : -1 !== initialValue.indexOf(",") && (initialValue = initialValue.substring(0, initialValue.indexOf(",")))), + "" !== opts.radixPoint && isFinite(opts.digits) && -1 !== initialValue.indexOf(opts.radixPoint)) { + var decPart = initialValue.split(opts.radixPoint)[1].match(new RegExp("\\d*"))[0]; + if (parseInt(opts.digits) < decPart.toString().length) { + var digitsFactor = Math.pow(10, parseInt(opts.digits)); + initialValue = initialValue.replace(Inputmask.escapeRegex(opts.radixPoint), "."), + initialValue = (initialValue = Math.round(parseFloat(initialValue) * digitsFactor) / digitsFactor).toString().replace(".", opts.radixPoint); + } + } + return initialValue; + }, + canClearPosition: function(maskset, position, lvp, strict, opts) { + var vp = maskset.validPositions[position], canClear = vp.input !== opts.radixPoint || null !== maskset.validPositions[position].match.fn && !1 === opts.decimalProtect || vp.input === opts.radixPoint && maskset.validPositions[position + 1] && null === maskset.validPositions[position + 1].match.fn || isFinite(vp.input) || position === lvp || vp.input === opts.groupSeparator || vp.input === opts.negationSymbol.front || vp.input === opts.negationSymbol.back; + return !canClear || "+" !== vp.match.nativeDef && "-" !== vp.match.nativeDef || (opts.isNegative = !1), + canClear; + }, + onKeyDown: function(e, buffer, caretPos, opts) { + var $input = $(this); + if (e.ctrlKey) switch (e.keyCode) { + case Inputmask.keyCode.UP: + $input.val(parseFloat(this.inputmask.unmaskedvalue()) + parseInt(opts.step)), $input.trigger("setvalue"); + break; + + case Inputmask.keyCode.DOWN: + $input.val(parseFloat(this.inputmask.unmaskedvalue()) - parseInt(opts.step)), $input.trigger("setvalue"); + } + } + }, + currency: { + prefix: "$ ", + groupSeparator: ",", + alias: "numeric", + placeholder: "0", + autoGroup: !0, + digits: 2, + digitsOptional: !1, + clearMaskOnLostFocus: !1 + }, + decimal: { + alias: "numeric" + }, + integer: { + alias: "numeric", + digits: 0, + radixPoint: "" + }, + percentage: { + alias: "numeric", + digits: 2, + digitsOptional: !0, + radixPoint: ".", + placeholder: "0", + autoGroup: !1, + min: 0, + max: 100, + suffix: " %", + allowMinus: !1 + } + }), Inputmask; +}); +/*! +* inputmask.phone.extensions.js +* https://github.com/RobinHerbots/Inputmask +* Copyright (c) 2010 - 2017 Robin Herbots +* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) +* Version: 3.3.11 +*/ + +!function(factory) { + "function" == typeof define && define.amd ? define([ "./dependencyLibs/inputmask.dependencyLib", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./dependencyLibs/inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask); +}(function($, Inputmask) { + function maskSort(a, b) { + var maska = (a.mask || a).replace(/#/g, "9").replace(/\)/, "9").replace(/[+()#-]/g, ""), maskb = (b.mask || b).replace(/#/g, "9").replace(/\)/, "9").replace(/[+()#-]/g, ""), maskas = (a.mask || a).split("#")[0], maskbs = (b.mask || b).split("#")[0]; + return 0 === maskbs.indexOf(maskas) ? -1 : 0 === maskas.indexOf(maskbs) ? 1 : maska.localeCompare(maskb); + } + var analyseMaskBase = Inputmask.prototype.analyseMask; + return Inputmask.prototype.analyseMask = function(mask, regexMask, opts) { + function reduceVariations(masks, previousVariation, previousmaskGroup) { + previousVariation = previousVariation || "", previousmaskGroup = previousmaskGroup || maskGroups, + "" !== previousVariation && (previousmaskGroup[previousVariation] = {}); + for (var variation = "", maskGroup = previousmaskGroup[previousVariation] || previousmaskGroup, i = masks.length - 1; i >= 0; i--) maskGroup[variation = (mask = masks[i].mask || masks[i]).substr(0, 1)] = maskGroup[variation] || [], + maskGroup[variation].unshift(mask.substr(1)), masks.splice(i, 1); + for (var ndx in maskGroup) maskGroup[ndx].length > 500 && reduceVariations(maskGroup[ndx].slice(), ndx, maskGroup); + } + function rebuild(maskGroup) { + var mask = "", submasks = []; + for (var ndx in maskGroup) $.isArray(maskGroup[ndx]) ? 1 === maskGroup[ndx].length ? submasks.push(ndx + maskGroup[ndx]) : submasks.push(ndx + opts.groupmarker.start + maskGroup[ndx].join(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start) + opts.groupmarker.end) : submasks.push(ndx + rebuild(maskGroup[ndx])); + return 1 === submasks.length ? mask += submasks[0] : mask += opts.groupmarker.start + submasks.join(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start) + opts.groupmarker.end, + mask; + } + var maskGroups = {}; + return opts.phoneCodes && (opts.phoneCodes && opts.phoneCodes.length > 1e3 && (reduceVariations((mask = mask.substr(1, mask.length - 2)).split(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start)), + mask = rebuild(maskGroups)), mask = mask.replace(/9/g, "\\9")), analyseMaskBase.call(this, mask, regexMask, opts); + }, Inputmask.extendAliases({ + abstractphone: { + groupmarker: { + start: "<", + end: ">" + }, + countrycode: "", + phoneCodes: [], + mask: function(opts) { + return opts.definitions = { + "#": Inputmask.prototype.definitions[9] + }, opts.phoneCodes.sort(maskSort); + }, + keepStatic: !0, + onBeforeMask: function(value, opts) { + var processedValue = value.replace(/^0{1,2}/, "").replace(/[\s]/g, ""); + return (processedValue.indexOf(opts.countrycode) > 1 || -1 === processedValue.indexOf(opts.countrycode)) && (processedValue = "+" + opts.countrycode + processedValue), + processedValue; + }, + onUnMask: function(maskedValue, unmaskedValue, opts) { + return maskedValue.replace(/[()#-]/g, ""); + }, + inputmode: "tel" + } + }), Inputmask; +}); +/*! nouislider - 10.1.0 - 2017-07-28 17:11:18 */ + +(function (factory) { + + if ( typeof define === 'function' && define.amd ) { + + // AMD. Register as an anonymous module. + define([], factory); + + } else if ( typeof exports === 'object' ) { + + // Node/CommonJS + module.exports = factory(); + + } else { + + // Browser globals + window.noUiSlider = factory(); + } + +}(function( ){ + + 'use strict'; + + var VERSION = '10.1.0'; + + + function isValidFormatter ( entry ) { + return typeof entry === 'object' && typeof entry.to === 'function' && typeof entry.from === 'function'; + } + + function removeElement ( el ) { + el.parentElement.removeChild(el); + } + + // Bindable version + function preventDefault ( e ) { + e.preventDefault(); + } + + // Removes duplicates from an array. + function unique ( array ) { + return array.filter(function(a){ + return !this[a] ? this[a] = true : false; + }, {}); + } + + // Round a value to the closest 'to'. + function closest ( value, to ) { + return Math.round(value / to) * to; + } + + // Current position of an element relative to the document. + function offset ( elem, orientation ) { + + var rect = elem.getBoundingClientRect(); + var doc = elem.ownerDocument; + var docElem = doc.documentElement; + var pageOffset = getPageOffset(doc); + + // getBoundingClientRect contains left scroll in Chrome on Android. + // I haven't found a feature detection that proves this. Worst case + // scenario on mis-match: the 'tap' feature on horizontal sliders breaks. + if ( /webkit.*Chrome.*Mobile/i.test(navigator.userAgent) ) { + pageOffset.x = 0; + } + + return orientation ? (rect.top + pageOffset.y - docElem.clientTop) : (rect.left + pageOffset.x - docElem.clientLeft); + } + + // Checks whether a value is numerical. + function isNumeric ( a ) { + return typeof a === 'number' && !isNaN( a ) && isFinite( a ); + } + + // Sets a class and removes it after [duration] ms. + function addClassFor ( element, className, duration ) { + if (duration > 0) { + addClass(element, className); + setTimeout(function(){ + removeClass(element, className); + }, duration); + } + } + + // Limits a value to 0 - 100 + function limit ( a ) { + return Math.max(Math.min(a, 100), 0); + } + + // Wraps a variable as an array, if it isn't one yet. + // Note that an input array is returned by reference! + function asArray ( a ) { + return Array.isArray(a) ? a : [a]; + } + + // Counts decimals + function countDecimals ( numStr ) { + numStr = String(numStr); + var pieces = numStr.split("."); + return pieces.length > 1 ? pieces[1].length : 0; + } + + // http://youmightnotneedjquery.com/#add_class + function addClass ( el, className ) { + if ( el.classList ) { + el.classList.add(className); + } else { + el.className += ' ' + className; + } + } + + // http://youmightnotneedjquery.com/#remove_class + function removeClass ( el, className ) { + if ( el.classList ) { + el.classList.remove(className); + } else { + el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' '); + } + } + + // https://plainjs.com/javascript/attributes/adding-removing-and-testing-for-classes-9/ + function hasClass ( el, className ) { + return el.classList ? el.classList.contains(className) : new RegExp('\\b' + className + '\\b').test(el.className); + } + + // https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollY#Notes + function getPageOffset ( doc ) { + + var supportPageOffset = window.pageXOffset !== undefined; + var isCSS1Compat = ((doc.compatMode || "") === "CSS1Compat"); + var x = supportPageOffset ? window.pageXOffset : isCSS1Compat ? doc.documentElement.scrollLeft : doc.body.scrollLeft; + var y = supportPageOffset ? window.pageYOffset : isCSS1Compat ? doc.documentElement.scrollTop : doc.body.scrollTop; + + return { + x: x, + y: y + }; + } + + // we provide a function to compute constants instead + // of accessing window.* as soon as the module needs it + // so that we do not compute anything if not needed + function getActions ( ) { + + // Determine the events to bind. IE11 implements pointerEvents without + // a prefix, which breaks compatibility with the IE10 implementation. + return window.navigator.pointerEnabled ? { + start: 'pointerdown', + move: 'pointermove', + end: 'pointerup' + } : window.navigator.msPointerEnabled ? { + start: 'MSPointerDown', + move: 'MSPointerMove', + end: 'MSPointerUp' + } : { + start: 'mousedown touchstart', + move: 'mousemove touchmove', + end: 'mouseup touchend' + }; + } + + // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md + // Issue #785 + function getSupportsPassive ( ) { + + var supportsPassive = false; + + try { + + var opts = Object.defineProperty({}, 'passive', { + get: function() { + supportsPassive = true; + } + }); + + window.addEventListener('test', null, opts); + + } catch (e) {} + + return supportsPassive; + } + + function getSupportsTouchActionNone ( ) { + return window.CSS && CSS.supports && CSS.supports('touch-action', 'none'); + } + + +// Value calculation + + // Determine the size of a sub-range in relation to a full range. + function subRangeRatio ( pa, pb ) { + return (100 / (pb - pa)); + } + + // (percentage) How many percent is this value of this range? + function fromPercentage ( range, value ) { + return (value * 100) / ( range[1] - range[0] ); + } + + // (percentage) Where is this value on this range? + function toPercentage ( range, value ) { + return fromPercentage( range, range[0] < 0 ? + value + Math.abs(range[0]) : + value - range[0] ); + } + + // (value) How much is this percentage on this range? + function isPercentage ( range, value ) { + return ((value * ( range[1] - range[0] )) / 100) + range[0]; + } + + +// Range conversion + + function getJ ( value, arr ) { + + var j = 1; + + while ( value >= arr[j] ){ + j += 1; + } + + return j; + } + + // (percentage) Input a value, find where, on a scale of 0-100, it applies. + function toStepping ( xVal, xPct, value ) { + + if ( value >= xVal.slice(-1)[0] ){ + return 100; + } + + var j = getJ( value, xVal ), va, vb, pa, pb; + + va = xVal[j-1]; + vb = xVal[j]; + pa = xPct[j-1]; + pb = xPct[j]; + + return pa + (toPercentage([va, vb], value) / subRangeRatio (pa, pb)); + } + + // (value) Input a percentage, find where it is on the specified range. + function fromStepping ( xVal, xPct, value ) { + + // There is no range group that fits 100 + if ( value >= 100 ){ + return xVal.slice(-1)[0]; + } + + var j = getJ( value, xPct ), va, vb, pa, pb; + + va = xVal[j-1]; + vb = xVal[j]; + pa = xPct[j-1]; + pb = xPct[j]; + + return isPercentage([va, vb], (value - pa) * subRangeRatio (pa, pb)); + } + + // (percentage) Get the step that applies at a certain value. + function getStep ( xPct, xSteps, snap, value ) { + + if ( value === 100 ) { + return value; + } + + var j = getJ( value, xPct ), a, b; + + // If 'snap' is set, steps are used as fixed points on the slider. + if ( snap ) { + + a = xPct[j-1]; + b = xPct[j]; + + // Find the closest position, a or b. + if ((value - a) > ((b-a)/2)){ + return b; + } + + return a; + } + + if ( !xSteps[j-1] ){ + return value; + } + + return xPct[j-1] + closest( + value - xPct[j-1], + xSteps[j-1] + ); + } + + +// Entry parsing + + function handleEntryPoint ( index, value, that ) { + + var percentage; + + // Wrap numerical input in an array. + if ( typeof value === "number" ) { + value = [value]; + } + + // Reject any invalid input, by testing whether value is an array. + if ( Object.prototype.toString.call( value ) !== '[object Array]' ){ + throw new Error("noUiSlider (" + VERSION + "): 'range' contains invalid value."); + } + + // Covert min/max syntax to 0 and 100. + if ( index === 'min' ) { + percentage = 0; + } else if ( index === 'max' ) { + percentage = 100; + } else { + percentage = parseFloat( index ); + } + + // Check for correct input. + if ( !isNumeric( percentage ) || !isNumeric( value[0] ) ) { + throw new Error("noUiSlider (" + VERSION + "): 'range' value isn't numeric."); + } + + // Store values. + that.xPct.push( percentage ); + that.xVal.push( value[0] ); + + // NaN will evaluate to false too, but to keep + // logging clear, set step explicitly. Make sure + // not to override the 'step' setting with false. + if ( !percentage ) { + if ( !isNaN( value[1] ) ) { + that.xSteps[0] = value[1]; + } + } else { + that.xSteps.push( isNaN(value[1]) ? false : value[1] ); + } + + that.xHighestCompleteStep.push(0); + } + + function handleStepPoint ( i, n, that ) { + + // Ignore 'false' stepping. + if ( !n ) { + return true; + } + + // Factor to range ratio + that.xSteps[i] = fromPercentage([ + that.xVal[i] + ,that.xVal[i+1] + ], n) / subRangeRatio ( + that.xPct[i], + that.xPct[i+1] ); + + var totalSteps = (that.xVal[i+1] - that.xVal[i]) / that.xNumSteps[i]; + var highestStep = Math.ceil(Number(totalSteps.toFixed(3)) - 1); + var step = that.xVal[i] + (that.xNumSteps[i] * highestStep); + + that.xHighestCompleteStep[i] = step; + } + + +// Interface + + function Spectrum ( entry, snap, singleStep ) { + + this.xPct = []; + this.xVal = []; + this.xSteps = [ singleStep || false ]; + this.xNumSteps = [ false ]; + this.xHighestCompleteStep = []; + + this.snap = snap; + + var index, ordered = [ /* [0, 'min'], [1, '50%'], [2, 'max'] */ ]; + + // Map the object keys to an array. + for ( index in entry ) { + if ( entry.hasOwnProperty(index) ) { + ordered.push([entry[index], index]); + } + } + + // Sort all entries by value (numeric sort). + if ( ordered.length && typeof ordered[0][0] === "object" ) { + ordered.sort(function(a, b) { return a[0][0] - b[0][0]; }); + } else { + ordered.sort(function(a, b) { return a[0] - b[0]; }); + } + + + // Convert all entries to subranges. + for ( index = 0; index < ordered.length; index++ ) { + handleEntryPoint(ordered[index][1], ordered[index][0], this); + } + + // Store the actual step values. + // xSteps is sorted in the same order as xPct and xVal. + this.xNumSteps = this.xSteps.slice(0); + + // Convert all numeric steps to the percentage of the subrange they represent. + for ( index = 0; index < this.xNumSteps.length; index++ ) { + handleStepPoint(index, this.xNumSteps[index], this); + } + } + + Spectrum.prototype.getMargin = function ( value ) { + + var step = this.xNumSteps[0]; + + if ( step && ((value / step) % 1) !== 0 ) { + throw new Error("noUiSlider (" + VERSION + "): 'limit', 'margin' and 'padding' must be divisible by step."); + } + + return this.xPct.length === 2 ? fromPercentage(this.xVal, value) : false; + }; + + Spectrum.prototype.toStepping = function ( value ) { + + value = toStepping( this.xVal, this.xPct, value ); + + return value; + }; + + Spectrum.prototype.fromStepping = function ( value ) { + + return fromStepping( this.xVal, this.xPct, value ); + }; + + Spectrum.prototype.getStep = function ( value ) { + + value = getStep(this.xPct, this.xSteps, this.snap, value ); + + return value; + }; + + Spectrum.prototype.getNearbySteps = function ( value ) { + + var j = getJ(value, this.xPct); + + return { + stepBefore: { startValue: this.xVal[j-2], step: this.xNumSteps[j-2], highestStep: this.xHighestCompleteStep[j-2] }, + thisStep: { startValue: this.xVal[j-1], step: this.xNumSteps[j-1], highestStep: this.xHighestCompleteStep[j-1] }, + stepAfter: { startValue: this.xVal[j-0], step: this.xNumSteps[j-0], highestStep: this.xHighestCompleteStep[j-0] } + }; + }; + + Spectrum.prototype.countStepDecimals = function () { + var stepDecimals = this.xNumSteps.map(countDecimals); + return Math.max.apply(null, stepDecimals); + }; + + // Outside testing + Spectrum.prototype.convert = function ( value ) { + return this.getStep(this.toStepping(value)); + }; + +/* Every input option is tested and parsed. This'll prevent + endless validation in internal methods. These tests are + structured with an item for every option available. An + option can be marked as required by setting the 'r' flag. + The testing function is provided with three arguments: + - The provided value for the option; + - A reference to the options object; + - The name for the option; + + The testing function returns false when an error is detected, + or true when everything is OK. It can also modify the option + object, to make sure all values can be correctly looped elsewhere. */ + + var defaultFormatter = { 'to': function( value ){ + return value !== undefined && value.toFixed(2); + }, 'from': Number }; + + function validateFormat ( entry ) { + + // Any object with a to and from method is supported. + if ( isValidFormatter(entry) ) { + return true; + } + + throw new Error("noUiSlider (" + VERSION + "): 'format' requires 'to' and 'from' methods."); + } + + function testStep ( parsed, entry ) { + + if ( !isNumeric( entry ) ) { + throw new Error("noUiSlider (" + VERSION + "): 'step' is not numeric."); + } + + // The step option can still be used to set stepping + // for linear sliders. Overwritten if set in 'range'. + parsed.singleStep = entry; + } + + function testRange ( parsed, entry ) { + + // Filter incorrect input. + if ( typeof entry !== 'object' || Array.isArray(entry) ) { + throw new Error("noUiSlider (" + VERSION + "): 'range' is not an object."); + } + + // Catch missing start or end. + if ( entry.min === undefined || entry.max === undefined ) { + throw new Error("noUiSlider (" + VERSION + "): Missing 'min' or 'max' in 'range'."); + } + + // Catch equal start or end. + if ( entry.min === entry.max ) { + throw new Error("noUiSlider (" + VERSION + "): 'range' 'min' and 'max' cannot be equal."); + } + + parsed.spectrum = new Spectrum(entry, parsed.snap, parsed.singleStep); + } + + function testStart ( parsed, entry ) { + + entry = asArray(entry); + + // Validate input. Values aren't tested, as the public .val method + // will always provide a valid location. + if ( !Array.isArray( entry ) || !entry.length ) { + throw new Error("noUiSlider (" + VERSION + "): 'start' option is incorrect."); + } + + // Store the number of handles. + parsed.handles = entry.length; + + // When the slider is initialized, the .val method will + // be called with the start options. + parsed.start = entry; + } + + function testSnap ( parsed, entry ) { + + // Enforce 100% stepping within subranges. + parsed.snap = entry; + + if ( typeof entry !== 'boolean' ){ + throw new Error("noUiSlider (" + VERSION + "): 'snap' option must be a boolean."); + } + } + + function testAnimate ( parsed, entry ) { + + // Enforce 100% stepping within subranges. + parsed.animate = entry; + + if ( typeof entry !== 'boolean' ){ + throw new Error("noUiSlider (" + VERSION + "): 'animate' option must be a boolean."); + } + } + + function testAnimationDuration ( parsed, entry ) { + + parsed.animationDuration = entry; + + if ( typeof entry !== 'number' ){ + throw new Error("noUiSlider (" + VERSION + "): 'animationDuration' option must be a number."); + } + } + + function testConnect ( parsed, entry ) { + + var connect = [false]; + var i; + + // Map legacy options + if ( entry === 'lower' ) { + entry = [true, false]; + } + + else if ( entry === 'upper' ) { + entry = [false, true]; + } + + // Handle boolean options + if ( entry === true || entry === false ) { + + for ( i = 1; i < parsed.handles; i++ ) { + connect.push(entry); + } + + connect.push(false); + } + + // Reject invalid input + else if ( !Array.isArray( entry ) || !entry.length || entry.length !== parsed.handles + 1 ) { + throw new Error("noUiSlider (" + VERSION + "): 'connect' option doesn't match handle count."); + } + + else { + connect = entry; + } + + parsed.connect = connect; + } + + function testOrientation ( parsed, entry ) { + + // Set orientation to an a numerical value for easy + // array selection. + switch ( entry ){ + case 'horizontal': + parsed.ort = 0; + break; + case 'vertical': + parsed.ort = 1; + break; + default: + throw new Error("noUiSlider (" + VERSION + "): 'orientation' option is invalid."); + } + } + + function testMargin ( parsed, entry ) { + + if ( !isNumeric(entry) ){ + throw new Error("noUiSlider (" + VERSION + "): 'margin' option must be numeric."); + } + + // Issue #582 + if ( entry === 0 ) { + return; + } + + parsed.margin = parsed.spectrum.getMargin(entry); + + if ( !parsed.margin ) { + throw new Error("noUiSlider (" + VERSION + "): 'margin' option is only supported on linear sliders."); + } + } + + function testLimit ( parsed, entry ) { + + if ( !isNumeric(entry) ){ + throw new Error("noUiSlider (" + VERSION + "): 'limit' option must be numeric."); + } + + parsed.limit = parsed.spectrum.getMargin(entry); + + if ( !parsed.limit || parsed.handles < 2 ) { + throw new Error("noUiSlider (" + VERSION + "): 'limit' option is only supported on linear sliders with 2 or more handles."); + } + } + + function testPadding ( parsed, entry ) { + + if ( !isNumeric(entry) ){ + throw new Error("noUiSlider (" + VERSION + "): 'padding' option must be numeric."); + } + + if ( entry === 0 ) { + return; + } + + parsed.padding = parsed.spectrum.getMargin(entry); + + if ( !parsed.padding ) { + throw new Error("noUiSlider (" + VERSION + "): 'padding' option is only supported on linear sliders."); + } + + if ( parsed.padding < 0 ) { + throw new Error("noUiSlider (" + VERSION + "): 'padding' option must be a positive number."); + } + + if ( parsed.padding >= 50 ) { + throw new Error("noUiSlider (" + VERSION + "): 'padding' option must be less than half the range."); + } + } + + function testDirection ( parsed, entry ) { + + // Set direction as a numerical value for easy parsing. + // Invert connection for RTL sliders, so that the proper + // handles get the connect/background classes. + switch ( entry ) { + case 'ltr': + parsed.dir = 0; + break; + case 'rtl': + parsed.dir = 1; + break; + default: + throw new Error("noUiSlider (" + VERSION + "): 'direction' option was not recognized."); + } + } + + function testBehaviour ( parsed, entry ) { + + // Make sure the input is a string. + if ( typeof entry !== 'string' ) { + throw new Error("noUiSlider (" + VERSION + "): 'behaviour' must be a string containing options."); + } + + // Check if the string contains any keywords. + // None are required. + var tap = entry.indexOf('tap') >= 0; + var drag = entry.indexOf('drag') >= 0; + var fixed = entry.indexOf('fixed') >= 0; + var snap = entry.indexOf('snap') >= 0; + var hover = entry.indexOf('hover') >= 0; + + if ( fixed ) { + + if ( parsed.handles !== 2 ) { + throw new Error("noUiSlider (" + VERSION + "): 'fixed' behaviour must be used with 2 handles"); + } + + // Use margin to enforce fixed state + testMargin(parsed, parsed.start[1] - parsed.start[0]); + } + + parsed.events = { + tap: tap || snap, + drag: drag, + fixed: fixed, + snap: snap, + hover: hover + }; + } + + function testMultitouch ( parsed, entry ) { + parsed.multitouch = entry; + + if ( typeof entry !== 'boolean' ){ + throw new Error("noUiSlider (" + VERSION + "): 'multitouch' option must be a boolean."); + } + } + + function testTooltips ( parsed, entry ) { + + if ( entry === false ) { + return; + } + + else if ( entry === true ) { + + parsed.tooltips = []; + + for ( var i = 0; i < parsed.handles; i++ ) { + parsed.tooltips.push(true); + } + } + + else { + + parsed.tooltips = asArray(entry); + + if ( parsed.tooltips.length !== parsed.handles ) { + throw new Error("noUiSlider (" + VERSION + "): must pass a formatter for all handles."); + } + + parsed.tooltips.forEach(function(formatter){ + if ( typeof formatter !== 'boolean' && (typeof formatter !== 'object' || typeof formatter.to !== 'function') ) { + throw new Error("noUiSlider (" + VERSION + "): 'tooltips' must be passed a formatter or 'false'."); + } + }); + } + } + + function testAriaFormat ( parsed, entry ) { + parsed.ariaFormat = entry; + validateFormat(entry); + } + + function testFormat ( parsed, entry ) { + parsed.format = entry; + validateFormat(entry); + } + + function testCssPrefix ( parsed, entry ) { + + if ( entry !== undefined && typeof entry !== 'string' && entry !== false ) { + throw new Error("noUiSlider (" + VERSION + "): 'cssPrefix' must be a string or `false`."); + } + + parsed.cssPrefix = entry; + } + + function testCssClasses ( parsed, entry ) { + + if ( entry !== undefined && typeof entry !== 'object' ) { + throw new Error("noUiSlider (" + VERSION + "): 'cssClasses' must be an object."); + } + + if ( typeof parsed.cssPrefix === 'string' ) { + parsed.cssClasses = {}; + + for ( var key in entry ) { + if ( !entry.hasOwnProperty(key) ) { continue; } + + parsed.cssClasses[key] = parsed.cssPrefix + entry[key]; + } + } else { + parsed.cssClasses = entry; + } + } + + function testUseRaf ( parsed, entry ) { + if ( entry === true || entry === false ) { + parsed.useRequestAnimationFrame = entry; + } else { + throw new Error("noUiSlider (" + VERSION + "): 'useRequestAnimationFrame' option should be true (default) or false."); + } + } + + // Test all developer settings and parse to assumption-safe values. + function testOptions ( options ) { + + // To prove a fix for #537, freeze options here. + // If the object is modified, an error will be thrown. + // Object.freeze(options); + + var parsed = { + margin: 0, + limit: 0, + padding: 0, + animate: true, + animationDuration: 300, + ariaFormat: defaultFormatter, + format: defaultFormatter + }; + + // Tests are executed in the order they are presented here. + var tests = { + 'step': { r: false, t: testStep }, + 'start': { r: true, t: testStart }, + 'connect': { r: true, t: testConnect }, + 'direction': { r: true, t: testDirection }, + 'snap': { r: false, t: testSnap }, + 'animate': { r: false, t: testAnimate }, + 'animationDuration': { r: false, t: testAnimationDuration }, + 'range': { r: true, t: testRange }, + 'orientation': { r: false, t: testOrientation }, + 'margin': { r: false, t: testMargin }, + 'limit': { r: false, t: testLimit }, + 'padding': { r: false, t: testPadding }, + 'behaviour': { r: true, t: testBehaviour }, + 'multitouch': { r: true, t: testMultitouch }, + 'ariaFormat': { r: false, t: testAriaFormat }, + 'format': { r: false, t: testFormat }, + 'tooltips': { r: false, t: testTooltips }, + 'cssPrefix': { r: false, t: testCssPrefix }, + 'cssClasses': { r: false, t: testCssClasses }, + 'useRequestAnimationFrame': { r: false, t: testUseRaf } + }; + + var defaults = { + 'connect': false, + 'direction': 'ltr', + 'behaviour': 'tap', + 'multitouch': false, + 'orientation': 'horizontal', + 'cssPrefix' : 'noUi-', + 'cssClasses': { + target: 'target', + base: 'base', + origin: 'origin', + handle: 'handle', + handleLower: 'handle-lower', + handleUpper: 'handle-upper', + horizontal: 'horizontal', + vertical: 'vertical', + background: 'background', + connect: 'connect', + ltr: 'ltr', + rtl: 'rtl', + draggable: 'draggable', + drag: 'state-drag', + tap: 'state-tap', + active: 'active', + tooltip: 'tooltip', + pips: 'pips', + pipsHorizontal: 'pips-horizontal', + pipsVertical: 'pips-vertical', + marker: 'marker', + markerHorizontal: 'marker-horizontal', + markerVertical: 'marker-vertical', + markerNormal: 'marker-normal', + markerLarge: 'marker-large', + markerSub: 'marker-sub', + value: 'value', + valueHorizontal: 'value-horizontal', + valueVertical: 'value-vertical', + valueNormal: 'value-normal', + valueLarge: 'value-large', + valueSub: 'value-sub' + }, + 'useRequestAnimationFrame': true + }; + + // AriaFormat defaults to regular format, if any. + if ( options.format && !options.ariaFormat ) { + options.ariaFormat = options.format; + } + + // Run all options through a testing mechanism to ensure correct + // input. It should be noted that options might get modified to + // be handled properly. E.g. wrapping integers in arrays. + Object.keys(tests).forEach(function( name ){ + + // If the option isn't set, but it is required, throw an error. + if ( options[name] === undefined && defaults[name] === undefined ) { + + if ( tests[name].r ) { + throw new Error("noUiSlider (" + VERSION + "): '" + name + "' is required."); + } + + return true; + } + + tests[name].t( parsed, options[name] === undefined ? defaults[name] : options[name] ); + }); + + // Forward pips options + parsed.pips = options.pips; + + var styles = [['left', 'top'], ['right', 'bottom']]; + + // Pre-define the styles. + parsed.style = styles[parsed.dir][parsed.ort]; + parsed.styleOposite = styles[parsed.dir?0:1][parsed.ort]; + + return parsed; + } + + +function closure ( target, options, originalOptions ){ + + var actions = getActions(); + var supportsTouchActionNone = getSupportsTouchActionNone(); + var supportsPassive = supportsTouchActionNone && getSupportsPassive(); + + // All variables local to 'closure' are prefixed with 'scope_' + var scope_Target = target; + var scope_Locations = []; + var scope_Base; + var scope_Handles; + var scope_HandleNumbers = []; + var scope_ActiveHandlesCount = 0; + var scope_Connects; + var scope_Spectrum = options.spectrum; + var scope_Values = []; + var scope_Events = {}; + var scope_Self; + var scope_Pips; + var scope_Document = target.ownerDocument; + var scope_DocumentElement = scope_Document.documentElement; + var scope_Body = scope_Document.body; + + + // Creates a node, adds it to target, returns the new node. + function addNodeTo ( target, className ) { + + var div = scope_Document.createElement('div'); + + if ( className ) { + addClass(div, className); + } + + target.appendChild(div); + + return div; + } + + // Append a origin to the base + function addOrigin ( base, handleNumber ) { + + var origin = addNodeTo(base, options.cssClasses.origin); + var handle = addNodeTo(origin, options.cssClasses.handle); + + handle.setAttribute('data-handle', handleNumber); + + // https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex + // 0 = focusable and reachable + handle.setAttribute('tabindex', '0'); + handle.setAttribute('role', 'slider'); + handle.setAttribute('aria-orientation', options.ort ? 'vertical' : 'horizontal'); + + if ( handleNumber === 0 ) { + addClass(handle, options.cssClasses.handleLower); + } + + else if ( handleNumber === options.handles - 1 ) { + addClass(handle, options.cssClasses.handleUpper); + } + + return origin; + } + + // Insert nodes for connect elements + function addConnect ( base, add ) { + + if ( !add ) { + return false; + } + + return addNodeTo(base, options.cssClasses.connect); + } + + // Add handles to the slider base. + function addElements ( connectOptions, base ) { + + scope_Handles = []; + scope_Connects = []; + + scope_Connects.push(addConnect(base, connectOptions[0])); + + // [::::O====O====O====] + // connectOptions = [0, 1, 1, 1] + + for ( var i = 0; i < options.handles; i++ ) { + // Keep a list of all added handles. + scope_Handles.push(addOrigin(base, i)); + scope_HandleNumbers[i] = i; + scope_Connects.push(addConnect(base, connectOptions[i + 1])); + } + } + + // Initialize a single slider. + function addSlider ( target ) { + + // Apply classes and data to the target. + addClass(target, options.cssClasses.target); + + if ( options.dir === 0 ) { + addClass(target, options.cssClasses.ltr); + } else { + addClass(target, options.cssClasses.rtl); + } + + if ( options.ort === 0 ) { + addClass(target, options.cssClasses.horizontal); + } else { + addClass(target, options.cssClasses.vertical); + } + + scope_Base = addNodeTo(target, options.cssClasses.base); + } + + + function addTooltip ( handle, handleNumber ) { + + if ( !options.tooltips[handleNumber] ) { + return false; + } + + return addNodeTo(handle.firstChild, options.cssClasses.tooltip); + } + + // The tooltips option is a shorthand for using the 'update' event. + function tooltips ( ) { + + // Tooltips are added with options.tooltips in original order. + var tips = scope_Handles.map(addTooltip); + + bindEvent('update', function(values, handleNumber, unencoded) { + + if ( !tips[handleNumber] ) { + return; + } + + var formattedValue = values[handleNumber]; + + if ( options.tooltips[handleNumber] !== true ) { + formattedValue = options.tooltips[handleNumber].to(unencoded[handleNumber]); + } + + tips[handleNumber].innerHTML = formattedValue; + }); + } + + + function aria ( ) { + + bindEvent('update', function ( values, handleNumber, unencoded, tap, positions ) { + + // Update Aria Values for all handles, as a change in one changes min and max values for the next. + scope_HandleNumbers.forEach(function( handleNumber ){ + + var handle = scope_Handles[handleNumber]; + + var min = checkHandlePosition(scope_Locations, handleNumber, 0, true, true, true); + var max = checkHandlePosition(scope_Locations, handleNumber, 100, true, true, true); + + var now = positions[handleNumber]; + var text = options.ariaFormat.to(unencoded[handleNumber]); + + handle.children[0].setAttribute('aria-valuemin', min.toFixed(1)); + handle.children[0].setAttribute('aria-valuemax', max.toFixed(1)); + handle.children[0].setAttribute('aria-valuenow', now.toFixed(1)); + handle.children[0].setAttribute('aria-valuetext', text); + }); + }); + } + + + function getGroup ( mode, values, stepped ) { + + // Use the range. + if ( mode === 'range' || mode === 'steps' ) { + return scope_Spectrum.xVal; + } + + if ( mode === 'count' ) { + + if ( !values ) { + throw new Error("noUiSlider (" + VERSION + "): 'values' required for mode 'count'."); + } + + // Divide 0 - 100 in 'count' parts. + var spread = ( 100 / (values - 1) ); + var v; + var i = 0; + + values = []; + + // List these parts and have them handled as 'positions'. + while ( (v = i++ * spread) <= 100 ) { + values.push(v); + } + + mode = 'positions'; + } + + if ( mode === 'positions' ) { + + // Map all percentages to on-range values. + return values.map(function( value ){ + return scope_Spectrum.fromStepping( stepped ? scope_Spectrum.getStep( value ) : value ); + }); + } + + if ( mode === 'values' ) { + + // If the value must be stepped, it needs to be converted to a percentage first. + if ( stepped ) { + + return values.map(function( value ){ + + // Convert to percentage, apply step, return to value. + return scope_Spectrum.fromStepping( scope_Spectrum.getStep( scope_Spectrum.toStepping( value ) ) ); + }); + + } + + // Otherwise, we can simply use the values. + return values; + } + } + + function generateSpread ( density, mode, group ) { + + function safeIncrement(value, increment) { + // Avoid floating point variance by dropping the smallest decimal places. + return (value + increment).toFixed(7) / 1; + } + + var indexes = {}; + var firstInRange = scope_Spectrum.xVal[0]; + var lastInRange = scope_Spectrum.xVal[scope_Spectrum.xVal.length-1]; + var ignoreFirst = false; + var ignoreLast = false; + var prevPct = 0; + + // Create a copy of the group, sort it and filter away all duplicates. + group = unique(group.slice().sort(function(a, b){ return a - b; })); + + // Make sure the range starts with the first element. + if ( group[0] !== firstInRange ) { + group.unshift(firstInRange); + ignoreFirst = true; + } + + // Likewise for the last one. + if ( group[group.length - 1] !== lastInRange ) { + group.push(lastInRange); + ignoreLast = true; + } + + group.forEach(function ( current, index ) { + + // Get the current step and the lower + upper positions. + var step; + var i; + var q; + var low = current; + var high = group[index+1]; + var newPct; + var pctDifference; + var pctPos; + var type; + var steps; + var realSteps; + var stepsize; + + // When using 'steps' mode, use the provided steps. + // Otherwise, we'll step on to the next subrange. + if ( mode === 'steps' ) { + step = scope_Spectrum.xNumSteps[ index ]; + } + + // Default to a 'full' step. + if ( !step ) { + step = high-low; + } + + // Low can be 0, so test for false. If high is undefined, + // we are at the last subrange. Index 0 is already handled. + if ( low === false || high === undefined ) { + return; + } + + // Make sure step isn't 0, which would cause an infinite loop (#654) + step = Math.max(step, 0.0000001); + + // Find all steps in the subrange. + for ( i = low; i <= high; i = safeIncrement(i, step) ) { + + // Get the percentage value for the current step, + // calculate the size for the subrange. + newPct = scope_Spectrum.toStepping( i ); + pctDifference = newPct - prevPct; + + steps = pctDifference / density; + realSteps = Math.round(steps); + + // This ratio represents the ammount of percentage-space a point indicates. + // For a density 1 the points/percentage = 1. For density 2, that percentage needs to be re-devided. + // Round the percentage offset to an even number, then divide by two + // to spread the offset on both sides of the range. + stepsize = pctDifference/realSteps; + + // Divide all points evenly, adding the correct number to this subrange. + // Run up to <= so that 100% gets a point, event if ignoreLast is set. + for ( q = 1; q <= realSteps; q += 1 ) { + + // The ratio between the rounded value and the actual size might be ~1% off. + // Correct the percentage offset by the number of points + // per subrange. density = 1 will result in 100 points on the + // full range, 2 for 50, 4 for 25, etc. + pctPos = prevPct + ( q * stepsize ); + indexes[pctPos.toFixed(5)] = ['x', 0]; + } + + // Determine the point type. + type = (group.indexOf(i) > -1) ? 1 : ( mode === 'steps' ? 2 : 0 ); + + // Enforce the 'ignoreFirst' option by overwriting the type for 0. + if ( !index && ignoreFirst ) { + type = 0; + } + + if ( !(i === high && ignoreLast)) { + // Mark the 'type' of this point. 0 = plain, 1 = real value, 2 = step value. + indexes[newPct.toFixed(5)] = [i, type]; + } + + // Update the percentage count. + prevPct = newPct; + } + }); + + return indexes; + } + + function addMarking ( spread, filterFunc, formatter ) { + + var element = scope_Document.createElement('div'); + + var valueSizeClasses = [ + options.cssClasses.valueNormal, + options.cssClasses.valueLarge, + options.cssClasses.valueSub + ]; + var markerSizeClasses = [ + options.cssClasses.markerNormal, + options.cssClasses.markerLarge, + options.cssClasses.markerSub + ]; + var valueOrientationClasses = [ + options.cssClasses.valueHorizontal, + options.cssClasses.valueVertical + ]; + var markerOrientationClasses = [ + options.cssClasses.markerHorizontal, + options.cssClasses.markerVertical + ]; + + addClass(element, options.cssClasses.pips); + addClass(element, options.ort === 0 ? options.cssClasses.pipsHorizontal : options.cssClasses.pipsVertical); + + function getClasses( type, source ){ + var a = source === options.cssClasses.value; + var orientationClasses = a ? valueOrientationClasses : markerOrientationClasses; + var sizeClasses = a ? valueSizeClasses : markerSizeClasses; + + return source + ' ' + orientationClasses[options.ort] + ' ' + sizeClasses[type]; + } + + function addSpread ( offset, values ){ + + // Apply the filter function, if it is set. + values[1] = (values[1] && filterFunc) ? filterFunc(values[0], values[1]) : values[1]; + + // Add a marker for every point + var node = addNodeTo(element, false); + node.className = getClasses(values[1], options.cssClasses.marker); + node.style[options.style] = offset + '%'; + + // Values are only appended for points marked '1' or '2'. + if ( values[1] ) { + node = addNodeTo(element, false); + node.className = getClasses(values[1], options.cssClasses.value); + node.style[options.style] = offset + '%'; + node.innerText = formatter.to(values[0]); + } + } + + // Append all points. + Object.keys(spread).forEach(function(a){ + addSpread(a, spread[a]); + }); + + return element; + } + + function removePips ( ) { + if ( scope_Pips ) { + removeElement(scope_Pips); + scope_Pips = null; + } + } + + function pips ( grid ) { + + // Fix #669 + removePips(); + + var mode = grid.mode; + var density = grid.density || 1; + var filter = grid.filter || false; + var values = grid.values || false; + var stepped = grid.stepped || false; + var group = getGroup( mode, values, stepped ); + var spread = generateSpread( density, mode, group ); + var format = grid.format || { + to: Math.round + }; + + scope_Pips = scope_Target.appendChild(addMarking( + spread, + filter, + format + )); + + return scope_Pips; + } + + + // Shorthand for base dimensions. + function baseSize ( ) { + var rect = scope_Base.getBoundingClientRect(), alt = 'offset' + ['Width', 'Height'][options.ort]; + return options.ort === 0 ? (rect.width||scope_Base[alt]) : (rect.height||scope_Base[alt]); + } + + // Handler for attaching events trough a proxy. + function attachEvent ( events, element, callback, data ) { + + // This function can be used to 'filter' events to the slider. + // element is a node, not a nodeList + + var method = function ( e ){ + + if ( scope_Target.hasAttribute('disabled') ) { + return false; + } + + // Stop if an active 'tap' transition is taking place. + if ( hasClass(scope_Target, options.cssClasses.tap) ) { + return false; + } + + e = fixEvent(e, data.pageOffset, data.target || element); + + // Handle reject of multitouch + if ( !e ) { + return false; + } + + // Ignore right or middle clicks on start #454 + if ( events === actions.start && e.buttons !== undefined && e.buttons > 1 ) { + return false; + } + + // Ignore right or middle clicks on start #454 + if ( data.hover && e.buttons ) { + return false; + } + + // 'supportsPassive' is only true if a browser also supports touch-action: none in CSS. + // iOS safari does not, so it doesn't get to benefit from passive scrolling. iOS does support + // touch-action: manipulation, but that allows panning, which breaks + // sliders after zooming/on non-responsive pages. + // See: https://bugs.webkit.org/show_bug.cgi?id=133112 + if ( !supportsPassive ) { + e.preventDefault(); + } + + e.calcPoint = e.points[ options.ort ]; + + // Call the event handler with the event [ and additional data ]. + callback ( e, data ); + }; + + var methods = []; + + // Bind a closure on the target for every event type. + events.split(' ').forEach(function( eventName ){ + element.addEventListener(eventName, method, supportsPassive ? { passive: true } : false); + methods.push([eventName, method]); + }); + + return methods; + } + + // Provide a clean event with standardized offset values. + function fixEvent ( e, pageOffset, target ) { + + // Filter the event to register the type, which can be + // touch, mouse or pointer. Offset changes need to be + // made on an event specific basis. + var touch = e.type.indexOf('touch') === 0; + var mouse = e.type.indexOf('mouse') === 0; + var pointer = e.type.indexOf('pointer') === 0; + + var x; + var y; + + // IE10 implemented pointer events with a prefix; + if ( e.type.indexOf('MSPointer') === 0 ) { + pointer = true; + } + + + // In the event that multitouch is activated, the only thing one handle should be concerned + // about is the touches that originated on top of it. + if ( touch && options.multitouch ) { + // Returns true if a touch originated on the target. + var isTouchOnTarget = function (touch) { + return touch.target === target || target.contains(touch.target); + }; + // In the case of touchstart events, we need to make sure there is still no more than one + // touch on the target so we look amongst all touches. + if (e.type === 'touchstart') { + var targetTouches = Array.prototype.filter.call(e.touches, isTouchOnTarget); + // Do not support more than one touch per handle. + if ( targetTouches.length > 1 ) { + return false; + } + x = targetTouches[0].pageX; + y = targetTouches[0].pageY; + } else { + // In the other cases, find on changedTouches is enough. + var targetTouch = Array.prototype.find.call(e.changedTouches, isTouchOnTarget); + // Cancel if the target touch has not moved. + if ( !targetTouch ) { + return false; + } + x = targetTouch.pageX; + y = targetTouch.pageY; + } + } else if ( touch ) { + // Fix bug when user touches with two or more fingers on mobile devices. + // It's useful when you have two or more sliders on one page, + // that can be touched simultaneously. + // #649, #663, #668 + if ( e.touches.length > 1 ) { + return false; + } + + // noUiSlider supports one movement at a time, + // so we can select the first 'changedTouch'. + x = e.changedTouches[0].pageX; + y = e.changedTouches[0].pageY; + } + + pageOffset = pageOffset || getPageOffset(scope_Document); + + if ( mouse || pointer ) { + x = e.clientX + pageOffset.x; + y = e.clientY + pageOffset.y; + } + + e.pageOffset = pageOffset; + e.points = [x, y]; + e.cursor = mouse || pointer; // Fix #435 + + return e; + } + + // Translate a coordinate in the document to a percentage on the slider + function calcPointToPercentage ( calcPoint ) { + var location = calcPoint - offset(scope_Base, options.ort); + var proposal = ( location * 100 ) / baseSize(); + return options.dir ? 100 - proposal : proposal; + } + + // Find handle closest to a certain percentage on the slider + function getClosestHandle ( proposal ) { + + var closest = 100; + var handleNumber = false; + + scope_Handles.forEach(function(handle, index){ + + // Disabled handles are ignored + if ( handle.hasAttribute('disabled') ) { + return; + } + + var pos = Math.abs(scope_Locations[index] - proposal); + + if ( pos < closest ) { + handleNumber = index; + closest = pos; + } + }); + + return handleNumber; + } + + // Moves handle(s) by a percentage + // (bool, % to move, [% where handle started, ...], [index in scope_Handles, ...]) + function moveHandles ( upward, proposal, locations, handleNumbers ) { + + var proposals = locations.slice(); + + var b = [!upward, upward]; + var f = [upward, !upward]; + + // Copy handleNumbers so we don't change the dataset + handleNumbers = handleNumbers.slice(); + + // Check to see which handle is 'leading'. + // If that one can't move the second can't either. + if ( upward ) { + handleNumbers.reverse(); + } + + // Step 1: get the maximum percentage that any of the handles can move + if ( handleNumbers.length > 1 ) { + + handleNumbers.forEach(function(handleNumber, o) { + + var to = checkHandlePosition(proposals, handleNumber, proposals[handleNumber] + proposal, b[o], f[o], false); + + // Stop if one of the handles can't move. + if ( to === false ) { + proposal = 0; + } else { + proposal = to - proposals[handleNumber]; + proposals[handleNumber] = to; + } + }); + } + + // If using one handle, check backward AND forward + else { + b = f = [true]; + } + + var state = false; + + // Step 2: Try to set the handles with the found percentage + handleNumbers.forEach(function(handleNumber, o) { + state = setHandle(handleNumber, locations[handleNumber] + proposal, b[o], f[o]) || state; + }); + + // Step 3: If a handle moved, fire events + if ( state ) { + handleNumbers.forEach(function(handleNumber){ + fireEvent('update', handleNumber); + fireEvent('slide', handleNumber); + }); + } + } + + // External event handling + function fireEvent ( eventName, handleNumber, tap ) { + + Object.keys(scope_Events).forEach(function( targetEvent ) { + + var eventType = targetEvent.split('.')[0]; + + if ( eventName === eventType ) { + scope_Events[targetEvent].forEach(function( callback ) { + + callback.call( + // Use the slider public API as the scope ('this') + scope_Self, + // Return values as array, so arg_1[arg_2] is always valid. + scope_Values.map(options.format.to), + // Handle index, 0 or 1 + handleNumber, + // Unformatted slider values + scope_Values.slice(), + // Event is fired by tap, true or false + tap || false, + // Left offset of the handle, in relation to the slider + scope_Locations.slice() + ); + }); + } + }); + } + + + // Fire 'end' when a mouse or pen leaves the document. + function documentLeave ( event, data ) { + if ( event.type === "mouseout" && event.target.nodeName === "HTML" && event.relatedTarget === null ){ + eventEnd (event, data); + } + } + + // Handle movement on document for handle and range drag. + function eventMove ( event, data ) { + + // Fix #498 + // Check value of .buttons in 'start' to work around a bug in IE10 mobile (data.buttonsProperty). + // https://connect.microsoft.com/IE/feedback/details/927005/mobile-ie10-windows-phone-buttons-property-of-pointermove-event-always-zero + // IE9 has .buttons and .which zero on mousemove. + // Firefox breaks the spec MDN defines. + if ( navigator.appVersion.indexOf("MSIE 9") === -1 && event.buttons === 0 && data.buttonsProperty !== 0 ) { + return eventEnd(event, data); + } + + // Check if we are moving up or down + var movement = (options.dir ? -1 : 1) * (event.calcPoint - data.startCalcPoint); + + // Convert the movement into a percentage of the slider width/height + var proposal = (movement * 100) / data.baseSize; + + moveHandles(movement > 0, proposal, data.locations, data.handleNumbers); + } + + // Unbind move events on document, call callbacks. + function eventEnd ( event, data ) { + + // The handle is no longer active, so remove the class. + if ( data.handle ) { + removeClass(data.handle, options.cssClasses.active); + scope_ActiveHandlesCount -= 1; + } + + // Unbind the move and end events, which are added on 'start'. + data.listeners.forEach(function( c ) { + scope_DocumentElement.removeEventListener(c[0], c[1]); + }); + + if ( scope_ActiveHandlesCount === 0 ) { + // Remove dragging class. + removeClass(scope_Target, options.cssClasses.drag); + setZindex(); + + // Remove cursor styles and text-selection events bound to the body. + if ( event.cursor ) { + scope_Body.style.cursor = ''; + scope_Body.removeEventListener('selectstart', preventDefault); + } + } + + data.handleNumbers.forEach(function(handleNumber){ + fireEvent('change', handleNumber); + fireEvent('set', handleNumber); + fireEvent('end', handleNumber); + }); + } + + // Bind move events on document. + function eventStart ( event, data ) { + + var handle; + if ( data.handleNumbers.length === 1 ) { + + var handleOrigin = scope_Handles[data.handleNumbers[0]]; + + // Ignore 'disabled' handles + if ( handleOrigin.hasAttribute('disabled') ) { + return false; + } + + handle = handleOrigin.children[0]; + scope_ActiveHandlesCount += 1; + + // Mark the handle as 'active' so it can be styled. + addClass(handle, options.cssClasses.active); + } + + // A drag should never propagate up to the 'tap' event. + event.stopPropagation(); + + // Record the event listeners. + var listeners = []; + + // Attach the move and end events. + var moveEvent = attachEvent(actions.move, scope_DocumentElement, eventMove, { + // The event target has changed so we need to propagate the original one so that we keep + // relying on it to extract target touches. + target: event.target, + handle: handle, + listeners: listeners, + startCalcPoint: event.calcPoint, + baseSize: baseSize(), + pageOffset: event.pageOffset, + handleNumbers: data.handleNumbers, + buttonsProperty: event.buttons, + locations: scope_Locations.slice() + }); + + var endEvent = attachEvent(actions.end, scope_DocumentElement, eventEnd, { + target: event.target, + handle: handle, + listeners: listeners, + handleNumbers: data.handleNumbers + }); + + var outEvent = attachEvent("mouseout", scope_DocumentElement, documentLeave, { + target: event.target, + handle: handle, + listeners: listeners, + handleNumbers: data.handleNumbers + }); + + // We want to make sure we pushed the listeners in the listener list rather than creating + // a new one as it has already been passed to the event handlers. + listeners.push.apply(listeners, moveEvent.concat(endEvent, outEvent)); + + // Text selection isn't an issue on touch devices, + // so adding cursor styles can be skipped. + if ( event.cursor ) { + + // Prevent the 'I' cursor and extend the range-drag cursor. + scope_Body.style.cursor = getComputedStyle(event.target).cursor; + + // Mark the target with a dragging state. + if ( scope_Handles.length > 1 ) { + addClass(scope_Target, options.cssClasses.drag); + } + + // Prevent text selection when dragging the handles. + // In noUiSlider <= 9.2.0, this was handled by calling preventDefault on mouse/touch start/move, + // which is scroll blocking. The selectstart event is supported by FireFox starting from version 52, + // meaning the only holdout is iOS Safari. This doesn't matter: text selection isn't triggered there. + // The 'cursor' flag is false. + // See: http://caniuse.com/#search=selectstart + scope_Body.addEventListener('selectstart', preventDefault, false); + } + + data.handleNumbers.forEach(function(handleNumber){ + fireEvent('start', handleNumber); + }); + } + + // Move closest handle to tapped location. + function eventTap ( event ) { + + // The tap event shouldn't propagate up + event.stopPropagation(); + + var proposal = calcPointToPercentage(event.calcPoint); + var handleNumber = getClosestHandle(proposal); + + // Tackle the case that all handles are 'disabled'. + if ( handleNumber === false ) { + return false; + } + + // Flag the slider as it is now in a transitional state. + // Transition takes a configurable amount of ms (default 300). Re-enable the slider after that. + if ( !options.events.snap ) { + addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration); + } + + setHandle(handleNumber, proposal, true, true); + + setZindex(); + + fireEvent('slide', handleNumber, true); + fireEvent('update', handleNumber, true); + fireEvent('change', handleNumber, true); + fireEvent('set', handleNumber, true); + + if ( options.events.snap ) { + eventStart(event, { handleNumbers: [handleNumber] }); + } + } + + // Fires a 'hover' event for a hovered mouse/pen position. + function eventHover ( event ) { + + var proposal = calcPointToPercentage(event.calcPoint); + + var to = scope_Spectrum.getStep(proposal); + var value = scope_Spectrum.fromStepping(to); + + Object.keys(scope_Events).forEach(function( targetEvent ) { + if ( 'hover' === targetEvent.split('.')[0] ) { + scope_Events[targetEvent].forEach(function( callback ) { + callback.call( scope_Self, value ); + }); + } + }); + } + + // Attach events to several slider parts. + function bindSliderEvents ( behaviour ) { + + // Attach the standard drag event to the handles. + if ( !behaviour.fixed ) { + + scope_Handles.forEach(function( handle, index ){ + + // These events are only bound to the visual handle + // element, not the 'real' origin element. + attachEvent ( actions.start, handle.children[0], eventStart, { + handleNumbers: [index] + }); + }); + } + + // Attach the tap event to the slider base. + if ( behaviour.tap ) { + attachEvent (actions.start, scope_Base, eventTap, {}); + } + + // Fire hover events + if ( behaviour.hover ) { + attachEvent (actions.move, scope_Base, eventHover, { hover: true }); + } + + // Make the range draggable. + if ( behaviour.drag ){ + + scope_Connects.forEach(function( connect, index ){ + + if ( connect === false || index === 0 || index === scope_Connects.length - 1 ) { + return; + } + + var handleBefore = scope_Handles[index - 1]; + var handleAfter = scope_Handles[index]; + var eventHolders = [connect]; + + addClass(connect, options.cssClasses.draggable); + + // When the range is fixed, the entire range can + // be dragged by the handles. The handle in the first + // origin will propagate the start event upward, + // but it needs to be bound manually on the other. + if ( behaviour.fixed ) { + eventHolders.push(handleBefore.children[0]); + eventHolders.push(handleAfter.children[0]); + } + + eventHolders.forEach(function( eventHolder ) { + attachEvent ( actions.start, eventHolder, eventStart, { + handles: [handleBefore, handleAfter], + handleNumbers: [index - 1, index] + }); + }); + }); + } + } + + + // Split out the handle positioning logic so the Move event can use it, too + function checkHandlePosition ( reference, handleNumber, to, lookBackward, lookForward, getValue ) { + + // For sliders with multiple handles, limit movement to the other handle. + // Apply the margin option by adding it to the handle positions. + if ( scope_Handles.length > 1 ) { + + if ( lookBackward && handleNumber > 0 ) { + to = Math.max(to, reference[handleNumber - 1] + options.margin); + } + + if ( lookForward && handleNumber < scope_Handles.length - 1 ) { + to = Math.min(to, reference[handleNumber + 1] - options.margin); + } + } + + // The limit option has the opposite effect, limiting handles to a + // maximum distance from another. Limit must be > 0, as otherwise + // handles would be unmoveable. + if ( scope_Handles.length > 1 && options.limit ) { + + if ( lookBackward && handleNumber > 0 ) { + to = Math.min(to, reference[handleNumber - 1] + options.limit); + } + + if ( lookForward && handleNumber < scope_Handles.length - 1 ) { + to = Math.max(to, reference[handleNumber + 1] - options.limit); + } + } + + // The padding option keeps the handles a certain distance from the + // edges of the slider. Padding must be > 0. + if ( options.padding ) { + + if ( handleNumber === 0 ) { + to = Math.max(to, options.padding); + } + + if ( handleNumber === scope_Handles.length - 1 ) { + to = Math.min(to, 100 - options.padding); + } + } + + to = scope_Spectrum.getStep(to); + + // Limit percentage to the 0 - 100 range + to = limit(to); + + // Return false if handle can't move + if ( to === reference[handleNumber] && !getValue ) { + return false; + } + + return to; + } + + function toPct ( pct ) { + return pct + '%'; + } + + // Updates scope_Locations and scope_Values, updates visual state + function updateHandlePosition ( handleNumber, to ) { + + // Update locations. + scope_Locations[handleNumber] = to; + + // Convert the value to the slider stepping/range. + scope_Values[handleNumber] = scope_Spectrum.fromStepping(to); + + // Called synchronously or on the next animationFrame + var stateUpdate = function() { + scope_Handles[handleNumber].style[options.style] = toPct(to); + updateConnect(handleNumber); + updateConnect(handleNumber + 1); + }; + + // Set the handle to the new position. + // Use requestAnimationFrame for efficient painting. + // No significant effect in Chrome, Edge sees dramatic performace improvements. + // Option to disable is useful for unit tests, and single-step debugging. + if ( window.requestAnimationFrame && options.useRequestAnimationFrame ) { + window.requestAnimationFrame(stateUpdate); + } else { + stateUpdate(); + } + } + + function setZindex ( ) { + + scope_HandleNumbers.forEach(function(handleNumber){ + // Handles before the slider middle are stacked later = higher, + // Handles after the middle later is lower + // [[7] [8] .......... | .......... [5] [4] + var dir = (scope_Locations[handleNumber] > 50 ? -1 : 1); + var zIndex = 3 + (scope_Handles.length + (dir * handleNumber)); + scope_Handles[handleNumber].childNodes[0].style.zIndex = zIndex; + }); + } + + // Test suggested values and apply margin, step. + function setHandle ( handleNumber, to, lookBackward, lookForward ) { + + to = checkHandlePosition(scope_Locations, handleNumber, to, lookBackward, lookForward, false); + + if ( to === false ) { + return false; + } + + updateHandlePosition(handleNumber, to); + + return true; + } + + // Updates style attribute for connect nodes + function updateConnect ( index ) { + + // Skip connects set to false + if ( !scope_Connects[index] ) { + return; + } + + var l = 0; + var h = 100; + + if ( index !== 0 ) { + l = scope_Locations[index - 1]; + } + + if ( index !== scope_Connects.length - 1 ) { + h = scope_Locations[index]; + } + + scope_Connects[index].style[options.style] = toPct(l); + scope_Connects[index].style[options.styleOposite] = toPct(100 - h); + } + + // ... + function setValue ( to, handleNumber ) { + + // Setting with null indicates an 'ignore'. + // Inputting 'false' is invalid. + if ( to === null || to === false ) { + return; + } + + // If a formatted number was passed, attemt to decode it. + if ( typeof to === 'number' ) { + to = String(to); + } + + to = options.format.from(to); + + // Request an update for all links if the value was invalid. + // Do so too if setting the handle fails. + if ( to !== false && !isNaN(to) ) { + setHandle(handleNumber, scope_Spectrum.toStepping(to), false, false); + } + } + + // Set the slider value. + function valueSet ( input, fireSetEvent ) { + + var values = asArray(input); + var isInit = scope_Locations[0] === undefined; + + // Event fires by default + fireSetEvent = (fireSetEvent === undefined ? true : !!fireSetEvent); + + values.forEach(setValue); + + // Animation is optional. + // Make sure the initial values were set before using animated placement. + if ( options.animate && !isInit ) { + addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration); + } + + // Now that all base values are set, apply constraints + scope_HandleNumbers.forEach(function(handleNumber){ + setHandle(handleNumber, scope_Locations[handleNumber], true, false); + }); + + setZindex(); + + scope_HandleNumbers.forEach(function(handleNumber){ + + fireEvent('update', handleNumber); + + // Fire the event only for handles that received a new value, as per #579 + if ( values[handleNumber] !== null && fireSetEvent ) { + fireEvent('set', handleNumber); + } + }); + } + + // Reset slider to initial values + function valueReset ( fireSetEvent ) { + valueSet(options.start, fireSetEvent); + } + + // Get the slider value. + function valueGet ( ) { + + var values = scope_Values.map(options.format.to); + + // If only one handle is used, return a single value. + if ( values.length === 1 ){ + return values[0]; + } + + return values; + } + + // Removes classes from the root and empties it. + function destroy ( ) { + + for ( var key in options.cssClasses ) { + if ( !options.cssClasses.hasOwnProperty(key) ) { continue; } + removeClass(scope_Target, options.cssClasses[key]); + } + + while (scope_Target.firstChild) { + scope_Target.removeChild(scope_Target.firstChild); + } + + delete scope_Target.noUiSlider; + } + + // Get the current step size for the slider. + function getCurrentStep ( ) { + + // Check all locations, map them to their stepping point. + // Get the step point, then find it in the input list. + return scope_Locations.map(function( location, index ){ + + var nearbySteps = scope_Spectrum.getNearbySteps( location ); + var value = scope_Values[index]; + var increment = nearbySteps.thisStep.step; + var decrement = null; + + // If the next value in this step moves into the next step, + // the increment is the start of the next step - the current value + if ( increment !== false ) { + if ( value + increment > nearbySteps.stepAfter.startValue ) { + increment = nearbySteps.stepAfter.startValue - value; + } + } + + + // If the value is beyond the starting point + if ( value > nearbySteps.thisStep.startValue ) { + decrement = nearbySteps.thisStep.step; + } + + else if ( nearbySteps.stepBefore.step === false ) { + decrement = false; + } + + // If a handle is at the start of a step, it always steps back into the previous step first + else { + decrement = value - nearbySteps.stepBefore.highestStep; + } + + + // Now, if at the slider edges, there is not in/decrement + if ( location === 100 ) { + increment = null; + } + + else if ( location === 0 ) { + decrement = null; + } + + // As per #391, the comparison for the decrement step can have some rounding issues. + var stepDecimals = scope_Spectrum.countStepDecimals(); + + // Round per #391 + if ( increment !== null && increment !== false ) { + increment = Number(increment.toFixed(stepDecimals)); + } + + if ( decrement !== null && decrement !== false ) { + decrement = Number(decrement.toFixed(stepDecimals)); + } + + return [decrement, increment]; + }); + } + + // Attach an event to this slider, possibly including a namespace + function bindEvent ( namespacedEvent, callback ) { + scope_Events[namespacedEvent] = scope_Events[namespacedEvent] || []; + scope_Events[namespacedEvent].push(callback); + + // If the event bound is 'update,' fire it immediately for all handles. + if ( namespacedEvent.split('.')[0] === 'update' ) { + scope_Handles.forEach(function(a, index){ + fireEvent('update', index); + }); + } + } + + // Undo attachment of event + function removeEvent ( namespacedEvent ) { + + var event = namespacedEvent && namespacedEvent.split('.')[0]; + var namespace = event && namespacedEvent.substring(event.length); + + Object.keys(scope_Events).forEach(function( bind ){ + + var tEvent = bind.split('.')[0], + tNamespace = bind.substring(tEvent.length); + + if ( (!event || event === tEvent) && (!namespace || namespace === tNamespace) ) { + delete scope_Events[bind]; + } + }); + } + + // Updateable: margin, limit, padding, step, range, animate, snap + function updateOptions ( optionsToUpdate, fireSetEvent ) { + + // Spectrum is created using the range, snap, direction and step options. + // 'snap' and 'step' can be updated. + // If 'snap' and 'step' are not passed, they should remain unchanged. + var v = valueGet(); + + var updateAble = ['margin', 'limit', 'padding', 'range', 'animate', 'snap', 'step', 'format']; + + // Only change options that we're actually passed to update. + updateAble.forEach(function(name){ + if ( optionsToUpdate[name] !== undefined ) { + originalOptions[name] = optionsToUpdate[name]; + } + }); + + var newOptions = testOptions(originalOptions); + + // Load new options into the slider state + updateAble.forEach(function(name){ + if ( optionsToUpdate[name] !== undefined ) { + options[name] = newOptions[name]; + } + }); + + scope_Spectrum = newOptions.spectrum; + + // Limit, margin and padding depend on the spectrum but are stored outside of it. (#677) + options.margin = newOptions.margin; + options.limit = newOptions.limit; + options.padding = newOptions.padding; + + // Update pips, removes existing. + if ( options.pips ) { + pips(options.pips); + } + + // Invalidate the current positioning so valueSet forces an update. + scope_Locations = []; + valueSet(optionsToUpdate.start || v, fireSetEvent); + } + + // Throw an error if the slider was already initialized. + if ( scope_Target.noUiSlider ) { + throw new Error("noUiSlider (" + VERSION + "): Slider was already initialized."); + } + + // Create the base element, initialise HTML and set classes. + // Add handles and connect elements. + addSlider(scope_Target); + addElements(options.connect, scope_Base); + + scope_Self = { + destroy: destroy, + steps: getCurrentStep, + on: bindEvent, + off: removeEvent, + get: valueGet, + set: valueSet, + reset: valueReset, + // Exposed for unit testing, don't use this in your application. + __moveHandles: function(a, b, c) { moveHandles(a, b, scope_Locations, c); }, + options: originalOptions, // Issue #600, #678 + updateOptions: updateOptions, + target: scope_Target, // Issue #597 + removePips: removePips, + pips: pips // Issue #594 + }; + + // Attach user events. + bindSliderEvents(options.events); + + // Use the public value method to set the start values. + valueSet(options.start); + + if ( options.pips ) { + pips(options.pips); + } + + if ( options.tooltips ) { + tooltips(); + } + + aria(); + + return scope_Self; + +} + + + // Run the standard initializer + function initialize ( target, originalOptions ) { + + if ( !target || !target.nodeName ) { + throw new Error("noUiSlider (" + VERSION + "): create requires a single element, got: " + target); + } + + // Test the options and create the slider environment; + var options = testOptions( originalOptions, target ); + var api = closure( target, options, originalOptions ); + + target.noUiSlider = api; + + return api; + } + + // Use an object instead of a function for future expansibility; + return { + version: VERSION, + create: initialize + }; + +})); +/*! + Autosize 4.0.0 + license: MIT + http://www.jacklmoore.com/autosize +*/ +(function (global, factory) { + if (typeof define === 'function' && define.amd) { + define(['exports', 'module'], factory); + } else if (typeof exports !== 'undefined' && typeof module !== 'undefined') { + factory(exports, module); + } else { + var mod = { + exports: {} + }; + factory(mod.exports, mod); + global.autosize = mod.exports; + } +})(this, function (exports, module) { + 'use strict'; + + var map = typeof Map === "function" ? new Map() : (function () { + var keys = []; + var values = []; + + return { + has: function has(key) { + return keys.indexOf(key) > -1; + }, + get: function get(key) { + return values[keys.indexOf(key)]; + }, + set: function set(key, value) { + if (keys.indexOf(key) === -1) { + keys.push(key); + values.push(value); + } + }, + 'delete': function _delete(key) { + var index = keys.indexOf(key); + if (index > -1) { + keys.splice(index, 1); + values.splice(index, 1); + } + } + }; + })(); + + var createEvent = function createEvent(name) { + return new Event(name, { bubbles: true }); + }; + try { + new Event('test'); + } catch (e) { + // IE does not support `new Event()` + createEvent = function (name) { + var evt = document.createEvent('Event'); + evt.initEvent(name, true, false); + return evt; + }; + } + + function assign(ta) { + if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || map.has(ta)) return; + + var heightOffset = null; + var clientWidth = ta.clientWidth; + var cachedHeight = null; + + function init() { + var style = window.getComputedStyle(ta, null); + + if (style.resize === 'vertical') { + ta.style.resize = 'none'; + } else if (style.resize === 'both') { + ta.style.resize = 'horizontal'; + } + + if (style.boxSizing === 'content-box') { + heightOffset = -(parseFloat(style.paddingTop) + parseFloat(style.paddingBottom)); + } else { + heightOffset = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth); + } + // Fix when a textarea is not on document body and heightOffset is Not a Number + if (isNaN(heightOffset)) { + heightOffset = 0; + } + + update(); + } + + function changeOverflow(value) { + { + // Chrome/Safari-specific fix: + // When the textarea y-overflow is hidden, Chrome/Safari do not reflow the text to account for the space + // made available by removing the scrollbar. The following forces the necessary text reflow. + var width = ta.style.width; + ta.style.width = '0px'; + // Force reflow: + /* jshint ignore:start */ + ta.offsetWidth; + /* jshint ignore:end */ + ta.style.width = width; + } + + ta.style.overflowY = value; + } + + function getParentOverflows(el) { + var arr = []; + + while (el && el.parentNode && el.parentNode instanceof Element) { + if (el.parentNode.scrollTop) { + arr.push({ + node: el.parentNode, + scrollTop: el.parentNode.scrollTop + }); + } + el = el.parentNode; + } + + return arr; + } + + function resize() { + var originalHeight = ta.style.height; + var overflows = getParentOverflows(ta); + var docTop = document.documentElement && document.documentElement.scrollTop; // Needed for Mobile IE (ticket #240) + + ta.style.height = ''; + + var endHeight = ta.scrollHeight + heightOffset; + + if (ta.scrollHeight === 0) { + // If the scrollHeight is 0, then the element probably has display:none or is detached from the DOM. + ta.style.height = originalHeight; + return; + } + + ta.style.height = endHeight + 'px'; + + // used to check if an update is actually necessary on window.resize + clientWidth = ta.clientWidth; + + // prevents scroll-position jumping + overflows.forEach(function (el) { + el.node.scrollTop = el.scrollTop; + }); + + if (docTop) { + document.documentElement.scrollTop = docTop; + } + } + + function update() { + resize(); + + var styleHeight = Math.round(parseFloat(ta.style.height)); + var computed = window.getComputedStyle(ta, null); + + // Using offsetHeight as a replacement for computed.height in IE, because IE does not account use of border-box + var actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(computed.height)) : ta.offsetHeight; + + // The actual height not matching the style height (set via the resize method) indicates that + // the max-height has been exceeded, in which case the overflow should be allowed. + if (actualHeight !== styleHeight) { + if (computed.overflowY === 'hidden') { + changeOverflow('scroll'); + resize(); + actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight; + } + } else { + // Normally keep overflow set to hidden, to avoid flash of scrollbar as the textarea expands. + if (computed.overflowY !== 'hidden') { + changeOverflow('hidden'); + resize(); + actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight; + } + } + + if (cachedHeight !== actualHeight) { + cachedHeight = actualHeight; + var evt = createEvent('autosize:resized'); + try { + ta.dispatchEvent(evt); + } catch (err) { + // Firefox will throw an error on dispatchEvent for a detached element + // https://bugzilla.mozilla.org/show_bug.cgi?id=889376 + } + } + } + + var pageResize = function pageResize() { + if (ta.clientWidth !== clientWidth) { + update(); + } + }; + + var destroy = (function (style) { + window.removeEventListener('resize', pageResize, false); + ta.removeEventListener('input', update, false); + ta.removeEventListener('keyup', update, false); + ta.removeEventListener('autosize:destroy', destroy, false); + ta.removeEventListener('autosize:update', update, false); + + Object.keys(style).forEach(function (key) { + ta.style[key] = style[key]; + }); + + map['delete'](ta); + }).bind(ta, { + height: ta.style.height, + resize: ta.style.resize, + overflowY: ta.style.overflowY, + overflowX: ta.style.overflowX, + wordWrap: ta.style.wordWrap + }); + + ta.addEventListener('autosize:destroy', destroy, false); + + // IE9 does not fire onpropertychange or oninput for deletions, + // so binding to onkeyup to catch most of those events. + // There is no way that I know of to detect something like 'cut' in IE9. + if ('onpropertychange' in ta && 'oninput' in ta) { + ta.addEventListener('keyup', update, false); + } + + window.addEventListener('resize', pageResize, false); + ta.addEventListener('input', update, false); + ta.addEventListener('autosize:update', update, false); + ta.style.overflowX = 'hidden'; + ta.style.wordWrap = 'break-word'; + + map.set(ta, { + destroy: destroy, + update: update + }); + + init(); + } + + function destroy(ta) { + var methods = map.get(ta); + if (methods) { + methods.destroy(); + } + } + + function update(ta) { + var methods = map.get(ta); + if (methods) { + methods.update(); + } + } + + var autosize = null; + + // Do nothing in Node.js environment and IE8 (or lower) + if (typeof window === 'undefined' || typeof window.getComputedStyle !== 'function') { + autosize = function (el) { + return el; + }; + autosize.destroy = function (el) { + return el; + }; + autosize.update = function (el) { + return el; + }; + } else { + autosize = function (el, options) { + if (el) { + Array.prototype.forEach.call(el.length ? el : [el], function (x) { + return assign(x, options); + }); + } + return el; + }; + autosize.destroy = function (el) { + if (el) { + Array.prototype.forEach.call(el.length ? el : [el], destroy); + } + return el; + }; + autosize.update = function (el) { + if (el) { + Array.prototype.forEach.call(el.length ? el : [el], update); + } + return el; + }; + } + + module.exports = autosize; +}); +/*! + * clipboard.js v1.7.1 + * https://zenorocha.github.io/clipboard.js + * + * Licensed MIT © Zeno Rocha + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t,e,n;return function t(e,n,o){function i(a,c){if(!n[a]){if(!e[a]){var l="function"==typeof require&&require;if(!c&&l)return l(a,!0);if(r)return r(a,!0);var s=new Error("Cannot find module '"+a+"'");throw s.code="MODULE_NOT_FOUND",s}var u=n[a]={exports:{}};e[a][0].call(u.exports,function(t){var n=e[a][1][t];return i(n||t)},u,u.exports,t,e,n,o)}return n[a].exports}for(var r="function"==typeof require&&require,a=0;a0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function t(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function t(){var e=this,n="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[n?"right":"left"]="-9999px";var o=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=o+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,i.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function t(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function t(){this.selectedText=(0,i.default)(this.target),this.copyText()}},{key:"copyText",value:function t(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function t(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function t(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function t(){this.removeFake()}},{key:"action",set:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function t(){return this._action}},{key:"target",set:function t(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":r(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function t(){return this._target}}]),t}();t.exports=c})},{select:5}],8:[function(e,n,o){!function(i,r){if("function"==typeof t&&t.amd)t(["module","./clipboard-action","tiny-emitter","good-listener"],r);else if(void 0!==o)r(n,e("./clipboard-action"),e("tiny-emitter"),e("good-listener"));else{var a={exports:{}};r(a,i.clipboardAction,i.tinyEmitter,i.goodListener),i.clipboard=a.exports}}(this,function(t,e,n,o){"use strict";function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function a(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function c(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function l(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}var s=i(e),u=i(n),f=i(o),d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},h=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===d(e.container)?e.container:document.body}},{key:"listenClick",value:function t(e){var n=this;this.listener=(0,f.default)(e,"click",function(t){return n.onClick(t)})}},{key:"onClick",value:function t(e){var n=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new s.default({action:this.action(n),target:this.target(n),text:this.text(n),container:this.container,trigger:n,emitter:this})}},{key:"defaultAction",value:function t(e){return l("action",e)}},{key:"defaultTarget",value:function t(e){var n=l("target",e);if(n)return document.querySelector(n)}},{key:"defaultText",value:function t(e){return l("text",e)}},{key:"destroy",value:function t(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],n="string"==typeof e?[e]:e,o=!!document.queryCommandSupported;return n.forEach(function(t){o=o&&!!document.queryCommandSupported(t)}),o}}]),e}(u.default);t.exports=p})},{"./clipboard-action":7,"good-listener":4,"tiny-emitter":6}]},{},[8])(8)}); +// Ion.RangeSlider +// version 2.2.0 Build: 380 +// © Denis Ineshin, 2017 +// https://github.com/IonDen +// +// Project page: http://ionden.com/a/plugins/ion.rangeSlider/en.html +// GitHub page: https://github.com/IonDen/ion.rangeSlider +// +// Released under MIT licence: +// http://ionden.com/a/plugins/licence-en.html +// ===================================================================================================================== + +;(function(factory) { + if (typeof define === "function" && define.amd) { + define(["jquery"], function (jQuery) { + return factory(jQuery, document, window, navigator); + }); + } else if (typeof exports === "object") { + factory(require("jquery"), document, window, navigator); + } else { + factory(jQuery, document, window, navigator); + } +} (function ($, document, window, navigator, undefined) { + "use strict"; + + // ================================================================================================================= + // Service + + var plugin_count = 0; + + // IE8 fix + var is_old_ie = (function () { + var n = navigator.userAgent, + r = /msie\s\d+/i, + v; + if (n.search(r) > 0) { + v = r.exec(n).toString(); + v = v.split(" ")[1]; + if (v < 9) { + $("html").addClass("lt-ie9"); + return true; + } + } + return false; + } ()); + if (!Function.prototype.bind) { + Function.prototype.bind = function bind(that) { + + var target = this; + var slice = [].slice; + + if (typeof target != "function") { + throw new TypeError(); + } + + var args = slice.call(arguments, 1), + bound = function () { + + if (this instanceof bound) { + + var F = function(){}; + F.prototype = target.prototype; + var self = new F(); + + var result = target.apply( + self, + args.concat(slice.call(arguments)) + ); + if (Object(result) === result) { + return result; + } + return self; + + } else { + + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + + } + + }; + + return bound; + }; + } + if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function(searchElement, fromIndex) { + var k; + if (this == null) { + throw new TypeError('"this" is null or not defined'); + } + var O = Object(this); + var len = O.length >>> 0; + if (len === 0) { + return -1; + } + var n = +fromIndex || 0; + if (Math.abs(n) === Infinity) { + n = 0; + } + if (n >= len) { + return -1; + } + k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); + while (k < len) { + if (k in O && O[k] === searchElement) { + return k; + } + k++; + } + return -1; + }; + } + + + + // ================================================================================================================= + // Template + + var base_html = + '' + + '' + + '01' + + '000' + + '' + + '' + + ''; + + var single_html = + '' + + '' + + ''; + + var double_html = + '' + + '' + + '' + + ''; + + var disable_html = + ''; + + + + // ================================================================================================================= + // Core + + /** + * Main plugin constructor + * + * @param input {Object} link to base input element + * @param options {Object} slider config + * @param plugin_count {Number} + * @constructor + */ + var IonRangeSlider = function (input, options, plugin_count) { + this.VERSION = "2.2.0"; + this.input = input; + this.plugin_count = plugin_count; + this.current_plugin = 0; + this.calc_count = 0; + this.update_tm = 0; + this.old_from = 0; + this.old_to = 0; + this.old_min_interval = null; + this.raf_id = null; + this.dragging = false; + this.force_redraw = false; + this.no_diapason = false; + this.has_tab_index = true; + this.is_key = false; + this.is_update = false; + this.is_start = true; + this.is_finish = false; + this.is_active = false; + this.is_resize = false; + this.is_click = false; + + options = options || {}; + + // cache for links to all DOM elements + this.$cache = { + win: $(window), + body: $(document.body), + input: $(input), + cont: null, + rs: null, + min: null, + max: null, + from: null, + to: null, + single: null, + bar: null, + line: null, + s_single: null, + s_from: null, + s_to: null, + shad_single: null, + shad_from: null, + shad_to: null, + edge: null, + grid: null, + grid_labels: [] + }; + + // storage for measure variables + this.coords = { + // left + x_gap: 0, + x_pointer: 0, + + // width + w_rs: 0, + w_rs_old: 0, + w_handle: 0, + + // percents + p_gap: 0, + p_gap_left: 0, + p_gap_right: 0, + p_step: 0, + p_pointer: 0, + p_handle: 0, + p_single_fake: 0, + p_single_real: 0, + p_from_fake: 0, + p_from_real: 0, + p_to_fake: 0, + p_to_real: 0, + p_bar_x: 0, + p_bar_w: 0, + + // grid + grid_gap: 0, + big_num: 0, + big: [], + big_w: [], + big_p: [], + big_x: [] + }; + + // storage for labels measure variables + this.labels = { + // width + w_min: 0, + w_max: 0, + w_from: 0, + w_to: 0, + w_single: 0, + + // percents + p_min: 0, + p_max: 0, + p_from_fake: 0, + p_from_left: 0, + p_to_fake: 0, + p_to_left: 0, + p_single_fake: 0, + p_single_left: 0 + }; + + + + /** + * get and validate config + */ + var $inp = this.$cache.input, + val = $inp.prop("value"), + config, config_from_data, prop; + + // default config + config = { + type: "single", + + min: 10, + max: 100, + from: null, + to: null, + step: 1, + + min_interval: 0, + max_interval: 0, + drag_interval: false, + + values: [], + p_values: [], + + from_fixed: false, + from_min: null, + from_max: null, + from_shadow: false, + + to_fixed: false, + to_min: null, + to_max: null, + to_shadow: false, + + prettify_enabled: true, + prettify_separator: " ", + prettify: null, + + force_edges: false, + + keyboard: true, + + grid: false, + grid_margin: true, + grid_num: 4, + grid_snap: false, + + hide_min_max: false, + hide_from_to: false, + + prefix: "", + postfix: "", + max_postfix: "", + decorate_both: true, + values_separator: " — ", + + input_values_separator: ";", + + disable: false, + block: false, + + extra_classes: "", + + scope: null, + onStart: null, + onChange: null, + onFinish: null, + onUpdate: null + }; + + + // check if base element is input + if ($inp[0].nodeName !== "INPUT") { + console && console.warn && console.warn("Base element should be !", $inp[0]); + } + + + // config from data-attributes extends js config + config_from_data = { + type: $inp.data("type"), + + min: $inp.data("min"), + max: $inp.data("max"), + from: $inp.data("from"), + to: $inp.data("to"), + step: $inp.data("step"), + + min_interval: $inp.data("minInterval"), + max_interval: $inp.data("maxInterval"), + drag_interval: $inp.data("dragInterval"), + + values: $inp.data("values"), + + from_fixed: $inp.data("fromFixed"), + from_min: $inp.data("fromMin"), + from_max: $inp.data("fromMax"), + from_shadow: $inp.data("fromShadow"), + + to_fixed: $inp.data("toFixed"), + to_min: $inp.data("toMin"), + to_max: $inp.data("toMax"), + to_shadow: $inp.data("toShadow"), + + prettify_enabled: $inp.data("prettifyEnabled"), + prettify_separator: $inp.data("prettifySeparator"), + + force_edges: $inp.data("forceEdges"), + + keyboard: $inp.data("keyboard"), + + grid: $inp.data("grid"), + grid_margin: $inp.data("gridMargin"), + grid_num: $inp.data("gridNum"), + grid_snap: $inp.data("gridSnap"), + + hide_min_max: $inp.data("hideMinMax"), + hide_from_to: $inp.data("hideFromTo"), + + prefix: $inp.data("prefix"), + postfix: $inp.data("postfix"), + max_postfix: $inp.data("maxPostfix"), + decorate_both: $inp.data("decorateBoth"), + values_separator: $inp.data("valuesSeparator"), + + input_values_separator: $inp.data("inputValuesSeparator"), + + disable: $inp.data("disable"), + block: $inp.data("block"), + + extra_classes: $inp.data("extraClasses"), + }; + config_from_data.values = config_from_data.values && config_from_data.values.split(","); + + for (prop in config_from_data) { + if (config_from_data.hasOwnProperty(prop)) { + if (config_from_data[prop] === undefined || config_from_data[prop] === "") { + delete config_from_data[prop]; + } + } + } + + + // input value extends default config + if (val !== undefined && val !== "") { + val = val.split(config_from_data.input_values_separator || options.input_values_separator || ";"); + + if (val[0] && val[0] == +val[0]) { + val[0] = +val[0]; + } + if (val[1] && val[1] == +val[1]) { + val[1] = +val[1]; + } + + if (options && options.values && options.values.length) { + config.from = val[0] && options.values.indexOf(val[0]); + config.to = val[1] && options.values.indexOf(val[1]); + } else { + config.from = val[0] && +val[0]; + config.to = val[1] && +val[1]; + } + } + + + + // js config extends default config + $.extend(config, options); + + + // data config extends config + $.extend(config, config_from_data); + this.options = config; + + + + // validate config, to be sure that all data types are correct + this.update_check = {}; + this.validate(); + + + + // default result object, returned to callbacks + this.result = { + input: this.$cache.input, + slider: null, + + min: this.options.min, + max: this.options.max, + + from: this.options.from, + from_percent: 0, + from_value: null, + + to: this.options.to, + to_percent: 0, + to_value: null + }; + + + + this.init(); + }; + + IonRangeSlider.prototype = { + + /** + * Starts or updates the plugin instance + * + * @param [is_update] {boolean} + */ + init: function (is_update) { + this.no_diapason = false; + this.coords.p_step = this.convertToPercent(this.options.step, true); + + this.target = "base"; + + this.toggleInput(); + this.append(); + this.setMinMax(); + + if (is_update) { + this.force_redraw = true; + this.calc(true); + + // callbacks called + this.callOnUpdate(); + } else { + this.force_redraw = true; + this.calc(true); + + // callbacks called + this.callOnStart(); + } + + this.updateScene(); + }, + + /** + * Appends slider template to a DOM + */ + append: function () { + var container_html = ''; + this.$cache.input.before(container_html); + this.$cache.input.prop("readonly", true); + this.$cache.cont = this.$cache.input.prev(); + this.result.slider = this.$cache.cont; + + this.$cache.cont.html(base_html); + this.$cache.rs = this.$cache.cont.find(".irs"); + this.$cache.min = this.$cache.cont.find(".irs-min"); + this.$cache.max = this.$cache.cont.find(".irs-max"); + this.$cache.from = this.$cache.cont.find(".irs-from"); + this.$cache.to = this.$cache.cont.find(".irs-to"); + this.$cache.single = this.$cache.cont.find(".irs-single"); + this.$cache.bar = this.$cache.cont.find(".irs-bar"); + this.$cache.line = this.$cache.cont.find(".irs-line"); + this.$cache.grid = this.$cache.cont.find(".irs-grid"); + + if (this.options.type === "single") { + this.$cache.cont.append(single_html); + this.$cache.edge = this.$cache.cont.find(".irs-bar-edge"); + this.$cache.s_single = this.$cache.cont.find(".single"); + this.$cache.from[0].style.visibility = "hidden"; + this.$cache.to[0].style.visibility = "hidden"; + this.$cache.shad_single = this.$cache.cont.find(".shadow-single"); + } else { + this.$cache.cont.append(double_html); + this.$cache.s_from = this.$cache.cont.find(".from"); + this.$cache.s_to = this.$cache.cont.find(".to"); + this.$cache.shad_from = this.$cache.cont.find(".shadow-from"); + this.$cache.shad_to = this.$cache.cont.find(".shadow-to"); + + this.setTopHandler(); + } + + if (this.options.hide_from_to) { + this.$cache.from[0].style.display = "none"; + this.$cache.to[0].style.display = "none"; + this.$cache.single[0].style.display = "none"; + } + + this.appendGrid(); + + if (this.options.disable) { + this.appendDisableMask(); + this.$cache.input[0].disabled = true; + } else { + this.$cache.input[0].disabled = false; + this.removeDisableMask(); + this.bindEvents(); + } + + // block only if not disabled + if (!this.options.disable) { + if (this.options.block) { + this.appendDisableMask(); + } else { + this.removeDisableMask(); + } + } + + if (this.options.drag_interval) { + this.$cache.bar[0].style.cursor = "ew-resize"; + } + }, + + /** + * Determine which handler has a priority + * works only for double slider type + */ + setTopHandler: function () { + var min = this.options.min, + max = this.options.max, + from = this.options.from, + to = this.options.to; + + if (from > min && to === max) { + this.$cache.s_from.addClass("type_last"); + } else if (to < max) { + this.$cache.s_to.addClass("type_last"); + } + }, + + /** + * Determine which handles was clicked last + * and which handler should have hover effect + * + * @param target {String} + */ + changeLevel: function (target) { + switch (target) { + case "single": + this.coords.p_gap = this.toFixed(this.coords.p_pointer - this.coords.p_single_fake); + this.$cache.s_single.addClass("state_hover"); + break; + case "from": + this.coords.p_gap = this.toFixed(this.coords.p_pointer - this.coords.p_from_fake); + this.$cache.s_from.addClass("state_hover"); + this.$cache.s_from.addClass("type_last"); + this.$cache.s_to.removeClass("type_last"); + break; + case "to": + this.coords.p_gap = this.toFixed(this.coords.p_pointer - this.coords.p_to_fake); + this.$cache.s_to.addClass("state_hover"); + this.$cache.s_to.addClass("type_last"); + this.$cache.s_from.removeClass("type_last"); + break; + case "both": + this.coords.p_gap_left = this.toFixed(this.coords.p_pointer - this.coords.p_from_fake); + this.coords.p_gap_right = this.toFixed(this.coords.p_to_fake - this.coords.p_pointer); + this.$cache.s_to.removeClass("type_last"); + this.$cache.s_from.removeClass("type_last"); + break; + } + }, + + /** + * Then slider is disabled + * appends extra layer with opacity + */ + appendDisableMask: function () { + this.$cache.cont.append(disable_html); + this.$cache.cont.addClass("irs-disabled"); + }, + + /** + * Then slider is not disabled + * remove disable mask + */ + removeDisableMask: function () { + this.$cache.cont.remove(".irs-disable-mask"); + this.$cache.cont.removeClass("irs-disabled"); + }, + + /** + * Remove slider instance + * and unbind all events + */ + remove: function () { + this.$cache.cont.remove(); + this.$cache.cont = null; + + this.$cache.line.off("keydown.irs_" + this.plugin_count); + + this.$cache.body.off("touchmove.irs_" + this.plugin_count); + this.$cache.body.off("mousemove.irs_" + this.plugin_count); + + this.$cache.win.off("touchend.irs_" + this.plugin_count); + this.$cache.win.off("mouseup.irs_" + this.plugin_count); + + if (is_old_ie) { + this.$cache.body.off("mouseup.irs_" + this.plugin_count); + this.$cache.body.off("mouseleave.irs_" + this.plugin_count); + } + + this.$cache.grid_labels = []; + this.coords.big = []; + this.coords.big_w = []; + this.coords.big_p = []; + this.coords.big_x = []; + + cancelAnimationFrame(this.raf_id); + }, + + /** + * bind all slider events + */ + bindEvents: function () { + if (this.no_diapason) { + return; + } + + this.$cache.body.on("touchmove.irs_" + this.plugin_count, this.pointerMove.bind(this)); + this.$cache.body.on("mousemove.irs_" + this.plugin_count, this.pointerMove.bind(this)); + + this.$cache.win.on("touchend.irs_" + this.plugin_count, this.pointerUp.bind(this)); + this.$cache.win.on("mouseup.irs_" + this.plugin_count, this.pointerUp.bind(this)); + + this.$cache.line.on("touchstart.irs_" + this.plugin_count, this.pointerClick.bind(this, "click")); + this.$cache.line.on("mousedown.irs_" + this.plugin_count, this.pointerClick.bind(this, "click")); + + this.$cache.line.on("focus.irs_" + this.plugin_count, this.pointerFocus.bind(this)); + + if (this.options.drag_interval && this.options.type === "double") { + this.$cache.bar.on("touchstart.irs_" + this.plugin_count, this.pointerDown.bind(this, "both")); + this.$cache.bar.on("mousedown.irs_" + this.plugin_count, this.pointerDown.bind(this, "both")); + } else { + this.$cache.bar.on("touchstart.irs_" + this.plugin_count, this.pointerClick.bind(this, "click")); + this.$cache.bar.on("mousedown.irs_" + this.plugin_count, this.pointerClick.bind(this, "click")); + } + + if (this.options.type === "single") { + this.$cache.single.on("touchstart.irs_" + this.plugin_count, this.pointerDown.bind(this, "single")); + this.$cache.s_single.on("touchstart.irs_" + this.plugin_count, this.pointerDown.bind(this, "single")); + this.$cache.shad_single.on("touchstart.irs_" + this.plugin_count, this.pointerClick.bind(this, "click")); + + this.$cache.single.on("mousedown.irs_" + this.plugin_count, this.pointerDown.bind(this, "single")); + this.$cache.s_single.on("mousedown.irs_" + this.plugin_count, this.pointerDown.bind(this, "single")); + this.$cache.edge.on("mousedown.irs_" + this.plugin_count, this.pointerClick.bind(this, "click")); + this.$cache.shad_single.on("mousedown.irs_" + this.plugin_count, this.pointerClick.bind(this, "click")); + } else { + this.$cache.single.on("touchstart.irs_" + this.plugin_count, this.pointerDown.bind(this, null)); + this.$cache.single.on("mousedown.irs_" + this.plugin_count, this.pointerDown.bind(this, null)); + + this.$cache.from.on("touchstart.irs_" + this.plugin_count, this.pointerDown.bind(this, "from")); + this.$cache.s_from.on("touchstart.irs_" + this.plugin_count, this.pointerDown.bind(this, "from")); + this.$cache.to.on("touchstart.irs_" + this.plugin_count, this.pointerDown.bind(this, "to")); + this.$cache.s_to.on("touchstart.irs_" + this.plugin_count, this.pointerDown.bind(this, "to")); + this.$cache.shad_from.on("touchstart.irs_" + this.plugin_count, this.pointerClick.bind(this, "click")); + this.$cache.shad_to.on("touchstart.irs_" + this.plugin_count, this.pointerClick.bind(this, "click")); + + this.$cache.from.on("mousedown.irs_" + this.plugin_count, this.pointerDown.bind(this, "from")); + this.$cache.s_from.on("mousedown.irs_" + this.plugin_count, this.pointerDown.bind(this, "from")); + this.$cache.to.on("mousedown.irs_" + this.plugin_count, this.pointerDown.bind(this, "to")); + this.$cache.s_to.on("mousedown.irs_" + this.plugin_count, this.pointerDown.bind(this, "to")); + this.$cache.shad_from.on("mousedown.irs_" + this.plugin_count, this.pointerClick.bind(this, "click")); + this.$cache.shad_to.on("mousedown.irs_" + this.plugin_count, this.pointerClick.bind(this, "click")); + } + + if (this.options.keyboard) { + this.$cache.line.on("keydown.irs_" + this.plugin_count, this.key.bind(this, "keyboard")); + } + + if (is_old_ie) { + this.$cache.body.on("mouseup.irs_" + this.plugin_count, this.pointerUp.bind(this)); + this.$cache.body.on("mouseleave.irs_" + this.plugin_count, this.pointerUp.bind(this)); + } + }, + + /** + * Focus with tabIndex + * + * @param e {Object} event object + */ + pointerFocus: function (e) { + if (!this.target) { + var x; + var $handle; + + if (this.options.type === "single") { + $handle = this.$cache.single; + } else { + $handle = this.$cache.from; + } + + x = $handle.offset().left; + x += ($handle.width() / 2) - 1; + + this.pointerClick("single", {preventDefault: function () {}, pageX: x}); + } + }, + + /** + * Mousemove or touchmove + * only for handlers + * + * @param e {Object} event object + */ + pointerMove: function (e) { + if (!this.dragging) { + return; + } + + var x = e.pageX || e.originalEvent.touches && e.originalEvent.touches[0].pageX; + this.coords.x_pointer = x - this.coords.x_gap; + + this.calc(); + }, + + /** + * Mouseup or touchend + * only for handlers + * + * @param e {Object} event object + */ + pointerUp: function (e) { + if (this.current_plugin !== this.plugin_count) { + return; + } + + if (this.is_active) { + this.is_active = false; + } else { + return; + } + + this.$cache.cont.find(".state_hover").removeClass("state_hover"); + + this.force_redraw = true; + + if (is_old_ie) { + $("*").prop("unselectable", false); + } + + this.updateScene(); + this.restoreOriginalMinInterval(); + + // callbacks call + if ($.contains(this.$cache.cont[0], e.target) || this.dragging) { + this.callOnFinish(); + } + + this.dragging = false; + }, + + /** + * Mousedown or touchstart + * only for handlers + * + * @param target {String|null} + * @param e {Object} event object + */ + pointerDown: function (target, e) { + e.preventDefault(); + var x = e.pageX || e.originalEvent.touches && e.originalEvent.touches[0].pageX; + if (e.button === 2) { + return; + } + + if (target === "both") { + this.setTempMinInterval(); + } + + if (!target) { + target = this.target || "from"; + } + + this.current_plugin = this.plugin_count; + this.target = target; + + this.is_active = true; + this.dragging = true; + + this.coords.x_gap = this.$cache.rs.offset().left; + this.coords.x_pointer = x - this.coords.x_gap; + + this.calcPointerPercent(); + this.changeLevel(target); + + if (is_old_ie) { + $("*").prop("unselectable", true); + } + + this.$cache.line.trigger("focus"); + + this.updateScene(); + }, + + /** + * Mousedown or touchstart + * for other slider elements, like diapason line + * + * @param target {String} + * @param e {Object} event object + */ + pointerClick: function (target, e) { + e.preventDefault(); + var x = e.pageX || e.originalEvent.touches && e.originalEvent.touches[0].pageX; + if (e.button === 2) { + return; + } + + this.current_plugin = this.plugin_count; + this.target = target; + + this.is_click = true; + this.coords.x_gap = this.$cache.rs.offset().left; + this.coords.x_pointer = +(x - this.coords.x_gap).toFixed(); + + this.force_redraw = true; + this.calc(); + + this.$cache.line.trigger("focus"); + }, + + /** + * Keyborard controls for focused slider + * + * @param target {String} + * @param e {Object} event object + * @returns {boolean|undefined} + */ + key: function (target, e) { + if (this.current_plugin !== this.plugin_count || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) { + return; + } + + switch (e.which) { + case 83: // W + case 65: // A + case 40: // DOWN + case 37: // LEFT + e.preventDefault(); + this.moveByKey(false); + break; + + case 87: // S + case 68: // D + case 38: // UP + case 39: // RIGHT + e.preventDefault(); + this.moveByKey(true); + break; + } + + return true; + }, + + /** + * Move by key + * + * @param right {boolean} direction to move + */ + moveByKey: function (right) { + var p = this.coords.p_pointer; + var p_step = (this.options.max - this.options.min) / 100; + p_step = this.options.step / p_step; + + if (right) { + p += p_step; + } else { + p -= p_step; + } + + this.coords.x_pointer = this.toFixed(this.coords.w_rs / 100 * p); + this.is_key = true; + this.calc(); + }, + + /** + * Set visibility and content + * of Min and Max labels + */ + setMinMax: function () { + if (!this.options) { + return; + } + + if (this.options.hide_min_max) { + this.$cache.min[0].style.display = "none"; + this.$cache.max[0].style.display = "none"; + return; + } + + if (this.options.values.length) { + this.$cache.min.html(this.decorate(this.options.p_values[this.options.min])); + this.$cache.max.html(this.decorate(this.options.p_values[this.options.max])); + } else { + var min_pretty = this._prettify(this.options.min); + var max_pretty = this._prettify(this.options.max); + + this.result.min_pretty = min_pretty; + this.result.max_pretty = max_pretty; + + this.$cache.min.html(this.decorate(min_pretty, this.options.min)); + this.$cache.max.html(this.decorate(max_pretty, this.options.max)); + } + + this.labels.w_min = this.$cache.min.outerWidth(false); + this.labels.w_max = this.$cache.max.outerWidth(false); + }, + + /** + * Then dragging interval, prevent interval collapsing + * using min_interval option + */ + setTempMinInterval: function () { + var interval = this.result.to - this.result.from; + + if (this.old_min_interval === null) { + this.old_min_interval = this.options.min_interval; + } + + this.options.min_interval = interval; + }, + + /** + * Restore min_interval option to original + */ + restoreOriginalMinInterval: function () { + if (this.old_min_interval !== null) { + this.options.min_interval = this.old_min_interval; + this.old_min_interval = null; + } + }, + + + + // ============================================================================================================= + // Calculations + + /** + * All calculations and measures start here + * + * @param update {boolean=} + */ + calc: function (update) { + if (!this.options) { + return; + } + + this.calc_count++; + + if (this.calc_count === 10 || update) { + this.calc_count = 0; + this.coords.w_rs = this.$cache.rs.outerWidth(false); + + this.calcHandlePercent(); + } + + if (!this.coords.w_rs) { + return; + } + + this.calcPointerPercent(); + var handle_x = this.getHandleX(); + + + if (this.target === "both") { + this.coords.p_gap = 0; + handle_x = this.getHandleX(); + } + + if (this.target === "click") { + this.coords.p_gap = this.coords.p_handle / 2; + handle_x = this.getHandleX(); + + if (this.options.drag_interval) { + this.target = "both_one"; + } else { + this.target = this.chooseHandle(handle_x); + } + } + + switch (this.target) { + case "base": + var w = (this.options.max - this.options.min) / 100, + f = (this.result.from - this.options.min) / w, + t = (this.result.to - this.options.min) / w; + + this.coords.p_single_real = this.toFixed(f); + this.coords.p_from_real = this.toFixed(f); + this.coords.p_to_real = this.toFixed(t); + + this.coords.p_single_real = this.checkDiapason(this.coords.p_single_real, this.options.from_min, this.options.from_max); + this.coords.p_from_real = this.checkDiapason(this.coords.p_from_real, this.options.from_min, this.options.from_max); + this.coords.p_to_real = this.checkDiapason(this.coords.p_to_real, this.options.to_min, this.options.to_max); + + this.coords.p_single_fake = this.convertToFakePercent(this.coords.p_single_real); + this.coords.p_from_fake = this.convertToFakePercent(this.coords.p_from_real); + this.coords.p_to_fake = this.convertToFakePercent(this.coords.p_to_real); + + this.target = null; + + break; + + case "single": + if (this.options.from_fixed) { + break; + } + + this.coords.p_single_real = this.convertToRealPercent(handle_x); + this.coords.p_single_real = this.calcWithStep(this.coords.p_single_real); + this.coords.p_single_real = this.checkDiapason(this.coords.p_single_real, this.options.from_min, this.options.from_max); + + this.coords.p_single_fake = this.convertToFakePercent(this.coords.p_single_real); + + break; + + case "from": + if (this.options.from_fixed) { + break; + } + + this.coords.p_from_real = this.convertToRealPercent(handle_x); + this.coords.p_from_real = this.calcWithStep(this.coords.p_from_real); + if (this.coords.p_from_real > this.coords.p_to_real) { + this.coords.p_from_real = this.coords.p_to_real; + } + this.coords.p_from_real = this.checkDiapason(this.coords.p_from_real, this.options.from_min, this.options.from_max); + this.coords.p_from_real = this.checkMinInterval(this.coords.p_from_real, this.coords.p_to_real, "from"); + this.coords.p_from_real = this.checkMaxInterval(this.coords.p_from_real, this.coords.p_to_real, "from"); + + this.coords.p_from_fake = this.convertToFakePercent(this.coords.p_from_real); + + break; + + case "to": + if (this.options.to_fixed) { + break; + } + + this.coords.p_to_real = this.convertToRealPercent(handle_x); + this.coords.p_to_real = this.calcWithStep(this.coords.p_to_real); + if (this.coords.p_to_real < this.coords.p_from_real) { + this.coords.p_to_real = this.coords.p_from_real; + } + this.coords.p_to_real = this.checkDiapason(this.coords.p_to_real, this.options.to_min, this.options.to_max); + this.coords.p_to_real = this.checkMinInterval(this.coords.p_to_real, this.coords.p_from_real, "to"); + this.coords.p_to_real = this.checkMaxInterval(this.coords.p_to_real, this.coords.p_from_real, "to"); + + this.coords.p_to_fake = this.convertToFakePercent(this.coords.p_to_real); + + break; + + case "both": + if (this.options.from_fixed || this.options.to_fixed) { + break; + } + + handle_x = this.toFixed(handle_x + (this.coords.p_handle * 0.001)); + + this.coords.p_from_real = this.convertToRealPercent(handle_x) - this.coords.p_gap_left; + this.coords.p_from_real = this.calcWithStep(this.coords.p_from_real); + this.coords.p_from_real = this.checkDiapason(this.coords.p_from_real, this.options.from_min, this.options.from_max); + this.coords.p_from_real = this.checkMinInterval(this.coords.p_from_real, this.coords.p_to_real, "from"); + this.coords.p_from_fake = this.convertToFakePercent(this.coords.p_from_real); + + this.coords.p_to_real = this.convertToRealPercent(handle_x) + this.coords.p_gap_right; + this.coords.p_to_real = this.calcWithStep(this.coords.p_to_real); + this.coords.p_to_real = this.checkDiapason(this.coords.p_to_real, this.options.to_min, this.options.to_max); + this.coords.p_to_real = this.checkMinInterval(this.coords.p_to_real, this.coords.p_from_real, "to"); + this.coords.p_to_fake = this.convertToFakePercent(this.coords.p_to_real); + + break; + + case "both_one": + if (this.options.from_fixed || this.options.to_fixed) { + break; + } + + var real_x = this.convertToRealPercent(handle_x), + from = this.result.from_percent, + to = this.result.to_percent, + full = to - from, + half = full / 2, + new_from = real_x - half, + new_to = real_x + half; + + if (new_from < 0) { + new_from = 0; + new_to = new_from + full; + } + + if (new_to > 100) { + new_to = 100; + new_from = new_to - full; + } + + this.coords.p_from_real = this.calcWithStep(new_from); + this.coords.p_from_real = this.checkDiapason(this.coords.p_from_real, this.options.from_min, this.options.from_max); + this.coords.p_from_fake = this.convertToFakePercent(this.coords.p_from_real); + + this.coords.p_to_real = this.calcWithStep(new_to); + this.coords.p_to_real = this.checkDiapason(this.coords.p_to_real, this.options.to_min, this.options.to_max); + this.coords.p_to_fake = this.convertToFakePercent(this.coords.p_to_real); + + break; + } + + if (this.options.type === "single") { + this.coords.p_bar_x = (this.coords.p_handle / 2); + this.coords.p_bar_w = this.coords.p_single_fake; + + this.result.from_percent = this.coords.p_single_real; + this.result.from = this.convertToValue(this.coords.p_single_real); + this.result.from_pretty = this._prettify(this.result.from); + + if (this.options.values.length) { + this.result.from_value = this.options.values[this.result.from]; + } + } else { + this.coords.p_bar_x = this.toFixed(this.coords.p_from_fake + (this.coords.p_handle / 2)); + this.coords.p_bar_w = this.toFixed(this.coords.p_to_fake - this.coords.p_from_fake); + + this.result.from_percent = this.coords.p_from_real; + this.result.from = this.convertToValue(this.coords.p_from_real); + this.result.from_pretty = this._prettify(this.result.from); + this.result.to_percent = this.coords.p_to_real; + this.result.to = this.convertToValue(this.coords.p_to_real); + this.result.to_pretty = this._prettify(this.result.to); + + if (this.options.values.length) { + this.result.from_value = this.options.values[this.result.from]; + this.result.to_value = this.options.values[this.result.to]; + } + } + + this.calcMinMax(); + this.calcLabels(); + }, + + + /** + * calculates pointer X in percent + */ + calcPointerPercent: function () { + if (!this.coords.w_rs) { + this.coords.p_pointer = 0; + return; + } + + if (this.coords.x_pointer < 0 || isNaN(this.coords.x_pointer) ) { + this.coords.x_pointer = 0; + } else if (this.coords.x_pointer > this.coords.w_rs) { + this.coords.x_pointer = this.coords.w_rs; + } + + this.coords.p_pointer = this.toFixed(this.coords.x_pointer / this.coords.w_rs * 100); + }, + + convertToRealPercent: function (fake) { + var full = 100 - this.coords.p_handle; + return fake / full * 100; + }, + + convertToFakePercent: function (real) { + var full = 100 - this.coords.p_handle; + return real / 100 * full; + }, + + getHandleX: function () { + var max = 100 - this.coords.p_handle, + x = this.toFixed(this.coords.p_pointer - this.coords.p_gap); + + if (x < 0) { + x = 0; + } else if (x > max) { + x = max; + } + + return x; + }, + + calcHandlePercent: function () { + if (this.options.type === "single") { + this.coords.w_handle = this.$cache.s_single.outerWidth(false); + } else { + this.coords.w_handle = this.$cache.s_from.outerWidth(false); + } + + this.coords.p_handle = this.toFixed(this.coords.w_handle / this.coords.w_rs * 100); + }, + + /** + * Find closest handle to pointer click + * + * @param real_x {Number} + * @returns {String} + */ + chooseHandle: function (real_x) { + if (this.options.type === "single") { + return "single"; + } else { + var m_point = this.coords.p_from_real + ((this.coords.p_to_real - this.coords.p_from_real) / 2); + if (real_x >= m_point) { + return this.options.to_fixed ? "from" : "to"; + } else { + return this.options.from_fixed ? "to" : "from"; + } + } + }, + + /** + * Measure Min and Max labels width in percent + */ + calcMinMax: function () { + if (!this.coords.w_rs) { + return; + } + + this.labels.p_min = this.labels.w_min / this.coords.w_rs * 100; + this.labels.p_max = this.labels.w_max / this.coords.w_rs * 100; + }, + + /** + * Measure labels width and X in percent + */ + calcLabels: function () { + if (!this.coords.w_rs || this.options.hide_from_to) { + return; + } + + if (this.options.type === "single") { + + this.labels.w_single = this.$cache.single.outerWidth(false); + this.labels.p_single_fake = this.labels.w_single / this.coords.w_rs * 100; + this.labels.p_single_left = this.coords.p_single_fake + (this.coords.p_handle / 2) - (this.labels.p_single_fake / 2); + this.labels.p_single_left = this.checkEdges(this.labels.p_single_left, this.labels.p_single_fake); + + } else { + + this.labels.w_from = this.$cache.from.outerWidth(false); + this.labels.p_from_fake = this.labels.w_from / this.coords.w_rs * 100; + this.labels.p_from_left = this.coords.p_from_fake + (this.coords.p_handle / 2) - (this.labels.p_from_fake / 2); + this.labels.p_from_left = this.toFixed(this.labels.p_from_left); + this.labels.p_from_left = this.checkEdges(this.labels.p_from_left, this.labels.p_from_fake); + + this.labels.w_to = this.$cache.to.outerWidth(false); + this.labels.p_to_fake = this.labels.w_to / this.coords.w_rs * 100; + this.labels.p_to_left = this.coords.p_to_fake + (this.coords.p_handle / 2) - (this.labels.p_to_fake / 2); + this.labels.p_to_left = this.toFixed(this.labels.p_to_left); + this.labels.p_to_left = this.checkEdges(this.labels.p_to_left, this.labels.p_to_fake); + + this.labels.w_single = this.$cache.single.outerWidth(false); + this.labels.p_single_fake = this.labels.w_single / this.coords.w_rs * 100; + this.labels.p_single_left = ((this.labels.p_from_left + this.labels.p_to_left + this.labels.p_to_fake) / 2) - (this.labels.p_single_fake / 2); + this.labels.p_single_left = this.toFixed(this.labels.p_single_left); + this.labels.p_single_left = this.checkEdges(this.labels.p_single_left, this.labels.p_single_fake); + + } + }, + + + + // ============================================================================================================= + // Drawings + + /** + * Main function called in request animation frame + * to update everything + */ + updateScene: function () { + if (this.raf_id) { + cancelAnimationFrame(this.raf_id); + this.raf_id = null; + } + + clearTimeout(this.update_tm); + this.update_tm = null; + + if (!this.options) { + return; + } + + this.drawHandles(); + + if (this.is_active) { + this.raf_id = requestAnimationFrame(this.updateScene.bind(this)); + } else { + this.update_tm = setTimeout(this.updateScene.bind(this), 300); + } + }, + + /** + * Draw handles + */ + drawHandles: function () { + this.coords.w_rs = this.$cache.rs.outerWidth(false); + + if (!this.coords.w_rs) { + return; + } + + if (this.coords.w_rs !== this.coords.w_rs_old) { + this.target = "base"; + this.is_resize = true; + } + + if (this.coords.w_rs !== this.coords.w_rs_old || this.force_redraw) { + this.setMinMax(); + this.calc(true); + this.drawLabels(); + if (this.options.grid) { + this.calcGridMargin(); + this.calcGridLabels(); + } + this.force_redraw = true; + this.coords.w_rs_old = this.coords.w_rs; + this.drawShadow(); + } + + if (!this.coords.w_rs) { + return; + } + + if (!this.dragging && !this.force_redraw && !this.is_key) { + return; + } + + if (this.old_from !== this.result.from || this.old_to !== this.result.to || this.force_redraw || this.is_key) { + + this.drawLabels(); + + this.$cache.bar[0].style.left = this.coords.p_bar_x + "%"; + this.$cache.bar[0].style.width = this.coords.p_bar_w + "%"; + + if (this.options.type === "single") { + this.$cache.s_single[0].style.left = this.coords.p_single_fake + "%"; + + this.$cache.single[0].style.left = this.labels.p_single_left + "%"; + } else { + this.$cache.s_from[0].style.left = this.coords.p_from_fake + "%"; + this.$cache.s_to[0].style.left = this.coords.p_to_fake + "%"; + + if (this.old_from !== this.result.from || this.force_redraw) { + this.$cache.from[0].style.left = this.labels.p_from_left + "%"; + } + if (this.old_to !== this.result.to || this.force_redraw) { + this.$cache.to[0].style.left = this.labels.p_to_left + "%"; + } + + this.$cache.single[0].style.left = this.labels.p_single_left + "%"; + } + + this.writeToInput(); + + if ((this.old_from !== this.result.from || this.old_to !== this.result.to) && !this.is_start) { + this.$cache.input.trigger("change"); + this.$cache.input.trigger("input"); + } + + this.old_from = this.result.from; + this.old_to = this.result.to; + + // callbacks call + if (!this.is_resize && !this.is_update && !this.is_start && !this.is_finish) { + this.callOnChange(); + } + if (this.is_key || this.is_click) { + this.is_key = false; + this.is_click = false; + this.callOnFinish(); + } + + this.is_update = false; + this.is_resize = false; + this.is_finish = false; + } + + this.is_start = false; + this.is_key = false; + this.is_click = false; + this.force_redraw = false; + }, + + /** + * Draw labels + * measure labels collisions + * collapse close labels + */ + drawLabels: function () { + if (!this.options) { + return; + } + + var values_num = this.options.values.length; + var p_values = this.options.p_values; + var text_single; + var text_from; + var text_to; + var from_pretty; + var to_pretty; + + if (this.options.hide_from_to) { + return; + } + + if (this.options.type === "single") { + + if (values_num) { + text_single = this.decorate(p_values[this.result.from]); + this.$cache.single.html(text_single); + } else { + from_pretty = this._prettify(this.result.from); + + text_single = this.decorate(from_pretty, this.result.from); + this.$cache.single.html(text_single); + } + + this.calcLabels(); + + if (this.labels.p_single_left < this.labels.p_min + 1) { + this.$cache.min[0].style.visibility = "hidden"; + } else { + this.$cache.min[0].style.visibility = "visible"; + } + + if (this.labels.p_single_left + this.labels.p_single_fake > 100 - this.labels.p_max - 1) { + this.$cache.max[0].style.visibility = "hidden"; + } else { + this.$cache.max[0].style.visibility = "visible"; + } + + } else { + + if (values_num) { + + if (this.options.decorate_both) { + text_single = this.decorate(p_values[this.result.from]); + text_single += this.options.values_separator; + text_single += this.decorate(p_values[this.result.to]); + } else { + text_single = this.decorate(p_values[this.result.from] + this.options.values_separator + p_values[this.result.to]); + } + text_from = this.decorate(p_values[this.result.from]); + text_to = this.decorate(p_values[this.result.to]); + + this.$cache.single.html(text_single); + this.$cache.from.html(text_from); + this.$cache.to.html(text_to); + + } else { + from_pretty = this._prettify(this.result.from); + to_pretty = this._prettify(this.result.to); + + if (this.options.decorate_both) { + text_single = this.decorate(from_pretty, this.result.from); + text_single += this.options.values_separator; + text_single += this.decorate(to_pretty, this.result.to); + } else { + text_single = this.decorate(from_pretty + this.options.values_separator + to_pretty, this.result.to); + } + text_from = this.decorate(from_pretty, this.result.from); + text_to = this.decorate(to_pretty, this.result.to); + + this.$cache.single.html(text_single); + this.$cache.from.html(text_from); + this.$cache.to.html(text_to); + + } + + this.calcLabels(); + + var min = Math.min(this.labels.p_single_left, this.labels.p_from_left), + single_left = this.labels.p_single_left + this.labels.p_single_fake, + to_left = this.labels.p_to_left + this.labels.p_to_fake, + max = Math.max(single_left, to_left); + + if (this.labels.p_from_left + this.labels.p_from_fake >= this.labels.p_to_left) { + this.$cache.from[0].style.visibility = "hidden"; + this.$cache.to[0].style.visibility = "hidden"; + this.$cache.single[0].style.visibility = "visible"; + + if (this.result.from === this.result.to) { + if (this.target === "from") { + this.$cache.from[0].style.visibility = "visible"; + } else if (this.target === "to") { + this.$cache.to[0].style.visibility = "visible"; + } else if (!this.target) { + this.$cache.from[0].style.visibility = "visible"; + } + this.$cache.single[0].style.visibility = "hidden"; + max = to_left; + } else { + this.$cache.from[0].style.visibility = "hidden"; + this.$cache.to[0].style.visibility = "hidden"; + this.$cache.single[0].style.visibility = "visible"; + max = Math.max(single_left, to_left); + } + } else { + this.$cache.from[0].style.visibility = "visible"; + this.$cache.to[0].style.visibility = "visible"; + this.$cache.single[0].style.visibility = "hidden"; + } + + if (min < this.labels.p_min + 1) { + this.$cache.min[0].style.visibility = "hidden"; + } else { + this.$cache.min[0].style.visibility = "visible"; + } + + if (max > 100 - this.labels.p_max - 1) { + this.$cache.max[0].style.visibility = "hidden"; + } else { + this.$cache.max[0].style.visibility = "visible"; + } + + } + }, + + /** + * Draw shadow intervals + */ + drawShadow: function () { + var o = this.options, + c = this.$cache, + + is_from_min = typeof o.from_min === "number" && !isNaN(o.from_min), + is_from_max = typeof o.from_max === "number" && !isNaN(o.from_max), + is_to_min = typeof o.to_min === "number" && !isNaN(o.to_min), + is_to_max = typeof o.to_max === "number" && !isNaN(o.to_max), + + from_min, + from_max, + to_min, + to_max; + + if (o.type === "single") { + if (o.from_shadow && (is_from_min || is_from_max)) { + from_min = this.convertToPercent(is_from_min ? o.from_min : o.min); + from_max = this.convertToPercent(is_from_max ? o.from_max : o.max) - from_min; + from_min = this.toFixed(from_min - (this.coords.p_handle / 100 * from_min)); + from_max = this.toFixed(from_max - (this.coords.p_handle / 100 * from_max)); + from_min = from_min + (this.coords.p_handle / 2); + + c.shad_single[0].style.display = "block"; + c.shad_single[0].style.left = from_min + "%"; + c.shad_single[0].style.width = from_max + "%"; + } else { + c.shad_single[0].style.display = "none"; + } + } else { + if (o.from_shadow && (is_from_min || is_from_max)) { + from_min = this.convertToPercent(is_from_min ? o.from_min : o.min); + from_max = this.convertToPercent(is_from_max ? o.from_max : o.max) - from_min; + from_min = this.toFixed(from_min - (this.coords.p_handle / 100 * from_min)); + from_max = this.toFixed(from_max - (this.coords.p_handle / 100 * from_max)); + from_min = from_min + (this.coords.p_handle / 2); + + c.shad_from[0].style.display = "block"; + c.shad_from[0].style.left = from_min + "%"; + c.shad_from[0].style.width = from_max + "%"; + } else { + c.shad_from[0].style.display = "none"; + } + + if (o.to_shadow && (is_to_min || is_to_max)) { + to_min = this.convertToPercent(is_to_min ? o.to_min : o.min); + to_max = this.convertToPercent(is_to_max ? o.to_max : o.max) - to_min; + to_min = this.toFixed(to_min - (this.coords.p_handle / 100 * to_min)); + to_max = this.toFixed(to_max - (this.coords.p_handle / 100 * to_max)); + to_min = to_min + (this.coords.p_handle / 2); + + c.shad_to[0].style.display = "block"; + c.shad_to[0].style.left = to_min + "%"; + c.shad_to[0].style.width = to_max + "%"; + } else { + c.shad_to[0].style.display = "none"; + } + } + }, + + + + /** + * Write values to input element + */ + writeToInput: function () { + if (this.options.type === "single") { + if (this.options.values.length) { + this.$cache.input.prop("value", this.result.from_value); + } else { + this.$cache.input.prop("value", this.result.from); + } + this.$cache.input.data("from", this.result.from); + } else { + if (this.options.values.length) { + this.$cache.input.prop("value", this.result.from_value + this.options.input_values_separator + this.result.to_value); + } else { + this.$cache.input.prop("value", this.result.from + this.options.input_values_separator + this.result.to); + } + this.$cache.input.data("from", this.result.from); + this.$cache.input.data("to", this.result.to); + } + }, + + + + // ============================================================================================================= + // Callbacks + + callOnStart: function () { + this.writeToInput(); + + if (this.options.onStart && typeof this.options.onStart === "function") { + if (this.options.scope) { + this.options.onStart.call(this.options.scope, this.result); + } else { + this.options.onStart(this.result); + } + } + }, + callOnChange: function () { + this.writeToInput(); + + if (this.options.onChange && typeof this.options.onChange === "function") { + if (this.options.scope) { + this.options.onChange.call(this.options.scope, this.result); + } else { + this.options.onChange(this.result); + } + } + }, + callOnFinish: function () { + this.writeToInput(); + + if (this.options.onFinish && typeof this.options.onFinish === "function") { + if (this.options.scope) { + this.options.onFinish.call(this.options.scope, this.result); + } else { + this.options.onFinish(this.result); + } + } + }, + callOnUpdate: function () { + this.writeToInput(); + + if (this.options.onUpdate && typeof this.options.onUpdate === "function") { + if (this.options.scope) { + this.options.onUpdate.call(this.options.scope, this.result); + } else { + this.options.onUpdate(this.result); + } + } + }, + + + + + // ============================================================================================================= + // Service methods + + toggleInput: function () { + this.$cache.input.toggleClass("irs-hidden-input"); + + if (this.has_tab_index) { + this.$cache.input.prop("tabindex", -1); + } else { + this.$cache.input.removeProp("tabindex"); + } + + this.has_tab_index = !this.has_tab_index; + }, + + /** + * Convert real value to percent + * + * @param value {Number} X in real + * @param no_min {boolean=} don't use min value + * @returns {Number} X in percent + */ + convertToPercent: function (value, no_min) { + var diapason = this.options.max - this.options.min, + one_percent = diapason / 100, + val, percent; + + if (!diapason) { + this.no_diapason = true; + return 0; + } + + if (no_min) { + val = value; + } else { + val = value - this.options.min; + } + + percent = val / one_percent; + + return this.toFixed(percent); + }, + + /** + * Convert percent to real values + * + * @param percent {Number} X in percent + * @returns {Number} X in real + */ + convertToValue: function (percent) { + var min = this.options.min, + max = this.options.max, + min_decimals = min.toString().split(".")[1], + max_decimals = max.toString().split(".")[1], + min_length, max_length, + avg_decimals = 0, + abs = 0; + + if (percent === 0) { + return this.options.min; + } + if (percent === 100) { + return this.options.max; + } + + + if (min_decimals) { + min_length = min_decimals.length; + avg_decimals = min_length; + } + if (max_decimals) { + max_length = max_decimals.length; + avg_decimals = max_length; + } + if (min_length && max_length) { + avg_decimals = (min_length >= max_length) ? min_length : max_length; + } + + if (min < 0) { + abs = Math.abs(min); + min = +(min + abs).toFixed(avg_decimals); + max = +(max + abs).toFixed(avg_decimals); + } + + var number = ((max - min) / 100 * percent) + min, + string = this.options.step.toString().split(".")[1], + result; + + if (string) { + number = +number.toFixed(string.length); + } else { + number = number / this.options.step; + number = number * this.options.step; + + number = +number.toFixed(0); + } + + if (abs) { + number -= abs; + } + + if (string) { + result = +number.toFixed(string.length); + } else { + result = this.toFixed(number); + } + + if (result < this.options.min) { + result = this.options.min; + } else if (result > this.options.max) { + result = this.options.max; + } + + return result; + }, + + /** + * Round percent value with step + * + * @param percent {Number} + * @returns percent {Number} rounded + */ + calcWithStep: function (percent) { + var rounded = Math.round(percent / this.coords.p_step) * this.coords.p_step; + + if (rounded > 100) { + rounded = 100; + } + if (percent === 100) { + rounded = 100; + } + + return this.toFixed(rounded); + }, + + checkMinInterval: function (p_current, p_next, type) { + var o = this.options, + current, + next; + + if (!o.min_interval) { + return p_current; + } + + current = this.convertToValue(p_current); + next = this.convertToValue(p_next); + + if (type === "from") { + + if (next - current < o.min_interval) { + current = next - o.min_interval; + } + + } else { + + if (current - next < o.min_interval) { + current = next + o.min_interval; + } + + } + + return this.convertToPercent(current); + }, + + checkMaxInterval: function (p_current, p_next, type) { + var o = this.options, + current, + next; + + if (!o.max_interval) { + return p_current; + } + + current = this.convertToValue(p_current); + next = this.convertToValue(p_next); + + if (type === "from") { + + if (next - current > o.max_interval) { + current = next - o.max_interval; + } + + } else { + + if (current - next > o.max_interval) { + current = next + o.max_interval; + } + + } + + return this.convertToPercent(current); + }, + + checkDiapason: function (p_num, min, max) { + var num = this.convertToValue(p_num), + o = this.options; + + if (typeof min !== "number") { + min = o.min; + } + + if (typeof max !== "number") { + max = o.max; + } + + if (num < min) { + num = min; + } + + if (num > max) { + num = max; + } + + return this.convertToPercent(num); + }, + + toFixed: function (num) { + num = num.toFixed(20); + return +num; + }, + + _prettify: function (num) { + if (!this.options.prettify_enabled) { + return num; + } + + if (this.options.prettify && typeof this.options.prettify === "function") { + return this.options.prettify(num); + } else { + return this.prettify(num); + } + }, + + prettify: function (num) { + var n = num.toString(); + return n.replace(/(\d{1,3}(?=(?:\d\d\d)+(?!\d)))/g, "$1" + this.options.prettify_separator); + }, + + checkEdges: function (left, width) { + if (!this.options.force_edges) { + return this.toFixed(left); + } + + if (left < 0) { + left = 0; + } else if (left > 100 - width) { + left = 100 - width; + } + + return this.toFixed(left); + }, + + validate: function () { + var o = this.options, + r = this.result, + v = o.values, + vl = v.length, + value, + i; + + if (typeof o.min === "string") o.min = +o.min; + if (typeof o.max === "string") o.max = +o.max; + if (typeof o.from === "string") o.from = +o.from; + if (typeof o.to === "string") o.to = +o.to; + if (typeof o.step === "string") o.step = +o.step; + + if (typeof o.from_min === "string") o.from_min = +o.from_min; + if (typeof o.from_max === "string") o.from_max = +o.from_max; + if (typeof o.to_min === "string") o.to_min = +o.to_min; + if (typeof o.to_max === "string") o.to_max = +o.to_max; + + if (typeof o.grid_num === "string") o.grid_num = +o.grid_num; + + if (o.max < o.min) { + o.max = o.min; + } + + if (vl) { + o.p_values = []; + o.min = 0; + o.max = vl - 1; + o.step = 1; + o.grid_num = o.max; + o.grid_snap = true; + + for (i = 0; i < vl; i++) { + value = +v[i]; + + if (!isNaN(value)) { + v[i] = value; + value = this._prettify(value); + } else { + value = v[i]; + } + + o.p_values.push(value); + } + } + + if (typeof o.from !== "number" || isNaN(o.from)) { + o.from = o.min; + } + + if (typeof o.to !== "number" || isNaN(o.to)) { + o.to = o.max; + } + + if (o.type === "single") { + + if (o.from < o.min) o.from = o.min; + if (o.from > o.max) o.from = o.max; + + } else { + + if (o.from < o.min) o.from = o.min; + if (o.from > o.max) o.from = o.max; + + if (o.to < o.min) o.to = o.min; + if (o.to > o.max) o.to = o.max; + + if (this.update_check.from) { + + if (this.update_check.from !== o.from) { + if (o.from > o.to) o.from = o.to; + } + if (this.update_check.to !== o.to) { + if (o.to < o.from) o.to = o.from; + } + + } + + if (o.from > o.to) o.from = o.to; + if (o.to < o.from) o.to = o.from; + + } + + if (typeof o.step !== "number" || isNaN(o.step) || !o.step || o.step < 0) { + o.step = 1; + } + + if (typeof o.from_min === "number" && o.from < o.from_min) { + o.from = o.from_min; + } + + if (typeof o.from_max === "number" && o.from > o.from_max) { + o.from = o.from_max; + } + + if (typeof o.to_min === "number" && o.to < o.to_min) { + o.to = o.to_min; + } + + if (typeof o.to_max === "number" && o.from > o.to_max) { + o.to = o.to_max; + } + + if (r) { + if (r.min !== o.min) { + r.min = o.min; + } + + if (r.max !== o.max) { + r.max = o.max; + } + + if (r.from < r.min || r.from > r.max) { + r.from = o.from; + } + + if (r.to < r.min || r.to > r.max) { + r.to = o.to; + } + } + + if (typeof o.min_interval !== "number" || isNaN(o.min_interval) || !o.min_interval || o.min_interval < 0) { + o.min_interval = 0; + } + + if (typeof o.max_interval !== "number" || isNaN(o.max_interval) || !o.max_interval || o.max_interval < 0) { + o.max_interval = 0; + } + + if (o.min_interval && o.min_interval > o.max - o.min) { + o.min_interval = o.max - o.min; + } + + if (o.max_interval && o.max_interval > o.max - o.min) { + o.max_interval = o.max - o.min; + } + }, + + decorate: function (num, original) { + var decorated = "", + o = this.options; + + if (o.prefix) { + decorated += o.prefix; + } + + decorated += num; + + if (o.max_postfix) { + if (o.values.length && num === o.p_values[o.max]) { + decorated += o.max_postfix; + if (o.postfix) { + decorated += " "; + } + } else if (original === o.max) { + decorated += o.max_postfix; + if (o.postfix) { + decorated += " "; + } + } + } + + if (o.postfix) { + decorated += o.postfix; + } + + return decorated; + }, + + updateFrom: function () { + this.result.from = this.options.from; + this.result.from_percent = this.convertToPercent(this.result.from); + this.result.from_pretty = this._prettify(this.result.from); + if (this.options.values) { + this.result.from_value = this.options.values[this.result.from]; + } + }, + + updateTo: function () { + this.result.to = this.options.to; + this.result.to_percent = this.convertToPercent(this.result.to); + this.result.to_pretty = this._prettify(this.result.to); + if (this.options.values) { + this.result.to_value = this.options.values[this.result.to]; + } + }, + + updateResult: function () { + this.result.min = this.options.min; + this.result.max = this.options.max; + this.updateFrom(); + this.updateTo(); + }, + + + // ============================================================================================================= + // Grid + + appendGrid: function () { + if (!this.options.grid) { + return; + } + + var o = this.options, + i, z, + + total = o.max - o.min, + big_num = o.grid_num, + big_p = 0, + big_w = 0, + + small_max = 4, + local_small_max, + small_p, + small_w = 0, + + result, + html = ''; + + + + this.calcGridMargin(); + + if (o.grid_snap) { + + if (total > 50) { + big_num = 50 / o.step; + big_p = this.toFixed(o.step / 0.5); + } else { + big_num = total / o.step; + big_p = this.toFixed(o.step / (total / 100)); + } + + } else { + big_p = this.toFixed(100 / big_num); + } + + if (big_num > 4) { + small_max = 3; + } + if (big_num > 7) { + small_max = 2; + } + if (big_num > 14) { + small_max = 1; + } + if (big_num > 28) { + small_max = 0; + } + + for (i = 0; i < big_num + 1; i++) { + local_small_max = small_max; + + big_w = this.toFixed(big_p * i); + + if (big_w > 100) { + big_w = 100; + } + this.coords.big[i] = big_w; + + small_p = (big_w - (big_p * (i - 1))) / (local_small_max + 1); + + for (z = 1; z <= local_small_max; z++) { + if (big_w === 0) { + break; + } + + small_w = this.toFixed(big_w - (small_p * z)); + + html += ''; + } + + html += ''; + + result = this.convertToValue(big_w); + if (o.values.length) { + result = o.p_values[result]; + } else { + result = this._prettify(result); + } + + html += '' + result + ''; + } + this.coords.big_num = Math.ceil(big_num + 1); + + + + this.$cache.cont.addClass("irs-with-grid"); + this.$cache.grid.html(html); + this.cacheGridLabels(); + }, + + cacheGridLabels: function () { + var $label, i, + num = this.coords.big_num; + + for (i = 0; i < num; i++) { + $label = this.$cache.grid.find(".js-grid-text-" + i); + this.$cache.grid_labels.push($label); + } + + this.calcGridLabels(); + }, + + calcGridLabels: function () { + var i, label, start = [], finish = [], + num = this.coords.big_num; + + for (i = 0; i < num; i++) { + this.coords.big_w[i] = this.$cache.grid_labels[i].outerWidth(false); + this.coords.big_p[i] = this.toFixed(this.coords.big_w[i] / this.coords.w_rs * 100); + this.coords.big_x[i] = this.toFixed(this.coords.big_p[i] / 2); + + start[i] = this.toFixed(this.coords.big[i] - this.coords.big_x[i]); + finish[i] = this.toFixed(start[i] + this.coords.big_p[i]); + } + + if (this.options.force_edges) { + if (start[0] < -this.coords.grid_gap) { + start[0] = -this.coords.grid_gap; + finish[0] = this.toFixed(start[0] + this.coords.big_p[0]); + + this.coords.big_x[0] = this.coords.grid_gap; + } + + if (finish[num - 1] > 100 + this.coords.grid_gap) { + finish[num - 1] = 100 + this.coords.grid_gap; + start[num - 1] = this.toFixed(finish[num - 1] - this.coords.big_p[num - 1]); + + this.coords.big_x[num - 1] = this.toFixed(this.coords.big_p[num - 1] - this.coords.grid_gap); + } + } + + this.calcGridCollision(2, start, finish); + this.calcGridCollision(4, start, finish); + + for (i = 0; i < num; i++) { + label = this.$cache.grid_labels[i][0]; + + if (this.coords.big_x[i] !== Number.POSITIVE_INFINITY) { + label.style.marginLeft = -this.coords.big_x[i] + "%"; + } + } + }, + + // Collisions Calc Beta + // TODO: Refactor then have plenty of time + calcGridCollision: function (step, start, finish) { + var i, next_i, label, + num = this.coords.big_num; + + for (i = 0; i < num; i += step) { + next_i = i + (step / 2); + if (next_i >= num) { + break; + } + + label = this.$cache.grid_labels[next_i][0]; + + if (finish[i] <= start[next_i]) { + label.style.visibility = "visible"; + } else { + label.style.visibility = "hidden"; + } + } + }, + + calcGridMargin: function () { + if (!this.options.grid_margin) { + return; + } + + this.coords.w_rs = this.$cache.rs.outerWidth(false); + if (!this.coords.w_rs) { + return; + } + + if (this.options.type === "single") { + this.coords.w_handle = this.$cache.s_single.outerWidth(false); + } else { + this.coords.w_handle = this.$cache.s_from.outerWidth(false); + } + this.coords.p_handle = this.toFixed(this.coords.w_handle / this.coords.w_rs * 100); + this.coords.grid_gap = this.toFixed((this.coords.p_handle / 2) - 0.1); + + this.$cache.grid[0].style.width = this.toFixed(100 - this.coords.p_handle) + "%"; + this.$cache.grid[0].style.left = this.coords.grid_gap + "%"; + }, + + + + // ============================================================================================================= + // Public methods + + update: function (options) { + if (!this.input) { + return; + } + + this.is_update = true; + + this.options.from = this.result.from; + this.options.to = this.result.to; + this.update_check.from = this.result.from; + this.update_check.to = this.result.to; + + this.options = $.extend(this.options, options); + this.validate(); + this.updateResult(options); + + this.toggleInput(); + this.remove(); + this.init(true); + }, + + reset: function () { + if (!this.input) { + return; + } + + this.updateResult(); + this.update(); + }, + + destroy: function () { + if (!this.input) { + return; + } + + this.toggleInput(); + this.$cache.input.prop("readonly", false); + $.data(this.input, "ionRangeSlider", null); + + this.remove(); + this.input = null; + this.options = null; + } + }; + + $.fn.ionRangeSlider = function (options) { + return this.each(function() { + if (!$.data(this, "ionRangeSlider")) { + $.data(this, "ionRangeSlider", new IonRangeSlider(this, options, plugin_count++)); + } + }); + }; + + + + // ================================================================================================================= + // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ + // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating + + // requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel + + // MIT license + + (function() { + var lastTime = 0; + var vendors = ['ms', 'moz', 'webkit', '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); + }; + }()); + +})); + +"use strict"; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* + * + * More info at [www.dropzonejs.com](http://www.dropzonejs.com) + * + * Copyright (c) 2012, Matias Meno + * + * 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. + * + */ + +// The Emitter class provides the ability to call `.on()` on Dropzone to listen +// to events. +// It is strongly based on component's emitter class, and I removed the +// functionality because of the dependency hell with different frameworks. +var Emitter = function () { + function Emitter() { + _classCallCheck(this, Emitter); + } + + _createClass(Emitter, [{ + key: "on", + + // Add an event listener for given event + value: function on(event, fn) { + this._callbacks = this._callbacks || {}; + // Create namespace for this event + if (!this._callbacks[event]) { + this._callbacks[event] = []; + } + this._callbacks[event].push(fn); + return this; + } + }, { + key: "emit", + value: function emit(event) { + this._callbacks = this._callbacks || {}; + var callbacks = this._callbacks[event]; + + if (callbacks) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + for (var _iterator = callbacks, _isArray = true, _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var callback = _ref; + + callback.apply(this, args); + } + } + + return this; + } + + // Remove event listener for given event. If fn is not provided, all event + // listeners for that event will be removed. If neither is provided, all + // event listeners will be removed. + + }, { + key: "off", + value: function off(event, fn) { + if (!this._callbacks || arguments.length === 0) { + this._callbacks = {}; + return this; + } + + // specific event + var callbacks = this._callbacks[event]; + if (!callbacks) { + return this; + } + + // remove all handlers + if (arguments.length === 1) { + delete this._callbacks[event]; + return this; + } + + // remove specific handler + for (var i = 0; i < callbacks.length; i++) { + var callback = callbacks[i]; + if (callback === fn) { + callbacks.splice(i, 1); + break; + } + } + + return this; + } + }]); + + return Emitter; +}(); + +var Dropzone = function (_Emitter) { + _inherits(Dropzone, _Emitter); + + _createClass(Dropzone, null, [{ + key: "initClass", + value: function initClass() { + + // Exposing the emitter class, mainly for tests + this.prototype.Emitter = Emitter; + + /* + This is a list of all available events you can register on a dropzone object. + You can register an event handler like this: + dropzone.on("dragEnter", function() { }); + */ + this.prototype.events = ["drop", "dragstart", "dragend", "dragenter", "dragover", "dragleave", "addedfile", "addedfiles", "removedfile", "thumbnail", "error", "errormultiple", "processing", "processingmultiple", "uploadprogress", "totaluploadprogress", "sending", "sendingmultiple", "success", "successmultiple", "canceled", "canceledmultiple", "complete", "completemultiple", "reset", "maxfilesexceeded", "maxfilesreached", "queuecomplete"]; + + this.prototype.defaultOptions = { + /** + * Has to be specified on elements other than form (or when the form + * doesn't have an `action` attribute). You can also + * provide a function that will be called with `files` and + * must return the url (since `v3.12.0`) + */ + url: null, + + /** + * Can be changed to `"put"` if necessary. You can also provide a function + * that will be called with `files` and must return the method (since `v3.12.0`). + */ + method: "post", + + /** + * Will be set on the XHRequest. + */ + withCredentials: false, + + /** + * The timeout for the XHR requests in milliseconds (since `v4.4.0`). + */ + timeout: 30000, + + /** + * How many file uploads to process in parallel (See the + * Enqueuing file uploads* documentation section for more info) + */ + parallelUploads: 2, + + /** + * Whether to send multiple files in one request. If + * this it set to true, then the fallback file input element will + * have the `multiple` attribute as well. This option will + * also trigger additional events (like `processingmultiple`). See the events + * documentation section for more information. + */ + uploadMultiple: false, + + /** + * Whether you want files to be uploaded in chunks to your server. This can't be + * used in combination with `uploadMultiple`. + * + * See [chunksUploaded](#config-chunksUploaded) for the callback to finalise an upload. + */ + chunking: false, + + /** + * If `chunking` is enabled, this defines whether **every** file should be chunked, + * even if the file size is below chunkSize. This means, that the additional chunk + * form data will be submitted and the `chunksUploaded` callback will be invoked. + */ + forceChunking: false, + + /** + * If `chunking` is `true`, then this defines the chunk size in bytes. + */ + chunkSize: 2000000, + + /** + * If `true`, the individual chunks of a file are being uploaded simultaneously. + */ + parallelChunkUploads: false, + + /** + * Whether a chunk should be retried if it fails. + */ + retryChunks: false, + + /** + * If `retryChunks` is true, how many times should it be retried. + */ + retryChunksLimit: 3, + + /** + * If not `null` defines how many files this Dropzone handles. If it exceeds, + * the event `maxfilesexceeded` will be called. The dropzone element gets the + * class `dz-max-files-reached` accordingly so you can provide visual feedback. + */ + maxFilesize: 256, + + /** + * The name of the file param that gets transferred. + * **NOTE**: If you have the option `uploadMultiple` set to `true`, then + * Dropzone will append `[]` to the name. + */ + paramName: "file", + + /** + * Whether thumbnails for images should be generated + */ + createImageThumbnails: true, + + /** + * In MB. When the filename exceeds this limit, the thumbnail will not be generated. + */ + maxThumbnailFilesize: 10, + + /** + * If `null`, the ratio of the image will be used to calculate it. + */ + thumbnailWidth: 120, + + /** + * The same as `thumbnailWidth`. If both are null, images will not be resized. + */ + thumbnailHeight: 120, + + /** + * How the images should be scaled down in case both, `thumbnailWidth` and `thumbnailHeight` are provided. + * Can be either `contain` or `crop`. + */ + thumbnailMethod: 'crop', + + /** + * If set, images will be resized to these dimensions before being **uploaded**. + * If only one, `resizeWidth` **or** `resizeHeight` is provided, the original aspect + * ratio of the file will be preserved. + * + * The `options.transformFile` function uses these options, so if the `transformFile` function + * is overridden, these options don't do anything. + */ + resizeWidth: null, + + /** + * See `resizeWidth`. + */ + resizeHeight: null, + + /** + * The mime type of the resized image (before it gets uploaded to the server). + * If `null` the original mime type will be used. To force jpeg, for example, use `image/jpeg`. + * See `resizeWidth` for more information. + */ + resizeMimeType: null, + + /** + * The quality of the resized images. See `resizeWidth`. + */ + resizeQuality: 0.8, + + /** + * How the images should be scaled down in case both, `resizeWidth` and `resizeHeight` are provided. + * Can be either `contain` or `crop`. + */ + resizeMethod: 'contain', + + /** + * The base that is used to calculate the filesize. You can change this to + * 1024 if you would rather display kibibytes, mebibytes, etc... + * 1024 is technically incorrect, because `1024 bytes` are `1 kibibyte` not `1 kilobyte`. + * You can change this to `1024` if you don't care about validity. + */ + filesizeBase: 1000, + + /** + * Can be used to limit the maximum number of files that will be handled by this Dropzone + */ + maxFiles: null, + + /** + * An optional object to send additional headers to the server. Eg: + * `{ "My-Awesome-Header": "header value" }` + */ + headers: null, + + /** + * If `true`, the dropzone element itself will be clickable, if `false` + * nothing will be clickable. + * + * You can also pass an HTML element, a CSS selector (for multiple elements) + * or an array of those. In that case, all of those elements will trigger an + * upload when clicked. + */ + clickable: true, + + /** + * Whether hidden files in directories should be ignored. + */ + ignoreHiddenFiles: true, + + /** + * The default implementation of `accept` checks the file's mime type or + * extension against this list. This is a comma separated list of mime + * types or file extensions. + * + * Eg.: `image/*,application/pdf,.psd` + * + * If the Dropzone is `clickable` this option will also be used as + * [`accept`](https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept) + * parameter on the hidden file input as well. + */ + acceptedFiles: null, + + /** + * **Deprecated!** + * Use acceptedFiles instead. + */ + acceptedMimeTypes: null, + + /** + * If false, files will be added to the queue but the queue will not be + * processed automatically. + * This can be useful if you need some additional user input before sending + * files (or if you want want all files sent at once). + * If you're ready to send the file simply call `myDropzone.processQueue()`. + * + * See the [enqueuing file uploads](#enqueuing-file-uploads) documentation + * section for more information. + */ + autoProcessQueue: true, + + /** + * If false, files added to the dropzone will not be queued by default. + * You'll have to call `enqueueFile(file)` manually. + */ + autoQueue: true, + + /** + * If `true`, this will add a link to every file preview to remove or cancel (if + * already uploading) the file. The `dictCancelUpload`, `dictCancelUploadConfirmation` + * and `dictRemoveFile` options are used for the wording. + */ + addRemoveLinks: false, + + /** + * Defines where to display the file previews – if `null` the + * Dropzone element itself is used. Can be a plain `HTMLElement` or a CSS + * selector. The element should have the `dropzone-previews` class so + * the previews are displayed properly. + */ + previewsContainer: null, + + /** + * This is the element the hidden input field (which is used when clicking on the + * dropzone to trigger file selection) will be appended to. This might + * be important in case you use frameworks to switch the content of your page. + */ + hiddenInputContainer: "body", + + /** + * If null, no capture type will be specified + * If camera, mobile devices will skip the file selection and choose camera + * If microphone, mobile devices will skip the file selection and choose the microphone + * If camcorder, mobile devices will skip the file selection and choose the camera in video mode + * On apple devices multiple must be set to false. AcceptedFiles may need to + * be set to an appropriate mime type (e.g. "image/*", "audio/*", or "video/*"). + */ + capture: null, + + /** + * **Deprecated**. Use `renameFile` instead. + */ + renameFilename: null, + + /** + * A function that is invoked before the file is uploaded to the server and renames the file. + * This function gets the `File` as argument and can use the `file.name`. The actual name of the + * file that gets used during the upload can be accessed through `file.upload.filename`. + */ + renameFile: null, + + /** + * If `true` the fallback will be forced. This is very useful to test your server + * implementations first and make sure that everything works as + * expected without dropzone if you experience problems, and to test + * how your fallbacks will look. + */ + forceFallback: false, + + /** + * The text used before any files are dropped. + */ + dictDefaultMessage: "Drop files here to upload", + + /** + * The text that replaces the default message text it the browser is not supported. + */ + dictFallbackMessage: "Your browser does not support drag'n'drop file uploads.", + + /** + * The text that will be added before the fallback form. + * If you provide a fallback element yourself, or if this option is `null` this will + * be ignored. + */ + dictFallbackText: "Please use the fallback form below to upload your files like in the olden days.", + + /** + * If the filesize is too big. + * `{{filesize}}` and `{{maxFilesize}}` will be replaced with the respective configuration values. + */ + dictFileTooBig: "File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.", + + /** + * If the file doesn't match the file type. + */ + dictInvalidFileType: "You can't upload files of this type.", + + /** + * If the server response was invalid. + * `{{statusCode}}` will be replaced with the servers status code. + */ + dictResponseError: "Server responded with {{statusCode}} code.", + + /** + * If `addRemoveLinks` is true, the text to be used for the cancel upload link. + */ + dictCancelUpload: "Cancel upload", + + /** + * If `addRemoveLinks` is true, the text to be used for confirmation when cancelling upload. + */ + dictCancelUploadConfirmation: "Are you sure you want to cancel this upload?", + + /** + * If `addRemoveLinks` is true, the text to be used to remove a file. + */ + dictRemoveFile: "Remove file", + + /** + * If this is not null, then the user will be prompted before removing a file. + */ + dictRemoveFileConfirmation: null, + + /** + * Displayed if `maxFiles` is st and exceeded. + * The string `{{maxFiles}}` will be replaced by the configuration value. + */ + dictMaxFilesExceeded: "You can not upload any more files.", + + /** + * Allows you to translate the different units. Starting with `tb` for terabytes and going down to + * `b` for bytes. + */ + dictFileSizeUnits: { tb: "TB", gb: "GB", mb: "MB", kb: "KB", b: "b" }, + + /** + * Called when dropzone initialized + * You can add event listeners here + */ + init: function init() {}, + + + /** + * Can be an **object** of additional parameters to transfer to the server, **or** a `Function` + * that gets invoked with the `files`, `xhr` and, if it's a chunked upload, `chunk` arguments. In case + * of a function, this needs to return a map. + * + * The default implementation does nothing for normal uploads, but adds relevant information for + * chunked uploads. + * + * This is the same as adding hidden input fields in the form element. + */ + params: function params(files, xhr, chunk) { + if (chunk) { + return { + dzuuid: chunk.file.upload.uuid, + dzchunkindex: chunk.index, + dztotalfilesize: chunk.file.size, + dzchunksize: this.options.chunkSize, + dztotalchunkcount: chunk.file.upload.totalChunkCount, + dzchunkbyteoffset: chunk.index * this.options.chunkSize + }; + } + }, + + + /** + * A function that gets a [file](https://developer.mozilla.org/en-US/docs/DOM/File) + * and a `done` function as parameters. + * + * If the done function is invoked without arguments, the file is "accepted" and will + * be processed. If you pass an error message, the file is rejected, and the error + * message will be displayed. + * This function will not be called if the file is too big or doesn't match the mime types. + */ + accept: function accept(file, done) { + return done(); + }, + + + /** + * The callback that will be invoked when all chunks have been uploaded for a file. + * It gets the file for which the chunks have been uploaded as the first parameter, + * and the `done` function as second. `done()` needs to be invoked when everything + * needed to finish the upload process is done. + */ + chunksUploaded: function chunksUploaded(file, done) { + done(); + }, + + /** + * Gets called when the browser is not supported. + * The default implementation shows the fallback input field and adds + * a text. + */ + fallback: function fallback() { + // This code should pass in IE7... :( + var messageElement = void 0; + this.element.className = this.element.className + " dz-browser-not-supported"; + + for (var _iterator2 = this.element.getElementsByTagName("div"), _isArray2 = true, _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + var child = _ref2; + + if (/(^| )dz-message($| )/.test(child.className)) { + messageElement = child; + child.className = "dz-message"; // Removes the 'dz-default' class + break; + } + } + if (!messageElement) { + messageElement = Dropzone.createElement("
          "); + this.element.appendChild(messageElement); + } + + var span = messageElement.getElementsByTagName("span")[0]; + if (span) { + if (span.textContent != null) { + span.textContent = this.options.dictFallbackMessage; + } else if (span.innerText != null) { + span.innerText = this.options.dictFallbackMessage; + } + } + + return this.element.appendChild(this.getFallbackForm()); + }, + + + /** + * Gets called to calculate the thumbnail dimensions. + * + * It gets `file`, `width` and `height` (both may be `null`) as parameters and must return an object containing: + * + * - `srcWidth` & `srcHeight` (required) + * - `trgWidth` & `trgHeight` (required) + * - `srcX` & `srcY` (optional, default `0`) + * - `trgX` & `trgY` (optional, default `0`) + * + * Those values are going to be used by `ctx.drawImage()`. + */ + resize: function resize(file, width, height, resizeMethod) { + var info = { + srcX: 0, + srcY: 0, + srcWidth: file.width, + srcHeight: file.height + }; + + var srcRatio = file.width / file.height; + + // Automatically calculate dimensions if not specified + if (width == null && height == null) { + width = info.srcWidth; + height = info.srcHeight; + } else if (width == null) { + width = height * srcRatio; + } else if (height == null) { + height = width / srcRatio; + } + + // Make sure images aren't upscaled + width = Math.min(width, info.srcWidth); + height = Math.min(height, info.srcHeight); + + var trgRatio = width / height; + + if (info.srcWidth > width || info.srcHeight > height) { + // Image is bigger and needs rescaling + if (resizeMethod === 'crop') { + if (srcRatio > trgRatio) { + info.srcHeight = file.height; + info.srcWidth = info.srcHeight * trgRatio; + } else { + info.srcWidth = file.width; + info.srcHeight = info.srcWidth / trgRatio; + } + } else if (resizeMethod === 'contain') { + // Method 'contain' + if (srcRatio > trgRatio) { + height = width / srcRatio; + } else { + width = height * srcRatio; + } + } else { + throw new Error("Unknown resizeMethod '" + resizeMethod + "'"); + } + } + + info.srcX = (file.width - info.srcWidth) / 2; + info.srcY = (file.height - info.srcHeight) / 2; + + info.trgWidth = width; + info.trgHeight = height; + + return info; + }, + + + /** + * Can be used to transform the file (for example, resize an image if necessary). + * + * The default implementation uses `resizeWidth` and `resizeHeight` (if provided) and resizes + * images according to those dimensions. + * + * Gets the `file` as the first parameter, and a `done()` function as the second, that needs + * to be invoked with the file when the transformation is done. + */ + transformFile: function transformFile(file, done) { + if ((this.options.resizeWidth || this.options.resizeHeight) && file.type.match(/image.*/)) { + return this.resizeImage(file, this.options.resizeWidth, this.options.resizeHeight, this.options.resizeMethod, done); + } else { + return done(file); + } + }, + + + /** + * A string that contains the template used for each dropped + * file. Change it to fulfill your needs but make sure to properly + * provide all elements. + * + * If you want to use an actual HTML element instead of providing a String + * as a config option, you could create a div with the id `tpl`, + * put the template inside it and provide the element like this: + * + * document + * .querySelector('#tpl') + * .innerHTML + * + */ + previewTemplate: "
          \n
          \n
          \n
          \n
          \n
          \n
          \n
          \n
          \n \n Check\n \n \n \n \n \n
          \n
          \n \n Error\n \n \n \n \n \n \n \n
          \n
          ", + + // END OPTIONS + // (Required by the dropzone documentation parser) + + + /* + Those functions register themselves to the events on init and handle all + the user interface specific stuff. Overwriting them won't break the upload + but can break the way it's displayed. + You can overwrite them if you don't like the default behavior. If you just + want to add an additional event handler, register it on the dropzone object + and don't overwrite those options. + */ + + // Those are self explanatory and simply concern the DragnDrop. + drop: function drop(e) { + return this.element.classList.remove("dz-drag-hover"); + }, + dragstart: function dragstart(e) {}, + dragend: function dragend(e) { + return this.element.classList.remove("dz-drag-hover"); + }, + dragenter: function dragenter(e) { + return this.element.classList.add("dz-drag-hover"); + }, + dragover: function dragover(e) { + return this.element.classList.add("dz-drag-hover"); + }, + dragleave: function dragleave(e) { + return this.element.classList.remove("dz-drag-hover"); + }, + paste: function paste(e) {}, + + + // Called whenever there are no files left in the dropzone anymore, and the + // dropzone should be displayed as if in the initial state. + reset: function reset() { + return this.element.classList.remove("dz-started"); + }, + + + // Called when a file is added to the queue + // Receives `file` + addedfile: function addedfile(file) { + var _this2 = this; + + if (this.element === this.previewsContainer) { + this.element.classList.add("dz-started"); + } + + if (this.previewsContainer) { + file.previewElement = Dropzone.createElement(this.options.previewTemplate.trim()); + file.previewTemplate = file.previewElement; // Backwards compatibility + + this.previewsContainer.appendChild(file.previewElement); + for (var _iterator3 = file.previewElement.querySelectorAll("[data-dz-name]"), _isArray3 = true, _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref3; + + if (_isArray3) { + if (_i3 >= _iterator3.length) break; + _ref3 = _iterator3[_i3++]; + } else { + _i3 = _iterator3.next(); + if (_i3.done) break; + _ref3 = _i3.value; + } + + var node = _ref3; + + node.textContent = file.name; + } + for (var _iterator4 = file.previewElement.querySelectorAll("[data-dz-size]"), _isArray4 = true, _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { + if (_isArray4) { + if (_i4 >= _iterator4.length) break; + node = _iterator4[_i4++]; + } else { + _i4 = _iterator4.next(); + if (_i4.done) break; + node = _i4.value; + } + + node.innerHTML = this.filesize(file.size); + } + + if (this.options.addRemoveLinks) { + file._removeLink = Dropzone.createElement("" + this.options.dictRemoveFile + ""); + file.previewElement.appendChild(file._removeLink); + } + + var removeFileEvent = function removeFileEvent(e) { + e.preventDefault(); + e.stopPropagation(); + if (file.status === Dropzone.UPLOADING) { + return Dropzone.confirm(_this2.options.dictCancelUploadConfirmation, function () { + return _this2.removeFile(file); + }); + } else { + if (_this2.options.dictRemoveFileConfirmation) { + return Dropzone.confirm(_this2.options.dictRemoveFileConfirmation, function () { + return _this2.removeFile(file); + }); + } else { + return _this2.removeFile(file); + } + } + }; + + for (var _iterator5 = file.previewElement.querySelectorAll("[data-dz-remove]"), _isArray5 = true, _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { + var _ref4; + + if (_isArray5) { + if (_i5 >= _iterator5.length) break; + _ref4 = _iterator5[_i5++]; + } else { + _i5 = _iterator5.next(); + if (_i5.done) break; + _ref4 = _i5.value; + } + + var removeLink = _ref4; + + removeLink.addEventListener("click", removeFileEvent); + } + } + }, + + + // Called whenever a file is removed. + removedfile: function removedfile(file) { + if (file.previewElement != null && file.previewElement.parentNode != null) { + file.previewElement.parentNode.removeChild(file.previewElement); + } + return this._updateMaxFilesReachedClass(); + }, + + + // Called when a thumbnail has been generated + // Receives `file` and `dataUrl` + thumbnail: function thumbnail(file, dataUrl) { + if (file.previewElement) { + file.previewElement.classList.remove("dz-file-preview"); + for (var _iterator6 = file.previewElement.querySelectorAll("[data-dz-thumbnail]"), _isArray6 = true, _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { + var _ref5; + + if (_isArray6) { + if (_i6 >= _iterator6.length) break; + _ref5 = _iterator6[_i6++]; + } else { + _i6 = _iterator6.next(); + if (_i6.done) break; + _ref5 = _i6.value; + } + + var thumbnailElement = _ref5; + + thumbnailElement.alt = file.name; + thumbnailElement.src = dataUrl; + } + + return setTimeout(function () { + return file.previewElement.classList.add("dz-image-preview"); + }, 1); + } + }, + + + // Called whenever an error occurs + // Receives `file` and `message` + error: function error(file, message) { + if (file.previewElement) { + file.previewElement.classList.add("dz-error"); + if (typeof message !== "String" && message.error) { + message = message.error; + } + for (var _iterator7 = file.previewElement.querySelectorAll("[data-dz-errormessage]"), _isArray7 = true, _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { + var _ref6; + + if (_isArray7) { + if (_i7 >= _iterator7.length) break; + _ref6 = _iterator7[_i7++]; + } else { + _i7 = _iterator7.next(); + if (_i7.done) break; + _ref6 = _i7.value; + } + + var node = _ref6; + + node.textContent = message; + } + } + }, + errormultiple: function errormultiple() {}, + + + // Called when a file gets processed. Since there is a cue, not all added + // files are processed immediately. + // Receives `file` + processing: function processing(file) { + if (file.previewElement) { + file.previewElement.classList.add("dz-processing"); + if (file._removeLink) { + return file._removeLink.textContent = this.options.dictCancelUpload; + } + } + }, + processingmultiple: function processingmultiple() {}, + + + // Called whenever the upload progress gets updated. + // Receives `file`, `progress` (percentage 0-100) and `bytesSent`. + // To get the total number of bytes of the file, use `file.size` + uploadprogress: function uploadprogress(file, progress, bytesSent) { + if (file.previewElement) { + for (var _iterator8 = file.previewElement.querySelectorAll("[data-dz-uploadprogress]"), _isArray8 = true, _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { + var _ref7; + + if (_isArray8) { + if (_i8 >= _iterator8.length) break; + _ref7 = _iterator8[_i8++]; + } else { + _i8 = _iterator8.next(); + if (_i8.done) break; + _ref7 = _i8.value; + } + + var node = _ref7; + + node.nodeName === 'PROGRESS' ? node.value = progress : node.style.width = progress + "%"; + } + } + }, + + + // Called whenever the total upload progress gets updated. + // Called with totalUploadProgress (0-100), totalBytes and totalBytesSent + totaluploadprogress: function totaluploadprogress() {}, + + + // Called just before the file is sent. Gets the `xhr` object as second + // parameter, so you can modify it (for example to add a CSRF token) and a + // `formData` object to add additional information. + sending: function sending() {}, + sendingmultiple: function sendingmultiple() {}, + + + // When the complete upload is finished and successful + // Receives `file` + success: function success(file) { + if (file.previewElement) { + return file.previewElement.classList.add("dz-success"); + } + }, + successmultiple: function successmultiple() {}, + + + // When the upload is canceled. + canceled: function canceled(file) { + return this.emit("error", file, "Upload canceled."); + }, + canceledmultiple: function canceledmultiple() {}, + + + // When the upload is finished, either with success or an error. + // Receives `file` + complete: function complete(file) { + if (file._removeLink) { + file._removeLink.textContent = this.options.dictRemoveFile; + } + if (file.previewElement) { + return file.previewElement.classList.add("dz-complete"); + } + }, + completemultiple: function completemultiple() {}, + maxfilesexceeded: function maxfilesexceeded() {}, + maxfilesreached: function maxfilesreached() {}, + queuecomplete: function queuecomplete() {}, + addedfiles: function addedfiles() {} + }; + + this.prototype._thumbnailQueue = []; + this.prototype._processingThumbnail = false; + } + + // global utility + + }, { + key: "extend", + value: function extend(target) { + for (var _len2 = arguments.length, objects = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + objects[_key2 - 1] = arguments[_key2]; + } + + for (var _iterator9 = objects, _isArray9 = true, _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) { + var _ref8; + + if (_isArray9) { + if (_i9 >= _iterator9.length) break; + _ref8 = _iterator9[_i9++]; + } else { + _i9 = _iterator9.next(); + if (_i9.done) break; + _ref8 = _i9.value; + } + + var object = _ref8; + + for (var key in object) { + var val = object[key]; + target[key] = val; + } + } + return target; + } + }]); + + function Dropzone(el, options) { + _classCallCheck(this, Dropzone); + + var _this = _possibleConstructorReturn(this, (Dropzone.__proto__ || Object.getPrototypeOf(Dropzone)).call(this)); + + var fallback = void 0, + left = void 0; + _this.element = el; + // For backwards compatibility since the version was in the prototype previously + _this.version = Dropzone.version; + + _this.defaultOptions.previewTemplate = _this.defaultOptions.previewTemplate.replace(/\n*/g, ""); + + _this.clickableElements = []; + _this.listeners = []; + _this.files = []; // All files + + if (typeof _this.element === "string") { + _this.element = document.querySelector(_this.element); + } + + // Not checking if instance of HTMLElement or Element since IE9 is extremely weird. + if (!_this.element || _this.element.nodeType == null) { + throw new Error("Invalid dropzone element."); + } + + if (_this.element.dropzone) { + throw new Error("Dropzone already attached."); + } + + // Now add this dropzone to the instances. + Dropzone.instances.push(_this); + + // Put the dropzone inside the element itself. + _this.element.dropzone = _this; + + var elementOptions = (left = Dropzone.optionsForElement(_this.element)) != null ? left : {}; + + _this.options = Dropzone.extend({}, _this.defaultOptions, elementOptions, options != null ? options : {}); + + // If the browser failed, just call the fallback and leave + if (_this.options.forceFallback || !Dropzone.isBrowserSupported()) { + var _ret; + + return _ret = _this.options.fallback.call(_this), _possibleConstructorReturn(_this, _ret); + } + + // @options.url = @element.getAttribute "action" unless @options.url? + if (_this.options.url == null) { + _this.options.url = _this.element.getAttribute("action"); + } + + if (!_this.options.url) { + throw new Error("No URL provided."); + } + + if (_this.options.acceptedFiles && _this.options.acceptedMimeTypes) { + throw new Error("You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated."); + } + + if (_this.options.uploadMultiple && _this.options.chunking) { + throw new Error('You cannot set both: uploadMultiple and chunking.'); + } + + // Backwards compatibility + if (_this.options.acceptedMimeTypes) { + _this.options.acceptedFiles = _this.options.acceptedMimeTypes; + delete _this.options.acceptedMimeTypes; + } + + // Backwards compatibility + if (_this.options.renameFilename != null) { + _this.options.renameFile = function (file) { + return _this.options.renameFilename.call(_this, file.name, file); + }; + } + + _this.options.method = _this.options.method.toUpperCase(); + + if ((fallback = _this.getExistingFallback()) && fallback.parentNode) { + // Remove the fallback + fallback.parentNode.removeChild(fallback); + } + + // Display previews in the previewsContainer element or the Dropzone element unless explicitly set to false + if (_this.options.previewsContainer !== false) { + if (_this.options.previewsContainer) { + _this.previewsContainer = Dropzone.getElement(_this.options.previewsContainer, "previewsContainer"); + } else { + _this.previewsContainer = _this.element; + } + } + + if (_this.options.clickable) { + if (_this.options.clickable === true) { + _this.clickableElements = [_this.element]; + } else { + _this.clickableElements = Dropzone.getElements(_this.options.clickable, "clickable"); + } + } + + _this.init(); + return _this; + } + + // Returns all files that have been accepted + + + _createClass(Dropzone, [{ + key: "getAcceptedFiles", + value: function getAcceptedFiles() { + return this.files.filter(function (file) { + return file.accepted; + }).map(function (file) { + return file; + }); + } + + // Returns all files that have been rejected + // Not sure when that's going to be useful, but added for completeness. + + }, { + key: "getRejectedFiles", + value: function getRejectedFiles() { + return this.files.filter(function (file) { + return !file.accepted; + }).map(function (file) { + return file; + }); + } + }, { + key: "getFilesWithStatus", + value: function getFilesWithStatus(status) { + return this.files.filter(function (file) { + return file.status === status; + }).map(function (file) { + return file; + }); + } + + // Returns all files that are in the queue + + }, { + key: "getQueuedFiles", + value: function getQueuedFiles() { + return this.getFilesWithStatus(Dropzone.QUEUED); + } + }, { + key: "getUploadingFiles", + value: function getUploadingFiles() { + return this.getFilesWithStatus(Dropzone.UPLOADING); + } + }, { + key: "getAddedFiles", + value: function getAddedFiles() { + return this.getFilesWithStatus(Dropzone.ADDED); + } + + // Files that are either queued or uploading + + }, { + key: "getActiveFiles", + value: function getActiveFiles() { + return this.files.filter(function (file) { + return file.status === Dropzone.UPLOADING || file.status === Dropzone.QUEUED; + }).map(function (file) { + return file; + }); + } + + // The function that gets called when Dropzone is initialized. You + // can (and should) setup event listeners inside this function. + + }, { + key: "init", + value: function init() { + var _this3 = this; + + // In case it isn't set already + if (this.element.tagName === "form") { + this.element.setAttribute("enctype", "multipart/form-data"); + } + + if (this.element.classList.contains("dropzone") && !this.element.querySelector(".dz-message")) { + this.element.appendChild(Dropzone.createElement("
          " + this.options.dictDefaultMessage + "
          ")); + } + + if (this.clickableElements.length) { + var setupHiddenFileInput = function setupHiddenFileInput() { + if (_this3.hiddenFileInput) { + _this3.hiddenFileInput.parentNode.removeChild(_this3.hiddenFileInput); + } + _this3.hiddenFileInput = document.createElement("input"); + _this3.hiddenFileInput.setAttribute("type", "file"); + if (_this3.options.maxFiles === null || _this3.options.maxFiles > 1) { + _this3.hiddenFileInput.setAttribute("multiple", "multiple"); + } + _this3.hiddenFileInput.className = "dz-hidden-input"; + + if (_this3.options.acceptedFiles !== null) { + _this3.hiddenFileInput.setAttribute("accept", _this3.options.acceptedFiles); + } + if (_this3.options.capture !== null) { + _this3.hiddenFileInput.setAttribute("capture", _this3.options.capture); + } + + // Not setting `display="none"` because some browsers don't accept clicks + // on elements that aren't displayed. + _this3.hiddenFileInput.style.visibility = "hidden"; + _this3.hiddenFileInput.style.position = "absolute"; + _this3.hiddenFileInput.style.top = "0"; + _this3.hiddenFileInput.style.left = "0"; + _this3.hiddenFileInput.style.height = "0"; + _this3.hiddenFileInput.style.width = "0"; + document.querySelector(_this3.options.hiddenInputContainer).appendChild(_this3.hiddenFileInput); + return _this3.hiddenFileInput.addEventListener("change", function () { + var files = _this3.hiddenFileInput.files; + + if (files.length) { + for (var _iterator10 = files, _isArray10 = true, _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) { + var _ref9; + + if (_isArray10) { + if (_i10 >= _iterator10.length) break; + _ref9 = _iterator10[_i10++]; + } else { + _i10 = _iterator10.next(); + if (_i10.done) break; + _ref9 = _i10.value; + } + + var file = _ref9; + + _this3.addFile(file); + } + } + _this3.emit("addedfiles", files); + return setupHiddenFileInput(); + }); + }; + setupHiddenFileInput(); + } + + this.URL = window.URL !== null ? window.URL : window.webkitURL; + + // Setup all event listeners on the Dropzone object itself. + // They're not in @setupEventListeners() because they shouldn't be removed + // again when the dropzone gets disabled. + for (var _iterator11 = this.events, _isArray11 = true, _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) { + var _ref10; + + if (_isArray11) { + if (_i11 >= _iterator11.length) break; + _ref10 = _iterator11[_i11++]; + } else { + _i11 = _iterator11.next(); + if (_i11.done) break; + _ref10 = _i11.value; + } + + var eventName = _ref10; + + this.on(eventName, this.options[eventName]); + } + + this.on("uploadprogress", function () { + return _this3.updateTotalUploadProgress(); + }); + + this.on("removedfile", function () { + return _this3.updateTotalUploadProgress(); + }); + + this.on("canceled", function (file) { + return _this3.emit("complete", file); + }); + + // Emit a `queuecomplete` event if all files finished uploading. + this.on("complete", function (file) { + if (_this3.getAddedFiles().length === 0 && _this3.getUploadingFiles().length === 0 && _this3.getQueuedFiles().length === 0) { + // This needs to be deferred so that `queuecomplete` really triggers after `complete` + return setTimeout(function () { + return _this3.emit("queuecomplete"); + }, 0); + } + }); + + var noPropagation = function noPropagation(e) { + e.stopPropagation(); + if (e.preventDefault) { + return e.preventDefault(); + } else { + return e.returnValue = false; + } + }; + + // Create the listeners + this.listeners = [{ + element: this.element, + events: { + "dragstart": function dragstart(e) { + return _this3.emit("dragstart", e); + }, + "dragenter": function dragenter(e) { + noPropagation(e); + return _this3.emit("dragenter", e); + }, + "dragover": function dragover(e) { + // Makes it possible to drag files from chrome's download bar + // http://stackoverflow.com/questions/19526430/drag-and-drop-file-uploads-from-chrome-downloads-bar + // Try is required to prevent bug in Internet Explorer 11 (SCRIPT65535 exception) + var efct = void 0; + try { + efct = e.dataTransfer.effectAllowed; + } catch (error) {} + e.dataTransfer.dropEffect = 'move' === efct || 'linkMove' === efct ? 'move' : 'copy'; + + noPropagation(e); + return _this3.emit("dragover", e); + }, + "dragleave": function dragleave(e) { + return _this3.emit("dragleave", e); + }, + "drop": function drop(e) { + noPropagation(e); + return _this3.drop(e); + }, + "dragend": function dragend(e) { + return _this3.emit("dragend", e); + } + + // This is disabled right now, because the browsers don't implement it properly. + // "paste": (e) => + // noPropagation e + // @paste e + } }]; + + this.clickableElements.forEach(function (clickableElement) { + return _this3.listeners.push({ + element: clickableElement, + events: { + "click": function click(evt) { + // Only the actual dropzone or the message element should trigger file selection + if (clickableElement !== _this3.element || evt.target === _this3.element || Dropzone.elementInside(evt.target, _this3.element.querySelector(".dz-message"))) { + _this3.hiddenFileInput.click(); // Forward the click + } + return true; + } + } + }); + }); + + this.enable(); + + return this.options.init.call(this); + } + + // Not fully tested yet + + }, { + key: "destroy", + value: function destroy() { + this.disable(); + this.removeAllFiles(true); + if (this.hiddenFileInput != null ? this.hiddenFileInput.parentNode : undefined) { + this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput); + this.hiddenFileInput = null; + } + delete this.element.dropzone; + return Dropzone.instances.splice(Dropzone.instances.indexOf(this), 1); + } + }, { + key: "updateTotalUploadProgress", + value: function updateTotalUploadProgress() { + var totalUploadProgress = void 0; + var totalBytesSent = 0; + var totalBytes = 0; + + var activeFiles = this.getActiveFiles(); + + if (activeFiles.length) { + for (var _iterator12 = this.getActiveFiles(), _isArray12 = true, _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) { + var _ref11; + + if (_isArray12) { + if (_i12 >= _iterator12.length) break; + _ref11 = _iterator12[_i12++]; + } else { + _i12 = _iterator12.next(); + if (_i12.done) break; + _ref11 = _i12.value; + } + + var file = _ref11; + + totalBytesSent += file.upload.bytesSent; + totalBytes += file.upload.total; + } + totalUploadProgress = 100 * totalBytesSent / totalBytes; + } else { + totalUploadProgress = 100; + } + + return this.emit("totaluploadprogress", totalUploadProgress, totalBytes, totalBytesSent); + } + + // @options.paramName can be a function taking one parameter rather than a string. + // A parameter name for a file is obtained simply by calling this with an index number. + + }, { + key: "_getParamName", + value: function _getParamName(n) { + if (typeof this.options.paramName === "function") { + return this.options.paramName(n); + } else { + return "" + this.options.paramName + (this.options.uploadMultiple ? "[" + n + "]" : ""); + } + } + + // If @options.renameFile is a function, + // the function will be used to rename the file.name before appending it to the formData + + }, { + key: "_renameFile", + value: function _renameFile(file) { + if (typeof this.options.renameFile !== "function") { + return file.name; + } + return this.options.renameFile(file); + } + + // Returns a form that can be used as fallback if the browser does not support DragnDrop + // + // If the dropzone is already a form, only the input field and button are returned. Otherwise a complete form element is provided. + // This code has to pass in IE7 :( + + }, { + key: "getFallbackForm", + value: function getFallbackForm() { + var existingFallback = void 0, + form = void 0; + if (existingFallback = this.getExistingFallback()) { + return existingFallback; + } + + var fieldsString = "
          "; + if (this.options.dictFallbackText) { + fieldsString += "

          " + this.options.dictFallbackText + "

          "; + } + fieldsString += "
          "; + + var fields = Dropzone.createElement(fieldsString); + if (this.element.tagName !== "FORM") { + form = Dropzone.createElement("
          "); + form.appendChild(fields); + } else { + // Make sure that the enctype and method attributes are set properly + this.element.setAttribute("enctype", "multipart/form-data"); + this.element.setAttribute("method", this.options.method); + } + return form != null ? form : fields; + } + + // Returns the fallback elements if they exist already + // + // This code has to pass in IE7 :( + + }, { + key: "getExistingFallback", + value: function getExistingFallback() { + var getFallback = function getFallback(elements) { + for (var _iterator13 = elements, _isArray13 = true, _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator]();;) { + var _ref12; + + if (_isArray13) { + if (_i13 >= _iterator13.length) break; + _ref12 = _iterator13[_i13++]; + } else { + _i13 = _iterator13.next(); + if (_i13.done) break; + _ref12 = _i13.value; + } + + var el = _ref12; + + if (/(^| )fallback($| )/.test(el.className)) { + return el; + } + } + }; + + var _arr = ["div", "form"]; + for (var _i14 = 0; _i14 < _arr.length; _i14++) { + var tagName = _arr[_i14]; + var fallback; + if (fallback = getFallback(this.element.getElementsByTagName(tagName))) { + return fallback; + } + } + } + + // Activates all listeners stored in @listeners + + }, { + key: "setupEventListeners", + value: function setupEventListeners() { + return this.listeners.map(function (elementListeners) { + return function () { + var result = []; + for (var event in elementListeners.events) { + var listener = elementListeners.events[event]; + result.push(elementListeners.element.addEventListener(event, listener, false)); + } + return result; + }(); + }); + } + + // Deactivates all listeners stored in @listeners + + }, { + key: "removeEventListeners", + value: function removeEventListeners() { + return this.listeners.map(function (elementListeners) { + return function () { + var result = []; + for (var event in elementListeners.events) { + var listener = elementListeners.events[event]; + result.push(elementListeners.element.removeEventListener(event, listener, false)); + } + return result; + }(); + }); + } + + // Removes all event listeners and cancels all files in the queue or being processed. + + }, { + key: "disable", + value: function disable() { + var _this4 = this; + + this.clickableElements.forEach(function (element) { + return element.classList.remove("dz-clickable"); + }); + this.removeEventListeners(); + + return this.files.map(function (file) { + return _this4.cancelUpload(file); + }); + } + }, { + key: "enable", + value: function enable() { + this.clickableElements.forEach(function (element) { + return element.classList.add("dz-clickable"); + }); + return this.setupEventListeners(); + } + + // Returns a nicely formatted filesize + + }, { + key: "filesize", + value: function filesize(size) { + var selectedSize = 0; + var selectedUnit = "b"; + + if (size > 0) { + var units = ['tb', 'gb', 'mb', 'kb', 'b']; + + for (var i = 0; i < units.length; i++) { + var unit = units[i]; + var cutoff = Math.pow(this.options.filesizeBase, 4 - i) / 10; + + if (size >= cutoff) { + selectedSize = size / Math.pow(this.options.filesizeBase, 4 - i); + selectedUnit = unit; + break; + } + } + + selectedSize = Math.round(10 * selectedSize) / 10; // Cutting of digits + } + + return "" + selectedSize + " " + this.options.dictFileSizeUnits[selectedUnit]; + } + + // Adds or removes the `dz-max-files-reached` class from the form. + + }, { + key: "_updateMaxFilesReachedClass", + value: function _updateMaxFilesReachedClass() { + if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) { + if (this.getAcceptedFiles().length === this.options.maxFiles) { + this.emit('maxfilesreached', this.files); + } + return this.element.classList.add("dz-max-files-reached"); + } else { + return this.element.classList.remove("dz-max-files-reached"); + } + } + }, { + key: "drop", + value: function drop(e) { + if (!e.dataTransfer) { + return; + } + this.emit("drop", e); + + var files = e.dataTransfer.files; + + this.emit("addedfiles", files); + + // Even if it's a folder, files.length will contain the folders. + if (files.length) { + var items = e.dataTransfer.items; + + if (items && items.length && items[0].webkitGetAsEntry != null) { + // The browser supports dropping of folders, so handle items instead of files + this._addFilesFromItems(items); + } else { + this.handleFiles(files); + } + } + } + }, { + key: "paste", + value: function paste(e) { + if (__guard__(e != null ? e.clipboardData : undefined, function (x) { + return x.items; + }) == null) { + return; + } + + this.emit("paste", e); + var items = e.clipboardData.items; + + + if (items.length) { + return this._addFilesFromItems(items); + } + } + }, { + key: "handleFiles", + value: function handleFiles(files) { + var _this5 = this; + + return files.map(function (file) { + return _this5.addFile(file); + }); + } + + // When a folder is dropped (or files are pasted), items must be handled + // instead of files. + + }, { + key: "_addFilesFromItems", + value: function _addFilesFromItems(items) { + var _this6 = this; + + return function () { + var result = []; + for (var _iterator14 = items, _isArray14 = true, _i15 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator]();;) { + var _ref13; + + if (_isArray14) { + if (_i15 >= _iterator14.length) break; + _ref13 = _iterator14[_i15++]; + } else { + _i15 = _iterator14.next(); + if (_i15.done) break; + _ref13 = _i15.value; + } + + var item = _ref13; + + var entry; + if (item.webkitGetAsEntry != null && (entry = item.webkitGetAsEntry())) { + if (entry.isFile) { + result.push(_this6.addFile(item.getAsFile())); + } else if (entry.isDirectory) { + // Append all files from that directory to files + result.push(_this6._addFilesFromDirectory(entry, entry.name)); + } else { + result.push(undefined); + } + } else if (item.getAsFile != null) { + if (item.kind == null || item.kind === "file") { + result.push(_this6.addFile(item.getAsFile())); + } else { + result.push(undefined); + } + } else { + result.push(undefined); + } + } + return result; + }(); + } + + // Goes through the directory, and adds each file it finds recursively + + }, { + key: "_addFilesFromDirectory", + value: function _addFilesFromDirectory(directory, path) { + var _this7 = this; + + var dirReader = directory.createReader(); + + var errorHandler = function errorHandler(error) { + return __guardMethod__(console, 'log', function (o) { + return o.log(error); + }); + }; + + var readEntries = function readEntries() { + return dirReader.readEntries(function (entries) { + if (entries.length > 0) { + for (var _iterator15 = entries, _isArray15 = true, _i16 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator]();;) { + var _ref14; + + if (_isArray15) { + if (_i16 >= _iterator15.length) break; + _ref14 = _iterator15[_i16++]; + } else { + _i16 = _iterator15.next(); + if (_i16.done) break; + _ref14 = _i16.value; + } + + var entry = _ref14; + + if (entry.isFile) { + entry.file(function (file) { + if (_this7.options.ignoreHiddenFiles && file.name.substring(0, 1) === '.') { + return; + } + file.fullPath = path + "/" + file.name; + return _this7.addFile(file); + }); + } else if (entry.isDirectory) { + _this7._addFilesFromDirectory(entry, path + "/" + entry.name); + } + } + + // Recursively call readEntries() again, since browser only handle + // the first 100 entries. + // See: https://developer.mozilla.org/en-US/docs/Web/API/DirectoryReader#readEntries + readEntries(); + } + return null; + }, errorHandler); + }; + + return readEntries(); + } + + // If `done()` is called without argument the file is accepted + // If you call it with an error message, the file is rejected + // (This allows for asynchronous validation) + // + // This function checks the filesize, and if the file.type passes the + // `acceptedFiles` check. + + }, { + key: "accept", + value: function accept(file, done) { + if (file.size > this.options.maxFilesize * 1024 * 1024) { + return done(this.options.dictFileTooBig.replace("{{filesize}}", Math.round(file.size / 1024 / 10.24) / 100).replace("{{maxFilesize}}", this.options.maxFilesize)); + } else if (!Dropzone.isValidFile(file, this.options.acceptedFiles)) { + return done(this.options.dictInvalidFileType); + } else if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) { + done(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}", this.options.maxFiles)); + return this.emit("maxfilesexceeded", file); + } else { + return this.options.accept.call(this, file, done); + } + } + }, { + key: "addFile", + value: function addFile(file) { + var _this8 = this; + + file.upload = { + uuid: Dropzone.uuidv4(), + progress: 0, + // Setting the total upload size to file.size for the beginning + // It's actual different than the size to be transmitted. + total: file.size, + bytesSent: 0, + filename: this._renameFile(file), + chunked: this.options.chunking && (this.options.forceChunking || file.size > this.options.chunkSize), + totalChunkCount: Math.ceil(file.size / this.options.chunkSize) + }; + this.files.push(file); + + file.status = Dropzone.ADDED; + + this.emit("addedfile", file); + + this._enqueueThumbnail(file); + + return this.accept(file, function (error) { + if (error) { + file.accepted = false; + _this8._errorProcessing([file], error); // Will set the file.status + } else { + file.accepted = true; + if (_this8.options.autoQueue) { + _this8.enqueueFile(file); + } // Will set .accepted = true + } + return _this8._updateMaxFilesReachedClass(); + }); + } + + // Wrapper for enqueueFile + + }, { + key: "enqueueFiles", + value: function enqueueFiles(files) { + for (var _iterator16 = files, _isArray16 = true, _i17 = 0, _iterator16 = _isArray16 ? _iterator16 : _iterator16[Symbol.iterator]();;) { + var _ref15; + + if (_isArray16) { + if (_i17 >= _iterator16.length) break; + _ref15 = _iterator16[_i17++]; + } else { + _i17 = _iterator16.next(); + if (_i17.done) break; + _ref15 = _i17.value; + } + + var file = _ref15; + + this.enqueueFile(file); + } + return null; + } + }, { + key: "enqueueFile", + value: function enqueueFile(file) { + var _this9 = this; + + if (file.status === Dropzone.ADDED && file.accepted === true) { + file.status = Dropzone.QUEUED; + if (this.options.autoProcessQueue) { + return setTimeout(function () { + return _this9.processQueue(); + }, 0); // Deferring the call + } + } else { + throw new Error("This file can't be queued because it has already been processed or was rejected."); + } + } + }, { + key: "_enqueueThumbnail", + value: function _enqueueThumbnail(file) { + var _this10 = this; + + if (this.options.createImageThumbnails && file.type.match(/image.*/) && file.size <= this.options.maxThumbnailFilesize * 1024 * 1024) { + this._thumbnailQueue.push(file); + return setTimeout(function () { + return _this10._processThumbnailQueue(); + }, 0); // Deferring the call + } + } + }, { + key: "_processThumbnailQueue", + value: function _processThumbnailQueue() { + var _this11 = this; + + if (this._processingThumbnail || this._thumbnailQueue.length === 0) { + return; + } + + this._processingThumbnail = true; + var file = this._thumbnailQueue.shift(); + return this.createThumbnail(file, this.options.thumbnailWidth, this.options.thumbnailHeight, this.options.thumbnailMethod, true, function (dataUrl) { + _this11.emit("thumbnail", file, dataUrl); + _this11._processingThumbnail = false; + return _this11._processThumbnailQueue(); + }); + } + + // Can be called by the user to remove a file + + }, { + key: "removeFile", + value: function removeFile(file) { + if (file.status === Dropzone.UPLOADING) { + this.cancelUpload(file); + } + this.files = without(this.files, file); + + this.emit("removedfile", file); + if (this.files.length === 0) { + return this.emit("reset"); + } + } + + // Removes all files that aren't currently processed from the list + + }, { + key: "removeAllFiles", + value: function removeAllFiles(cancelIfNecessary) { + // Create a copy of files since removeFile() changes the @files array. + if (cancelIfNecessary == null) { + cancelIfNecessary = false; + } + for (var _iterator17 = this.files.slice(), _isArray17 = true, _i18 = 0, _iterator17 = _isArray17 ? _iterator17 : _iterator17[Symbol.iterator]();;) { + var _ref16; + + if (_isArray17) { + if (_i18 >= _iterator17.length) break; + _ref16 = _iterator17[_i18++]; + } else { + _i18 = _iterator17.next(); + if (_i18.done) break; + _ref16 = _i18.value; + } + + var file = _ref16; + + if (file.status !== Dropzone.UPLOADING || cancelIfNecessary) { + this.removeFile(file); + } + } + return null; + } + + // Resizes an image before it gets sent to the server. This function is the default behavior of + // `options.transformFile` if `resizeWidth` or `resizeHeight` are set. The callback is invoked with + // the resized blob. + + }, { + key: "resizeImage", + value: function resizeImage(file, width, height, resizeMethod, callback) { + var _this12 = this; + + return this.createThumbnail(file, width, height, resizeMethod, false, function (dataUrl, canvas) { + if (canvas === null) { + // The image has not been resized + return callback(file); + } else { + var resizeMimeType = _this12.options.resizeMimeType; + + if (resizeMimeType == null) { + resizeMimeType = file.type; + } + var resizedDataURL = canvas.toDataURL(resizeMimeType, _this12.options.resizeQuality); + if (resizeMimeType === 'image/jpeg' || resizeMimeType === 'image/jpg') { + // Now add the original EXIF information + resizedDataURL = ExifRestore.restore(file.dataURL, resizedDataURL); + } + return callback(Dropzone.dataURItoBlob(resizedDataURL)); + } + }); + } + }, { + key: "createThumbnail", + value: function createThumbnail(file, width, height, resizeMethod, fixOrientation, callback) { + var _this13 = this; + + var fileReader = new FileReader(); + + fileReader.onload = function () { + + file.dataURL = fileReader.result; + + // Don't bother creating a thumbnail for SVG images since they're vector + if (file.type === "image/svg+xml") { + if (callback != null) { + callback(fileReader.result); + } + return; + } + + return _this13.createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback); + }; + + return fileReader.readAsDataURL(file); + } + }, { + key: "createThumbnailFromUrl", + value: function createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback, crossOrigin) { + var _this14 = this; + + // Not using `new Image` here because of a bug in latest Chrome versions. + // See https://github.com/enyo/dropzone/pull/226 + var img = document.createElement("img"); + + if (crossOrigin) { + img.crossOrigin = crossOrigin; + } + + img.onload = function () { + var loadExif = function loadExif(callback) { + return callback(1); + }; + if (typeof EXIF !== 'undefined' && EXIF !== null && fixOrientation) { + loadExif = function loadExif(callback) { + return EXIF.getData(img, function () { + return callback(EXIF.getTag(this, 'Orientation')); + }); + }; + } + + return loadExif(function (orientation) { + file.width = img.width; + file.height = img.height; + + var resizeInfo = _this14.options.resize.call(_this14, file, width, height, resizeMethod); + + var canvas = document.createElement("canvas"); + var ctx = canvas.getContext("2d"); + + canvas.width = resizeInfo.trgWidth; + canvas.height = resizeInfo.trgHeight; + + if (orientation > 4) { + canvas.width = resizeInfo.trgHeight; + canvas.height = resizeInfo.trgWidth; + } + + switch (orientation) { + case 2: + // horizontal flip + ctx.translate(canvas.width, 0); + ctx.scale(-1, 1); + break; + case 3: + // 180° rotate left + ctx.translate(canvas.width, canvas.height); + ctx.rotate(Math.PI); + break; + case 4: + // vertical flip + ctx.translate(0, canvas.height); + ctx.scale(1, -1); + break; + case 5: + // vertical flip + 90 rotate right + ctx.rotate(0.5 * Math.PI); + ctx.scale(1, -1); + break; + case 6: + // 90° rotate right + ctx.rotate(0.5 * Math.PI); + ctx.translate(0, -canvas.height); + break; + case 7: + // horizontal flip + 90 rotate right + ctx.rotate(0.5 * Math.PI); + ctx.translate(canvas.width, -canvas.height); + ctx.scale(-1, 1); + break; + case 8: + // 90° rotate left + ctx.rotate(-0.5 * Math.PI); + ctx.translate(-canvas.width, 0); + break; + } + + // This is a bugfix for iOS' scaling bug. + drawImageIOSFix(ctx, img, resizeInfo.srcX != null ? resizeInfo.srcX : 0, resizeInfo.srcY != null ? resizeInfo.srcY : 0, resizeInfo.srcWidth, resizeInfo.srcHeight, resizeInfo.trgX != null ? resizeInfo.trgX : 0, resizeInfo.trgY != null ? resizeInfo.trgY : 0, resizeInfo.trgWidth, resizeInfo.trgHeight); + + var thumbnail = canvas.toDataURL("image/png"); + + if (callback != null) { + return callback(thumbnail, canvas); + } + }); + }; + + if (callback != null) { + img.onerror = callback; + } + + return img.src = file.dataURL; + } + + // Goes through the queue and processes files if there aren't too many already. + + }, { + key: "processQueue", + value: function processQueue() { + var parallelUploads = this.options.parallelUploads; + + var processingLength = this.getUploadingFiles().length; + var i = processingLength; + + // There are already at least as many files uploading than should be + if (processingLength >= parallelUploads) { + return; + } + + var queuedFiles = this.getQueuedFiles(); + + if (!(queuedFiles.length > 0)) { + return; + } + + if (this.options.uploadMultiple) { + // The files should be uploaded in one request + return this.processFiles(queuedFiles.slice(0, parallelUploads - processingLength)); + } else { + while (i < parallelUploads) { + if (!queuedFiles.length) { + return; + } // Nothing left to process + this.processFile(queuedFiles.shift()); + i++; + } + } + } + + // Wrapper for `processFiles` + + }, { + key: "processFile", + value: function processFile(file) { + return this.processFiles([file]); + } + + // Loads the file, then calls finishedLoading() + + }, { + key: "processFiles", + value: function processFiles(files) { + for (var _iterator18 = files, _isArray18 = true, _i19 = 0, _iterator18 = _isArray18 ? _iterator18 : _iterator18[Symbol.iterator]();;) { + var _ref17; + + if (_isArray18) { + if (_i19 >= _iterator18.length) break; + _ref17 = _iterator18[_i19++]; + } else { + _i19 = _iterator18.next(); + if (_i19.done) break; + _ref17 = _i19.value; + } + + var file = _ref17; + + file.processing = true; // Backwards compatibility + file.status = Dropzone.UPLOADING; + + this.emit("processing", file); + } + + if (this.options.uploadMultiple) { + this.emit("processingmultiple", files); + } + + return this.uploadFiles(files); + } + }, { + key: "_getFilesWithXhr", + value: function _getFilesWithXhr(xhr) { + var files = void 0; + return files = this.files.filter(function (file) { + return file.xhr === xhr; + }).map(function (file) { + return file; + }); + } + + // Cancels the file upload and sets the status to CANCELED + // **if** the file is actually being uploaded. + // If it's still in the queue, the file is being removed from it and the status + // set to CANCELED. + + }, { + key: "cancelUpload", + value: function cancelUpload(file) { + if (file.status === Dropzone.UPLOADING) { + var groupedFiles = this._getFilesWithXhr(file.xhr); + for (var _iterator19 = groupedFiles, _isArray19 = true, _i20 = 0, _iterator19 = _isArray19 ? _iterator19 : _iterator19[Symbol.iterator]();;) { + var _ref18; + + if (_isArray19) { + if (_i20 >= _iterator19.length) break; + _ref18 = _iterator19[_i20++]; + } else { + _i20 = _iterator19.next(); + if (_i20.done) break; + _ref18 = _i20.value; + } + + var groupedFile = _ref18; + + groupedFile.status = Dropzone.CANCELED; + } + if (typeof file.xhr !== 'undefined') { + file.xhr.abort(); + } + for (var _iterator20 = groupedFiles, _isArray20 = true, _i21 = 0, _iterator20 = _isArray20 ? _iterator20 : _iterator20[Symbol.iterator]();;) { + var _ref19; + + if (_isArray20) { + if (_i21 >= _iterator20.length) break; + _ref19 = _iterator20[_i21++]; + } else { + _i21 = _iterator20.next(); + if (_i21.done) break; + _ref19 = _i21.value; + } + + var _groupedFile = _ref19; + + this.emit("canceled", _groupedFile); + } + if (this.options.uploadMultiple) { + this.emit("canceledmultiple", groupedFiles); + } + } else if (file.status === Dropzone.ADDED || file.status === Dropzone.QUEUED) { + file.status = Dropzone.CANCELED; + this.emit("canceled", file); + if (this.options.uploadMultiple) { + this.emit("canceledmultiple", [file]); + } + } + + if (this.options.autoProcessQueue) { + return this.processQueue(); + } + } + }, { + key: "resolveOption", + value: function resolveOption(option) { + if (typeof option === 'function') { + for (var _len3 = arguments.length, args = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + args[_key3 - 1] = arguments[_key3]; + } + + return option.apply(this, args); + } + return option; + } + }, { + key: "uploadFile", + value: function uploadFile(file) { + return this.uploadFiles([file]); + } + }, { + key: "uploadFiles", + value: function uploadFiles(files) { + var _this15 = this; + + this._transformFiles(files, function (transformedFiles) { + if (files[0].upload.chunked) { + // This file should be sent in chunks! + + // If the chunking option is set, we **know** that there can only be **one** file, since + // uploadMultiple is not allowed with this option. + var file = files[0]; + var transformedFile = transformedFiles[0]; + var startedChunkCount = 0; + + file.upload.chunks = []; + + var handleNextChunk = function handleNextChunk() { + var chunkIndex = 0; + + // Find the next item in file.upload.chunks that is not defined yet. + while (file.upload.chunks[chunkIndex] !== undefined) { + chunkIndex++; + } + + // This means, that all chunks have already been started. + if (chunkIndex >= file.upload.totalChunkCount) return; + + startedChunkCount++; + + var start = chunkIndex * _this15.options.chunkSize; + var end = Math.min(start + _this15.options.chunkSize, file.size); + + var dataBlock = { + name: _this15._getParamName(0), + data: transformedFile.webkitSlice ? transformedFile.webkitSlice(start, end) : transformedFile.slice(start, end), + filename: file.upload.filename, + chunkIndex: chunkIndex + }; + + file.upload.chunks[chunkIndex] = { + file: file, + index: chunkIndex, + dataBlock: dataBlock, // In case we want to retry. + status: Dropzone.UPLOADING, + progress: 0, + retries: 0 // The number of times this block has been retried. + }; + + _this15._uploadData(files, [dataBlock]); + }; + + file.upload.finishedChunkUpload = function (chunk) { + var allFinished = true; + chunk.status = Dropzone.SUCCESS; + + // Clear the data from the chunk + chunk.dataBlock = null; + + for (var i = 0; i < file.upload.totalChunkCount; i++) { + if (file.upload.chunks[i] === undefined) { + return handleNextChunk(); + } + if (file.upload.chunks[i].status !== Dropzone.SUCCESS) { + allFinished = false; + } + } + + if (allFinished) { + _this15.options.chunksUploaded(file, function () { + _this15._finished(files, '', null); + }); + } + }; + + if (_this15.options.parallelChunkUploads) { + for (var i = 0; i < file.upload.totalChunkCount; i++) { + handleNextChunk(); + } + } else { + handleNextChunk(); + } + } else { + var dataBlocks = []; + for (var _i22 = 0; _i22 < files.length; _i22++) { + dataBlocks[_i22] = { + name: _this15._getParamName(_i22), + data: transformedFiles[_i22], + filename: files[_i22].upload.filename + }; + } + _this15._uploadData(files, dataBlocks); + } + }); + } + + /// Returns the right chunk for given file and xhr + + }, { + key: "_getChunk", + value: function _getChunk(file, xhr) { + for (var i = 0; i < file.upload.totalChunkCount; i++) { + if (file.upload.chunks[i] !== undefined && file.upload.chunks[i].xhr === xhr) { + return file.upload.chunks[i]; + } + } + } + + // This function actually uploads the file(s) to the server. + // If dataBlocks contains the actual data to upload (meaning, that this could either be transformed + // files, or individual chunks for chunked upload). + + }, { + key: "_uploadData", + value: function _uploadData(files, dataBlocks) { + var _this16 = this; + + var xhr = new XMLHttpRequest(); + + // Put the xhr object in the file objects to be able to reference it later. + for (var _iterator21 = files, _isArray21 = true, _i23 = 0, _iterator21 = _isArray21 ? _iterator21 : _iterator21[Symbol.iterator]();;) { + var _ref20; + + if (_isArray21) { + if (_i23 >= _iterator21.length) break; + _ref20 = _iterator21[_i23++]; + } else { + _i23 = _iterator21.next(); + if (_i23.done) break; + _ref20 = _i23.value; + } + + var file = _ref20; + + file.xhr = xhr; + } + if (files[0].upload.chunked) { + // Put the xhr object in the right chunk object, so it can be associated later, and found with _getChunk + files[0].upload.chunks[dataBlocks[0].chunkIndex].xhr = xhr; + } + + var method = this.resolveOption(this.options.method, files); + var url = this.resolveOption(this.options.url, files); + xhr.open(method, url, true); + + // Setting the timeout after open because of IE11 issue: https://gitlab.com/meno/dropzone/issues/8 + xhr.timeout = this.resolveOption(this.options.timeout, files); + + // Has to be after `.open()`. See https://github.com/enyo/dropzone/issues/179 + xhr.withCredentials = !!this.options.withCredentials; + + xhr.onload = function (e) { + _this16._finishedUploading(files, xhr, e); + }; + + xhr.onerror = function () { + _this16._handleUploadError(files, xhr); + }; + + // Some browsers do not have the .upload property + var progressObj = xhr.upload != null ? xhr.upload : xhr; + progressObj.onprogress = function (e) { + return _this16._updateFilesUploadProgress(files, xhr, e); + }; + + var headers = { + "Accept": "application/json", + "Cache-Control": "no-cache", + "X-Requested-With": "XMLHttpRequest" + }; + + if (this.options.headers) { + Dropzone.extend(headers, this.options.headers); + } + + for (var headerName in headers) { + var headerValue = headers[headerName]; + if (headerValue) { + xhr.setRequestHeader(headerName, headerValue); + } + } + + var formData = new FormData(); + + // Adding all @options parameters + if (this.options.params) { + var additionalParams = this.options.params; + if (typeof additionalParams === 'function') { + additionalParams = additionalParams.call(this, files, xhr, files[0].upload.chunked ? this._getChunk(files[0], xhr) : null); + } + + for (var key in additionalParams) { + var value = additionalParams[key]; + formData.append(key, value); + } + } + + // Let the user add additional data if necessary + for (var _iterator22 = files, _isArray22 = true, _i24 = 0, _iterator22 = _isArray22 ? _iterator22 : _iterator22[Symbol.iterator]();;) { + var _ref21; + + if (_isArray22) { + if (_i24 >= _iterator22.length) break; + _ref21 = _iterator22[_i24++]; + } else { + _i24 = _iterator22.next(); + if (_i24.done) break; + _ref21 = _i24.value; + } + + var _file = _ref21; + + this.emit("sending", _file, xhr, formData); + } + if (this.options.uploadMultiple) { + this.emit("sendingmultiple", files, xhr, formData); + } + + this._addFormElementData(formData); + + // Finally add the files + // Has to be last because some servers (eg: S3) expect the file to be the last parameter + for (var i = 0; i < dataBlocks.length; i++) { + var dataBlock = dataBlocks[i]; + formData.append(dataBlock.name, dataBlock.data, dataBlock.filename); + } + + this.submitRequest(xhr, formData, files); + } + + // Transforms all files with this.options.transformFile and invokes done with the transformed files when done. + + }, { + key: "_transformFiles", + value: function _transformFiles(files, done) { + var _this17 = this; + + var transformedFiles = []; + // Clumsy way of handling asynchronous calls, until I get to add a proper Future library. + var doneCounter = 0; + + var _loop = function _loop(i) { + _this17.options.transformFile.call(_this17, files[i], function (transformedFile) { + transformedFiles[i] = transformedFile; + if (++doneCounter === files.length) { + done(transformedFiles); + } + }); + }; + + for (var i = 0; i < files.length; i++) { + _loop(i); + } + } + + // Takes care of adding other input elements of the form to the AJAX request + + }, { + key: "_addFormElementData", + value: function _addFormElementData(formData) { + // Take care of other input elements + if (this.element.tagName === "FORM") { + for (var _iterator23 = this.element.querySelectorAll("input, textarea, select, button"), _isArray23 = true, _i25 = 0, _iterator23 = _isArray23 ? _iterator23 : _iterator23[Symbol.iterator]();;) { + var _ref22; + + if (_isArray23) { + if (_i25 >= _iterator23.length) break; + _ref22 = _iterator23[_i25++]; + } else { + _i25 = _iterator23.next(); + if (_i25.done) break; + _ref22 = _i25.value; + } + + var input = _ref22; + + var inputName = input.getAttribute("name"); + var inputType = input.getAttribute("type"); + if (inputType) inputType = inputType.toLowerCase(); + + // If the input doesn't have a name, we can't use it. + if (typeof inputName === 'undefined' || inputName === null) continue; + + if (input.tagName === "SELECT" && input.hasAttribute("multiple")) { + // Possibly multiple values + for (var _iterator24 = input.options, _isArray24 = true, _i26 = 0, _iterator24 = _isArray24 ? _iterator24 : _iterator24[Symbol.iterator]();;) { + var _ref23; + + if (_isArray24) { + if (_i26 >= _iterator24.length) break; + _ref23 = _iterator24[_i26++]; + } else { + _i26 = _iterator24.next(); + if (_i26.done) break; + _ref23 = _i26.value; + } + + var option = _ref23; + + if (option.selected) { + formData.append(inputName, option.value); + } + } + } else if (!inputType || inputType !== "checkbox" && inputType !== "radio" || input.checked) { + formData.append(inputName, input.value); + } + } + } + } + + // Invoked when there is new progress information about given files. + // If e is not provided, it is assumed that the upload is finished. + + }, { + key: "_updateFilesUploadProgress", + value: function _updateFilesUploadProgress(files, xhr, e) { + var progress = void 0; + if (typeof e !== 'undefined') { + progress = 100 * e.loaded / e.total; + + if (files[0].upload.chunked) { + var file = files[0]; + // Since this is a chunked upload, we need to update the appropriate chunk progress. + var chunk = this._getChunk(file, xhr); + chunk.progress = progress; + chunk.total = e.total; + chunk.bytesSent = e.loaded; + var fileProgress = 0, + fileTotal = void 0, + fileBytesSent = void 0; + file.upload.progress = 0; + file.upload.total = 0; + file.upload.bytesSent = 0; + for (var i = 0; i < file.upload.totalChunkCount; i++) { + if (file.upload.chunks[i] !== undefined && file.upload.chunks[i].progress !== undefined) { + file.upload.progress += file.upload.chunks[i].progress; + file.upload.total += file.upload.chunks[i].total; + file.upload.bytesSent += file.upload.chunks[i].bytesSent; + } + } + file.upload.progress = file.upload.progress / file.upload.totalChunkCount; + } else { + for (var _iterator25 = files, _isArray25 = true, _i27 = 0, _iterator25 = _isArray25 ? _iterator25 : _iterator25[Symbol.iterator]();;) { + var _ref24; + + if (_isArray25) { + if (_i27 >= _iterator25.length) break; + _ref24 = _iterator25[_i27++]; + } else { + _i27 = _iterator25.next(); + if (_i27.done) break; + _ref24 = _i27.value; + } + + var _file2 = _ref24; + + _file2.upload.progress = progress; + _file2.upload.total = e.total; + _file2.upload.bytesSent = e.loaded; + } + } + for (var _iterator26 = files, _isArray26 = true, _i28 = 0, _iterator26 = _isArray26 ? _iterator26 : _iterator26[Symbol.iterator]();;) { + var _ref25; + + if (_isArray26) { + if (_i28 >= _iterator26.length) break; + _ref25 = _iterator26[_i28++]; + } else { + _i28 = _iterator26.next(); + if (_i28.done) break; + _ref25 = _i28.value; + } + + var _file3 = _ref25; + + this.emit("uploadprogress", _file3, _file3.upload.progress, _file3.upload.bytesSent); + } + } else { + // Called when the file finished uploading + + var allFilesFinished = true; + + progress = 100; + + for (var _iterator27 = files, _isArray27 = true, _i29 = 0, _iterator27 = _isArray27 ? _iterator27 : _iterator27[Symbol.iterator]();;) { + var _ref26; + + if (_isArray27) { + if (_i29 >= _iterator27.length) break; + _ref26 = _iterator27[_i29++]; + } else { + _i29 = _iterator27.next(); + if (_i29.done) break; + _ref26 = _i29.value; + } + + var _file4 = _ref26; + + if (_file4.upload.progress !== 100 || _file4.upload.bytesSent !== _file4.upload.total) { + allFilesFinished = false; + } + _file4.upload.progress = progress; + _file4.upload.bytesSent = _file4.upload.total; + } + + // Nothing to do, all files already at 100% + if (allFilesFinished) { + return; + } + + for (var _iterator28 = files, _isArray28 = true, _i30 = 0, _iterator28 = _isArray28 ? _iterator28 : _iterator28[Symbol.iterator]();;) { + var _ref27; + + if (_isArray28) { + if (_i30 >= _iterator28.length) break; + _ref27 = _iterator28[_i30++]; + } else { + _i30 = _iterator28.next(); + if (_i30.done) break; + _ref27 = _i30.value; + } + + var _file5 = _ref27; + + this.emit("uploadprogress", _file5, progress, _file5.upload.bytesSent); + } + } + } + }, { + key: "_finishedUploading", + value: function _finishedUploading(files, xhr, e) { + var response = void 0; + + if (files[0].status === Dropzone.CANCELED) { + return; + } + + if (xhr.readyState !== 4) { + return; + } + + if (xhr.responseType !== 'arraybuffer' && xhr.responseType !== 'blob') { + response = xhr.responseText; + + if (xhr.getResponseHeader("content-type") && ~xhr.getResponseHeader("content-type").indexOf("application/json")) { + try { + response = JSON.parse(response); + } catch (error) { + e = error; + response = "Invalid JSON response from server."; + } + } + } + + this._updateFilesUploadProgress(files); + + if (!(200 <= xhr.status && xhr.status < 300)) { + this._handleUploadError(files, xhr, response); + } else { + if (files[0].upload.chunked) { + files[0].upload.finishedChunkUpload(this._getChunk(files[0], xhr)); + } else { + this._finished(files, response, e); + } + } + } + }, { + key: "_handleUploadError", + value: function _handleUploadError(files, xhr, response) { + if (files[0].status === Dropzone.CANCELED) { + return; + } + + if (files[0].upload.chunked && this.options.retryChunks) { + var chunk = this._getChunk(files[0], xhr); + if (chunk.retries++ < this.options.retryChunksLimit) { + this._uploadData(files, [chunk.dataBlock]); + return; + } else { + console.warn('Retried this chunk too often. Giving up.'); + } + } + + for (var _iterator29 = files, _isArray29 = true, _i31 = 0, _iterator29 = _isArray29 ? _iterator29 : _iterator29[Symbol.iterator]();;) { + var _ref28; + + if (_isArray29) { + if (_i31 >= _iterator29.length) break; + _ref28 = _iterator29[_i31++]; + } else { + _i31 = _iterator29.next(); + if (_i31.done) break; + _ref28 = _i31.value; + } + + var file = _ref28; + + this._errorProcessing(files, response || this.options.dictResponseError.replace("{{statusCode}}", xhr.status), xhr); + } + } + }, { + key: "submitRequest", + value: function submitRequest(xhr, formData, files) { + xhr.send(formData); + } + + // Called internally when processing is finished. + // Individual callbacks have to be called in the appropriate sections. + + }, { + key: "_finished", + value: function _finished(files, responseText, e) { + for (var _iterator30 = files, _isArray30 = true, _i32 = 0, _iterator30 = _isArray30 ? _iterator30 : _iterator30[Symbol.iterator]();;) { + var _ref29; + + if (_isArray30) { + if (_i32 >= _iterator30.length) break; + _ref29 = _iterator30[_i32++]; + } else { + _i32 = _iterator30.next(); + if (_i32.done) break; + _ref29 = _i32.value; + } + + var file = _ref29; + + file.status = Dropzone.SUCCESS; + this.emit("success", file, responseText, e); + this.emit("complete", file); + } + if (this.options.uploadMultiple) { + this.emit("successmultiple", files, responseText, e); + this.emit("completemultiple", files); + } + + if (this.options.autoProcessQueue) { + return this.processQueue(); + } + } + + // Called internally when processing is finished. + // Individual callbacks have to be called in the appropriate sections. + + }, { + key: "_errorProcessing", + value: function _errorProcessing(files, message, xhr) { + for (var _iterator31 = files, _isArray31 = true, _i33 = 0, _iterator31 = _isArray31 ? _iterator31 : _iterator31[Symbol.iterator]();;) { + var _ref30; + + if (_isArray31) { + if (_i33 >= _iterator31.length) break; + _ref30 = _iterator31[_i33++]; + } else { + _i33 = _iterator31.next(); + if (_i33.done) break; + _ref30 = _i33.value; + } + + var file = _ref30; + + file.status = Dropzone.ERROR; + this.emit("error", file, message, xhr); + this.emit("complete", file); + } + if (this.options.uploadMultiple) { + this.emit("errormultiple", files, message, xhr); + this.emit("completemultiple", files); + } + + if (this.options.autoProcessQueue) { + return this.processQueue(); + } + } + }], [{ + key: "uuidv4", + value: function uuidv4() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, + v = c === 'x' ? r : r & 0x3 | 0x8; + return v.toString(16); + }); + } + }]); + + return Dropzone; +}(Emitter); + +Dropzone.initClass(); + +Dropzone.version = "5.2.0"; + +// This is a map of options for your different dropzones. Add configurations +// to this object for your different dropzone elemens. +// +// Example: +// +// Dropzone.options.myDropzoneElementId = { maxFilesize: 1 }; +// +// To disable autoDiscover for a specific element, you can set `false` as an option: +// +// Dropzone.options.myDisabledElementId = false; +// +// And in html: +// +//
          +Dropzone.options = {}; + +// Returns the options for an element or undefined if none available. +Dropzone.optionsForElement = function (element) { + // Get the `Dropzone.options.elementId` for this element if it exists + if (element.getAttribute("id")) { + return Dropzone.options[camelize(element.getAttribute("id"))]; + } else { + return undefined; + } +}; + +// Holds a list of all dropzone instances +Dropzone.instances = []; + +// Returns the dropzone for given element if any +Dropzone.forElement = function (element) { + if (typeof element === "string") { + element = document.querySelector(element); + } + if ((element != null ? element.dropzone : undefined) == null) { + throw new Error("No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone."); + } + return element.dropzone; +}; + +// Set to false if you don't want Dropzone to automatically find and attach to .dropzone elements. +Dropzone.autoDiscover = true; + +// Looks for all .dropzone elements and creates a dropzone for them +Dropzone.discover = function () { + var dropzones = void 0; + if (document.querySelectorAll) { + dropzones = document.querySelectorAll(".dropzone"); + } else { + dropzones = []; + // IE :( + var checkElements = function checkElements(elements) { + return function () { + var result = []; + for (var _iterator32 = elements, _isArray32 = true, _i34 = 0, _iterator32 = _isArray32 ? _iterator32 : _iterator32[Symbol.iterator]();;) { + var _ref31; + + if (_isArray32) { + if (_i34 >= _iterator32.length) break; + _ref31 = _iterator32[_i34++]; + } else { + _i34 = _iterator32.next(); + if (_i34.done) break; + _ref31 = _i34.value; + } + + var el = _ref31; + + if (/(^| )dropzone($| )/.test(el.className)) { + result.push(dropzones.push(el)); + } else { + result.push(undefined); + } + } + return result; + }(); + }; + checkElements(document.getElementsByTagName("div")); + checkElements(document.getElementsByTagName("form")); + } + + return function () { + var result = []; + for (var _iterator33 = dropzones, _isArray33 = true, _i35 = 0, _iterator33 = _isArray33 ? _iterator33 : _iterator33[Symbol.iterator]();;) { + var _ref32; + + if (_isArray33) { + if (_i35 >= _iterator33.length) break; + _ref32 = _iterator33[_i35++]; + } else { + _i35 = _iterator33.next(); + if (_i35.done) break; + _ref32 = _i35.value; + } + + var dropzone = _ref32; + + // Create a dropzone unless auto discover has been disabled for specific element + if (Dropzone.optionsForElement(dropzone) !== false) { + result.push(new Dropzone(dropzone)); + } else { + result.push(undefined); + } + } + return result; + }(); +}; + +// Since the whole Drag'n'Drop API is pretty new, some browsers implement it, +// but not correctly. +// So I created a blacklist of userAgents. Yes, yes. Browser sniffing, I know. +// But what to do when browsers *theoretically* support an API, but crash +// when using it. +// +// This is a list of regular expressions tested against navigator.userAgent +// +// ** It should only be used on browser that *do* support the API, but +// incorrectly ** +// +Dropzone.blacklistedBrowsers = [ +// The mac os and windows phone version of opera 12 seems to have a problem with the File drag'n'drop API. +/opera.*(Macintosh|Windows Phone).*version\/12/i]; + +// Checks if the browser is supported +Dropzone.isBrowserSupported = function () { + var capableBrowser = true; + + if (window.File && window.FileReader && window.FileList && window.Blob && window.FormData && document.querySelector) { + if (!("classList" in document.createElement("a"))) { + capableBrowser = false; + } else { + // The browser supports the API, but may be blacklisted. + for (var _iterator34 = Dropzone.blacklistedBrowsers, _isArray34 = true, _i36 = 0, _iterator34 = _isArray34 ? _iterator34 : _iterator34[Symbol.iterator]();;) { + var _ref33; + + if (_isArray34) { + if (_i36 >= _iterator34.length) break; + _ref33 = _iterator34[_i36++]; + } else { + _i36 = _iterator34.next(); + if (_i36.done) break; + _ref33 = _i36.value; + } + + var regex = _ref33; + + if (regex.test(navigator.userAgent)) { + capableBrowser = false; + continue; + } + } + } + } else { + capableBrowser = false; + } + + return capableBrowser; +}; + +Dropzone.dataURItoBlob = function (dataURI) { + // convert base64 to raw binary data held in a string + // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this + var byteString = atob(dataURI.split(',')[1]); + + // separate out the mime component + var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; + + // write the bytes of the string to an ArrayBuffer + var ab = new ArrayBuffer(byteString.length); + var ia = new Uint8Array(ab); + for (var i = 0, end = byteString.length, asc = 0 <= end; asc ? i <= end : i >= end; asc ? i++ : i--) { + ia[i] = byteString.charCodeAt(i); + } + + // write the ArrayBuffer to a blob + return new Blob([ab], { type: mimeString }); +}; + +// Returns an array without the rejected item +var without = function without(list, rejectedItem) { + return list.filter(function (item) { + return item !== rejectedItem; + }).map(function (item) { + return item; + }); +}; + +// abc-def_ghi -> abcDefGhi +var camelize = function camelize(str) { + return str.replace(/[\-_](\w)/g, function (match) { + return match.charAt(1).toUpperCase(); + }); +}; + +// Creates an element from string +Dropzone.createElement = function (string) { + var div = document.createElement("div"); + div.innerHTML = string; + return div.childNodes[0]; +}; + +// Tests if given element is inside (or simply is) the container +Dropzone.elementInside = function (element, container) { + if (element === container) { + return true; + } // Coffeescript doesn't support do/while loops + while (element = element.parentNode) { + if (element === container) { + return true; + } + } + return false; +}; + +Dropzone.getElement = function (el, name) { + var element = void 0; + if (typeof el === "string") { + element = document.querySelector(el); + } else if (el.nodeType != null) { + element = el; + } + if (element == null) { + throw new Error("Invalid `" + name + "` option provided. Please provide a CSS selector or a plain HTML element."); + } + return element; +}; + +Dropzone.getElements = function (els, name) { + var el = void 0, + elements = void 0; + if (els instanceof Array) { + elements = []; + try { + for (var _iterator35 = els, _isArray35 = true, _i37 = 0, _iterator35 = _isArray35 ? _iterator35 : _iterator35[Symbol.iterator]();;) { + if (_isArray35) { + if (_i37 >= _iterator35.length) break; + el = _iterator35[_i37++]; + } else { + _i37 = _iterator35.next(); + if (_i37.done) break; + el = _i37.value; + } + + elements.push(this.getElement(el, name)); + } + } catch (e) { + elements = null; + } + } else if (typeof els === "string") { + elements = []; + for (var _iterator36 = document.querySelectorAll(els), _isArray36 = true, _i38 = 0, _iterator36 = _isArray36 ? _iterator36 : _iterator36[Symbol.iterator]();;) { + if (_isArray36) { + if (_i38 >= _iterator36.length) break; + el = _iterator36[_i38++]; + } else { + _i38 = _iterator36.next(); + if (_i38.done) break; + el = _i38.value; + } + + elements.push(el); + } + } else if (els.nodeType != null) { + elements = [els]; + } + + if (elements == null || !elements.length) { + throw new Error("Invalid `" + name + "` option provided. Please provide a CSS selector, a plain HTML element or a list of those."); + } + + return elements; +}; + +// Asks the user the question and calls accepted or rejected accordingly +// +// The default implementation just uses `window.confirm` and then calls the +// appropriate callback. +Dropzone.confirm = function (question, accepted, rejected) { + if (window.confirm(question)) { + return accepted(); + } else if (rejected != null) { + return rejected(); + } +}; + +// Validates the mime type like this: +// +// https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept +Dropzone.isValidFile = function (file, acceptedFiles) { + if (!acceptedFiles) { + return true; + } // If there are no accepted mime types, it's OK + acceptedFiles = acceptedFiles.split(","); + + var mimeType = file.type; + var baseMimeType = mimeType.replace(/\/.*$/, ""); + + for (var _iterator37 = acceptedFiles, _isArray37 = true, _i39 = 0, _iterator37 = _isArray37 ? _iterator37 : _iterator37[Symbol.iterator]();;) { + var _ref34; + + if (_isArray37) { + if (_i39 >= _iterator37.length) break; + _ref34 = _iterator37[_i39++]; + } else { + _i39 = _iterator37.next(); + if (_i39.done) break; + _ref34 = _i39.value; + } + + var validType = _ref34; + + validType = validType.trim(); + if (validType.charAt(0) === ".") { + if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) { + return true; + } + } else if (/\/\*$/.test(validType)) { + // This is something like a image/* mime type + if (baseMimeType === validType.replace(/\/.*$/, "")) { + return true; + } + } else { + if (mimeType === validType) { + return true; + } + } + } + + return false; +}; + +// Augment jQuery +if (typeof jQuery !== 'undefined' && jQuery !== null) { + jQuery.fn.dropzone = function (options) { + return this.each(function () { + return new Dropzone(this, options); + }); + }; +} + +if (typeof module !== 'undefined' && module !== null) { + module.exports = Dropzone; +} else { + window.Dropzone = Dropzone; +} + +// Dropzone file status codes +Dropzone.ADDED = "added"; + +Dropzone.QUEUED = "queued"; +// For backwards compatibility. Now, if a file is accepted, it's either queued +// or uploading. +Dropzone.ACCEPTED = Dropzone.QUEUED; + +Dropzone.UPLOADING = "uploading"; +Dropzone.PROCESSING = Dropzone.UPLOADING; // alias + +Dropzone.CANCELED = "canceled"; +Dropzone.ERROR = "error"; +Dropzone.SUCCESS = "success"; + +/* + + Bugfix for iOS 6 and 7 + Source: http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios + based on the work of https://github.com/stomita/ios-imagefile-megapixel + + */ + +// Detecting vertical squash in loaded image. +// Fixes a bug which squash image vertically while drawing into canvas for some images. +// This is a bug in iOS6 devices. This function from https://github.com/stomita/ios-imagefile-megapixel +var detectVerticalSquash = function detectVerticalSquash(img) { + var iw = img.naturalWidth; + var ih = img.naturalHeight; + var canvas = document.createElement("canvas"); + canvas.width = 1; + canvas.height = ih; + var ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0); + + var _ctx$getImageData = ctx.getImageData(1, 0, 1, ih), + data = _ctx$getImageData.data; + + // search image edge pixel position in case it is squashed vertically. + + + var sy = 0; + var ey = ih; + var py = ih; + while (py > sy) { + var alpha = data[(py - 1) * 4 + 3]; + + if (alpha === 0) { + ey = py; + } else { + sy = py; + } + + py = ey + sy >> 1; + } + var ratio = py / ih; + + if (ratio === 0) { + return 1; + } else { + return ratio; + } +}; + +// A replacement for context.drawImage +// (args are for source and destination). +var drawImageIOSFix = function drawImageIOSFix(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) { + var vertSquashRatio = detectVerticalSquash(img); + return ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio); +}; + +// Based on MinifyJpeg +// Source: http://www.perry.cz/files/ExifRestorer.js +// http://elicon.blog57.fc2.com/blog-entry-206.html + +var ExifRestore = function () { + function ExifRestore() { + _classCallCheck(this, ExifRestore); + } + + _createClass(ExifRestore, null, [{ + key: "initClass", + value: function initClass() { + this.KEY_STR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + } + }, { + key: "encode64", + value: function encode64(input) { + var output = ''; + var chr1 = undefined; + var chr2 = undefined; + var chr3 = ''; + var enc1 = undefined; + var enc2 = undefined; + var enc3 = undefined; + var enc4 = ''; + var i = 0; + while (true) { + chr1 = input[i++]; + chr2 = input[i++]; + chr3 = input[i++]; + enc1 = chr1 >> 2; + enc2 = (chr1 & 3) << 4 | chr2 >> 4; + enc3 = (chr2 & 15) << 2 | chr3 >> 6; + enc4 = chr3 & 63; + if (isNaN(chr2)) { + enc3 = enc4 = 64; + } else if (isNaN(chr3)) { + enc4 = 64; + } + output = output + this.KEY_STR.charAt(enc1) + this.KEY_STR.charAt(enc2) + this.KEY_STR.charAt(enc3) + this.KEY_STR.charAt(enc4); + chr1 = chr2 = chr3 = ''; + enc1 = enc2 = enc3 = enc4 = ''; + if (!(i < input.length)) { + break; + } + } + return output; + } + }, { + key: "restore", + value: function restore(origFileBase64, resizedFileBase64) { + if (!origFileBase64.match('data:image/jpeg;base64,')) { + return resizedFileBase64; + } + var rawImage = this.decode64(origFileBase64.replace('data:image/jpeg;base64,', '')); + var segments = this.slice2Segments(rawImage); + var image = this.exifManipulation(resizedFileBase64, segments); + return "data:image/jpeg;base64," + this.encode64(image); + } + }, { + key: "exifManipulation", + value: function exifManipulation(resizedFileBase64, segments) { + var exifArray = this.getExifArray(segments); + var newImageArray = this.insertExif(resizedFileBase64, exifArray); + var aBuffer = new Uint8Array(newImageArray); + return aBuffer; + } + }, { + key: "getExifArray", + value: function getExifArray(segments) { + var seg = undefined; + var x = 0; + while (x < segments.length) { + seg = segments[x]; + if (seg[0] === 255 & seg[1] === 225) { + return seg; + } + x++; + } + return []; + } + }, { + key: "insertExif", + value: function insertExif(resizedFileBase64, exifArray) { + var imageData = resizedFileBase64.replace('data:image/jpeg;base64,', ''); + var buf = this.decode64(imageData); + var separatePoint = buf.indexOf(255, 3); + var mae = buf.slice(0, separatePoint); + var ato = buf.slice(separatePoint); + var array = mae; + array = array.concat(exifArray); + array = array.concat(ato); + return array; + } + }, { + key: "slice2Segments", + value: function slice2Segments(rawImageArray) { + var head = 0; + var segments = []; + while (true) { + var length; + if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 218) { + break; + } + if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 216) { + head += 2; + } else { + length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3]; + var endPoint = head + length + 2; + var seg = rawImageArray.slice(head, endPoint); + segments.push(seg); + head = endPoint; + } + if (head > rawImageArray.length) { + break; + } + } + return segments; + } + }, { + key: "decode64", + value: function decode64(input) { + var output = ''; + var chr1 = undefined; + var chr2 = undefined; + var chr3 = ''; + var enc1 = undefined; + var enc2 = undefined; + var enc3 = undefined; + var enc4 = ''; + var i = 0; + var buf = []; + // remove all characters that are not A-Z, a-z, 0-9, +, /, or = + var base64test = /[^A-Za-z0-9\+\/\=]/g; + if (base64test.exec(input)) { + console.warn('There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, \'+\', \'/\',and \'=\'\nExpect errors in decoding.'); + } + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); + while (true) { + enc1 = this.KEY_STR.indexOf(input.charAt(i++)); + enc2 = this.KEY_STR.indexOf(input.charAt(i++)); + enc3 = this.KEY_STR.indexOf(input.charAt(i++)); + enc4 = this.KEY_STR.indexOf(input.charAt(i++)); + chr1 = enc1 << 2 | enc2 >> 4; + chr2 = (enc2 & 15) << 4 | enc3 >> 2; + chr3 = (enc3 & 3) << 6 | enc4; + buf.push(chr1); + if (enc3 !== 64) { + buf.push(chr2); + } + if (enc4 !== 64) { + buf.push(chr3); + } + chr1 = chr2 = chr3 = ''; + enc1 = enc2 = enc3 = enc4 = ''; + if (!(i < input.length)) { + break; + } + } + return buf; + } + }]); + + return ExifRestore; +}(); + +ExifRestore.initClass(); + +/* + * contentloaded.js + * + * Author: Diego Perini (diego.perini at gmail.com) + * Summary: cross-browser wrapper for DOMContentLoaded + * Updated: 20101020 + * License: MIT + * Version: 1.2 + * + * URL: + * http://javascript.nwbox.com/ContentLoaded/ + * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE + */ + +// @win window reference +// @fn function reference +var contentLoaded = function contentLoaded(win, fn) { + var done = false; + var top = true; + var doc = win.document; + var root = doc.documentElement; + var add = doc.addEventListener ? "addEventListener" : "attachEvent"; + var rem = doc.addEventListener ? "removeEventListener" : "detachEvent"; + var pre = doc.addEventListener ? "" : "on"; + var init = function init(e) { + if (e.type === "readystatechange" && doc.readyState !== "complete") { + return; + } + (e.type === "load" ? win : doc)[rem](pre + e.type, init, false); + if (!done && (done = true)) { + return fn.call(win, e.type || e); + } + }; + + var poll = function poll() { + try { + root.doScroll("left"); + } catch (e) { + setTimeout(poll, 50); + return; + } + return init("poll"); + }; + + if (doc.readyState !== "complete") { + if (doc.createEventObject && root.doScroll) { + try { + top = !win.frameElement; + } catch (error) {} + if (top) { + poll(); + } + } + doc[add](pre + "DOMContentLoaded", init, false); + doc[add](pre + "readystatechange", init, false); + return win[add](pre + "load", init, false); + } +}; + +// As a single function to be able to write tests. +Dropzone._autoDiscoverFunction = function () { + if (Dropzone.autoDiscover) { + return Dropzone.discover(); + } +}; +contentLoaded(window, Dropzone._autoDiscoverFunction); + +function __guard__(value, transform) { + return typeof value !== 'undefined' && value !== null ? transform(value) : undefined; +} +function __guardMethod__(obj, methodName, transform) { + if (typeof obj !== 'undefined' && obj !== null && typeof obj[methodName] === 'function') { + return transform(obj, methodName); + } else { + return undefined; + } +} + +/** + * Super simple wysiwyg editor v0.8.8 + * http://summernote.org/ + * + * summernote.js + * Copyright 2013- Alan Hong. and other contributors + * summernote may be freely distributed under the MIT license./ + * + * Date: 2017-09-09T11:03Z + */ +(function (factory) { + /* global define */ + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof module === 'object' && module.exports) { + // Node/CommonJS + module.exports = factory(require('jquery')); + } else { + // Browser globals + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + var isSupportAmd = typeof define === 'function' && define.amd; + + /** + * returns whether font is installed or not. + * + * @param {String} fontName + * @return {Boolean} + */ + var isFontInstalled = function (fontName) { + var testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS'; + var $tester = $('
          ').css({ + position: 'absolute', + left: '-9999px', + top: '-9999px', + fontSize: '200px' + }).text('mmmmmmmmmwwwwwww').appendTo(document.body); + + var originalWidth = $tester.css('fontFamily', testFontName).width(); + var width = $tester.css('fontFamily', fontName + ',' + testFontName).width(); + + $tester.remove(); + + return originalWidth !== width; + }; + + var userAgent = navigator.userAgent; + var isMSIE = /MSIE|Trident/i.test(userAgent); + var browserVersion; + if (isMSIE) { + var matches = /MSIE (\d+[.]\d+)/.exec(userAgent); + if (matches) { + browserVersion = parseFloat(matches[1]); + } + matches = /Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/.exec(userAgent); + if (matches) { + browserVersion = parseFloat(matches[1]); + } + } + + var isEdge = /Edge\/\d+/.test(userAgent); + + var hasCodeMirror = !!window.CodeMirror; + if (!hasCodeMirror && isSupportAmd) { + // Webpack + if (typeof __webpack_require__ === 'function') { // jshint ignore:line + try { + // If CodeMirror can't be resolved, `require.resolve` will throw an + // exception and `hasCodeMirror` won't be set to `true`. + require.resolve('codemirror'); + hasCodeMirror = true; + } catch (e) { + // do nothing + } + } else if (typeof require !== 'undefined') { + // Browserify + if (typeof require.resolve !== 'undefined') { + try { + // If CodeMirror can't be resolved, `require.resolve` will throw an + // exception and `hasCodeMirror` won't be set to `true`. + require.resolve('codemirror'); + hasCodeMirror = true; + } catch (e) { + // do nothing + } + // Almond/Require + } else if (typeof require.specified !== 'undefined') { + hasCodeMirror = require.specified('codemirror'); + } + } + } + + var isSupportTouch = + (('ontouchstart' in window) || + (navigator.MaxTouchPoints > 0) || + (navigator.msMaxTouchPoints > 0)); + + /** + * @class core.agent + * + * Object which check platform and agent + * + * @singleton + * @alternateClassName agent + */ + var agent = { + isMac: navigator.appVersion.indexOf('Mac') > -1, + isMSIE: isMSIE, + isEdge: isEdge, + isFF: !isEdge && /firefox/i.test(userAgent), + isPhantom: /PhantomJS/i.test(userAgent), + isWebkit: !isEdge && /webkit/i.test(userAgent), + isChrome: !isEdge && /chrome/i.test(userAgent), + isSafari: !isEdge && /safari/i.test(userAgent), + browserVersion: browserVersion, + jqueryVersion: parseFloat($.fn.jquery), + isSupportAmd: isSupportAmd, + isSupportTouch: isSupportTouch, + hasCodeMirror: hasCodeMirror, + isFontInstalled: isFontInstalled, + isW3CRangeSupport: !!document.createRange + }; + + /** + * @class core.func + * + * func utils (for high-order func's arg) + * + * @singleton + * @alternateClassName func + */ + var func = (function () { + var eq = function (itemA) { + return function (itemB) { + return itemA === itemB; + }; + }; + + var eq2 = function (itemA, itemB) { + return itemA === itemB; + }; + + var peq2 = function (propName) { + return function (itemA, itemB) { + return itemA[propName] === itemB[propName]; + }; + }; + + var ok = function () { + return true; + }; + + var fail = function () { + return false; + }; + + var not = function (f) { + return function () { + return !f.apply(f, arguments); + }; + }; + + var and = function (fA, fB) { + return function (item) { + return fA(item) && fB(item); + }; + }; + + var self = function (a) { + return a; + }; + + var invoke = function (obj, method) { + return function () { + return obj[method].apply(obj, arguments); + }; + }; + + var idCounter = 0; + + /** + * generate a globally-unique id + * + * @param {String} [prefix] + */ + var uniqueId = function (prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + }; + + /** + * returns bnd (bounds) from rect + * + * - IE Compatibility Issue: http://goo.gl/sRLOAo + * - Scroll Issue: http://goo.gl/sNjUc + * + * @param {Rect} rect + * @return {Object} bounds + * @return {Number} bounds.top + * @return {Number} bounds.left + * @return {Number} bounds.width + * @return {Number} bounds.height + */ + var rect2bnd = function (rect) { + var $document = $(document); + return { + top: rect.top + $document.scrollTop(), + left: rect.left + $document.scrollLeft(), + width: rect.right - rect.left, + height: rect.bottom - rect.top + }; + }; + + /** + * returns a copy of the object where the keys have become the values and the values the keys. + * @param {Object} obj + * @return {Object} + */ + var invertObject = function (obj) { + var inverted = {}; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + inverted[obj[key]] = key; + } + } + return inverted; + }; + + /** + * @param {String} namespace + * @param {String} [prefix] + * @return {String} + */ + var namespaceToCamel = function (namespace, prefix) { + prefix = prefix || ''; + return prefix + namespace.split('.').map(function (name) { + return name.substring(0, 1).toUpperCase() + name.substring(1); + }).join(''); + }; + + /** + * 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. + * @param {Function} func + * @param {Number} wait + * @param {Boolean} immediate + * @return {Function} + */ + var debounce = function (func, wait, immediate) { + var timeout; + return function () { + var context = this, args = arguments; + var later = function () { + timeout = null; + if (!immediate) { + func.apply(context, args); + } + }; + var callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + func.apply(context, args); + } + }; + }; + + return { + eq: eq, + eq2: eq2, + peq2: peq2, + ok: ok, + fail: fail, + self: self, + not: not, + and: and, + invoke: invoke, + uniqueId: uniqueId, + rect2bnd: rect2bnd, + invertObject: invertObject, + namespaceToCamel: namespaceToCamel, + debounce: debounce + }; + })(); + + /** + * @class core.list + * + * list utils + * + * @singleton + * @alternateClassName list + */ + var list = (function () { + /** + * returns the first item of an array. + * + * @param {Array} array + */ + var head = function (array) { + return array[0]; + }; + + /** + * returns the last item of an array. + * + * @param {Array} array + */ + var last = function (array) { + return array[array.length - 1]; + }; + + /** + * returns everything but the last entry of the array. + * + * @param {Array} array + */ + var initial = function (array) { + return array.slice(0, array.length - 1); + }; + + /** + * returns the rest of the items in an array. + * + * @param {Array} array + */ + var tail = function (array) { + return array.slice(1); + }; + + /** + * returns item of array + */ + var find = function (array, pred) { + for (var idx = 0, len = array.length; idx < len; idx ++) { + var item = array[idx]; + if (pred(item)) { + return item; + } + } + }; + + /** + * returns true if all of the values in the array pass the predicate truth test. + */ + var all = function (array, pred) { + for (var idx = 0, len = array.length; idx < len; idx ++) { + if (!pred(array[idx])) { + return false; + } + } + return true; + }; + + /** + * returns index of item + */ + var indexOf = function (array, item) { + return $.inArray(item, array); + }; + + /** + * returns true if the value is present in the list. + */ + var contains = function (array, item) { + return indexOf(array, item) !== -1; + }; + + /** + * get sum from a list + * + * @param {Array} array - array + * @param {Function} fn - iterator + */ + var sum = function (array, fn) { + fn = fn || func.self; + return array.reduce(function (memo, v) { + return memo + fn(v); + }, 0); + }; + + /** + * returns a copy of the collection with array type. + * @param {Collection} collection - collection eg) node.childNodes, ... + */ + var from = function (collection) { + var result = [], idx = -1, length = collection.length; + while (++idx < length) { + result[idx] = collection[idx]; + } + return result; + }; + + /** + * returns whether list is empty or not + */ + var isEmpty = function (array) { + return !array || !array.length; + }; + + /** + * cluster elements by predicate function. + * + * @param {Array} array - array + * @param {Function} fn - predicate function for cluster rule + * @param {Array[]} + */ + var clusterBy = function (array, fn) { + if (!array.length) { return []; } + var aTail = tail(array); + return aTail.reduce(function (memo, v) { + var aLast = last(memo); + if (fn(last(aLast), v)) { + aLast[aLast.length] = v; + } else { + memo[memo.length] = [v]; + } + return memo; + }, [[head(array)]]); + }; + + /** + * returns a copy of the array with all false values removed + * + * @param {Array} array - array + * @param {Function} fn - predicate function for cluster rule + */ + var compact = function (array) { + var aResult = []; + for (var idx = 0, len = array.length; idx < len; idx ++) { + if (array[idx]) { aResult.push(array[idx]); } + } + return aResult; + }; + + /** + * produces a duplicate-free version of the array + * + * @param {Array} array + */ + var unique = function (array) { + var results = []; + + for (var idx = 0, len = array.length; idx < len; idx ++) { + if (!contains(results, array[idx])) { + results.push(array[idx]); + } + } + + return results; + }; + + /** + * returns next item. + * @param {Array} array + */ + var next = function (array, item) { + var idx = indexOf(array, item); + if (idx === -1) { return null; } + + return array[idx + 1]; + }; + + /** + * returns prev item. + * @param {Array} array + */ + var prev = function (array, item) { + var idx = indexOf(array, item); + if (idx === -1) { return null; } + + return array[idx - 1]; + }; + + return { head: head, last: last, initial: initial, tail: tail, + prev: prev, next: next, find: find, contains: contains, + all: all, sum: sum, from: from, isEmpty: isEmpty, + clusterBy: clusterBy, compact: compact, unique: unique }; + })(); + + + var NBSP_CHAR = String.fromCharCode(160); + var ZERO_WIDTH_NBSP_CHAR = '\ufeff'; + + /** + * @class core.dom + * + * Dom functions + * + * @singleton + * @alternateClassName dom + */ + var dom = (function () { + /** + * @method isEditable + * + * returns whether node is `note-editable` or not. + * + * @param {Node} node + * @return {Boolean} + */ + var isEditable = function (node) { + return node && $(node).hasClass('note-editable'); + }; + + /** + * @method isControlSizing + * + * returns whether node is `note-control-sizing` or not. + * + * @param {Node} node + * @return {Boolean} + */ + var isControlSizing = function (node) { + return node && $(node).hasClass('note-control-sizing'); + }; + + /** + * @method makePredByNodeName + * + * returns predicate which judge whether nodeName is same + * + * @param {String} nodeName + * @return {Function} + */ + var makePredByNodeName = function (nodeName) { + nodeName = nodeName.toUpperCase(); + return function (node) { + return node && node.nodeName.toUpperCase() === nodeName; + }; + }; + + /** + * @method isText + * + * + * + * @param {Node} node + * @return {Boolean} true if node's type is text(3) + */ + var isText = function (node) { + return node && node.nodeType === 3; + }; + + /** + * @method isElement + * + * + * + * @param {Node} node + * @return {Boolean} true if node's type is element(1) + */ + var isElement = function (node) { + return node && node.nodeType === 1; + }; + + /** + * ex) br, col, embed, hr, img, input, ... + * @see http://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements + */ + var isVoid = function (node) { + return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT/.test(node.nodeName.toUpperCase()); + }; + + var isPara = function (node) { + if (isEditable(node)) { + return false; + } + + // Chrome(v31.0), FF(v25.0.1) use DIV for paragraph + return node && /^DIV|^P|^LI|^H[1-7]/.test(node.nodeName.toUpperCase()); + }; + + var isHeading = function (node) { + return node && /^H[1-7]/.test(node.nodeName.toUpperCase()); + }; + + var isPre = makePredByNodeName('PRE'); + + var isLi = makePredByNodeName('LI'); + + var isPurePara = function (node) { + return isPara(node) && !isLi(node); + }; + + var isTable = makePredByNodeName('TABLE'); + + var isData = makePredByNodeName('DATA'); + + var isInline = function (node) { + return !isBodyContainer(node) && + !isList(node) && + !isHr(node) && + !isPara(node) && + !isTable(node) && + !isBlockquote(node) && + !isData(node); + }; + + var isList = function (node) { + return node && /^UL|^OL/.test(node.nodeName.toUpperCase()); + }; + + var isHr = makePredByNodeName('HR'); + + var isCell = function (node) { + return node && /^TD|^TH/.test(node.nodeName.toUpperCase()); + }; + + var isBlockquote = makePredByNodeName('BLOCKQUOTE'); + + var isBodyContainer = function (node) { + return isCell(node) || isBlockquote(node) || isEditable(node); + }; + + var isAnchor = makePredByNodeName('A'); + + var isParaInline = function (node) { + return isInline(node) && !!ancestor(node, isPara); + }; + + var isBodyInline = function (node) { + return isInline(node) && !ancestor(node, isPara); + }; + + var isBody = makePredByNodeName('BODY'); + + /** + * returns whether nodeB is closest sibling of nodeA + * + * @param {Node} nodeA + * @param {Node} nodeB + * @return {Boolean} + */ + var isClosestSibling = function (nodeA, nodeB) { + return nodeA.nextSibling === nodeB || + nodeA.previousSibling === nodeB; + }; + + /** + * returns array of closest siblings with node + * + * @param {Node} node + * @param {function} [pred] - predicate function + * @return {Node[]} + */ + var withClosestSiblings = function (node, pred) { + pred = pred || func.ok; + + var siblings = []; + if (node.previousSibling && pred(node.previousSibling)) { + siblings.push(node.previousSibling); + } + siblings.push(node); + if (node.nextSibling && pred(node.nextSibling)) { + siblings.push(node.nextSibling); + } + return siblings; + }; + + /** + * blank HTML for cursor position + * - [workaround] old IE only works with   + * - [workaround] IE11 and other browser works with bogus br + */ + var blankHTML = agent.isMSIE && agent.browserVersion < 11 ? ' ' : '
          '; + + /** + * @method nodeLength + * + * returns #text's text size or element's childNodes size + * + * @param {Node} node + */ + var nodeLength = function (node) { + if (isText(node)) { + return node.nodeValue.length; + } + + if (node) { + return node.childNodes.length; + } + + return 0; + + }; + + /** + * returns whether node is empty or not. + * + * @param {Node} node + * @return {Boolean} + */ + var isEmpty = function (node) { + var len = nodeLength(node); + + if (len === 0) { + return true; + } else if (!isText(node) && len === 1 && node.innerHTML === blankHTML) { + // ex)


          ,
          + return true; + } else if (list.all(node.childNodes, isText) && node.innerHTML === '') { + // ex)

          , + return true; + } + + return false; + }; + + /** + * padding blankHTML if node is empty (for cursor position) + */ + var paddingBlankHTML = function (node) { + if (!isVoid(node) && !nodeLength(node)) { + node.innerHTML = blankHTML; + } + }; + + /** + * find nearest ancestor predicate hit + * + * @param {Node} node + * @param {Function} pred - predicate function + */ + var ancestor = function (node, pred) { + while (node) { + if (pred(node)) { return node; } + if (isEditable(node)) { break; } + + node = node.parentNode; + } + return null; + }; + + /** + * find nearest ancestor only single child blood line and predicate hit + * + * @param {Node} node + * @param {Function} pred - predicate function + */ + var singleChildAncestor = function (node, pred) { + node = node.parentNode; + + while (node) { + if (nodeLength(node) !== 1) { break; } + if (pred(node)) { return node; } + if (isEditable(node)) { break; } + + node = node.parentNode; + } + return null; + }; + + /** + * returns new array of ancestor nodes (until predicate hit). + * + * @param {Node} node + * @param {Function} [optional] pred - predicate function + */ + var listAncestor = function (node, pred) { + pred = pred || func.fail; + + var ancestors = []; + ancestor(node, function (el) { + if (!isEditable(el)) { + ancestors.push(el); + } + + return pred(el); + }); + return ancestors; + }; + + /** + * find farthest ancestor predicate hit + */ + var lastAncestor = function (node, pred) { + var ancestors = listAncestor(node); + return list.last(ancestors.filter(pred)); + }; + + /** + * returns common ancestor node between two nodes. + * + * @param {Node} nodeA + * @param {Node} nodeB + */ + var commonAncestor = function (nodeA, nodeB) { + var ancestors = listAncestor(nodeA); + for (var n = nodeB; n; n = n.parentNode) { + if ($.inArray(n, ancestors) > -1) { return n; } + } + return null; // difference document area + }; + + /** + * listing all previous siblings (until predicate hit). + * + * @param {Node} node + * @param {Function} [optional] pred - predicate function + */ + var listPrev = function (node, pred) { + pred = pred || func.fail; + + var nodes = []; + while (node) { + if (pred(node)) { break; } + nodes.push(node); + node = node.previousSibling; + } + return nodes; + }; + + /** + * listing next siblings (until predicate hit). + * + * @param {Node} node + * @param {Function} [pred] - predicate function + */ + var listNext = function (node, pred) { + pred = pred || func.fail; + + var nodes = []; + while (node) { + if (pred(node)) { break; } + nodes.push(node); + node = node.nextSibling; + } + return nodes; + }; + + /** + * listing descendant nodes + * + * @param {Node} node + * @param {Function} [pred] - predicate function + */ + var listDescendant = function (node, pred) { + var descendants = []; + pred = pred || func.ok; + + // start DFS(depth first search) with node + (function fnWalk(current) { + if (node !== current && pred(current)) { + descendants.push(current); + } + for (var idx = 0, len = current.childNodes.length; idx < len; idx++) { + fnWalk(current.childNodes[idx]); + } + })(node); + + return descendants; + }; + + /** + * wrap node with new tag. + * + * @param {Node} node + * @param {Node} tagName of wrapper + * @return {Node} - wrapper + */ + var wrap = function (node, wrapperName) { + var parent = node.parentNode; + var wrapper = $('<' + wrapperName + '>')[0]; + + parent.insertBefore(wrapper, node); + wrapper.appendChild(node); + + return wrapper; + }; + + /** + * insert node after preceding + * + * @param {Node} node + * @param {Node} preceding - predicate function + */ + var insertAfter = function (node, preceding) { + var next = preceding.nextSibling, parent = preceding.parentNode; + if (next) { + parent.insertBefore(node, next); + } else { + parent.appendChild(node); + } + return node; + }; + + /** + * append elements. + * + * @param {Node} node + * @param {Collection} aChild + */ + var appendChildNodes = function (node, aChild) { + $.each(aChild, function (idx, child) { + node.appendChild(child); + }); + return node; + }; + + /** + * returns whether boundaryPoint is left edge or not. + * + * @param {BoundaryPoint} point + * @return {Boolean} + */ + var isLeftEdgePoint = function (point) { + return point.offset === 0; + }; + + /** + * returns whether boundaryPoint is right edge or not. + * + * @param {BoundaryPoint} point + * @return {Boolean} + */ + var isRightEdgePoint = function (point) { + return point.offset === nodeLength(point.node); + }; + + /** + * returns whether boundaryPoint is edge or not. + * + * @param {BoundaryPoint} point + * @return {Boolean} + */ + var isEdgePoint = function (point) { + return isLeftEdgePoint(point) || isRightEdgePoint(point); + }; + + /** + * returns whether node is left edge of ancestor or not. + * + * @param {Node} node + * @param {Node} ancestor + * @return {Boolean} + */ + var isLeftEdgeOf = function (node, ancestor) { + while (node && node !== ancestor) { + if (position(node) !== 0) { + return false; + } + node = node.parentNode; + } + + return true; + }; + + /** + * returns whether node is right edge of ancestor or not. + * + * @param {Node} node + * @param {Node} ancestor + * @return {Boolean} + */ + var isRightEdgeOf = function (node, ancestor) { + if (!ancestor) { + return false; + } + while (node && node !== ancestor) { + if (position(node) !== nodeLength(node.parentNode) - 1) { + return false; + } + node = node.parentNode; + } + + return true; + }; + + /** + * returns whether point is left edge of ancestor or not. + * @param {BoundaryPoint} point + * @param {Node} ancestor + * @return {Boolean} + */ + var isLeftEdgePointOf = function (point, ancestor) { + return isLeftEdgePoint(point) && isLeftEdgeOf(point.node, ancestor); + }; + + /** + * returns whether point is right edge of ancestor or not. + * @param {BoundaryPoint} point + * @param {Node} ancestor + * @return {Boolean} + */ + var isRightEdgePointOf = function (point, ancestor) { + return isRightEdgePoint(point) && isRightEdgeOf(point.node, ancestor); + }; + + /** + * returns offset from parent. + * + * @param {Node} node + */ + var position = function (node) { + var offset = 0; + while ((node = node.previousSibling)) { + offset += 1; + } + return offset; + }; + + var hasChildren = function (node) { + return !!(node && node.childNodes && node.childNodes.length); + }; + + /** + * returns previous boundaryPoint + * + * @param {BoundaryPoint} point + * @param {Boolean} isSkipInnerOffset + * @return {BoundaryPoint} + */ + var prevPoint = function (point, isSkipInnerOffset) { + var node, offset; + + if (point.offset === 0) { + if (isEditable(point.node)) { + return null; + } + + node = point.node.parentNode; + offset = position(point.node); + } else if (hasChildren(point.node)) { + node = point.node.childNodes[point.offset - 1]; + offset = nodeLength(node); + } else { + node = point.node; + offset = isSkipInnerOffset ? 0 : point.offset - 1; + } + + return { + node: node, + offset: offset + }; + }; + + /** + * returns next boundaryPoint + * + * @param {BoundaryPoint} point + * @param {Boolean} isSkipInnerOffset + * @return {BoundaryPoint} + */ + var nextPoint = function (point, isSkipInnerOffset) { + var node, offset; + + if (nodeLength(point.node) === point.offset) { + if (isEditable(point.node)) { + return null; + } + + node = point.node.parentNode; + offset = position(point.node) + 1; + } else if (hasChildren(point.node)) { + node = point.node.childNodes[point.offset]; + offset = 0; + } else { + node = point.node; + offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1; + } + + return { + node: node, + offset: offset + }; + }; + + /** + * returns whether pointA and pointB is same or not. + * + * @param {BoundaryPoint} pointA + * @param {BoundaryPoint} pointB + * @return {Boolean} + */ + var isSamePoint = function (pointA, pointB) { + return pointA.node === pointB.node && pointA.offset === pointB.offset; + }; + + /** + * returns whether point is visible (can set cursor) or not. + * + * @param {BoundaryPoint} point + * @return {Boolean} + */ + var isVisiblePoint = function (point) { + if (isText(point.node) || !hasChildren(point.node) || isEmpty(point.node)) { + return true; + } + + var leftNode = point.node.childNodes[point.offset - 1]; + var rightNode = point.node.childNodes[point.offset]; + if ((!leftNode || isVoid(leftNode)) && (!rightNode || isVoid(rightNode))) { + return true; + } + + return false; + }; + + /** + * @method prevPointUtil + * + * @param {BoundaryPoint} point + * @param {Function} pred + * @return {BoundaryPoint} + */ + var prevPointUntil = function (point, pred) { + while (point) { + if (pred(point)) { + return point; + } + + point = prevPoint(point); + } + + return null; + }; + + /** + * @method nextPointUntil + * + * @param {BoundaryPoint} point + * @param {Function} pred + * @return {BoundaryPoint} + */ + var nextPointUntil = function (point, pred) { + while (point) { + if (pred(point)) { + return point; + } + + point = nextPoint(point); + } + + return null; + }; + + /** + * returns whether point has character or not. + * + * @param {Point} point + * @return {Boolean} + */ + var isCharPoint = function (point) { + if (!isText(point.node)) { + return false; + } + + var ch = point.node.nodeValue.charAt(point.offset - 1); + return ch && (ch !== ' ' && ch !== NBSP_CHAR); + }; + + /** + * @method walkPoint + * + * @param {BoundaryPoint} startPoint + * @param {BoundaryPoint} endPoint + * @param {Function} handler + * @param {Boolean} isSkipInnerOffset + */ + var walkPoint = function (startPoint, endPoint, handler, isSkipInnerOffset) { + var point = startPoint; + + while (point) { + handler(point); + + if (isSamePoint(point, endPoint)) { + break; + } + + var isSkipOffset = isSkipInnerOffset && + startPoint.node !== point.node && + endPoint.node !== point.node; + point = nextPoint(point, isSkipOffset); + } + }; + + /** + * @method makeOffsetPath + * + * return offsetPath(array of offset) from ancestor + * + * @param {Node} ancestor - ancestor node + * @param {Node} node + */ + var makeOffsetPath = function (ancestor, node) { + var ancestors = listAncestor(node, func.eq(ancestor)); + return ancestors.map(position).reverse(); + }; + + /** + * @method fromOffsetPath + * + * return element from offsetPath(array of offset) + * + * @param {Node} ancestor - ancestor node + * @param {array} offsets - offsetPath + */ + var fromOffsetPath = function (ancestor, offsets) { + var current = ancestor; + for (var i = 0, len = offsets.length; i < len; i++) { + if (current.childNodes.length <= offsets[i]) { + current = current.childNodes[current.childNodes.length - 1]; + } else { + current = current.childNodes[offsets[i]]; + } + } + return current; + }; + + /** + * @method splitNode + * + * split element or #text + * + * @param {BoundaryPoint} point + * @param {Object} [options] + * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false + * @param {Boolean} [options.isNotSplitEdgePoint] - default: false + * @return {Node} right node of boundaryPoint + */ + var splitNode = function (point, options) { + var isSkipPaddingBlankHTML = options && options.isSkipPaddingBlankHTML; + var isNotSplitEdgePoint = options && options.isNotSplitEdgePoint; + + // edge case + if (isEdgePoint(point) && (isText(point.node) || isNotSplitEdgePoint)) { + if (isLeftEdgePoint(point)) { + return point.node; + } else if (isRightEdgePoint(point)) { + return point.node.nextSibling; + } + } + + // split #text + if (isText(point.node)) { + return point.node.splitText(point.offset); + } else { + var childNode = point.node.childNodes[point.offset]; + var clone = insertAfter(point.node.cloneNode(false), point.node); + appendChildNodes(clone, listNext(childNode)); + + if (!isSkipPaddingBlankHTML) { + paddingBlankHTML(point.node); + paddingBlankHTML(clone); + } + + return clone; + } + }; + + /** + * @method splitTree + * + * split tree by point + * + * @param {Node} root - split root + * @param {BoundaryPoint} point + * @param {Object} [options] + * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false + * @param {Boolean} [options.isNotSplitEdgePoint] - default: false + * @return {Node} right node of boundaryPoint + */ + var splitTree = function (root, point, options) { + // ex) [#text, ,

          ] + var ancestors = listAncestor(point.node, func.eq(root)); + + if (!ancestors.length) { + return null; + } else if (ancestors.length === 1) { + return splitNode(point, options); + } + + return ancestors.reduce(function (node, parent) { + if (node === point.node) { + node = splitNode(point, options); + } + + return splitNode({ + node: parent, + offset: node ? dom.position(node) : nodeLength(parent) + }, options); + }); + }; + + /** + * split point + * + * @param {Point} point + * @param {Boolean} isInline + * @return {Object} + */ + var splitPoint = function (point, isInline) { + // find splitRoot, container + // - inline: splitRoot is a child of paragraph + // - block: splitRoot is a child of bodyContainer + var pred = isInline ? isPara : isBodyContainer; + var ancestors = listAncestor(point.node, pred); + var topAncestor = list.last(ancestors) || point.node; + + var splitRoot, container; + if (pred(topAncestor)) { + splitRoot = ancestors[ancestors.length - 2]; + container = topAncestor; + } else { + splitRoot = topAncestor; + container = splitRoot.parentNode; + } + + // if splitRoot is exists, split with splitTree + var pivot = splitRoot && splitTree(splitRoot, point, { + isSkipPaddingBlankHTML: isInline, + isNotSplitEdgePoint: isInline + }); + + // if container is point.node, find pivot with point.offset + if (!pivot && container === point.node) { + pivot = point.node.childNodes[point.offset]; + } + + return { + rightNode: pivot, + container: container + }; + }; + + var create = function (nodeName) { + return document.createElement(nodeName); + }; + + var createText = function (text) { + return document.createTextNode(text); + }; + + /** + * @method remove + * + * remove node, (isRemoveChild: remove child or not) + * + * @param {Node} node + * @param {Boolean} isRemoveChild + */ + var remove = function (node, isRemoveChild) { + if (!node || !node.parentNode) { return; } + if (node.removeNode) { return node.removeNode(isRemoveChild); } + + var parent = node.parentNode; + if (!isRemoveChild) { + var nodes = []; + var i, len; + for (i = 0, len = node.childNodes.length; i < len; i++) { + nodes.push(node.childNodes[i]); + } + + for (i = 0, len = nodes.length; i < len; i++) { + parent.insertBefore(nodes[i], node); + } + } + + parent.removeChild(node); + }; + + /** + * @method removeWhile + * + * @param {Node} node + * @param {Function} pred + */ + var removeWhile = function (node, pred) { + while (node) { + if (isEditable(node) || !pred(node)) { + break; + } + + var parent = node.parentNode; + remove(node); + node = parent; + } + }; + + /** + * @method replace + * + * replace node with provided nodeName + * + * @param {Node} node + * @param {String} nodeName + * @return {Node} - new node + */ + var replace = function (node, nodeName) { + if (node.nodeName.toUpperCase() === nodeName.toUpperCase()) { + return node; + } + + var newNode = create(nodeName); + + if (node.style.cssText) { + newNode.style.cssText = node.style.cssText; + } + + appendChildNodes(newNode, list.from(node.childNodes)); + insertAfter(newNode, node); + remove(node); + + return newNode; + }; + + var isTextarea = makePredByNodeName('TEXTAREA'); + + /** + * @param {jQuery} $node + * @param {Boolean} [stripLinebreaks] - default: false + */ + var value = function ($node, stripLinebreaks) { + var val = isTextarea($node[0]) ? $node.val() : $node.html(); + if (stripLinebreaks) { + return val.replace(/[\n\r]/g, ''); + } + return val; + }; + + /** + * @method html + * + * get the HTML contents of node + * + * @param {jQuery} $node + * @param {Boolean} [isNewlineOnBlock] + */ + var html = function ($node, isNewlineOnBlock) { + var markup = value($node); + + if (isNewlineOnBlock) { + var regexTag = /<(\/?)(\b(?!!)[^>\s]*)(.*?)(\s*\/?>)/g; + markup = markup.replace(regexTag, function (match, endSlash, name) { + name = name.toUpperCase(); + var isEndOfInlineContainer = /^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(name) && + !!endSlash; + var isBlockNode = /^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(name); + + return match + ((isEndOfInlineContainer || isBlockNode) ? '\n' : ''); + }); + markup = $.trim(markup); + } + + return markup; + }; + + var posFromPlaceholder = function (placeholder) { + var $placeholder = $(placeholder); + var pos = $placeholder.offset(); + var height = $placeholder.outerHeight(true); // include margin + + return { + left: pos.left, + top: pos.top + height + }; + }; + + var attachEvents = function ($node, events) { + Object.keys(events).forEach(function (key) { + $node.on(key, events[key]); + }); + }; + + var detachEvents = function ($node, events) { + Object.keys(events).forEach(function (key) { + $node.off(key, events[key]); + }); + }; + + /** + * @method isCustomStyleTag + * + * assert if a node contains a "note-styletag" class, + * which implies that's a custom-made style tag node + * + * @param {Node} an HTML DOM node + */ + var isCustomStyleTag = function (node) { + return node && !dom.isText(node) && list.contains(node.classList, 'note-styletag'); + }; + + return { + /** @property {String} NBSP_CHAR */ + NBSP_CHAR: NBSP_CHAR, + /** @property {String} ZERO_WIDTH_NBSP_CHAR */ + ZERO_WIDTH_NBSP_CHAR: ZERO_WIDTH_NBSP_CHAR, + /** @property {String} blank */ + blank: blankHTML, + /** @property {String} emptyPara */ + emptyPara: '

          ' + blankHTML + '

          ', + makePredByNodeName: makePredByNodeName, + isEditable: isEditable, + isControlSizing: isControlSizing, + isText: isText, + isElement: isElement, + isVoid: isVoid, + isPara: isPara, + isPurePara: isPurePara, + isHeading: isHeading, + isInline: isInline, + isBlock: func.not(isInline), + isBodyInline: isBodyInline, + isBody: isBody, + isParaInline: isParaInline, + isPre: isPre, + isList: isList, + isTable: isTable, + isData: isData, + isCell: isCell, + isBlockquote: isBlockquote, + isBodyContainer: isBodyContainer, + isAnchor: isAnchor, + isDiv: makePredByNodeName('DIV'), + isLi: isLi, + isBR: makePredByNodeName('BR'), + isSpan: makePredByNodeName('SPAN'), + isB: makePredByNodeName('B'), + isU: makePredByNodeName('U'), + isS: makePredByNodeName('S'), + isI: makePredByNodeName('I'), + isImg: makePredByNodeName('IMG'), + isTextarea: isTextarea, + isEmpty: isEmpty, + isEmptyAnchor: func.and(isAnchor, isEmpty), + isClosestSibling: isClosestSibling, + withClosestSiblings: withClosestSiblings, + nodeLength: nodeLength, + isLeftEdgePoint: isLeftEdgePoint, + isRightEdgePoint: isRightEdgePoint, + isEdgePoint: isEdgePoint, + isLeftEdgeOf: isLeftEdgeOf, + isRightEdgeOf: isRightEdgeOf, + isLeftEdgePointOf: isLeftEdgePointOf, + isRightEdgePointOf: isRightEdgePointOf, + prevPoint: prevPoint, + nextPoint: nextPoint, + isSamePoint: isSamePoint, + isVisiblePoint: isVisiblePoint, + prevPointUntil: prevPointUntil, + nextPointUntil: nextPointUntil, + isCharPoint: isCharPoint, + walkPoint: walkPoint, + ancestor: ancestor, + singleChildAncestor: singleChildAncestor, + listAncestor: listAncestor, + lastAncestor: lastAncestor, + listNext: listNext, + listPrev: listPrev, + listDescendant: listDescendant, + commonAncestor: commonAncestor, + wrap: wrap, + insertAfter: insertAfter, + appendChildNodes: appendChildNodes, + position: position, + hasChildren: hasChildren, + makeOffsetPath: makeOffsetPath, + fromOffsetPath: fromOffsetPath, + splitTree: splitTree, + splitPoint: splitPoint, + create: create, + createText: createText, + remove: remove, + removeWhile: removeWhile, + replace: replace, + html: html, + value: value, + posFromPlaceholder: posFromPlaceholder, + attachEvents: attachEvents, + detachEvents: detachEvents, + isCustomStyleTag: isCustomStyleTag + }; + })(); + + /** + * @param {jQuery} $note + * @param {Object} options + * @return {Context} + */ + var Context = function ($note, options) { + var self = this; + + var ui = $.summernote.ui; + this.memos = {}; + this.modules = {}; + this.layoutInfo = {}; + this.options = options; + + /** + * create layout and initialize modules and other resources + */ + this.initialize = function () { + this.layoutInfo = ui.createLayout($note, options); + this._initialize(); + $note.hide(); + return this; + }; + + /** + * destroy modules and other resources and remove layout + */ + this.destroy = function () { + this._destroy(); + $note.removeData('summernote'); + ui.removeLayout($note, this.layoutInfo); + }; + + /** + * destory modules and other resources and initialize it again + */ + this.reset = function () { + var disabled = self.isDisabled(); + this.code(dom.emptyPara); + this._destroy(); + this._initialize(); + + if (disabled) { + self.disable(); + } + }; + + this._initialize = function () { + // add optional buttons + var buttons = $.extend({}, this.options.buttons); + Object.keys(buttons).forEach(function (key) { + self.memo('button.' + key, buttons[key]); + }); + + var modules = $.extend({}, this.options.modules, $.summernote.plugins || {}); + + // add and initialize modules + Object.keys(modules).forEach(function (key) { + self.module(key, modules[key], true); + }); + + Object.keys(this.modules).forEach(function (key) { + self.initializeModule(key); + }); + }; + + this._destroy = function () { + // destroy modules with reversed order + Object.keys(this.modules).reverse().forEach(function (key) { + self.removeModule(key); + }); + + Object.keys(this.memos).forEach(function (key) { + self.removeMemo(key); + }); + // trigger custom onDestroy callback + this.triggerEvent('destroy', this); + }; + + this.code = function (html) { + var isActivated = this.invoke('codeview.isActivated'); + + if (html === undefined) { + this.invoke('codeview.sync'); + return isActivated ? this.layoutInfo.codable.val() : this.layoutInfo.editable.html(); + } else { + if (isActivated) { + this.layoutInfo.codable.val(html); + } else { + this.layoutInfo.editable.html(html); + } + $note.val(html); + this.triggerEvent('change', html); + } + }; + + this.isDisabled = function () { + return this.layoutInfo.editable.attr('contenteditable') === 'false'; + }; + + this.enable = function () { + this.layoutInfo.editable.attr('contenteditable', true); + this.invoke('toolbar.activate', true); + this.triggerEvent('disable', false); + }; + + this.disable = function () { + // close codeview if codeview is opend + if (this.invoke('codeview.isActivated')) { + this.invoke('codeview.deactivate'); + } + this.layoutInfo.editable.attr('contenteditable', false); + this.invoke('toolbar.deactivate', true); + + this.triggerEvent('disable', true); + }; + + this.triggerEvent = function () { + var namespace = list.head(arguments); + var args = list.tail(list.from(arguments)); + + var callback = this.options.callbacks[func.namespaceToCamel(namespace, 'on')]; + if (callback) { + callback.apply($note[0], args); + } + $note.trigger('summernote.' + namespace, args); + }; + + this.initializeModule = function (key) { + var module = this.modules[key]; + module.shouldInitialize = module.shouldInitialize || func.ok; + if (!module.shouldInitialize()) { + return; + } + + // initialize module + if (module.initialize) { + module.initialize(); + } + + // attach events + if (module.events) { + dom.attachEvents($note, module.events); + } + }; + + this.module = function (key, ModuleClass, withoutIntialize) { + if (arguments.length === 1) { + return this.modules[key]; + } + + this.modules[key] = new ModuleClass(this); + + if (!withoutIntialize) { + this.initializeModule(key); + } + }; + + this.removeModule = function (key) { + var module = this.modules[key]; + if (module.shouldInitialize()) { + if (module.events) { + dom.detachEvents($note, module.events); + } + + if (module.destroy) { + module.destroy(); + } + } + + delete this.modules[key]; + }; + + this.memo = function (key, obj) { + if (arguments.length === 1) { + return this.memos[key]; + } + this.memos[key] = obj; + }; + + this.removeMemo = function (key) { + if (this.memos[key] && this.memos[key].destroy) { + this.memos[key].destroy(); + } + + delete this.memos[key]; + }; + + /** + *Some buttons need to change their visual style immediately once they get pressed + */ + this.createInvokeHandlerAndUpdateState = function (namespace, value) { + return function (event) { + self.createInvokeHandler(namespace, value)(event); + self.invoke('buttons.updateCurrentStyle'); + }; + }; + + this.createInvokeHandler = function (namespace, value) { + return function (event) { + event.preventDefault(); + var $target = $(event.target); + self.invoke(namespace, value || $target.closest('[data-value]').data('value'), $target); + }; + }; + + this.invoke = function () { + var namespace = list.head(arguments); + var args = list.tail(list.from(arguments)); + + var splits = namespace.split('.'); + var hasSeparator = splits.length > 1; + var moduleName = hasSeparator && list.head(splits); + var methodName = hasSeparator ? list.last(splits) : list.head(splits); + + var module = this.modules[moduleName || 'editor']; + if (!moduleName && this[methodName]) { + return this[methodName].apply(this, args); + } else if (module && module[methodName] && module.shouldInitialize()) { + return module[methodName].apply(module, args); + } + }; + + return this.initialize(); + }; + + $.fn.extend({ + /** + * Summernote API + * + * @param {Object|String} + * @return {this} + */ + summernote: function () { + var type = $.type(list.head(arguments)); + var isExternalAPICalled = type === 'string'; + var hasInitOptions = type === 'object'; + + var options = hasInitOptions ? list.head(arguments) : {}; + + options = $.extend({}, $.summernote.options, options); + + // Update options + options.langInfo = $.extend(true, {}, $.summernote.lang['en-US'], $.summernote.lang[options.lang]); + options.icons = $.extend(true, {}, $.summernote.options.icons, options.icons); + options.tooltip = options.tooltip === 'auto' ? !agent.isSupportTouch : options.tooltip; + + this.each(function (idx, note) { + var $note = $(note); + if (!$note.data('summernote')) { + var context = new Context($note, options); + $note.data('summernote', context); + $note.data('summernote').triggerEvent('init', context.layoutInfo); + } + }); + + var $note = this.first(); + if ($note.length) { + var context = $note.data('summernote'); + if (isExternalAPICalled) { + return context.invoke.apply(context, list.from(arguments)); + } else if (options.focus) { + context.invoke('editor.focus'); + } + } + + return this; + } + }); + + + var Renderer = function (markup, children, options, callback) { + this.render = function ($parent) { + var $node = $(markup); + + if (options && options.contents) { + $node.html(options.contents); + } + + if (options && options.className) { + $node.addClass(options.className); + } + + if (options && options.data) { + $.each(options.data, function (k, v) { + $node.attr('data-' + k, v); + }); + } + + if (options && options.click) { + $node.on('click', options.click); + } + + if (children) { + var $container = $node.find('.note-children-container'); + children.forEach(function (child) { + child.render($container.length ? $container : $node); + }); + } + + if (callback) { + callback($node, options); + } + + if (options && options.callback) { + options.callback($node); + } + + if ($parent) { + $parent.append($node); + } + + return $node; + }; + }; + + var renderer = { + create: function (markup, callback) { + return function () { + var children = $.isArray(arguments[0]) ? arguments[0] : []; + var options = typeof arguments[1] === 'object' ? arguments[1] : arguments[0]; + if (options && options.children) { + children = options.children; + } + return new Renderer(markup, children, options, callback); + }; + } + }; + + var editor = renderer.create('
          '); + var toolbar = renderer.create('
          '); + var editingArea = renderer.create('
          '); + var codable = renderer.create('\n
          \n
          \n \n \n
          \n \n
          \n').replace(/(^|\n)\s*/g,""),b=function(){return document.body.querySelector("."+o.container)},h=function(){return b()?b().querySelector("."+o.popup):null},g=function(e){return b()?b().querySelector("."+e):null},v=function(){return g(o.title)},y=function(){return g(o.content)},w=function(){return g(o.image)},C=function(){return g(o.progresssteps)},x=function(){return g(o.validationerror)},k=function(){return g(o.confirm)},S=function(){return g(o.cancel)},A=function(){return g(o.buttonswrapper)},B=function(){return g(o.close)},P=function(){var e=Array.from(h().querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])')).sort(function(e,t){return e=parseInt(e.getAttribute("tabindex")),t=parseInt(t.getAttribute("tabindex")),e>t?1:e"),t.backdrop||q(document.body,o["no-backdrop"]),t.text||t.html){if("object"===R(t.html))if(x.innerHTML="",0 in t.html)for(var O=0;O in t.html;O++)x.appendChild(t.html[O].cloneNode(!0));else x.appendChild(t.html.cloneNode(!0));else t.html?x.innerHTML=t.html:t.text&&(x.textContent=t.text);j(x)}else N(x);if(t.position in o&&q(m,o[t.position]),t.grow&&"string"==typeof t.grow){var M="grow-"+t.grow;M in o&&q(m,o[M])}t.showCloseButton?(T.setAttribute("aria-label",t.closeButtonAriaLabel),j(T)):N(T),n.className=o.popup,t.toast?(q(document.body,o["toast-shown"]),q(n,o.toast)):q(n,o.modal),t.customClass&&q(n,t.customClass);var H=C(),I=parseInt(null===t.currentProgressStep?Y.getQueueStep():t.currentProgressStep,10);t.progressSteps.length?(j(H),function(e){for(;e.firstChild;)e.removeChild(e.firstChild)}(H),I>=t.progressSteps.length&&s("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),t.progressSteps.forEach(function(e,n){var r=document.createElement("li");if(q(r,o.progresscircle),r.innerHTML=e,n===I&&q(r,o.activeprogressstep),H.appendChild(r),n!==t.progressSteps.length-1){var i=document.createElement("li");q(i,o.progressline),i.style.width=t.progressStepsDistance,H.appendChild(i)}})):N(H);for(var D=h().querySelectorAll("."+o.icon),U=0;Uwindow.innerHeight&&(d.previousBodyPadding=document.body.style.paddingRight,document.body.style.paddingRight=function(){if("ontouchstart"in window||navigator.msMaxTouchPoints)return 0;var e=document.createElement("div");e.style.width="50px",e.style.height="50px",e.style.overflow="scroll",document.body.appendChild(e);var t=e.offsetWidth-e.clientWidth;return document.body.removeChild(e),t}()+"px")},Q=function(){if(/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream&&!L(document.body,o.iosfix)){var e=document.body.scrollTop;document.body.style.top=-1*e+"px",q(document.body,o.iosfix)}},Y=function e(){for(var t=arguments.length,n=Array(t),r=0;r=1){return"rgb("+[o.r,o.g,o.b].join(",")+")"}else{return"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"}};o.normalize=function(){function clamp(min,value,max){return valuemax?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=""&&c!="transparent")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),"body"));if(c=="rgba(0, 0, 0, 0)")c="transparent";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name=="transparent")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); + +// the actual Flot code +(function($) { + + // Cache the prototype hasOwnProperty for faster access + + var hasOwnProperty = Object.prototype.hasOwnProperty; + + // A shim to provide 'detach' to jQuery versions prior to 1.4. Using a DOM + // operation produces the same effect as detach, i.e. removing the element + // without touching its jQuery data. + + // Do not merge this into Flot 0.9, since it requires jQuery 1.4.4+. + + if (!$.fn.detach) { + $.fn.detach = function() { + return this.each(function() { + if (this.parentNode) { + this.parentNode.removeChild( this ); + } + }); + }; + } + + /////////////////////////////////////////////////////////////////////////// + // The Canvas object is a wrapper around an HTML5 tag. + // + // @constructor + // @param {string} cls List of classes to apply to the canvas. + // @param {element} container Element onto which to append the canvas. + // + // Requiring a container is a little iffy, but unfortunately canvas + // operations don't work unless the canvas is attached to the DOM. + + function Canvas(cls, container) { + + var element = container.children("." + cls)[0]; + + if (element == null) { + + element = document.createElement("canvas"); + element.className = cls; + + $(element).css({ direction: "ltr", position: "absolute", left: 0, top: 0 }) + .appendTo(container); + + // If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas + + if (!element.getContext) { + if (window.G_vmlCanvasManager) { + element = window.G_vmlCanvasManager.initElement(element); + } else { + throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode."); + } + } + } + + this.element = element; + + var context = this.context = element.getContext("2d"); + + // Determine the screen's ratio of physical to device-independent + // pixels. This is the ratio between the canvas width that the browser + // advertises and the number of pixels actually present in that space. + + // The iPhone 4, for example, has a device-independent width of 320px, + // but its screen is actually 640px wide. It therefore has a pixel + // ratio of 2, while most normal devices have a ratio of 1. + + var devicePixelRatio = window.devicePixelRatio || 1, + backingStoreRatio = + context.webkitBackingStorePixelRatio || + context.mozBackingStorePixelRatio || + context.msBackingStorePixelRatio || + context.oBackingStorePixelRatio || + context.backingStorePixelRatio || 1; + + this.pixelRatio = devicePixelRatio / backingStoreRatio; + + // Size the canvas to match the internal dimensions of its container + + this.resize(container.width(), container.height()); + + // Collection of HTML div layers for text overlaid onto the canvas + + this.textContainer = null; + this.text = {}; + + // Cache of text fragments and metrics, so we can avoid expensively + // re-calculating them when the plot is re-rendered in a loop. + + this._textCache = {}; + } + + // Resizes the canvas to the given dimensions. + // + // @param {number} width New width of the canvas, in pixels. + // @param {number} width New height of the canvas, in pixels. + + Canvas.prototype.resize = function(width, height) { + + if (width <= 0 || height <= 0) { + throw new Error("Invalid dimensions for plot, width = " + width + ", height = " + height); + } + + var element = this.element, + context = this.context, + pixelRatio = this.pixelRatio; + + // Resize the canvas, increasing its density based on the display's + // pixel ratio; basically giving it more pixels without increasing the + // size of its element, to take advantage of the fact that retina + // displays have that many more pixels in the same advertised space. + + // Resizing should reset the state (excanvas seems to be buggy though) + + if (this.width != width) { + element.width = width * pixelRatio; + element.style.width = width + "px"; + this.width = width; + } + + if (this.height != height) { + element.height = height * pixelRatio; + element.style.height = height + "px"; + this.height = height; + } + + // Save the context, so we can reset in case we get replotted. The + // restore ensure that we're really back at the initial state, and + // should be safe even if we haven't saved the initial state yet. + + context.restore(); + context.save(); + + // Scale the coordinate space to match the display density; so even though we + // may have twice as many pixels, we still want lines and other drawing to + // appear at the same size; the extra pixels will just make them crisper. + + context.scale(pixelRatio, pixelRatio); + }; + + // Clears the entire canvas area, not including any overlaid HTML text + + Canvas.prototype.clear = function() { + this.context.clearRect(0, 0, this.width, this.height); + }; + + // Finishes rendering the canvas, including managing the text overlay. + + Canvas.prototype.render = function() { + + var cache = this._textCache; + + // For each text layer, add elements marked as active that haven't + // already been rendered, and remove those that are no longer active. + + for (var layerKey in cache) { + if (hasOwnProperty.call(cache, layerKey)) { + + var layer = this.getTextLayer(layerKey), + layerCache = cache[layerKey]; + + layer.hide(); + + for (var styleKey in layerCache) { + if (hasOwnProperty.call(layerCache, styleKey)) { + var styleCache = layerCache[styleKey]; + for (var key in styleCache) { + if (hasOwnProperty.call(styleCache, key)) { + + var positions = styleCache[key].positions; + + for (var i = 0, position; position = positions[i]; i++) { + if (position.active) { + if (!position.rendered) { + layer.append(position.element); + position.rendered = true; + } + } else { + positions.splice(i--, 1); + if (position.rendered) { + position.element.detach(); + } + } + } + + if (positions.length == 0) { + delete styleCache[key]; + } + } + } + } + } + + layer.show(); + } + } + }; + + // Creates (if necessary) and returns the text overlay container. + // + // @param {string} classes String of space-separated CSS classes used to + // uniquely identify the text layer. + // @return {object} The jQuery-wrapped text-layer div. + + Canvas.prototype.getTextLayer = function(classes) { + + var layer = this.text[classes]; + + // Create the text layer if it doesn't exist + + if (layer == null) { + + // Create the text layer container, if it doesn't exist + + if (this.textContainer == null) { + this.textContainer = $("
          ") + .css({ + position: "absolute", + top: 0, + left: 0, + bottom: 0, + right: 0, + 'font-size': "smaller", + color: "#545454" + }) + .insertAfter(this.element); + } + + layer = this.text[classes] = $("
          ") + .addClass(classes) + .css({ + position: "absolute", + top: 0, + left: 0, + bottom: 0, + right: 0 + }) + .appendTo(this.textContainer); + } + + return layer; + }; + + // Creates (if necessary) and returns a text info object. + // + // The object looks like this: + // + // { + // width: Width of the text's wrapper div. + // height: Height of the text's wrapper div. + // element: The jQuery-wrapped HTML div containing the text. + // positions: Array of positions at which this text is drawn. + // } + // + // The positions array contains objects that look like this: + // + // { + // active: Flag indicating whether the text should be visible. + // rendered: Flag indicating whether the text is currently visible. + // element: The jQuery-wrapped HTML div containing the text. + // x: X coordinate at which to draw the text. + // y: Y coordinate at which to draw the text. + // } + // + // Each position after the first receives a clone of the original element. + // + // The idea is that that the width, height, and general 'identity' of the + // text is constant no matter where it is placed; the placements are a + // secondary property. + // + // Canvas maintains a cache of recently-used text info objects; getTextInfo + // either returns the cached element or creates a new entry. + // + // @param {string} layer A string of space-separated CSS classes uniquely + // identifying the layer containing this text. + // @param {string} text Text string to retrieve info for. + // @param {(string|object)=} font Either a string of space-separated CSS + // classes or a font-spec object, defining the text's font and style. + // @param {number=} angle Angle at which to rotate the text, in degrees. + // Angle is currently unused, it will be implemented in the future. + // @param {number=} width Maximum width of the text before it wraps. + // @return {object} a text info object. + + Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) { + + var textStyle, layerCache, styleCache, info; + + // Cast the value to a string, in case we were given a number or such + + text = "" + text; + + // If the font is a font-spec object, generate a CSS font definition + + if (typeof font === "object") { + textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px/" + font.lineHeight + "px " + font.family; + } else { + textStyle = font; + } + + // Retrieve (or create) the cache for the text's layer and styles + + layerCache = this._textCache[layer]; + + if (layerCache == null) { + layerCache = this._textCache[layer] = {}; + } + + styleCache = layerCache[textStyle]; + + if (styleCache == null) { + styleCache = layerCache[textStyle] = {}; + } + + info = styleCache[text]; + + // If we can't find a matching element in our cache, create a new one + + if (info == null) { + + var element = $("
          ").html(text) + .css({ + position: "absolute", + 'max-width': width, + top: -9999 + }) + .appendTo(this.getTextLayer(layer)); + + if (typeof font === "object") { + element.css({ + font: textStyle, + color: font.color + }); + } else if (typeof font === "string") { + element.addClass(font); + } + + info = styleCache[text] = { + width: element.outerWidth(true), + height: element.outerHeight(true), + element: element, + positions: [] + }; + + element.detach(); + } + + return info; + }; + + // Adds a text string to the canvas text overlay. + // + // The text isn't drawn immediately; it is marked as rendering, which will + // result in its addition to the canvas on the next render pass. + // + // @param {string} layer A string of space-separated CSS classes uniquely + // identifying the layer containing this text. + // @param {number} x X coordinate at which to draw the text. + // @param {number} y Y coordinate at which to draw the text. + // @param {string} text Text string to draw. + // @param {(string|object)=} font Either a string of space-separated CSS + // classes or a font-spec object, defining the text's font and style. + // @param {number=} angle Angle at which to rotate the text, in degrees. + // Angle is currently unused, it will be implemented in the future. + // @param {number=} width Maximum width of the text before it wraps. + // @param {string=} halign Horizontal alignment of the text; either "left", + // "center" or "right". + // @param {string=} valign Vertical alignment of the text; either "top", + // "middle" or "bottom". + + Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) { + + var info = this.getTextInfo(layer, text, font, angle, width), + positions = info.positions; + + // Tweak the div's position to match the text's alignment + + if (halign == "center") { + x -= info.width / 2; + } else if (halign == "right") { + x -= info.width; + } + + if (valign == "middle") { + y -= info.height / 2; + } else if (valign == "bottom") { + y -= info.height; + } + + // Determine whether this text already exists at this position. + // If so, mark it for inclusion in the next render pass. + + for (var i = 0, position; position = positions[i]; i++) { + if (position.x == x && position.y == y) { + position.active = true; + return; + } + } + + // If the text doesn't exist at this position, create a new entry + + // For the very first position we'll re-use the original element, + // while for subsequent ones we'll clone it. + + position = { + active: true, + rendered: false, + element: positions.length ? info.element.clone() : info.element, + x: x, + y: y + }; + + positions.push(position); + + // Move the element to its final position within the container + + position.element.css({ + top: Math.round(y), + left: Math.round(x), + 'text-align': halign // In case the text wraps + }); + }; + + // Removes one or more text strings from the canvas text overlay. + // + // If no parameters are given, all text within the layer is removed. + // + // Note that the text is not immediately removed; it is simply marked as + // inactive, which will result in its removal on the next render pass. + // This avoids the performance penalty for 'clear and redraw' behavior, + // where we potentially get rid of all text on a layer, but will likely + // add back most or all of it later, as when redrawing axes, for example. + // + // @param {string} layer A string of space-separated CSS classes uniquely + // identifying the layer containing this text. + // @param {number=} x X coordinate of the text. + // @param {number=} y Y coordinate of the text. + // @param {string=} text Text string to remove. + // @param {(string|object)=} font Either a string of space-separated CSS + // classes or a font-spec object, defining the text's font and style. + // @param {number=} angle Angle at which the text is rotated, in degrees. + // Angle is currently unused, it will be implemented in the future. + + Canvas.prototype.removeText = function(layer, x, y, text, font, angle) { + if (text == null) { + var layerCache = this._textCache[layer]; + if (layerCache != null) { + for (var styleKey in layerCache) { + if (hasOwnProperty.call(layerCache, styleKey)) { + var styleCache = layerCache[styleKey]; + for (var key in styleCache) { + if (hasOwnProperty.call(styleCache, key)) { + var positions = styleCache[key].positions; + for (var i = 0, position; position = positions[i]; i++) { + position.active = false; + } + } + } + } + } + } + } else { + var positions = this.getTextInfo(layer, text, font, angle).positions; + for (var i = 0, position; position = positions[i]; i++) { + if (position.x == x && position.y == y) { + position.active = false; + } + } + } + }; + + /////////////////////////////////////////////////////////////////////////// + // The top-level container for the entire plot. + + function Plot(placeholder, data_, options_, plugins) { + // data is on the form: + // [ series1, series2 ... ] + // where series is either just the data as [ [x1, y1], [x2, y2], ... ] + // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... } + + var series = [], + options = { + // the color theme used for graphs + colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"], + legend: { + show: true, + noColumns: 1, // number of colums in legend table + labelFormatter: null, // fn: string -> string + labelBoxBorderColor: "#ccc", // border color for the little label boxes + container: null, // container (as jQuery object) to put legend in, null means default on top of graph + position: "ne", // position of default legend container within plot + margin: 5, // distance from grid edge to default legend container within plot + backgroundColor: null, // null means auto-detect + backgroundOpacity: 0.85, // set to 0 to avoid background + sorted: null // default to no legend sorting + }, + xaxis: { + show: null, // null = auto-detect, true = always, false = never + position: "bottom", // or "top" + mode: null, // null or "time" + font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" } + color: null, // base color, labels, ticks + tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)" + transform: null, // null or f: number -> number to transform axis + inverseTransform: null, // if transform is set, this should be the inverse function + min: null, // min. value to show, null means set automatically + max: null, // max. value to show, null means set automatically + autoscaleMargin: null, // margin in % to add if auto-setting min/max + ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks + tickFormatter: null, // fn: number -> string + labelWidth: null, // size of tick labels in pixels + labelHeight: null, + reserveSpace: null, // whether to reserve space even if axis isn't shown + tickLength: null, // size in pixels of ticks, or "full" for whole line + alignTicksWithAxis: null, // axis number or null for no sync + tickDecimals: null, // no. of decimals, null means auto + tickSize: null, // number or [number, "unit"] + minTickSize: null // number or [number, "unit"] + }, + yaxis: { + autoscaleMargin: 0.02, + position: "left" // or "right" + }, + xaxes: [], + yaxes: [], + series: { + points: { + show: false, + radius: 3, + lineWidth: 2, // in pixels + fill: true, + fillColor: "#ffffff", + symbol: "circle" // or callback + }, + lines: { + // we don't put in show: false so we can see + // whether lines were actively disabled + lineWidth: 2, // in pixels + fill: false, + fillColor: null, + steps: false + // Omit 'zero', so we can later default its value to + // match that of the 'fill' option. + }, + bars: { + show: false, + lineWidth: 2, // in pixels + barWidth: 1, // in units of the x axis + fill: true, + fillColor: null, + align: "left", // "left", "right", or "center" + horizontal: false, + zero: true + }, + shadowSize: 3, + highlightColor: null + }, + grid: { + show: true, + aboveData: false, + color: "#545454", // primary color used for outline and labels + backgroundColor: null, // null for transparent, else color + borderColor: null, // set if different from the grid color + tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)" + margin: 0, // distance from the canvas edge to the grid + labelMargin: 5, // in pixels + axisMargin: 8, // in pixels + borderWidth: 2, // in pixels + minBorderMargin: null, // in pixels, null means taken from points radius + markings: null, // array of ranges or fn: axes -> array of ranges + markingsColor: "#f4f4f4", + markingsLineWidth: 2, + // interactive stuff + clickable: false, + hoverable: false, + autoHighlight: true, // highlight in case mouse is near + mouseActiveRadius: 10 // how far the mouse can be away to activate an item + }, + interaction: { + redrawOverlayInterval: 1000/60 // time between updates, -1 means in same flow + }, + hooks: {} + }, + surface = null, // the canvas for the plot itself + overlay = null, // canvas for interactive stuff on top of plot + eventHolder = null, // jQuery object that events should be bound to + ctx = null, octx = null, + xaxes = [], yaxes = [], + plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, + plotWidth = 0, plotHeight = 0, + hooks = { + processOptions: [], + processRawData: [], + processDatapoints: [], + processOffset: [], + drawBackground: [], + drawSeries: [], + draw: [], + bindEvents: [], + drawOverlay: [], + shutdown: [] + }, + plot = this; + + // public functions + plot.setData = setData; + plot.setupGrid = setupGrid; + plot.draw = draw; + plot.getPlaceholder = function() { return placeholder; }; + plot.getCanvas = function() { return surface.element; }; + plot.getPlotOffset = function() { return plotOffset; }; + plot.width = function () { return plotWidth; }; + plot.height = function () { return plotHeight; }; + plot.offset = function () { + var o = eventHolder.offset(); + o.left += plotOffset.left; + o.top += plotOffset.top; + return o; + }; + plot.getData = function () { return series; }; + plot.getAxes = function () { + var res = {}, i; + $.each(xaxes.concat(yaxes), function (_, axis) { + if (axis) + res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis; + }); + return res; + }; + plot.getXAxes = function () { return xaxes; }; + plot.getYAxes = function () { return yaxes; }; + plot.c2p = canvasToAxisCoords; + plot.p2c = axisToCanvasCoords; + plot.getOptions = function () { return options; }; + plot.highlight = highlight; + plot.unhighlight = unhighlight; + plot.triggerRedrawOverlay = triggerRedrawOverlay; + plot.pointOffset = function(point) { + return { + left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left, 10), + top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top, 10) + }; + }; + plot.shutdown = shutdown; + plot.destroy = function () { + shutdown(); + placeholder.removeData("plot").empty(); + + series = []; + options = null; + surface = null; + overlay = null; + eventHolder = null; + ctx = null; + octx = null; + xaxes = []; + yaxes = []; + hooks = null; + highlights = []; + plot = null; + }; + plot.resize = function () { + var width = placeholder.width(), + height = placeholder.height(); + surface.resize(width, height); + overlay.resize(width, height); + }; + + // public attributes + plot.hooks = hooks; + + // initialize + initPlugins(plot); + parseOptions(options_); + setupCanvases(); + setData(data_); + setupGrid(); + draw(); + bindEvents(); + + + function executeHooks(hook, args) { + args = [plot].concat(args); + for (var i = 0; i < hook.length; ++i) + hook[i].apply(this, args); + } + + function initPlugins() { + + // References to key classes, allowing plugins to modify them + + var classes = { + Canvas: Canvas + }; + + for (var i = 0; i < plugins.length; ++i) { + var p = plugins[i]; + p.init(plot, classes); + if (p.options) + $.extend(true, options, p.options); + } + } + + function parseOptions(opts) { + + $.extend(true, options, opts); + + // $.extend merges arrays, rather than replacing them. When less + // colors are provided than the size of the default palette, we + // end up with those colors plus the remaining defaults, which is + // not expected behavior; avoid it by replacing them here. + + if (opts && opts.colors) { + options.colors = opts.colors; + } + + if (options.xaxis.color == null) + options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + if (options.yaxis.color == null) + options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + + if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility + options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color; + if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility + options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color; + + if (options.grid.borderColor == null) + options.grid.borderColor = options.grid.color; + if (options.grid.tickColor == null) + options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + + // Fill in defaults for axis options, including any unspecified + // font-spec fields, if a font-spec was provided. + + // If no x/y axis options were provided, create one of each anyway, + // since the rest of the code assumes that they exist. + + var i, axisOptions, axisCount, + fontSize = placeholder.css("font-size"), + fontSizeDefault = fontSize ? +fontSize.replace("px", "") : 13, + fontDefaults = { + style: placeholder.css("font-style"), + size: Math.round(0.8 * fontSizeDefault), + variant: placeholder.css("font-variant"), + weight: placeholder.css("font-weight"), + family: placeholder.css("font-family") + }; + + axisCount = options.xaxes.length || 1; + for (i = 0; i < axisCount; ++i) { + + axisOptions = options.xaxes[i]; + if (axisOptions && !axisOptions.tickColor) { + axisOptions.tickColor = axisOptions.color; + } + + axisOptions = $.extend(true, {}, options.xaxis, axisOptions); + options.xaxes[i] = axisOptions; + + if (axisOptions.font) { + axisOptions.font = $.extend({}, fontDefaults, axisOptions.font); + if (!axisOptions.font.color) { + axisOptions.font.color = axisOptions.color; + } + if (!axisOptions.font.lineHeight) { + axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15); + } + } + } + + axisCount = options.yaxes.length || 1; + for (i = 0; i < axisCount; ++i) { + + axisOptions = options.yaxes[i]; + if (axisOptions && !axisOptions.tickColor) { + axisOptions.tickColor = axisOptions.color; + } + + axisOptions = $.extend(true, {}, options.yaxis, axisOptions); + options.yaxes[i] = axisOptions; + + if (axisOptions.font) { + axisOptions.font = $.extend({}, fontDefaults, axisOptions.font); + if (!axisOptions.font.color) { + axisOptions.font.color = axisOptions.color; + } + if (!axisOptions.font.lineHeight) { + axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15); + } + } + } + + // backwards compatibility, to be removed in future + if (options.xaxis.noTicks && options.xaxis.ticks == null) + options.xaxis.ticks = options.xaxis.noTicks; + if (options.yaxis.noTicks && options.yaxis.ticks == null) + options.yaxis.ticks = options.yaxis.noTicks; + if (options.x2axis) { + options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis); + options.xaxes[1].position = "top"; + // Override the inherit to allow the axis to auto-scale + if (options.x2axis.min == null) { + options.xaxes[1].min = null; + } + if (options.x2axis.max == null) { + options.xaxes[1].max = null; + } + } + if (options.y2axis) { + options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis); + options.yaxes[1].position = "right"; + // Override the inherit to allow the axis to auto-scale + if (options.y2axis.min == null) { + options.yaxes[1].min = null; + } + if (options.y2axis.max == null) { + options.yaxes[1].max = null; + } + } + if (options.grid.coloredAreas) + options.grid.markings = options.grid.coloredAreas; + if (options.grid.coloredAreasColor) + options.grid.markingsColor = options.grid.coloredAreasColor; + if (options.lines) + $.extend(true, options.series.lines, options.lines); + if (options.points) + $.extend(true, options.series.points, options.points); + if (options.bars) + $.extend(true, options.series.bars, options.bars); + if (options.shadowSize != null) + options.series.shadowSize = options.shadowSize; + if (options.highlightColor != null) + options.series.highlightColor = options.highlightColor; + + // save options on axes for future reference + for (i = 0; i < options.xaxes.length; ++i) + getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i]; + for (i = 0; i < options.yaxes.length; ++i) + getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i]; + + // add hooks from options + for (var n in hooks) + if (options.hooks[n] && options.hooks[n].length) + hooks[n] = hooks[n].concat(options.hooks[n]); + + executeHooks(hooks.processOptions, [options]); + } + + function setData(d) { + series = parseData(d); + fillInSeriesOptions(); + processData(); + } + + function parseData(d) { + var res = []; + for (var i = 0; i < d.length; ++i) { + var s = $.extend(true, {}, options.series); + + if (d[i].data != null) { + s.data = d[i].data; // move the data instead of deep-copy + delete d[i].data; + + $.extend(true, s, d[i]); + + d[i].data = s.data; + } + else + s.data = d[i]; + res.push(s); + } + + return res; + } + + function axisNumber(obj, coord) { + var a = obj[coord + "axis"]; + if (typeof a == "object") // if we got a real axis, extract number + a = a.n; + if (typeof a != "number") + a = 1; // default to first axis + return a; + } + + function allAxes() { + // return flat array without annoying null entries + return $.grep(xaxes.concat(yaxes), function (a) { return a; }); + } + + function canvasToAxisCoords(pos) { + // return an object with x/y corresponding to all used axes + var res = {}, i, axis; + for (i = 0; i < xaxes.length; ++i) { + axis = xaxes[i]; + if (axis && axis.used) + res["x" + axis.n] = axis.c2p(pos.left); + } + + for (i = 0; i < yaxes.length; ++i) { + axis = yaxes[i]; + if (axis && axis.used) + res["y" + axis.n] = axis.c2p(pos.top); + } + + if (res.x1 !== undefined) + res.x = res.x1; + if (res.y1 !== undefined) + res.y = res.y1; + + return res; + } + + function axisToCanvasCoords(pos) { + // get canvas coords from the first pair of x/y found in pos + var res = {}, i, axis, key; + + for (i = 0; i < xaxes.length; ++i) { + axis = xaxes[i]; + if (axis && axis.used) { + key = "x" + axis.n; + if (pos[key] == null && axis.n == 1) + key = "x"; + + if (pos[key] != null) { + res.left = axis.p2c(pos[key]); + break; + } + } + } + + for (i = 0; i < yaxes.length; ++i) { + axis = yaxes[i]; + if (axis && axis.used) { + key = "y" + axis.n; + if (pos[key] == null && axis.n == 1) + key = "y"; + + if (pos[key] != null) { + res.top = axis.p2c(pos[key]); + break; + } + } + } + + return res; + } + + function getOrCreateAxis(axes, number) { + if (!axes[number - 1]) + axes[number - 1] = { + n: number, // save the number for future reference + direction: axes == xaxes ? "x" : "y", + options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis) + }; + + return axes[number - 1]; + } + + function fillInSeriesOptions() { + + var neededColors = series.length, maxIndex = -1, i; + + // Subtract the number of series that already have fixed colors or + // color indexes from the number that we still need to generate. + + for (i = 0; i < series.length; ++i) { + var sc = series[i].color; + if (sc != null) { + neededColors--; + if (typeof sc == "number" && sc > maxIndex) { + maxIndex = sc; + } + } + } + + // If any of the series have fixed color indexes, then we need to + // generate at least as many colors as the highest index. + + if (neededColors <= maxIndex) { + neededColors = maxIndex + 1; + } + + // Generate all the colors, using first the option colors and then + // variations on those colors once they're exhausted. + + var c, colors = [], colorPool = options.colors, + colorPoolSize = colorPool.length, variation = 0; + + for (i = 0; i < neededColors; i++) { + + c = $.color.parse(colorPool[i % colorPoolSize] || "#666"); + + // Each time we exhaust the colors in the pool we adjust + // a scaling factor used to produce more variations on + // those colors. The factor alternates negative/positive + // to produce lighter/darker colors. + + // Reset the variation after every few cycles, or else + // it will end up producing only white or black colors. + + if (i % colorPoolSize == 0 && i) { + if (variation >= 0) { + if (variation < 0.5) { + variation = -variation - 0.2; + } else variation = 0; + } else variation = -variation; + } + + colors[i] = c.scale('rgb', 1 + variation); + } + + // Finalize the series options, filling in their colors + + var colori = 0, s; + for (i = 0; i < series.length; ++i) { + s = series[i]; + + // assign colors + if (s.color == null) { + s.color = colors[colori].toString(); + ++colori; + } + else if (typeof s.color == "number") + s.color = colors[s.color].toString(); + + // turn on lines automatically in case nothing is set + if (s.lines.show == null) { + var v, show = true; + for (v in s) + if (s[v] && s[v].show) { + show = false; + break; + } + if (show) + s.lines.show = true; + } + + // If nothing was provided for lines.zero, default it to match + // lines.fill, since areas by default should extend to zero. + + if (s.lines.zero == null) { + s.lines.zero = !!s.lines.fill; + } + + // setup axes + s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x")); + s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y")); + } + } + + function processData() { + var topSentry = Number.POSITIVE_INFINITY, + bottomSentry = Number.NEGATIVE_INFINITY, + fakeInfinity = Number.MAX_VALUE, + i, j, k, m, length, + s, points, ps, x, y, axis, val, f, p, + data, format; + + function updateAxis(axis, min, max) { + if (min < axis.datamin && min != -fakeInfinity) + axis.datamin = min; + if (max > axis.datamax && max != fakeInfinity) + axis.datamax = max; + } + + $.each(allAxes(), function (_, axis) { + // init axis + axis.datamin = topSentry; + axis.datamax = bottomSentry; + axis.used = false; + }); + + for (i = 0; i < series.length; ++i) { + s = series[i]; + s.datapoints = { points: [] }; + + executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]); + } + + // first pass: clean and copy data + for (i = 0; i < series.length; ++i) { + s = series[i]; + + data = s.data; + format = s.datapoints.format; + + if (!format) { + format = []; + // find out how to copy + format.push({ x: true, number: true, required: true }); + format.push({ y: true, number: true, required: true }); + + if (s.bars.show || (s.lines.show && s.lines.fill)) { + var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero)); + format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale }); + if (s.bars.horizontal) { + delete format[format.length - 1].y; + format[format.length - 1].x = true; + } + } + + s.datapoints.format = format; + } + + if (s.datapoints.pointsize != null) + continue; // already filled in + + s.datapoints.pointsize = format.length; + + ps = s.datapoints.pointsize; + points = s.datapoints.points; + + var insertSteps = s.lines.show && s.lines.steps; + s.xaxis.used = s.yaxis.used = true; + + for (j = k = 0; j < data.length; ++j, k += ps) { + p = data[j]; + + var nullify = p == null; + if (!nullify) { + for (m = 0; m < ps; ++m) { + val = p[m]; + f = format[m]; + + if (f) { + if (f.number && val != null) { + val = +val; // convert to number + if (isNaN(val)) + val = null; + else if (val == Infinity) + val = fakeInfinity; + else if (val == -Infinity) + val = -fakeInfinity; + } + + if (val == null) { + if (f.required) + nullify = true; + + if (f.defaultValue != null) + val = f.defaultValue; + } + } + + points[k + m] = val; + } + } + + if (nullify) { + for (m = 0; m < ps; ++m) { + val = points[k + m]; + if (val != null) { + f = format[m]; + // extract min/max info + if (f.autoscale !== false) { + if (f.x) { + updateAxis(s.xaxis, val, val); + } + if (f.y) { + updateAxis(s.yaxis, val, val); + } + } + } + points[k + m] = null; + } + } + else { + // a little bit of line specific stuff that + // perhaps shouldn't be here, but lacking + // better means... + if (insertSteps && k > 0 + && points[k - ps] != null + && points[k - ps] != points[k] + && points[k - ps + 1] != points[k + 1]) { + // copy the point to make room for a middle point + for (m = 0; m < ps; ++m) + points[k + ps + m] = points[k + m]; + + // middle point has same y + points[k + 1] = points[k - ps + 1]; + + // we've added a point, better reflect that + k += ps; + } + } + } + } + + // give the hooks a chance to run + for (i = 0; i < series.length; ++i) { + s = series[i]; + + executeHooks(hooks.processDatapoints, [ s, s.datapoints]); + } + + // second pass: find datamax/datamin for auto-scaling + for (i = 0; i < series.length; ++i) { + s = series[i]; + points = s.datapoints.points; + ps = s.datapoints.pointsize; + format = s.datapoints.format; + + var xmin = topSentry, ymin = topSentry, + xmax = bottomSentry, ymax = bottomSentry; + + for (j = 0; j < points.length; j += ps) { + if (points[j] == null) + continue; + + for (m = 0; m < ps; ++m) { + val = points[j + m]; + f = format[m]; + if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity) + continue; + + if (f.x) { + if (val < xmin) + xmin = val; + if (val > xmax) + xmax = val; + } + if (f.y) { + if (val < ymin) + ymin = val; + if (val > ymax) + ymax = val; + } + } + } + + if (s.bars.show) { + // make sure we got room for the bar on the dancing floor + var delta; + + switch (s.bars.align) { + case "left": + delta = 0; + break; + case "right": + delta = -s.bars.barWidth; + break; + default: + delta = -s.bars.barWidth / 2; + } + + if (s.bars.horizontal) { + ymin += delta; + ymax += delta + s.bars.barWidth; + } + else { + xmin += delta; + xmax += delta + s.bars.barWidth; + } + } + + updateAxis(s.xaxis, xmin, xmax); + updateAxis(s.yaxis, ymin, ymax); + } + + $.each(allAxes(), function (_, axis) { + if (axis.datamin == topSentry) + axis.datamin = null; + if (axis.datamax == bottomSentry) + axis.datamax = null; + }); + } + + function setupCanvases() { + + // Make sure the placeholder is clear of everything except canvases + // from a previous plot in this container that we'll try to re-use. + + placeholder.css("padding", 0) // padding messes up the positioning + .children().filter(function(){ + return !$(this).hasClass("flot-overlay") && !$(this).hasClass('flot-base'); + }).remove(); + + if (placeholder.css("position") == 'static') + placeholder.css("position", "relative"); // for positioning labels and overlay + + surface = new Canvas("flot-base", placeholder); + overlay = new Canvas("flot-overlay", placeholder); // overlay canvas for interactive features + + ctx = surface.context; + octx = overlay.context; + + // define which element we're listening for events on + eventHolder = $(overlay.element).unbind(); + + // If we're re-using a plot object, shut down the old one + + var existing = placeholder.data("plot"); + + if (existing) { + existing.shutdown(); + overlay.clear(); + } + + // save in case we get replotted + placeholder.data("plot", plot); + } + + function bindEvents() { + // bind events + if (options.grid.hoverable) { + eventHolder.mousemove(onMouseMove); + + // Use bind, rather than .mouseleave, because we officially + // still support jQuery 1.2.6, which doesn't define a shortcut + // for mouseenter or mouseleave. This was a bug/oversight that + // was fixed somewhere around 1.3.x. We can return to using + // .mouseleave when we drop support for 1.2.6. + + eventHolder.bind("mouseleave", onMouseLeave); + } + + if (options.grid.clickable) + eventHolder.click(onClick); + + executeHooks(hooks.bindEvents, [eventHolder]); + } + + function shutdown() { + if (redrawTimeout) + clearTimeout(redrawTimeout); + + eventHolder.unbind("mousemove", onMouseMove); + eventHolder.unbind("mouseleave", onMouseLeave); + eventHolder.unbind("click", onClick); + + executeHooks(hooks.shutdown, [eventHolder]); + } + + function setTransformationHelpers(axis) { + // set helper functions on the axis, assumes plot area + // has been computed already + + function identity(x) { return x; } + + var s, m, t = axis.options.transform || identity, + it = axis.options.inverseTransform; + + // precompute how much the axis is scaling a point + // in canvas space + if (axis.direction == "x") { + s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min)); + m = Math.min(t(axis.max), t(axis.min)); + } + else { + s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min)); + s = -s; + m = Math.max(t(axis.max), t(axis.min)); + } + + // data point to canvas coordinate + if (t == identity) // slight optimization + axis.p2c = function (p) { return (p - m) * s; }; + else + axis.p2c = function (p) { return (t(p) - m) * s; }; + // canvas coordinate to data point + if (!it) + axis.c2p = function (c) { return m + c / s; }; + else + axis.c2p = function (c) { return it(m + c / s); }; + } + + function measureTickLabels(axis) { + + var opts = axis.options, + ticks = axis.ticks || [], + labelWidth = opts.labelWidth || 0, + labelHeight = opts.labelHeight || 0, + maxWidth = labelWidth || (axis.direction == "x" ? Math.floor(surface.width / (ticks.length || 1)) : null), + legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis", + layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles, + font = opts.font || "flot-tick-label tickLabel"; + + for (var i = 0; i < ticks.length; ++i) { + + var t = ticks[i]; + + if (!t.label) + continue; + + var info = surface.getTextInfo(layer, t.label, font, null, maxWidth); + + labelWidth = Math.max(labelWidth, info.width); + labelHeight = Math.max(labelHeight, info.height); + } + + axis.labelWidth = opts.labelWidth || labelWidth; + axis.labelHeight = opts.labelHeight || labelHeight; + } + + function allocateAxisBoxFirstPhase(axis) { + // find the bounding box of the axis by looking at label + // widths/heights and ticks, make room by diminishing the + // plotOffset; this first phase only looks at one + // dimension per axis, the other dimension depends on the + // other axes so will have to wait + + var lw = axis.labelWidth, + lh = axis.labelHeight, + pos = axis.options.position, + isXAxis = axis.direction === "x", + tickLength = axis.options.tickLength, + axisMargin = options.grid.axisMargin, + padding = options.grid.labelMargin, + innermost = true, + outermost = true, + first = true, + found = false; + + // Determine the axis's position in its direction and on its side + + $.each(isXAxis ? xaxes : yaxes, function(i, a) { + if (a && (a.show || a.reserveSpace)) { + if (a === axis) { + found = true; + } else if (a.options.position === pos) { + if (found) { + outermost = false; + } else { + innermost = false; + } + } + if (!found) { + first = false; + } + } + }); + + // The outermost axis on each side has no margin + + if (outermost) { + axisMargin = 0; + } + + // The ticks for the first axis in each direction stretch across + + if (tickLength == null) { + tickLength = first ? "full" : 5; + } + + if (!isNaN(+tickLength)) + padding += +tickLength; + + if (isXAxis) { + lh += padding; + + if (pos == "bottom") { + plotOffset.bottom += lh + axisMargin; + axis.box = { top: surface.height - plotOffset.bottom, height: lh }; + } + else { + axis.box = { top: plotOffset.top + axisMargin, height: lh }; + plotOffset.top += lh + axisMargin; + } + } + else { + lw += padding; + + if (pos == "left") { + axis.box = { left: plotOffset.left + axisMargin, width: lw }; + plotOffset.left += lw + axisMargin; + } + else { + plotOffset.right += lw + axisMargin; + axis.box = { left: surface.width - plotOffset.right, width: lw }; + } + } + + // save for future reference + axis.position = pos; + axis.tickLength = tickLength; + axis.box.padding = padding; + axis.innermost = innermost; + } + + function allocateAxisBoxSecondPhase(axis) { + // now that all axis boxes have been placed in one + // dimension, we can set the remaining dimension coordinates + if (axis.direction == "x") { + axis.box.left = plotOffset.left - axis.labelWidth / 2; + axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth; + } + else { + axis.box.top = plotOffset.top - axis.labelHeight / 2; + axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight; + } + } + + function adjustLayoutForThingsStickingOut() { + // possibly adjust plot offset to ensure everything stays + // inside the canvas and isn't clipped off + + var minMargin = options.grid.minBorderMargin, + axis, i; + + // check stuff from the plot (FIXME: this should just read + // a value from the series, otherwise it's impossible to + // customize) + if (minMargin == null) { + minMargin = 0; + for (i = 0; i < series.length; ++i) + minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2)); + } + + var margins = { + left: minMargin, + right: minMargin, + top: minMargin, + bottom: minMargin + }; + + // check axis labels, note we don't check the actual + // labels but instead use the overall width/height to not + // jump as much around with replots + $.each(allAxes(), function (_, axis) { + if (axis.reserveSpace && axis.ticks && axis.ticks.length) { + if (axis.direction === "x") { + margins.left = Math.max(margins.left, axis.labelWidth / 2); + margins.right = Math.max(margins.right, axis.labelWidth / 2); + } else { + margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2); + margins.top = Math.max(margins.top, axis.labelHeight / 2); + } + } + }); + + plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left)); + plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right)); + plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top)); + plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom)); + } + + function setupGrid() { + var i, axes = allAxes(), showGrid = options.grid.show; + + // Initialize the plot's offset from the edge of the canvas + + for (var a in plotOffset) { + var margin = options.grid.margin || 0; + plotOffset[a] = typeof margin == "number" ? margin : margin[a] || 0; + } + + executeHooks(hooks.processOffset, [plotOffset]); + + // If the grid is visible, add its border width to the offset + + for (var a in plotOffset) { + if(typeof(options.grid.borderWidth) == "object") { + plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0; + } + else { + plotOffset[a] += showGrid ? options.grid.borderWidth : 0; + } + } + + $.each(axes, function (_, axis) { + var axisOpts = axis.options; + axis.show = axisOpts.show == null ? axis.used : axisOpts.show; + axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace; + setRange(axis); + }); + + if (showGrid) { + + var allocatedAxes = $.grep(axes, function (axis) { + return axis.show || axis.reserveSpace; + }); + + $.each(allocatedAxes, function (_, axis) { + // make the ticks + setupTickGeneration(axis); + setTicks(axis); + snapRangeToTicks(axis, axis.ticks); + // find labelWidth/Height for axis + measureTickLabels(axis); + }); + + // with all dimensions calculated, we can compute the + // axis bounding boxes, start from the outside + // (reverse order) + for (i = allocatedAxes.length - 1; i >= 0; --i) + allocateAxisBoxFirstPhase(allocatedAxes[i]); + + // make sure we've got enough space for things that + // might stick out + adjustLayoutForThingsStickingOut(); + + $.each(allocatedAxes, function (_, axis) { + allocateAxisBoxSecondPhase(axis); + }); + } + + plotWidth = surface.width - plotOffset.left - plotOffset.right; + plotHeight = surface.height - plotOffset.bottom - plotOffset.top; + + // now we got the proper plot dimensions, we can compute the scaling + $.each(axes, function (_, axis) { + setTransformationHelpers(axis); + }); + + if (showGrid) { + drawAxisLabels(); + } + + insertLegend(); + } + + function setRange(axis) { + var opts = axis.options, + min = +(opts.min != null ? opts.min : axis.datamin), + max = +(opts.max != null ? opts.max : axis.datamax), + delta = max - min; + + if (delta == 0.0) { + // degenerate case + var widen = max == 0 ? 1 : 0.01; + + if (opts.min == null) + min -= widen; + // always widen max if we couldn't widen min to ensure we + // don't fall into min == max which doesn't work + if (opts.max == null || opts.min != null) + max += widen; + } + else { + // consider autoscaling + var margin = opts.autoscaleMargin; + if (margin != null) { + if (opts.min == null) { + min -= delta * margin; + // make sure we don't go below zero if all values + // are positive + if (min < 0 && axis.datamin != null && axis.datamin >= 0) + min = 0; + } + if (opts.max == null) { + max += delta * margin; + if (max > 0 && axis.datamax != null && axis.datamax <= 0) + max = 0; + } + } + } + axis.min = min; + axis.max = max; + } + + function setupTickGeneration(axis) { + var opts = axis.options; + + // estimate number of ticks + var noTicks; + if (typeof opts.ticks == "number" && opts.ticks > 0) + noTicks = opts.ticks; + else + // heuristic based on the model a*sqrt(x) fitted to + // some data points that seemed reasonable + noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? surface.width : surface.height); + + var delta = (axis.max - axis.min) / noTicks, + dec = -Math.floor(Math.log(delta) / Math.LN10), + maxDec = opts.tickDecimals; + + if (maxDec != null && dec > maxDec) { + dec = maxDec; + } + + var magn = Math.pow(10, -dec), + norm = delta / magn, // norm is between 1.0 and 10.0 + size; + + if (norm < 1.5) { + size = 1; + } else if (norm < 3) { + size = 2; + // special case for 2.5, requires an extra decimal + if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) { + size = 2.5; + ++dec; + } + } else if (norm < 7.5) { + size = 5; + } else { + size = 10; + } + + size *= magn; + + if (opts.minTickSize != null && size < opts.minTickSize) { + size = opts.minTickSize; + } + + axis.delta = delta; + axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec); + axis.tickSize = opts.tickSize || size; + + // Time mode was moved to a plug-in in 0.8, and since so many people use it + // we'll add an especially friendly reminder to make sure they included it. + + if (opts.mode == "time" && !axis.tickGenerator) { + throw new Error("Time mode requires the flot.time plugin."); + } + + // Flot supports base-10 axes; any other mode else is handled by a plug-in, + // like flot.time.js. + + if (!axis.tickGenerator) { + + axis.tickGenerator = function (axis) { + + var ticks = [], + start = floorInBase(axis.min, axis.tickSize), + i = 0, + v = Number.NaN, + prev; + + do { + prev = v; + v = start + i * axis.tickSize; + ticks.push(v); + ++i; + } while (v < axis.max && v != prev); + return ticks; + }; + + axis.tickFormatter = function (value, axis) { + + var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1; + var formatted = "" + Math.round(value * factor) / factor; + + // If tickDecimals was specified, ensure that we have exactly that + // much precision; otherwise default to the value's own precision. + + if (axis.tickDecimals != null) { + var decimal = formatted.indexOf("."); + var precision = decimal == -1 ? 0 : formatted.length - decimal - 1; + if (precision < axis.tickDecimals) { + return (precision ? formatted : formatted + ".") + ("" + factor).substr(1, axis.tickDecimals - precision); + } + } + + return formatted; + }; + } + + if ($.isFunction(opts.tickFormatter)) + axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); }; + + if (opts.alignTicksWithAxis != null) { + var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1]; + if (otherAxis && otherAxis.used && otherAxis != axis) { + // consider snapping min/max to outermost nice ticks + var niceTicks = axis.tickGenerator(axis); + if (niceTicks.length > 0) { + if (opts.min == null) + axis.min = Math.min(axis.min, niceTicks[0]); + if (opts.max == null && niceTicks.length > 1) + axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]); + } + + axis.tickGenerator = function (axis) { + // copy ticks, scaled to this axis + var ticks = [], v, i; + for (i = 0; i < otherAxis.ticks.length; ++i) { + v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min); + v = axis.min + v * (axis.max - axis.min); + ticks.push(v); + } + return ticks; + }; + + // we might need an extra decimal since forced + // ticks don't necessarily fit naturally + if (!axis.mode && opts.tickDecimals == null) { + var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1), + ts = axis.tickGenerator(axis); + + // only proceed if the tick interval rounded + // with an extra decimal doesn't give us a + // zero at end + if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec)))) + axis.tickDecimals = extraDec; + } + } + } + } + + function setTicks(axis) { + var oticks = axis.options.ticks, ticks = []; + if (oticks == null || (typeof oticks == "number" && oticks > 0)) + ticks = axis.tickGenerator(axis); + else if (oticks) { + if ($.isFunction(oticks)) + // generate the ticks + ticks = oticks(axis); + else + ticks = oticks; + } + + // clean up/labelify the supplied ticks, copy them over + var i, v; + axis.ticks = []; + for (i = 0; i < ticks.length; ++i) { + var label = null; + var t = ticks[i]; + if (typeof t == "object") { + v = +t[0]; + if (t.length > 1) + label = t[1]; + } + else + v = +t; + if (label == null) + label = axis.tickFormatter(v, axis); + if (!isNaN(v)) + axis.ticks.push({ v: v, label: label }); + } + } + + function snapRangeToTicks(axis, ticks) { + if (axis.options.autoscaleMargin && ticks.length > 0) { + // snap to ticks + if (axis.options.min == null) + axis.min = Math.min(axis.min, ticks[0].v); + if (axis.options.max == null && ticks.length > 1) + axis.max = Math.max(axis.max, ticks[ticks.length - 1].v); + } + } + + function draw() { + + surface.clear(); + + executeHooks(hooks.drawBackground, [ctx]); + + var grid = options.grid; + + // draw background, if any + if (grid.show && grid.backgroundColor) + drawBackground(); + + if (grid.show && !grid.aboveData) { + drawGrid(); + } + + for (var i = 0; i < series.length; ++i) { + executeHooks(hooks.drawSeries, [ctx, series[i]]); + drawSeries(series[i]); + } + + executeHooks(hooks.draw, [ctx]); + + if (grid.show && grid.aboveData) { + drawGrid(); + } + + surface.render(); + + // A draw implies that either the axes or data have changed, so we + // should probably update the overlay highlights as well. + + triggerRedrawOverlay(); + } + + function extractRange(ranges, coord) { + var axis, from, to, key, axes = allAxes(); + + for (var i = 0; i < axes.length; ++i) { + axis = axes[i]; + if (axis.direction == coord) { + key = coord + axis.n + "axis"; + if (!ranges[key] && axis.n == 1) + key = coord + "axis"; // support x1axis as xaxis + if (ranges[key]) { + from = ranges[key].from; + to = ranges[key].to; + break; + } + } + } + + // backwards-compat stuff - to be removed in future + if (!ranges[key]) { + axis = coord == "x" ? xaxes[0] : yaxes[0]; + from = ranges[coord + "1"]; + to = ranges[coord + "2"]; + } + + // auto-reverse as an added bonus + if (from != null && to != null && from > to) { + var tmp = from; + from = to; + to = tmp; + } + + return { from: from, to: to, axis: axis }; + } + + function drawBackground() { + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)"); + ctx.fillRect(0, 0, plotWidth, plotHeight); + ctx.restore(); + } + + function drawGrid() { + var i, axes, bw, bc; + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // draw markings + var markings = options.grid.markings; + if (markings) { + if ($.isFunction(markings)) { + axes = plot.getAxes(); + // xmin etc. is backwards compatibility, to be + // removed in the future + axes.xmin = axes.xaxis.min; + axes.xmax = axes.xaxis.max; + axes.ymin = axes.yaxis.min; + axes.ymax = axes.yaxis.max; + + markings = markings(axes); + } + + for (i = 0; i < markings.length; ++i) { + var m = markings[i], + xrange = extractRange(m, "x"), + yrange = extractRange(m, "y"); + + // fill in missing + if (xrange.from == null) + xrange.from = xrange.axis.min; + if (xrange.to == null) + xrange.to = xrange.axis.max; + if (yrange.from == null) + yrange.from = yrange.axis.min; + if (yrange.to == null) + yrange.to = yrange.axis.max; + + // clip + if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max || + yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) + continue; + + xrange.from = Math.max(xrange.from, xrange.axis.min); + xrange.to = Math.min(xrange.to, xrange.axis.max); + yrange.from = Math.max(yrange.from, yrange.axis.min); + yrange.to = Math.min(yrange.to, yrange.axis.max); + + var xequal = xrange.from === xrange.to, + yequal = yrange.from === yrange.to; + + if (xequal && yequal) { + continue; + } + + // then draw + xrange.from = Math.floor(xrange.axis.p2c(xrange.from)); + xrange.to = Math.floor(xrange.axis.p2c(xrange.to)); + yrange.from = Math.floor(yrange.axis.p2c(yrange.from)); + yrange.to = Math.floor(yrange.axis.p2c(yrange.to)); + + if (xequal || yequal) { + var lineWidth = m.lineWidth || options.grid.markingsLineWidth, + subPixel = lineWidth % 2 ? 0.5 : 0; + ctx.beginPath(); + ctx.strokeStyle = m.color || options.grid.markingsColor; + ctx.lineWidth = lineWidth; + if (xequal) { + ctx.moveTo(xrange.to + subPixel, yrange.from); + ctx.lineTo(xrange.to + subPixel, yrange.to); + } else { + ctx.moveTo(xrange.from, yrange.to + subPixel); + ctx.lineTo(xrange.to, yrange.to + subPixel); + } + ctx.stroke(); + } else { + ctx.fillStyle = m.color || options.grid.markingsColor; + ctx.fillRect(xrange.from, yrange.to, + xrange.to - xrange.from, + yrange.from - yrange.to); + } + } + } + + // draw the ticks + axes = allAxes(); + bw = options.grid.borderWidth; + + for (var j = 0; j < axes.length; ++j) { + var axis = axes[j], box = axis.box, + t = axis.tickLength, x, y, xoff, yoff; + if (!axis.show || axis.ticks.length == 0) + continue; + + ctx.lineWidth = 1; + + // find the edges + if (axis.direction == "x") { + x = 0; + if (t == "full") + y = (axis.position == "top" ? 0 : plotHeight); + else + y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0); + } + else { + y = 0; + if (t == "full") + x = (axis.position == "left" ? 0 : plotWidth); + else + x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0); + } + + // draw tick bar + if (!axis.innermost) { + ctx.strokeStyle = axis.options.color; + ctx.beginPath(); + xoff = yoff = 0; + if (axis.direction == "x") + xoff = plotWidth + 1; + else + yoff = plotHeight + 1; + + if (ctx.lineWidth == 1) { + if (axis.direction == "x") { + y = Math.floor(y) + 0.5; + } else { + x = Math.floor(x) + 0.5; + } + } + + ctx.moveTo(x, y); + ctx.lineTo(x + xoff, y + yoff); + ctx.stroke(); + } + + // draw ticks + + ctx.strokeStyle = axis.options.tickColor; + + ctx.beginPath(); + for (i = 0; i < axis.ticks.length; ++i) { + var v = axis.ticks[i].v; + + xoff = yoff = 0; + + if (isNaN(v) || v < axis.min || v > axis.max + // skip those lying on the axes if we got a border + || (t == "full" + && ((typeof bw == "object" && bw[axis.position] > 0) || bw > 0) + && (v == axis.min || v == axis.max))) + continue; + + if (axis.direction == "x") { + x = axis.p2c(v); + yoff = t == "full" ? -plotHeight : t; + + if (axis.position == "top") + yoff = -yoff; + } + else { + y = axis.p2c(v); + xoff = t == "full" ? -plotWidth : t; + + if (axis.position == "left") + xoff = -xoff; + } + + if (ctx.lineWidth == 1) { + if (axis.direction == "x") + x = Math.floor(x) + 0.5; + else + y = Math.floor(y) + 0.5; + } + + ctx.moveTo(x, y); + ctx.lineTo(x + xoff, y + yoff); + } + + ctx.stroke(); + } + + + // draw border + if (bw) { + // If either borderWidth or borderColor is an object, then draw the border + // line by line instead of as one rectangle + bc = options.grid.borderColor; + if(typeof bw == "object" || typeof bc == "object") { + if (typeof bw !== "object") { + bw = {top: bw, right: bw, bottom: bw, left: bw}; + } + if (typeof bc !== "object") { + bc = {top: bc, right: bc, bottom: bc, left: bc}; + } + + if (bw.top > 0) { + ctx.strokeStyle = bc.top; + ctx.lineWidth = bw.top; + ctx.beginPath(); + ctx.moveTo(0 - bw.left, 0 - bw.top/2); + ctx.lineTo(plotWidth, 0 - bw.top/2); + ctx.stroke(); + } + + if (bw.right > 0) { + ctx.strokeStyle = bc.right; + ctx.lineWidth = bw.right; + ctx.beginPath(); + ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top); + ctx.lineTo(plotWidth + bw.right / 2, plotHeight); + ctx.stroke(); + } + + if (bw.bottom > 0) { + ctx.strokeStyle = bc.bottom; + ctx.lineWidth = bw.bottom; + ctx.beginPath(); + ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2); + ctx.lineTo(0, plotHeight + bw.bottom / 2); + ctx.stroke(); + } + + if (bw.left > 0) { + ctx.strokeStyle = bc.left; + ctx.lineWidth = bw.left; + ctx.beginPath(); + ctx.moveTo(0 - bw.left/2, plotHeight + bw.bottom); + ctx.lineTo(0- bw.left/2, 0); + ctx.stroke(); + } + } + else { + ctx.lineWidth = bw; + ctx.strokeStyle = options.grid.borderColor; + ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw); + } + } + + ctx.restore(); + } + + function drawAxisLabels() { + + $.each(allAxes(), function (_, axis) { + var box = axis.box, + legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis", + layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles, + font = axis.options.font || "flot-tick-label tickLabel", + tick, x, y, halign, valign; + + // Remove text before checking for axis.show and ticks.length; + // otherwise plugins, like flot-tickrotor, that draw their own + // tick labels will end up with both theirs and the defaults. + + surface.removeText(layer); + + if (!axis.show || axis.ticks.length == 0) + return; + + for (var i = 0; i < axis.ticks.length; ++i) { + + tick = axis.ticks[i]; + if (!tick.label || tick.v < axis.min || tick.v > axis.max) + continue; + + if (axis.direction == "x") { + halign = "center"; + x = plotOffset.left + axis.p2c(tick.v); + if (axis.position == "bottom") { + y = box.top + box.padding; + } else { + y = box.top + box.height - box.padding; + valign = "bottom"; + } + } else { + valign = "middle"; + y = plotOffset.top + axis.p2c(tick.v); + if (axis.position == "left") { + x = box.left + box.width - box.padding; + halign = "right"; + } else { + x = box.left + box.padding; + } + } + + surface.addText(layer, x, y, tick.label, font, null, null, halign, valign); + } + }); + } + + function drawSeries(series) { + if (series.lines.show) + drawSeriesLines(series); + if (series.bars.show) + drawSeriesBars(series); + if (series.points.show) + drawSeriesPoints(series); + } + + function drawSeriesLines(series) { + function plotLine(datapoints, xoffset, yoffset, axisx, axisy) { + var points = datapoints.points, + ps = datapoints.pointsize, + prevx = null, prevy = null; + + ctx.beginPath(); + for (var i = ps; i < points.length; i += ps) { + var x1 = points[i - ps], y1 = points[i - ps + 1], + x2 = points[i], y2 = points[i + 1]; + + if (x1 == null || x2 == null) + continue; + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min) { + if (y2 < axisy.min) + continue; // line segment is outside + // compute new intersection point + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min) { + if (y1 < axisy.min) + continue; + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max) { + if (y2 > axisy.max) + continue; + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max) { + if (y1 > axisy.max) + continue; + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (x1 != prevx || y1 != prevy) + ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset); + + prevx = x2; + prevy = y2; + ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset); + } + ctx.stroke(); + } + + function plotLineArea(datapoints, axisx, axisy) { + var points = datapoints.points, + ps = datapoints.pointsize, + bottom = Math.min(Math.max(0, axisy.min), axisy.max), + i = 0, top, areaOpen = false, + ypos = 1, segmentStart = 0, segmentEnd = 0; + + // we process each segment in two turns, first forward + // direction to sketch out top, then once we hit the + // end we go backwards to sketch the bottom + while (true) { + if (ps > 0 && i > points.length + ps) + break; + + i += ps; // ps is negative if going backwards + + var x1 = points[i - ps], + y1 = points[i - ps + ypos], + x2 = points[i], y2 = points[i + ypos]; + + if (areaOpen) { + if (ps > 0 && x1 != null && x2 == null) { + // at turning point + segmentEnd = i; + ps = -ps; + ypos = 2; + continue; + } + + if (ps < 0 && i == segmentStart + ps) { + // done with the reverse sweep + ctx.fill(); + areaOpen = false; + ps = -ps; + ypos = 1; + i = segmentStart = segmentEnd + ps; + continue; + } + } + + if (x1 == null || x2 == null) + continue; + + // clip x values + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (!areaOpen) { + // open area + ctx.beginPath(); + ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom)); + areaOpen = true; + } + + // now first check the case where both is outside + if (y1 >= axisy.max && y2 >= axisy.max) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max)); + continue; + } + else if (y1 <= axisy.min && y2 <= axisy.min) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min)); + continue; + } + + // else it's a bit more complicated, there might + // be a flat maxed out rectangle first, then a + // triangular cutout or reverse; to find these + // keep track of the current x values + var x1old = x1, x2old = x2; + + // clip the y values, without shortcutting, we + // go through all cases in turn + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) { + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) { + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // if the x value was changed we got a rectangle + // to fill + if (x1 != x1old) { + ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1)); + // it goes to (x1, y1), but we fill that below + } + + // fill triangular section, this sometimes result + // in redundant points if (x1, y1) hasn't changed + // from previous line to, but we just ignore that + ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + + // fill the other rectangle if it's there + if (x2 != x2old) { + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2)); + } + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + ctx.lineJoin = "round"; + + var lw = series.lines.lineWidth, + sw = series.shadowSize; + // FIXME: consider another form of shadow when filling is turned on + if (lw > 0 && sw > 0) { + // draw shadow as a thick and thin line with transparency + ctx.lineWidth = sw; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + // position shadow at angle from the mid of line + var angle = Math.PI/18; + plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis); + ctx.lineWidth = sw/2; + plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight); + if (fillStyle) { + ctx.fillStyle = fillStyle; + plotLineArea(series.datapoints, series.xaxis, series.yaxis); + } + + if (lw > 0) + plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis); + ctx.restore(); + } + + function drawSeriesPoints(series) { + function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) { + var points = datapoints.points, ps = datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + var x = points[i], y = points[i + 1]; + if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + continue; + + ctx.beginPath(); + x = axisx.p2c(x); + y = axisy.p2c(y) + offset; + if (symbol == "circle") + ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false); + else + symbol(ctx, x, y, radius, shadow); + ctx.closePath(); + + if (fillStyle) { + ctx.fillStyle = fillStyle; + ctx.fill(); + } + ctx.stroke(); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + var lw = series.points.lineWidth, + sw = series.shadowSize, + radius = series.points.radius, + symbol = series.points.symbol; + + // If the user sets the line width to 0, we change it to a very + // small value. A line width of 0 seems to force the default of 1. + // Doing the conditional here allows the shadow setting to still be + // optional even with a lineWidth of 0. + + if( lw == 0 ) + lw = 0.0001; + + if (lw > 0 && sw > 0) { + // draw shadow in two steps + var w = sw / 2; + ctx.lineWidth = w; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + plotPoints(series.datapoints, radius, null, w + w/2, true, + series.xaxis, series.yaxis, symbol); + + ctx.strokeStyle = "rgba(0,0,0,0.2)"; + plotPoints(series.datapoints, radius, null, w/2, true, + series.xaxis, series.yaxis, symbol); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + plotPoints(series.datapoints, radius, + getFillStyle(series.points, series.color), 0, false, + series.xaxis, series.yaxis, symbol); + ctx.restore(); + } + + function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) { + var left, right, bottom, top, + drawLeft, drawRight, drawTop, drawBottom, + tmp; + + // in horizontal mode, we start the bar from the left + // instead of from the bottom so it appears to be + // horizontal rather than vertical + if (horizontal) { + drawBottom = drawRight = drawTop = true; + drawLeft = false; + left = b; + right = x; + top = y + barLeft; + bottom = y + barRight; + + // account for negative bars + if (right < left) { + tmp = right; + right = left; + left = tmp; + drawLeft = true; + drawRight = false; + } + } + else { + drawLeft = drawRight = drawTop = true; + drawBottom = false; + left = x + barLeft; + right = x + barRight; + bottom = b; + top = y; + + // account for negative bars + if (top < bottom) { + tmp = top; + top = bottom; + bottom = tmp; + drawBottom = true; + drawTop = false; + } + } + + // clip + if (right < axisx.min || left > axisx.max || + top < axisy.min || bottom > axisy.max) + return; + + if (left < axisx.min) { + left = axisx.min; + drawLeft = false; + } + + if (right > axisx.max) { + right = axisx.max; + drawRight = false; + } + + if (bottom < axisy.min) { + bottom = axisy.min; + drawBottom = false; + } + + if (top > axisy.max) { + top = axisy.max; + drawTop = false; + } + + left = axisx.p2c(left); + bottom = axisy.p2c(bottom); + right = axisx.p2c(right); + top = axisy.p2c(top); + + // fill the bar + if (fillStyleCallback) { + c.fillStyle = fillStyleCallback(bottom, top); + c.fillRect(left, top, right - left, bottom - top) + } + + // draw outline + if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) { + c.beginPath(); + + // FIXME: inline moveTo is buggy with excanvas + c.moveTo(left, bottom); + if (drawLeft) + c.lineTo(left, top); + else + c.moveTo(left, top); + if (drawTop) + c.lineTo(right, top); + else + c.moveTo(right, top); + if (drawRight) + c.lineTo(right, bottom); + else + c.moveTo(right, bottom); + if (drawBottom) + c.lineTo(left, bottom); + else + c.moveTo(left, bottom); + c.stroke(); + } + } + + function drawSeriesBars(series) { + function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) { + var points = datapoints.points, ps = datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + if (points[i] == null) + continue; + drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // FIXME: figure out a way to add shadows (for instance along the right edge) + ctx.lineWidth = series.bars.lineWidth; + ctx.strokeStyle = series.color; + + var barLeft; + + switch (series.bars.align) { + case "left": + barLeft = 0; + break; + case "right": + barLeft = -series.bars.barWidth; + break; + default: + barLeft = -series.bars.barWidth / 2; + } + + var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null; + plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis); + ctx.restore(); + } + + function getFillStyle(filloptions, seriesColor, bottom, top) { + var fill = filloptions.fill; + if (!fill) + return null; + + if (filloptions.fillColor) + return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor); + + var c = $.color.parse(seriesColor); + c.a = typeof fill == "number" ? fill : 0.4; + c.normalize(); + return c.toString(); + } + + function insertLegend() { + + if (options.legend.container != null) { + $(options.legend.container).html(""); + } else { + placeholder.find(".legend").remove(); + } + + if (!options.legend.show) { + return; + } + + var fragments = [], entries = [], rowStarted = false, + lf = options.legend.labelFormatter, s, label; + + // Build a list of legend entries, with each having a label and a color + + for (var i = 0; i < series.length; ++i) { + s = series[i]; + if (s.label) { + label = lf ? lf(s.label, s) : s.label; + if (label) { + entries.push({ + label: label, + color: s.color + }); + } + } + } + + // Sort the legend using either the default or a custom comparator + + if (options.legend.sorted) { + if ($.isFunction(options.legend.sorted)) { + entries.sort(options.legend.sorted); + } else if (options.legend.sorted == "reverse") { + entries.reverse(); + } else { + var ascending = options.legend.sorted != "descending"; + entries.sort(function(a, b) { + return a.label == b.label ? 0 : ( + (a.label < b.label) != ascending ? 1 : -1 // Logical XOR + ); + }); + } + } + + // Generate markup for the list of entries, in their final order + + for (var i = 0; i < entries.length; ++i) { + + var entry = entries[i]; + + if (i % options.legend.noColumns == 0) { + if (rowStarted) + fragments.push(''); + fragments.push(''); + rowStarted = true; + } + + fragments.push( + '
          ' + + '' + entry.label + '' + ); + } + + if (rowStarted) + fragments.push(''); + + if (fragments.length == 0) + return; + + var table = '' + fragments.join("") + '
          '; + if (options.legend.container != null) + $(options.legend.container).html(table); + else { + var pos = "", + p = options.legend.position, + m = options.legend.margin; + if (m[0] == null) + m = [m, m]; + if (p.charAt(0) == "n") + pos += 'top:' + (m[1] + plotOffset.top) + 'px;'; + else if (p.charAt(0) == "s") + pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;'; + if (p.charAt(1) == "e") + pos += 'right:' + (m[0] + plotOffset.right) + 'px;'; + else if (p.charAt(1) == "w") + pos += 'left:' + (m[0] + plotOffset.left) + 'px;'; + var legend = $('
          ' + table.replace('style="', 'style="position:absolute;' + pos +';') + '
          ').appendTo(placeholder); + if (options.legend.backgroundOpacity != 0.0) { + // put in the transparent background + // separately to avoid blended labels and + // label boxes + var c = options.legend.backgroundColor; + if (c == null) { + c = options.grid.backgroundColor; + if (c && typeof c == "string") + c = $.color.parse(c); + else + c = $.color.extract(legend, 'background-color'); + c.a = 1; + c = c.toString(); + } + var div = legend.children(); + $('
          ').prependTo(legend).css('opacity', options.legend.backgroundOpacity); + } + } + } + + + // interactive features + + var highlights = [], + redrawTimeout = null; + + // returns the data item the mouse is over, or null if none is found + function findNearbyItem(mouseX, mouseY, seriesFilter) { + var maxDistance = options.grid.mouseActiveRadius, + smallestDistance = maxDistance * maxDistance + 1, + item = null, foundPoint = false, i, j, ps; + + for (i = series.length - 1; i >= 0; --i) { + if (!seriesFilter(series[i])) + continue; + + var s = series[i], + axisx = s.xaxis, + axisy = s.yaxis, + points = s.datapoints.points, + mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster + my = axisy.c2p(mouseY), + maxx = maxDistance / axisx.scale, + maxy = maxDistance / axisy.scale; + + ps = s.datapoints.pointsize; + // with inverse transforms, we can't use the maxx/maxy + // optimization, sadly + if (axisx.options.inverseTransform) + maxx = Number.MAX_VALUE; + if (axisy.options.inverseTransform) + maxy = Number.MAX_VALUE; + + if (s.lines.show || s.points.show) { + for (j = 0; j < points.length; j += ps) { + var x = points[j], y = points[j + 1]; + if (x == null) + continue; + + // For points and lines, the cursor must be within a + // certain distance to the data point + if (x - mx > maxx || x - mx < -maxx || + y - my > maxy || y - my < -maxy) + continue; + + // We have to calculate distances in pixels, not in + // data units, because the scales of the axes may be different + var dx = Math.abs(axisx.p2c(x) - mouseX), + dy = Math.abs(axisy.p2c(y) - mouseY), + dist = dx * dx + dy * dy; // we save the sqrt + + // use <= to ensure last point takes precedence + // (last generally means on top of) + if (dist < smallestDistance) { + smallestDistance = dist; + item = [i, j / ps]; + } + } + } + + if (s.bars.show && !item) { // no other point can be nearby + + var barLeft, barRight; + + switch (s.bars.align) { + case "left": + barLeft = 0; + break; + case "right": + barLeft = -s.bars.barWidth; + break; + default: + barLeft = -s.bars.barWidth / 2; + } + + barRight = barLeft + s.bars.barWidth; + + for (j = 0; j < points.length; j += ps) { + var x = points[j], y = points[j + 1], b = points[j + 2]; + if (x == null) + continue; + + // for a bar graph, the cursor must be inside the bar + if (series[i].bars.horizontal ? + (mx <= Math.max(b, x) && mx >= Math.min(b, x) && + my >= y + barLeft && my <= y + barRight) : + (mx >= x + barLeft && mx <= x + barRight && + my >= Math.min(b, y) && my <= Math.max(b, y))) + item = [i, j / ps]; + } + } + } + + if (item) { + i = item[0]; + j = item[1]; + ps = series[i].datapoints.pointsize; + + return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps), + dataIndex: j, + series: series[i], + seriesIndex: i }; + } + + return null; + } + + function onMouseMove(e) { + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", e, + function (s) { return s["hoverable"] != false; }); + } + + function onMouseLeave(e) { + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", e, + function (s) { return false; }); + } + + function onClick(e) { + triggerClickHoverEvent("plotclick", e, + function (s) { return s["clickable"] != false; }); + } + + // trigger click or hover event (they send the same parameters + // so we share their code) + function triggerClickHoverEvent(eventname, event, seriesFilter) { + var offset = eventHolder.offset(), + canvasX = event.pageX - offset.left - plotOffset.left, + canvasY = event.pageY - offset.top - plotOffset.top, + pos = canvasToAxisCoords({ left: canvasX, top: canvasY }); + + pos.pageX = event.pageX; + pos.pageY = event.pageY; + + var item = findNearbyItem(canvasX, canvasY, seriesFilter); + + if (item) { + // fill in mouse pos for any listeners out there + item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10); + item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10); + } + + if (options.grid.autoHighlight) { + // clear auto-highlights + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.auto == eventname && + !(item && h.series == item.series && + h.point[0] == item.datapoint[0] && + h.point[1] == item.datapoint[1])) + unhighlight(h.series, h.point); + } + + if (item) + highlight(item.series, item.datapoint, eventname); + } + + placeholder.trigger(eventname, [ pos, item ]); + } + + function triggerRedrawOverlay() { + var t = options.interaction.redrawOverlayInterval; + if (t == -1) { // skip event queue + drawOverlay(); + return; + } + + if (!redrawTimeout) + redrawTimeout = setTimeout(drawOverlay, t); + } + + function drawOverlay() { + redrawTimeout = null; + + // draw highlights + octx.save(); + overlay.clear(); + octx.translate(plotOffset.left, plotOffset.top); + + var i, hi; + for (i = 0; i < highlights.length; ++i) { + hi = highlights[i]; + + if (hi.series.bars.show) + drawBarHighlight(hi.series, hi.point); + else + drawPointHighlight(hi.series, hi.point); + } + octx.restore(); + + executeHooks(hooks.drawOverlay, [octx]); + } + + function highlight(s, point, auto) { + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") { + var ps = s.datapoints.pointsize; + point = s.datapoints.points.slice(ps * point, ps * (point + 1)); + } + + var i = indexOfHighlight(s, point); + if (i == -1) { + highlights.push({ series: s, point: point, auto: auto }); + + triggerRedrawOverlay(); + } + else if (!auto) + highlights[i].auto = false; + } + + function unhighlight(s, point) { + if (s == null && point == null) { + highlights = []; + triggerRedrawOverlay(); + return; + } + + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") { + var ps = s.datapoints.pointsize; + point = s.datapoints.points.slice(ps * point, ps * (point + 1)); + } + + var i = indexOfHighlight(s, point); + if (i != -1) { + highlights.splice(i, 1); + + triggerRedrawOverlay(); + } + } + + function indexOfHighlight(s, p) { + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.series == s && h.point[0] == p[0] + && h.point[1] == p[1]) + return i; + } + return -1; + } + + function drawPointHighlight(series, point) { + var x = point[0], y = point[1], + axisx = series.xaxis, axisy = series.yaxis, + highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(); + + if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + return; + + var pointRadius = series.points.radius + series.points.lineWidth / 2; + octx.lineWidth = pointRadius; + octx.strokeStyle = highlightColor; + var radius = 1.5 * pointRadius; + x = axisx.p2c(x); + y = axisy.p2c(y); + + octx.beginPath(); + if (series.points.symbol == "circle") + octx.arc(x, y, radius, 0, 2 * Math.PI, false); + else + series.points.symbol(octx, x, y, radius, false); + octx.closePath(); + octx.stroke(); + } + + function drawBarHighlight(series, point) { + var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(), + fillStyle = highlightColor, + barLeft; + + switch (series.bars.align) { + case "left": + barLeft = 0; + break; + case "right": + barLeft = -series.bars.barWidth; + break; + default: + barLeft = -series.bars.barWidth / 2; + } + + octx.lineWidth = series.bars.lineWidth; + octx.strokeStyle = highlightColor; + + drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth, + function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth); + } + + function getColorOrGradient(spec, bottom, top, defaultColor) { + if (typeof spec == "string") + return spec; + else { + // assume this is a gradient spec; IE currently only + // supports a simple vertical gradient properly, so that's + // what we support too + var gradient = ctx.createLinearGradient(0, top, 0, bottom); + + for (var i = 0, l = spec.colors.length; i < l; ++i) { + var c = spec.colors[i]; + if (typeof c != "string") { + var co = $.color.parse(defaultColor); + if (c.brightness != null) + co = co.scale('rgb', c.brightness); + if (c.opacity != null) + co.a *= c.opacity; + c = co.toString(); + } + gradient.addColorStop(i / (l - 1), c); + } + + return gradient; + } + } + } + + // Add the plot function to the top level of the jQuery object + + $.plot = function(placeholder, data, options) { + //var t0 = new Date(); + var plot = new Plot($(placeholder), data, options, $.plot.plugins); + //(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime())); + return plot; + }; + + $.plot.version = "0.8.3"; + + $.plot.plugins = []; + + // Also add the plot function as a chainable property + + $.fn.plot = function(data, options) { + return this.each(function() { + $.plot(this, data, options); + }); + }; + + // round to nearby lower multiple of base + function floorInBase(n, base) { + return base * Math.floor(n / base); + } + +})(jQuery); + +/* Flot plugin for automatically redrawing plots as the placeholder resizes. + +Copyright (c) 2007-2014 IOLA and Ole Laursen. +Licensed under the MIT license. + +It works by listening for changes on the placeholder div (through the jQuery +resize event plugin) - if the size changes, it will redraw the plot. + +There are no options. If you need to disable the plugin for some plots, you +can just fix the size of their placeholders. + +*/ + +/* Inline dependency: + * jQuery resize event - v1.1 - 3/14/2010 + * http://benalman.com/projects/jquery-resize-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,t){"$:nomunge";var i=[],n=$.resize=$.extend($.resize,{}),a,r=false,s="setTimeout",u="resize",m=u+"-special-event",o="pendingDelay",l="activeDelay",f="throttleWindow";n[o]=200;n[l]=20;n[f]=true;$.event.special[u]={setup:function(){if(!n[f]&&this[s]){return false}var e=$(this);i.push(this);e.data(m,{w:e.width(),h:e.height()});if(i.length===1){a=t;h()}},teardown:function(){if(!n[f]&&this[s]){return false}var e=$(this);for(var t=i.length-1;t>=0;t--){if(i[t]==this){i.splice(t,1);break}}e.removeData(m);if(!i.length){if(r){cancelAnimationFrame(a)}else{clearTimeout(a)}a=null}},add:function(e){if(!n[f]&&this[s]){return false}var i;function a(e,n,a){var r=$(this),s=r.data(m)||{};s.w=n!==t?n:r.width();s.h=a!==t?a:r.height();i.apply(this,arguments)}if($.isFunction(e)){i=e;return a}else{i=e.handler;e.handler=a}}};function h(t){if(r===true){r=t||1}for(var s=i.length-1;s>=0;s--){var l=$(i[s]);if(l[0]==e||l.is(":visible")){var f=l.width(),c=l.height(),d=l.data(m);if(d&&(f!==d.w||c!==d.h)){l.trigger(u,[d.w=f,d.h=c]);r=t||true}}else{d=l.data(m);d.w=0;d.h=0}}if(a!==null){if(r&&(t==null||t-r<1e3)){a=e.requestAnimationFrame(h)}else{a=setTimeout(h,n[o]);r=false}}}if(!e.requestAnimationFrame){e.requestAnimationFrame=function(){return e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(t,i){return e.setTimeout(function(){t((new Date).getTime())},n[l])}}()}if(!e.cancelAnimationFrame){e.cancelAnimationFrame=function(){return e.webkitCancelRequestAnimationFrame||e.mozCancelRequestAnimationFrame||e.oCancelRequestAnimationFrame||e.msCancelRequestAnimationFrame||clearTimeout}()}})(jQuery,this); + +(function ($) { + var options = { }; // no options + + function init(plot) { + function onResize() { + var placeholder = plot.getPlaceholder(); + + // somebody might have hidden us and we can't plot + // when we don't have the dimensions + if (placeholder.width() == 0 || placeholder.height() == 0) + return; + + plot.resize(); + plot.setupGrid(); + plot.draw(); + } + + function bindEvents(plot, eventHolder) { + plot.getPlaceholder().resize(onResize); + } + + function shutdown(plot, eventHolder) { + plot.getPlaceholder().unbind("resize", onResize); + } + + plot.hooks.bindEvents.push(bindEvents); + plot.hooks.shutdown.push(shutdown); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'resize', + version: '1.0' + }); +})(jQuery); + +/* Flot plugin for plotting textual data or categories. + +Copyright (c) 2007-2014 IOLA and Ole Laursen. +Licensed under the MIT license. + +Consider a dataset like [["February", 34], ["March", 20], ...]. This plugin +allows you to plot such a dataset directly. + +To enable it, you must specify mode: "categories" on the axis with the textual +labels, e.g. + + $.plot("#placeholder", data, { xaxis: { mode: "categories" } }); + +By default, the labels are ordered as they are met in the data series. If you +need a different ordering, you can specify "categories" on the axis options +and list the categories there: + + xaxis: { + mode: "categories", + categories: ["February", "March", "April"] + } + +If you need to customize the distances between the categories, you can specify +"categories" as an object mapping labels to values + + xaxis: { + mode: "categories", + categories: { "February": 1, "March": 3, "April": 4 } + } + +If you don't specify all categories, the remaining categories will be numbered +from the max value plus 1 (with a spacing of 1 between each). + +Internally, the plugin works by transforming the input data through an auto- +generated mapping where the first category becomes 0, the second 1, etc. +Hence, a point like ["February", 34] becomes [0, 34] internally in Flot (this +is visible in hover and click events that return numbers rather than the +category labels). The plugin also overrides the tick generator to spit out the +categories as ticks instead of the values. + +If you need to map a value back to its label, the mapping is always accessible +as "categories" on the axis object, e.g. plot.getAxes().xaxis.categories. + +*/ + +(function ($) { + var options = { + xaxis: { + categories: null + }, + yaxis: { + categories: null + } + }; + + function processRawData(plot, series, data, datapoints) { + // if categories are enabled, we need to disable + // auto-transformation to numbers so the strings are intact + // for later processing + + var xCategories = series.xaxis.options.mode == "categories", + yCategories = series.yaxis.options.mode == "categories"; + + if (!(xCategories || yCategories)) + return; + + var format = datapoints.format; + + if (!format) { + // FIXME: auto-detection should really not be defined here + var s = series; + format = []; + format.push({ x: true, number: true, required: true }); + format.push({ y: true, number: true, required: true }); + + if (s.bars.show || (s.lines.show && s.lines.fill)) { + var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero)); + format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale }); + if (s.bars.horizontal) { + delete format[format.length - 1].y; + format[format.length - 1].x = true; + } + } + + datapoints.format = format; + } + + for (var m = 0; m < format.length; ++m) { + if (format[m].x && xCategories) + format[m].number = false; + + if (format[m].y && yCategories) + format[m].number = false; + } + } + + function getNextIndex(categories) { + var index = -1; + + for (var v in categories) + if (categories[v] > index) + index = categories[v]; + + return index + 1; + } + + function categoriesTickGenerator(axis) { + var res = []; + for (var label in axis.categories) { + var v = axis.categories[label]; + if (v >= axis.min && v <= axis.max) + res.push([v, label]); + } + + res.sort(function (a, b) { return a[0] - b[0]; }); + + return res; + } + + function setupCategoriesForAxis(series, axis, datapoints) { + if (series[axis].options.mode != "categories") + return; + + if (!series[axis].categories) { + // parse options + var c = {}, o = series[axis].options.categories || {}; + if ($.isArray(o)) { + for (var i = 0; i < o.length; ++i) + c[o[i]] = i; + } + else { + for (var v in o) + c[v] = o[v]; + } + + series[axis].categories = c; + } + + // fix ticks + if (!series[axis].options.ticks) + series[axis].options.ticks = categoriesTickGenerator; + + transformPointsOnAxis(datapoints, axis, series[axis].categories); + } + + function transformPointsOnAxis(datapoints, axis, categories) { + // go through the points, transforming them + var points = datapoints.points, + ps = datapoints.pointsize, + format = datapoints.format, + formatColumn = axis.charAt(0), + index = getNextIndex(categories); + + for (var i = 0; i < points.length; i += ps) { + if (points[i] == null) + continue; + + for (var m = 0; m < ps; ++m) { + var val = points[i + m]; + + if (val == null || !format[m][formatColumn]) + continue; + + if (!(val in categories)) { + categories[val] = index; + ++index; + } + + points[i + m] = categories[val]; + } + } + } + + function processDatapoints(plot, series, datapoints) { + setupCategoriesForAxis(series, "xaxis", datapoints); + setupCategoriesForAxis(series, "yaxis", datapoints); + } + + function init(plot) { + plot.hooks.processRawData.push(processRawData); + plot.hooks.processDatapoints.push(processDatapoints); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'categories', + version: '1.0' + }); +})(jQuery); + +/* Flot plugin for rendering pie charts. + +Copyright (c) 2007-2014 IOLA and Ole Laursen. +Licensed under the MIT license. + +The plugin assumes that each series has a single data value, and that each +value is a positive integer or zero. Negative numbers don't make sense for a +pie chart, and have unpredictable results. The values do NOT need to be +passed in as percentages; the plugin will calculate the total and per-slice +percentages internally. + +* Created by Brian Medendorp + +* Updated with contributions from btburnett3, Anthony Aragues and Xavi Ivars + +The plugin supports these options: + + series: { + pie: { + show: true/false + radius: 0-1 for percentage of fullsize, or a specified pixel length, or 'auto' + innerRadius: 0-1 for percentage of fullsize or a specified pixel length, for creating a donut effect + startAngle: 0-2 factor of PI used for starting angle (in radians) i.e 3/2 starts at the top, 0 and 2 have the same result + tilt: 0-1 for percentage to tilt the pie, where 1 is no tilt, and 0 is completely flat (nothing will show) + offset: { + top: integer value to move the pie up or down + left: integer value to move the pie left or right, or 'auto' + }, + stroke: { + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#FFF') + width: integer pixel width of the stroke + }, + label: { + show: true/false, or 'auto' + formatter: a user-defined function that modifies the text/style of the label text + radius: 0-1 for percentage of fullsize, or a specified pixel length + background: { + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#000') + opacity: 0-1 + }, + threshold: 0-1 for the percentage value at which to hide labels (if they're too small) + }, + combine: { + threshold: 0-1 for the percentage value at which to combine slices (if they're too small) + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#CCC'), if null, the plugin will automatically use the color of the first slice to be combined + label: any text value of what the combined slice should be labeled + } + highlight: { + opacity: 0-1 + } + } + } + +More detail and specific examples can be found in the included HTML file. + +*/ + +(function($) { + + // Maximum redraw attempts when fitting labels within the plot + + var REDRAW_ATTEMPTS = 10; + + // Factor by which to shrink the pie when fitting labels within the plot + + var REDRAW_SHRINK = 0.95; + + function init(plot) { + + var canvas = null, + target = null, + options = null, + maxRadius = null, + centerLeft = null, + centerTop = null, + processed = false, + ctx = null; + + // interactive variables + + var highlights = []; + + // add hook to determine if pie plugin in enabled, and then perform necessary operations + + plot.hooks.processOptions.push(function(plot, options) { + if (options.series.pie.show) { + + options.grid.show = false; + + // set labels.show + + if (options.series.pie.label.show == "auto") { + if (options.legend.show) { + options.series.pie.label.show = false; + } else { + options.series.pie.label.show = true; + } + } + + // set radius + + if (options.series.pie.radius == "auto") { + if (options.series.pie.label.show) { + options.series.pie.radius = 3/4; + } else { + options.series.pie.radius = 1; + } + } + + // ensure sane tilt + + if (options.series.pie.tilt > 1) { + options.series.pie.tilt = 1; + } else if (options.series.pie.tilt < 0) { + options.series.pie.tilt = 0; + } + } + }); + + plot.hooks.bindEvents.push(function(plot, eventHolder) { + var options = plot.getOptions(); + if (options.series.pie.show) { + if (options.grid.hoverable) { + eventHolder.unbind("mousemove").mousemove(onMouseMove); + } + if (options.grid.clickable) { + eventHolder.unbind("click").click(onClick); + } + } + }); + + plot.hooks.processDatapoints.push(function(plot, series, data, datapoints) { + var options = plot.getOptions(); + if (options.series.pie.show) { + processDatapoints(plot, series, data, datapoints); + } + }); + + plot.hooks.drawOverlay.push(function(plot, octx) { + var options = plot.getOptions(); + if (options.series.pie.show) { + drawOverlay(plot, octx); + } + }); + + plot.hooks.draw.push(function(plot, newCtx) { + var options = plot.getOptions(); + if (options.series.pie.show) { + draw(plot, newCtx); + } + }); + + function processDatapoints(plot, series, datapoints) { + if (!processed) { + processed = true; + canvas = plot.getCanvas(); + target = $(canvas).parent(); + options = plot.getOptions(); + plot.setData(combine(plot.getData())); + } + } + + function combine(data) { + + var total = 0, + combined = 0, + numCombined = 0, + color = options.series.pie.combine.color, + newdata = []; + + // Fix up the raw data from Flot, ensuring the data is numeric + + for (var i = 0; i < data.length; ++i) { + + var value = data[i].data; + + // If the data is an array, we'll assume that it's a standard + // Flot x-y pair, and are concerned only with the second value. + + // Note how we use the original array, rather than creating a + // new one; this is more efficient and preserves any extra data + // that the user may have stored in higher indexes. + + if ($.isArray(value) && value.length == 1) { + value = value[0]; + } + + if ($.isArray(value)) { + // Equivalent to $.isNumeric() but compatible with jQuery < 1.7 + if (!isNaN(parseFloat(value[1])) && isFinite(value[1])) { + value[1] = +value[1]; + } else { + value[1] = 0; + } + } else if (!isNaN(parseFloat(value)) && isFinite(value)) { + value = [1, +value]; + } else { + value = [1, 0]; + } + + data[i].data = [value]; + } + + // Sum up all the slices, so we can calculate percentages for each + + for (var i = 0; i < data.length; ++i) { + total += data[i].data[0][1]; + } + + // Count the number of slices with percentages below the combine + // threshold; if it turns out to be just one, we won't combine. + + for (var i = 0; i < data.length; ++i) { + var value = data[i].data[0][1]; + if (value / total <= options.series.pie.combine.threshold) { + combined += value; + numCombined++; + if (!color) { + color = data[i].color; + } + } + } + + for (var i = 0; i < data.length; ++i) { + var value = data[i].data[0][1]; + if (numCombined < 2 || value / total > options.series.pie.combine.threshold) { + newdata.push( + $.extend(data[i], { /* extend to allow keeping all other original data values + and using them e.g. in labelFormatter. */ + data: [[1, value]], + color: data[i].color, + label: data[i].label, + angle: value * Math.PI * 2 / total, + percent: value / (total / 100) + }) + ); + } + } + + if (numCombined > 1) { + newdata.push({ + data: [[1, combined]], + color: color, + label: options.series.pie.combine.label, + angle: combined * Math.PI * 2 / total, + percent: combined / (total / 100) + }); + } + + return newdata; + } + + function draw(plot, newCtx) { + + if (!target) { + return; // if no series were passed + } + + var canvasWidth = plot.getPlaceholder().width(), + canvasHeight = plot.getPlaceholder().height(), + legendWidth = target.children().filter(".legend").children().width() || 0; + + ctx = newCtx; + + // WARNING: HACK! REWRITE THIS CODE AS SOON AS POSSIBLE! + + // When combining smaller slices into an 'other' slice, we need to + // add a new series. Since Flot gives plugins no way to modify the + // list of series, the pie plugin uses a hack where the first call + // to processDatapoints results in a call to setData with the new + // list of series, then subsequent processDatapoints do nothing. + + // The plugin-global 'processed' flag is used to control this hack; + // it starts out false, and is set to true after the first call to + // processDatapoints. + + // Unfortunately this turns future setData calls into no-ops; they + // call processDatapoints, the flag is true, and nothing happens. + + // To fix this we'll set the flag back to false here in draw, when + // all series have been processed, so the next sequence of calls to + // processDatapoints once again starts out with a slice-combine. + // This is really a hack; in 0.9 we need to give plugins a proper + // way to modify series before any processing begins. + + processed = false; + + // calculate maximum radius and center point + + maxRadius = Math.min(canvasWidth, canvasHeight / options.series.pie.tilt) / 2; + centerTop = canvasHeight / 2 + options.series.pie.offset.top; + centerLeft = canvasWidth / 2; + + if (options.series.pie.offset.left == "auto") { + if (options.legend.position.match("w")) { + centerLeft += legendWidth / 2; + } else { + centerLeft -= legendWidth / 2; + } + if (centerLeft < maxRadius) { + centerLeft = maxRadius; + } else if (centerLeft > canvasWidth - maxRadius) { + centerLeft = canvasWidth - maxRadius; + } + } else { + centerLeft += options.series.pie.offset.left; + } + + var slices = plot.getData(), + attempts = 0; + + // Keep shrinking the pie's radius until drawPie returns true, + // indicating that all the labels fit, or we try too many times. + + do { + if (attempts > 0) { + maxRadius *= REDRAW_SHRINK; + } + attempts += 1; + clear(); + if (options.series.pie.tilt <= 0.8) { + drawShadow(); + } + } while (!drawPie() && attempts < REDRAW_ATTEMPTS) + + if (attempts >= REDRAW_ATTEMPTS) { + clear(); + target.prepend("
          Could not draw pie with labels contained inside canvas
          "); + } + + if (plot.setSeries && plot.insertLegend) { + plot.setSeries(slices); + plot.insertLegend(); + } + + // we're actually done at this point, just defining internal functions at this point + + function clear() { + ctx.clearRect(0, 0, canvasWidth, canvasHeight); + target.children().filter(".pieLabel, .pieLabelBackground").remove(); + } + + function drawShadow() { + + var shadowLeft = options.series.pie.shadow.left; + var shadowTop = options.series.pie.shadow.top; + var edge = 10; + var alpha = options.series.pie.shadow.alpha; + var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; + + if (radius >= canvasWidth / 2 - shadowLeft || radius * options.series.pie.tilt >= canvasHeight / 2 - shadowTop || radius <= edge) { + return; // shadow would be outside canvas, so don't draw it + } + + ctx.save(); + ctx.translate(shadowLeft,shadowTop); + ctx.globalAlpha = alpha; + ctx.fillStyle = "#000"; + + // center and rotate to starting position + + ctx.translate(centerLeft,centerTop); + ctx.scale(1, options.series.pie.tilt); + + //radius -= edge; + + for (var i = 1; i <= edge; i++) { + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2, false); + ctx.fill(); + radius -= i; + } + + ctx.restore(); + } + + function drawPie() { + + var startAngle = Math.PI * options.series.pie.startAngle; + var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; + + // center and rotate to starting position + + ctx.save(); + ctx.translate(centerLeft,centerTop); + ctx.scale(1, options.series.pie.tilt); + //ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera + + // draw slices + + ctx.save(); + var currentAngle = startAngle; + for (var i = 0; i < slices.length; ++i) { + slices[i].startAngle = currentAngle; + drawSlice(slices[i].angle, slices[i].color, true); + } + ctx.restore(); + + // draw slice outlines + + if (options.series.pie.stroke.width > 0) { + ctx.save(); + ctx.lineWidth = options.series.pie.stroke.width; + currentAngle = startAngle; + for (var i = 0; i < slices.length; ++i) { + drawSlice(slices[i].angle, options.series.pie.stroke.color, false); + } + ctx.restore(); + } + + // draw donut hole + + drawDonutHole(ctx); + + ctx.restore(); + + // Draw the labels, returning true if they fit within the plot + + if (options.series.pie.label.show) { + return drawLabels(); + } else return true; + + function drawSlice(angle, color, fill) { + + if (angle <= 0 || isNaN(angle)) { + return; + } + + if (fill) { + ctx.fillStyle = color; + } else { + ctx.strokeStyle = color; + ctx.lineJoin = "round"; + } + + ctx.beginPath(); + if (Math.abs(angle - Math.PI * 2) > 0.000000001) { + ctx.moveTo(0, 0); // Center of the pie + } + + //ctx.arc(0, 0, radius, 0, angle, false); // This doesn't work properly in Opera + ctx.arc(0, 0, radius,currentAngle, currentAngle + angle / 2, false); + ctx.arc(0, 0, radius,currentAngle + angle / 2, currentAngle + angle, false); + ctx.closePath(); + //ctx.rotate(angle); // This doesn't work properly in Opera + currentAngle += angle; + + if (fill) { + ctx.fill(); + } else { + ctx.stroke(); + } + } + + function drawLabels() { + + var currentAngle = startAngle; + var radius = options.series.pie.label.radius > 1 ? options.series.pie.label.radius : maxRadius * options.series.pie.label.radius; + + for (var i = 0; i < slices.length; ++i) { + if (slices[i].percent >= options.series.pie.label.threshold * 100) { + if (!drawLabel(slices[i], currentAngle, i)) { + return false; + } + } + currentAngle += slices[i].angle; + } + + return true; + + function drawLabel(slice, startAngle, index) { + + if (slice.data[0][1] == 0) { + return true; + } + + // format label text + + var lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter; + + if (lf) { + text = lf(slice.label, slice); + } else { + text = slice.label; + } + + if (plf) { + text = plf(text, slice); + } + + var halfAngle = ((startAngle + slice.angle) + startAngle) / 2; + var x = centerLeft + Math.round(Math.cos(halfAngle) * radius); + var y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt; + + var html = "" + text + ""; + target.append(html); + + var label = target.children("#pieLabel" + index); + var labelTop = (y - label.height() / 2); + var labelLeft = (x - label.width() / 2); + + label.css("top", labelTop); + label.css("left", labelLeft); + + // check to make sure that the label is not outside the canvas + + if (0 - labelTop > 0 || 0 - labelLeft > 0 || canvasHeight - (labelTop + label.height()) < 0 || canvasWidth - (labelLeft + label.width()) < 0) { + return false; + } + + if (options.series.pie.label.background.opacity != 0) { + + // put in the transparent background separately to avoid blended labels and label boxes + + var c = options.series.pie.label.background.color; + + if (c == null) { + c = slice.color; + } + + var pos = "top:" + labelTop + "px;left:" + labelLeft + "px;"; + $("
          ") + .css("opacity", options.series.pie.label.background.opacity) + .insertBefore(label); + } + + return true; + } // end individual label function + } // end drawLabels function + } // end drawPie function + } // end draw function + + // Placed here because it needs to be accessed from multiple locations + + function drawDonutHole(layer) { + if (options.series.pie.innerRadius > 0) { + + // subtract the center + + layer.save(); + var innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius; + layer.globalCompositeOperation = "destination-out"; // this does not work with excanvas, but it will fall back to using the stroke color + layer.beginPath(); + layer.fillStyle = options.series.pie.stroke.color; + layer.arc(0, 0, innerRadius, 0, Math.PI * 2, false); + layer.fill(); + layer.closePath(); + layer.restore(); + + // add inner stroke + + layer.save(); + layer.beginPath(); + layer.strokeStyle = options.series.pie.stroke.color; + layer.arc(0, 0, innerRadius, 0, Math.PI * 2, false); + layer.stroke(); + layer.closePath(); + layer.restore(); + + // TODO: add extra shadow inside hole (with a mask) if the pie is tilted. + } + } + + //-- Additional Interactive related functions -- + + function isPointInPoly(poly, pt) { + for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) + ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1]< poly[i][1])) + && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]) + && (c = !c); + return c; + } + + function findNearbySlice(mouseX, mouseY) { + + var slices = plot.getData(), + options = plot.getOptions(), + radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius, + x, y; + + for (var i = 0; i < slices.length; ++i) { + + var s = slices[i]; + + if (s.pie.show) { + + ctx.save(); + ctx.beginPath(); + ctx.moveTo(0, 0); // Center of the pie + //ctx.scale(1, options.series.pie.tilt); // this actually seems to break everything when here. + ctx.arc(0, 0, radius, s.startAngle, s.startAngle + s.angle / 2, false); + ctx.arc(0, 0, radius, s.startAngle + s.angle / 2, s.startAngle + s.angle, false); + ctx.closePath(); + x = mouseX - centerLeft; + y = mouseY - centerTop; + + if (ctx.isPointInPath) { + if (ctx.isPointInPath(mouseX - centerLeft, mouseY - centerTop)) { + ctx.restore(); + return { + datapoint: [s.percent, s.data], + dataIndex: 0, + series: s, + seriesIndex: i + }; + } + } else { + + // excanvas for IE doesn;t support isPointInPath, this is a workaround. + + var p1X = radius * Math.cos(s.startAngle), + p1Y = radius * Math.sin(s.startAngle), + p2X = radius * Math.cos(s.startAngle + s.angle / 4), + p2Y = radius * Math.sin(s.startAngle + s.angle / 4), + p3X = radius * Math.cos(s.startAngle + s.angle / 2), + p3Y = radius * Math.sin(s.startAngle + s.angle / 2), + p4X = radius * Math.cos(s.startAngle + s.angle / 1.5), + p4Y = radius * Math.sin(s.startAngle + s.angle / 1.5), + p5X = radius * Math.cos(s.startAngle + s.angle), + p5Y = radius * Math.sin(s.startAngle + s.angle), + arrPoly = [[0, 0], [p1X, p1Y], [p2X, p2Y], [p3X, p3Y], [p4X, p4Y], [p5X, p5Y]], + arrPoint = [x, y]; + + // TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt? + + if (isPointInPoly(arrPoly, arrPoint)) { + ctx.restore(); + return { + datapoint: [s.percent, s.data], + dataIndex: 0, + series: s, + seriesIndex: i + }; + } + } + + ctx.restore(); + } + } + + return null; + } + + function onMouseMove(e) { + triggerClickHoverEvent("plothover", e); + } + + function onClick(e) { + triggerClickHoverEvent("plotclick", e); + } + + // trigger click or hover event (they send the same parameters so we share their code) + + function triggerClickHoverEvent(eventname, e) { + + var offset = plot.offset(); + var canvasX = parseInt(e.pageX - offset.left); + var canvasY = parseInt(e.pageY - offset.top); + var item = findNearbySlice(canvasX, canvasY); + + if (options.grid.autoHighlight) { + + // clear auto-highlights + + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.auto == eventname && !(item && h.series == item.series)) { + unhighlight(h.series); + } + } + } + + // highlight the slice + + if (item) { + highlight(item.series, eventname); + } + + // trigger any hover bind events + + var pos = { pageX: e.pageX, pageY: e.pageY }; + target.trigger(eventname, [pos, item]); + } + + function highlight(s, auto) { + //if (typeof s == "number") { + // s = series[s]; + //} + + var i = indexOfHighlight(s); + + if (i == -1) { + highlights.push({ series: s, auto: auto }); + plot.triggerRedrawOverlay(); + } else if (!auto) { + highlights[i].auto = false; + } + } + + function unhighlight(s) { + if (s == null) { + highlights = []; + plot.triggerRedrawOverlay(); + } + + //if (typeof s == "number") { + // s = series[s]; + //} + + var i = indexOfHighlight(s); + + if (i != -1) { + highlights.splice(i, 1); + plot.triggerRedrawOverlay(); + } + } + + function indexOfHighlight(s) { + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.series == s) + return i; + } + return -1; + } + + function drawOverlay(plot, octx) { + + var options = plot.getOptions(); + + var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; + + octx.save(); + octx.translate(centerLeft, centerTop); + octx.scale(1, options.series.pie.tilt); + + for (var i = 0; i < highlights.length; ++i) { + drawHighlight(highlights[i].series); + } + + drawDonutHole(octx); + + octx.restore(); + + function drawHighlight(series) { + + if (series.angle <= 0 || isNaN(series.angle)) { + return; + } + + //octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString(); + octx.fillStyle = "rgba(255, 255, 255, " + options.series.pie.highlight.opacity + ")"; // this is temporary until we have access to parseColor + octx.beginPath(); + if (Math.abs(series.angle - Math.PI * 2) > 0.000000001) { + octx.moveTo(0, 0); // Center of the pie + } + octx.arc(0, 0, radius, series.startAngle, series.startAngle + series.angle / 2, false); + octx.arc(0, 0, radius, series.startAngle + series.angle / 2, series.startAngle + series.angle, false); + octx.closePath(); + octx.fill(); + } + } + } // end init (plugin body) + + // define pie specific options and their default values + + var options = { + series: { + pie: { + show: false, + radius: "auto", // actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value) + innerRadius: 0, /* for donut */ + startAngle: 3/2, + tilt: 1, + shadow: { + left: 5, // shadow left offset + top: 15, // shadow top offset + alpha: 0.02 // shadow alpha + }, + offset: { + top: 0, + left: "auto" + }, + stroke: { + color: "#fff", + width: 1 + }, + label: { + show: "auto", + formatter: function(label, slice) { + return "
          " + label + "
          " + Math.round(slice.percent) + "%
          "; + }, // formatter function + radius: 1, // radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value) + background: { + color: null, + opacity: 0 + }, + threshold: 0 // percentage at which to hide the label (i.e. the slice is too narrow) + }, + combine: { + threshold: -1, // percentage at which to combine little slices into one larger slice + color: null, // color to give the new slice (auto-generated if null) + label: "Other" // label to give the new slice + }, + highlight: { + //color: "#fff", // will add this functionality once parseColor is available + opacity: 0.5 + } + } + } + }; + + $.plot.plugins.push({ + init: init, + options: options, + name: "pie", + version: "1.1" + }); + +})(jQuery); + +/* Flot plugin for stacking data sets rather than overlyaing them. + +Copyright (c) 2007-2014 IOLA and Ole Laursen. +Licensed under the MIT license. + +The plugin assumes the data is sorted on x (or y if stacking horizontally). +For line charts, it is assumed that if a line has an undefined gap (from a +null point), then the line above it should have the same gap - insert zeros +instead of "null" if you want another behaviour. This also holds for the start +and end of the chart. Note that stacking a mix of positive and negative values +in most instances doesn't make sense (so it looks weird). + +Two or more series are stacked when their "stack" attribute is set to the same +key (which can be any number or string or just "true"). To specify the default +stack, you can set the stack option like this: + + series: { + stack: null/false, true, or a key (number/string) + } + +You can also specify it for a single series, like this: + + $.plot( $("#placeholder"), [{ + data: [ ... ], + stack: true + }]) + +The stacking order is determined by the order of the data series in the array +(later series end up on top of the previous). + +Internally, the plugin modifies the datapoints in each series, adding an +offset to the y value. For line series, extra data points are inserted through +interpolation. If there's a second y value, it's also adjusted (e.g for bar +charts or filled areas). + +*/ + +(function ($) { + var options = { + series: { stack: null } // or number/string + }; + + function init(plot) { + function findMatchingSeries(s, allseries) { + var res = null; + for (var i = 0; i < allseries.length; ++i) { + if (s == allseries[i]) + break; + + if (allseries[i].stack == s.stack) + res = allseries[i]; + } + + return res; + } + + function stackData(plot, s, datapoints) { + if (s.stack == null || s.stack === false) + return; + + var other = findMatchingSeries(s, plot.getData()); + if (!other) + return; + + var ps = datapoints.pointsize, + points = datapoints.points, + otherps = other.datapoints.pointsize, + otherpoints = other.datapoints.points, + newpoints = [], + px, py, intery, qx, qy, bottom, + withlines = s.lines.show, + horizontal = s.bars.horizontal, + withbottom = ps > 2 && (horizontal ? datapoints.format[2].x : datapoints.format[2].y), + withsteps = withlines && s.lines.steps, + fromgap = true, + keyOffset = horizontal ? 1 : 0, + accumulateOffset = horizontal ? 0 : 1, + i = 0, j = 0, l, m; + + while (true) { + if (i >= points.length) + break; + + l = newpoints.length; + + if (points[i] == null) { + // copy gaps + for (m = 0; m < ps; ++m) + newpoints.push(points[i + m]); + i += ps; + } + else if (j >= otherpoints.length) { + // for lines, we can't use the rest of the points + if (!withlines) { + for (m = 0; m < ps; ++m) + newpoints.push(points[i + m]); + } + i += ps; + } + else if (otherpoints[j] == null) { + // oops, got a gap + for (m = 0; m < ps; ++m) + newpoints.push(null); + fromgap = true; + j += otherps; + } + else { + // cases where we actually got two points + px = points[i + keyOffset]; + py = points[i + accumulateOffset]; + qx = otherpoints[j + keyOffset]; + qy = otherpoints[j + accumulateOffset]; + bottom = 0; + + if (px == qx) { + for (m = 0; m < ps; ++m) + newpoints.push(points[i + m]); + + newpoints[l + accumulateOffset] += qy; + bottom = qy; + + i += ps; + j += otherps; + } + else if (px > qx) { + // we got past point below, might need to + // insert interpolated extra point + if (withlines && i > 0 && points[i - ps] != null) { + intery = py + (points[i - ps + accumulateOffset] - py) * (qx - px) / (points[i - ps + keyOffset] - px); + newpoints.push(qx); + newpoints.push(intery + qy); + for (m = 2; m < ps; ++m) + newpoints.push(points[i + m]); + bottom = qy; + } + + j += otherps; + } + else { // px < qx + if (fromgap && withlines) { + // if we come from a gap, we just skip this point + i += ps; + continue; + } + + for (m = 0; m < ps; ++m) + newpoints.push(points[i + m]); + + // we might be able to interpolate a point below, + // this can give us a better y + if (withlines && j > 0 && otherpoints[j - otherps] != null) + bottom = qy + (otherpoints[j - otherps + accumulateOffset] - qy) * (px - qx) / (otherpoints[j - otherps + keyOffset] - qx); + + newpoints[l + accumulateOffset] += bottom; + + i += ps; + } + + fromgap = false; + + if (l != newpoints.length && withbottom) + newpoints[l + 2] += bottom; + } + + // maintain the line steps invariant + if (withsteps && l != newpoints.length && l > 0 + && newpoints[l] != null + && newpoints[l] != newpoints[l - ps] + && newpoints[l + 1] != newpoints[l - ps + 1]) { + for (m = 0; m < ps; ++m) + newpoints[l + ps + m] = newpoints[l + m]; + newpoints[l + 1] = newpoints[l - ps + 1]; + } + } + + datapoints.points = newpoints; + } + + plot.hooks.processDatapoints.push(stackData); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'stack', + version: '1.2' + }); +})(jQuery); + +/* Flot plugin for showing crosshairs when the mouse hovers over the plot. + +Copyright (c) 2007-2014 IOLA and Ole Laursen. +Licensed under the MIT license. + +The plugin supports these options: + + crosshair: { + mode: null or "x" or "y" or "xy" + color: color + lineWidth: number + } + +Set the mode to one of "x", "y" or "xy". The "x" mode enables a vertical +crosshair that lets you trace the values on the x axis, "y" enables a +horizontal crosshair and "xy" enables them both. "color" is the color of the +crosshair (default is "rgba(170, 0, 0, 0.80)"), "lineWidth" is the width of +the drawn lines (default is 1). + +The plugin also adds four public methods: + + - setCrosshair( pos ) + + Set the position of the crosshair. Note that this is cleared if the user + moves the mouse. "pos" is in coordinates of the plot and should be on the + form { x: xpos, y: ypos } (you can use x2/x3/... if you're using multiple + axes), which is coincidentally the same format as what you get from a + "plothover" event. If "pos" is null, the crosshair is cleared. + + - clearCrosshair() + + Clear the crosshair. + + - lockCrosshair(pos) + + Cause the crosshair to lock to the current location, no longer updating if + the user moves the mouse. Optionally supply a position (passed on to + setCrosshair()) to move it to. + + Example usage: + + var myFlot = $.plot( $("#graph"), ..., { crosshair: { mode: "x" } } }; + $("#graph").bind( "plothover", function ( evt, position, item ) { + if ( item ) { + // Lock the crosshair to the data point being hovered + myFlot.lockCrosshair({ + x: item.datapoint[ 0 ], + y: item.datapoint[ 1 ] + }); + } else { + // Return normal crosshair operation + myFlot.unlockCrosshair(); + } + }); + + - unlockCrosshair() + + Free the crosshair to move again after locking it. +*/ + +(function ($) { + var options = { + crosshair: { + mode: null, // one of null, "x", "y" or "xy", + color: "rgba(170, 0, 0, 0.80)", + lineWidth: 1 + } + }; + + function init(plot) { + // position of crosshair in pixels + var crosshair = { x: -1, y: -1, locked: false }; + + plot.setCrosshair = function setCrosshair(pos) { + if (!pos) + crosshair.x = -1; + else { + var o = plot.p2c(pos); + crosshair.x = Math.max(0, Math.min(o.left, plot.width())); + crosshair.y = Math.max(0, Math.min(o.top, plot.height())); + } + + plot.triggerRedrawOverlay(); + }; + + plot.clearCrosshair = plot.setCrosshair; // passes null for pos + + plot.lockCrosshair = function lockCrosshair(pos) { + if (pos) + plot.setCrosshair(pos); + crosshair.locked = true; + }; + + plot.unlockCrosshair = function unlockCrosshair() { + crosshair.locked = false; + }; + + function onMouseOut(e) { + if (crosshair.locked) + return; + + if (crosshair.x != -1) { + crosshair.x = -1; + plot.triggerRedrawOverlay(); + } + } + + function onMouseMove(e) { + if (crosshair.locked) + return; + + if (plot.getSelection && plot.getSelection()) { + crosshair.x = -1; // hide the crosshair while selecting + return; + } + + var offset = plot.offset(); + crosshair.x = Math.max(0, Math.min(e.pageX - offset.left, plot.width())); + crosshair.y = Math.max(0, Math.min(e.pageY - offset.top, plot.height())); + plot.triggerRedrawOverlay(); + } + + plot.hooks.bindEvents.push(function (plot, eventHolder) { + if (!plot.getOptions().crosshair.mode) + return; + + eventHolder.mouseout(onMouseOut); + eventHolder.mousemove(onMouseMove); + }); + + plot.hooks.drawOverlay.push(function (plot, ctx) { + var c = plot.getOptions().crosshair; + if (!c.mode) + return; + + var plotOffset = plot.getPlotOffset(); + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + if (crosshair.x != -1) { + var adj = plot.getOptions().crosshair.lineWidth % 2 ? 0.5 : 0; + + ctx.strokeStyle = c.color; + ctx.lineWidth = c.lineWidth; + ctx.lineJoin = "round"; + + ctx.beginPath(); + if (c.mode.indexOf("x") != -1) { + var drawX = Math.floor(crosshair.x) + adj; + ctx.moveTo(drawX, 0); + ctx.lineTo(drawX, plot.height()); + } + if (c.mode.indexOf("y") != -1) { + var drawY = Math.floor(crosshair.y) + adj; + ctx.moveTo(0, drawY); + ctx.lineTo(plot.width(), drawY); + } + ctx.stroke(); + } + ctx.restore(); + }); + + plot.hooks.shutdown.push(function (plot, eventHolder) { + eventHolder.unbind("mouseout", onMouseOut); + eventHolder.unbind("mousemove", onMouseMove); + }); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'crosshair', + version: '1.0' + }); +})(jQuery); diff --git a/public/assets/vendors/custom/fullcalendar/fullcalendar.bundle.css b/public/assets/vendors/custom/fullcalendar/fullcalendar.bundle.css new file mode 100644 index 00000000..af151ce0 --- /dev/null +++ b/public/assets/vendors/custom/fullcalendar/fullcalendar.bundle.css @@ -0,0 +1,1265 @@ +/*! + * FullCalendar v3.7.0 Stylesheet + * Docs & License: https://fullcalendar.io/ + * (c) 2017 Adam Shaw + */ +.fc { + direction: ltr; + text-align: left; } + +.fc-rtl { + text-align: right; } + +body .fc { + /* extra precedence to overcome jqui */ + font-size: 1em; } + +/* Colors +--------------------------------------------------------------------------------------------------*/ +.fc-highlight { + /* when user is selecting cells */ + background: #bce8f1; + opacity: .3; } + +.fc-bgevent { + /* default look for background events */ + background: #8fdf82; + opacity: .3; } + +.fc-nonbusiness { + /* default look for non-business-hours areas */ + /* will inherit .fc-bgevent's styles */ + background: #d7d7d7; } + +/* Buttons (styled ') + .click(function (ev) { + // don't process clicks for disabled buttons + if (!buttonEl.hasClass(theme.getClass('stateDisabled'))) { + buttonClick(ev); + // after the click action, if the button becomes the "active" tab, or disabled, + // it should never have a hover class, so remove it now. + if (buttonEl.hasClass(theme.getClass('stateActive')) || + buttonEl.hasClass(theme.getClass('stateDisabled'))) { + buttonEl.removeClass(theme.getClass('stateHover')); + } + } + }) + .mousedown(function () { + // the *down* effect (mouse pressed in). + // only on buttons that are not the "active" tab, or disabled + buttonEl + .not('.' + theme.getClass('stateActive')) + .not('.' + theme.getClass('stateDisabled')) + .addClass(theme.getClass('stateDown')); + }) + .mouseup(function () { + // undo the *down* effect + buttonEl.removeClass(theme.getClass('stateDown')); + }) + .hover(function () { + // the *hover* effect. + // only on buttons that are not the "active" tab, or disabled + buttonEl + .not('.' + theme.getClass('stateActive')) + .not('.' + theme.getClass('stateDisabled')) + .addClass(theme.getClass('stateHover')); + }, function () { + // undo the *hover* effect + buttonEl + .removeClass(theme.getClass('stateHover')) + .removeClass(theme.getClass('stateDown')); // if mouseleave happens before mouseup + }); + groupChildren = groupChildren.add(buttonEl); + } + } + }); + if (isOnlyButtons) { + groupChildren + .first().addClass(theme.getClass('cornerLeft')).end() + .last().addClass(theme.getClass('cornerRight')).end(); + } + if (groupChildren.length > 1) { + groupEl = $('
          '); + if (isOnlyButtons) { + groupEl.addClass(theme.getClass('buttonGroup')); + } + groupEl.append(groupChildren); + sectionEl.append(groupEl); + } + else { + sectionEl.append(groupChildren); // 1 or 0 children + } + }); + } + return sectionEl; + }; + Toolbar.prototype.updateTitle = function (text) { + if (this.el) { + this.el.find('h2').text(text); + } + }; + Toolbar.prototype.activateButton = function (buttonName) { + if (this.el) { + this.el.find('.fc-' + buttonName + '-button') + .addClass(this.calendar.theme.getClass('stateActive')); + } + }; + Toolbar.prototype.deactivateButton = function (buttonName) { + if (this.el) { + this.el.find('.fc-' + buttonName + '-button') + .removeClass(this.calendar.theme.getClass('stateActive')); + } + }; + Toolbar.prototype.disableButton = function (buttonName) { + if (this.el) { + this.el.find('.fc-' + buttonName + '-button') + .prop('disabled', true) + .addClass(this.calendar.theme.getClass('stateDisabled')); + } + }; + Toolbar.prototype.enableButton = function (buttonName) { + if (this.el) { + this.el.find('.fc-' + buttonName + '-button') + .prop('disabled', false) + .removeClass(this.calendar.theme.getClass('stateDisabled')); + } + }; + Toolbar.prototype.getViewsWithButtons = function () { + return this.viewsWithButtons; + }; + return Toolbar; +}()); +exports.default = Toolbar; + + +/***/ }), +/* 76 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(0); +var $ = __webpack_require__(1); +var util_1 = __webpack_require__(2); +var options_1 = __webpack_require__(19); +var locale_1 = __webpack_require__(20); +var Model_1 = __webpack_require__(32); +var OptionsManager = /** @class */ (function (_super) { + tslib_1.__extends(OptionsManager, _super); + function OptionsManager(_calendar, overrides) { + var _this = _super.call(this) || this; + _this._calendar = _calendar; + _this.overrides = $.extend({}, overrides); // make a copy + _this.dynamicOverrides = {}; + _this.compute(); + return _this; + } + OptionsManager.prototype.add = function (newOptionHash) { + var optionCnt = 0; + var optionName; + this.recordOverrides(newOptionHash); // will trigger this model's watchers + for (optionName in newOptionHash) { + optionCnt++; + } + // special-case handling of single option change. + // if only one option change, `optionName` will be its name. + if (optionCnt === 1) { + if (optionName === 'height' || optionName === 'contentHeight' || optionName === 'aspectRatio') { + this._calendar.updateViewSize(true); // isResize=true + return; + } + else if (optionName === 'defaultDate') { + return; // can't change date this way. use gotoDate instead + } + else if (optionName === 'businessHours') { + return; // this model already reacts to this + } + else if (optionName === 'timezone') { + this._calendar.view.flash('initialEvents'); + return; + } + } + // catch-all. rerender the header and footer and rebuild/rerender the current view + this._calendar.renderHeader(); + this._calendar.renderFooter(); + // even non-current views will be affected by this option change. do before rerender + // TODO: detangle + this._calendar.viewsByType = {}; + this._calendar.reinitView(); + }; + // Computes the flattened options hash for the calendar and assigns to `this.options`. + // Assumes this.overrides and this.dynamicOverrides have already been initialized. + OptionsManager.prototype.compute = function () { + var locale, localeDefaults; + var isRTL, dirDefaults; + var rawOptions; + locale = util_1.firstDefined(// explicit locale option given? + this.dynamicOverrides.locale, this.overrides.locale); + localeDefaults = locale_1.localeOptionHash[locale]; + if (!localeDefaults) { + locale = options_1.globalDefaults.locale; + localeDefaults = locale_1.localeOptionHash[locale] || {}; + } + isRTL = util_1.firstDefined(// based on options computed so far, is direction RTL? + this.dynamicOverrides.isRTL, this.overrides.isRTL, localeDefaults.isRTL, options_1.globalDefaults.isRTL); + dirDefaults = isRTL ? options_1.rtlDefaults : {}; + this.dirDefaults = dirDefaults; + this.localeDefaults = localeDefaults; + rawOptions = options_1.mergeOptions([ + options_1.globalDefaults, + dirDefaults, + localeDefaults, + this.overrides, + this.dynamicOverrides + ]); + locale_1.populateInstanceComputableOptions(rawOptions); // fill in gaps with computed options + this.reset(rawOptions); + }; + // stores the new options internally, but does not rerender anything. + OptionsManager.prototype.recordOverrides = function (newOptionHash) { + var optionName; + for (optionName in newOptionHash) { + this.dynamicOverrides[optionName] = newOptionHash[optionName]; + } + this._calendar.viewSpecManager.clearCache(); // the dynamic override invalidates the options in this cache, so just clear it + this.compute(); // this.options needs to be recomputed after the dynamic override + }; + return OptionsManager; +}(Model_1.default)); +exports.default = OptionsManager; + + +/***/ }), +/* 77 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var moment = __webpack_require__(3); +var $ = __webpack_require__(1); +var namespace_hooks_1 = __webpack_require__(7); +var util_1 = __webpack_require__(2); +var options_1 = __webpack_require__(19); +var locale_1 = __webpack_require__(20); +var ViewSpecManager = /** @class */ (function () { + function ViewSpecManager(optionsManager, _calendar) { + this.optionsManager = optionsManager; + this._calendar = _calendar; + this.clearCache(); + } + ViewSpecManager.prototype.clearCache = function () { + this.viewSpecCache = {}; + }; + // Gets information about how to create a view. Will use a cache. + ViewSpecManager.prototype.getViewSpec = function (viewType) { + var cache = this.viewSpecCache; + return cache[viewType] || (cache[viewType] = this.buildViewSpec(viewType)); + }; + // Given a duration singular unit, like "week" or "day", finds a matching view spec. + // Preference is given to views that have corresponding buttons. + ViewSpecManager.prototype.getUnitViewSpec = function (unit) { + var viewTypes; + var i; + var spec; + if ($.inArray(unit, util_1.unitsDesc) != -1) { + // put views that have buttons first. there will be duplicates, but oh well + viewTypes = this._calendar.header.getViewsWithButtons(); // TODO: include footer as well? + $.each(namespace_hooks_1.default.views, function (viewType) { + viewTypes.push(viewType); + }); + for (i = 0; i < viewTypes.length; i++) { + spec = this.getViewSpec(viewTypes[i]); + if (spec) { + if (spec.singleUnit == unit) { + return spec; + } + } + } + } + }; + // Builds an object with information on how to create a given view + ViewSpecManager.prototype.buildViewSpec = function (requestedViewType) { + var viewOverrides = this.optionsManager.overrides.views || {}; + var specChain = []; // for the view. lowest to highest priority + var defaultsChain = []; // for the view. lowest to highest priority + var overridesChain = []; // for the view. lowest to highest priority + var viewType = requestedViewType; + var spec; // for the view + var overrides; // for the view + var durationInput; + var duration; + var unit; + // iterate from the specific view definition to a more general one until we hit an actual View class + while (viewType) { + spec = namespace_hooks_1.default.views[viewType]; + overrides = viewOverrides[viewType]; + viewType = null; // clear. might repopulate for another iteration + if (typeof spec === 'function') { + spec = { 'class': spec }; + } + if (spec) { + specChain.unshift(spec); + defaultsChain.unshift(spec.defaults || {}); + durationInput = durationInput || spec.duration; + viewType = viewType || spec.type; + } + if (overrides) { + overridesChain.unshift(overrides); // view-specific option hashes have options at zero-level + durationInput = durationInput || overrides.duration; + viewType = viewType || overrides.type; + } + } + spec = util_1.mergeProps(specChain); + spec.type = requestedViewType; + if (!spec['class']) { + return false; + } + // fall back to top-level `duration` option + durationInput = durationInput || + this.optionsManager.dynamicOverrides.duration || + this.optionsManager.overrides.duration; + if (durationInput) { + duration = moment.duration(durationInput); + if (duration.valueOf()) { + unit = util_1.computeDurationGreatestUnit(duration, durationInput); + spec.duration = duration; + spec.durationUnit = unit; + // view is a single-unit duration, like "week" or "day" + // incorporate options for this. lowest priority + if (duration.as(unit) === 1) { + spec.singleUnit = unit; + overridesChain.unshift(viewOverrides[unit] || {}); + } + } + } + spec.defaults = options_1.mergeOptions(defaultsChain); + spec.overrides = options_1.mergeOptions(overridesChain); + this.buildViewSpecOptions(spec); + this.buildViewSpecButtonText(spec, requestedViewType); + return spec; + }; + // Builds and assigns a view spec's options object from its already-assigned defaults and overrides + ViewSpecManager.prototype.buildViewSpecOptions = function (spec) { + var optionsManager = this.optionsManager; + spec.options = options_1.mergeOptions([ + options_1.globalDefaults, + spec.defaults, + optionsManager.dirDefaults, + optionsManager.localeDefaults, + optionsManager.overrides, + spec.overrides, + optionsManager.dynamicOverrides // dynamically set via setter. highest precedence + ]); + locale_1.populateInstanceComputableOptions(spec.options); + }; + // Computes and assigns a view spec's buttonText-related options + ViewSpecManager.prototype.buildViewSpecButtonText = function (spec, requestedViewType) { + var optionsManager = this.optionsManager; + // given an options object with a possible `buttonText` hash, lookup the buttonText for the + // requested view, falling back to a generic unit entry like "week" or "day" + function queryButtonText(options) { + var buttonText = options.buttonText || {}; + return buttonText[requestedViewType] || + // view can decide to look up a certain key + (spec.buttonTextKey ? buttonText[spec.buttonTextKey] : null) || + // a key like "month" + (spec.singleUnit ? buttonText[spec.singleUnit] : null); + } + // highest to lowest priority + spec.buttonTextOverride = + queryButtonText(optionsManager.dynamicOverrides) || + queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence + spec.overrides.buttonText; // `buttonText` for view-specific options is a string + // highest to lowest priority. mirrors buildViewSpecOptions + spec.buttonTextDefault = + queryButtonText(optionsManager.localeDefaults) || + queryButtonText(optionsManager.dirDefaults) || + spec.defaults.buttonText || // a single string. from ViewSubclass.defaults + queryButtonText(options_1.globalDefaults) || + (spec.duration ? this._calendar.humanizeDuration(spec.duration) : null) || // like "3 days" + requestedViewType; // fall back to given view name + }; + return ViewSpecManager; +}()); +exports.default = ViewSpecManager; + + +/***/ }), +/* 78 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var $ = __webpack_require__(1); +var util_1 = __webpack_require__(2); +var EventPeriod_1 = __webpack_require__(79); +var ArrayEventSource_1 = __webpack_require__(34); +var EventSource_1 = __webpack_require__(5); +var EventSourceParser_1 = __webpack_require__(25); +var SingleEventDef_1 = __webpack_require__(11); +var EventInstanceGroup_1 = __webpack_require__(17); +var EmitterMixin_1 = __webpack_require__(8); +var ListenerMixin_1 = __webpack_require__(6); +var EventManager = /** @class */ (function () { + function EventManager(calendar) { + this.calendar = calendar; + this.stickySource = new ArrayEventSource_1.default(calendar); + this.otherSources = []; + } + EventManager.prototype.requestEvents = function (start, end, timezone, force) { + if (force || + !this.currentPeriod || + !this.currentPeriod.isWithinRange(start, end) || + timezone !== this.currentPeriod.timezone) { + this.setPeriod(// will change this.currentPeriod + new EventPeriod_1.default(start, end, timezone)); + } + return this.currentPeriod.whenReleased(); + }; + // Source Adding/Removing + // ----------------------------------------------------------------------------------------------------------------- + EventManager.prototype.addSource = function (eventSource) { + this.otherSources.push(eventSource); + if (this.currentPeriod) { + this.currentPeriod.requestSource(eventSource); // might release + } + }; + EventManager.prototype.removeSource = function (doomedSource) { + util_1.removeExact(this.otherSources, doomedSource); + if (this.currentPeriod) { + this.currentPeriod.purgeSource(doomedSource); // might release + } + }; + EventManager.prototype.removeAllSources = function () { + this.otherSources = []; + if (this.currentPeriod) { + this.currentPeriod.purgeAllSources(); // might release + } + }; + // Source Refetching + // ----------------------------------------------------------------------------------------------------------------- + EventManager.prototype.refetchSource = function (eventSource) { + var currentPeriod = this.currentPeriod; + if (currentPeriod) { + currentPeriod.freeze(); + currentPeriod.purgeSource(eventSource); + currentPeriod.requestSource(eventSource); + currentPeriod.thaw(); + } + }; + EventManager.prototype.refetchAllSources = function () { + var currentPeriod = this.currentPeriod; + if (currentPeriod) { + currentPeriod.freeze(); + currentPeriod.purgeAllSources(); + currentPeriod.requestSources(this.getSources()); + currentPeriod.thaw(); + } + }; + // Source Querying + // ----------------------------------------------------------------------------------------------------------------- + EventManager.prototype.getSources = function () { + return [this.stickySource].concat(this.otherSources); + }; + // like querySources, but accepts multple match criteria (like multiple IDs) + EventManager.prototype.multiQuerySources = function (matchInputs) { + // coerce into an array + if (!matchInputs) { + matchInputs = []; + } + else if (!$.isArray(matchInputs)) { + matchInputs = [matchInputs]; + } + var matchingSources = []; + var i; + // resolve raw inputs to real event source objects + for (i = 0; i < matchInputs.length; i++) { + matchingSources.push.apply(// append + matchingSources, this.querySources(matchInputs[i])); + } + return matchingSources; + }; + // matchInput can either by a real event source object, an ID, or the function/URL for the source. + // returns an array of matching source objects. + EventManager.prototype.querySources = function (matchInput) { + var sources = this.otherSources; + var i, source; + // given a proper event source object + for (i = 0; i < sources.length; i++) { + source = sources[i]; + if (source === matchInput) { + return [source]; + } + } + // an ID match + source = this.getSourceById(EventSource_1.default.normalizeId(matchInput)); + if (source) { + return [source]; + } + // parse as an event source + matchInput = EventSourceParser_1.default.parse(matchInput, this.calendar); + if (matchInput) { + return $.grep(sources, function (source) { + return isSourcesEquivalent(matchInput, source); + }); + } + }; + /* + ID assumed to already be normalized + */ + EventManager.prototype.getSourceById = function (id) { + return $.grep(this.otherSources, function (source) { + return source.id && source.id === id; + })[0]; + }; + // Event-Period + // ----------------------------------------------------------------------------------------------------------------- + EventManager.prototype.setPeriod = function (eventPeriod) { + if (this.currentPeriod) { + this.unbindPeriod(this.currentPeriod); + this.currentPeriod = null; + } + this.currentPeriod = eventPeriod; + this.bindPeriod(eventPeriod); + eventPeriod.requestSources(this.getSources()); + }; + EventManager.prototype.bindPeriod = function (eventPeriod) { + this.listenTo(eventPeriod, 'release', function (eventsPayload) { + this.trigger('release', eventsPayload); + }); + }; + EventManager.prototype.unbindPeriod = function (eventPeriod) { + this.stopListeningTo(eventPeriod); + }; + // Event Getting/Adding/Removing + // ----------------------------------------------------------------------------------------------------------------- + EventManager.prototype.getEventDefByUid = function (uid) { + if (this.currentPeriod) { + return this.currentPeriod.getEventDefByUid(uid); + } + }; + EventManager.prototype.addEventDef = function (eventDef, isSticky) { + if (isSticky) { + this.stickySource.addEventDef(eventDef); + } + if (this.currentPeriod) { + this.currentPeriod.addEventDef(eventDef); // might release + } + }; + EventManager.prototype.removeEventDefsById = function (eventId) { + this.getSources().forEach(function (eventSource) { + eventSource.removeEventDefsById(eventId); + }); + if (this.currentPeriod) { + this.currentPeriod.removeEventDefsById(eventId); // might release + } + }; + EventManager.prototype.removeAllEventDefs = function () { + this.getSources().forEach(function (eventSource) { + eventSource.removeAllEventDefs(); + }); + if (this.currentPeriod) { + this.currentPeriod.removeAllEventDefs(); + } + }; + // Event Mutating + // ----------------------------------------------------------------------------------------------------------------- + /* + Returns an undo function. + */ + EventManager.prototype.mutateEventsWithId = function (eventDefId, eventDefMutation) { + var currentPeriod = this.currentPeriod; + var eventDefs; + var undoFuncs = []; + if (currentPeriod) { + currentPeriod.freeze(); + eventDefs = currentPeriod.getEventDefsById(eventDefId); + eventDefs.forEach(function (eventDef) { + // add/remove esp because id might change + currentPeriod.removeEventDef(eventDef); + undoFuncs.push(eventDefMutation.mutateSingle(eventDef)); + currentPeriod.addEventDef(eventDef); + }); + currentPeriod.thaw(); + return function () { + currentPeriod.freeze(); + for (var i = 0; i < eventDefs.length; i++) { + currentPeriod.removeEventDef(eventDefs[i]); + undoFuncs[i](); + currentPeriod.addEventDef(eventDefs[i]); + } + currentPeriod.thaw(); + }; + } + return function () { }; + }; + /* + copies and then mutates + */ + EventManager.prototype.buildMutatedEventInstanceGroup = function (eventDefId, eventDefMutation) { + var eventDefs = this.getEventDefsById(eventDefId); + var i; + var defCopy; + var allInstances = []; + for (i = 0; i < eventDefs.length; i++) { + defCopy = eventDefs[i].clone(); + if (defCopy instanceof SingleEventDef_1.default) { + eventDefMutation.mutateSingle(defCopy); + allInstances.push.apply(allInstances, // append + defCopy.buildInstances()); + } + } + return new EventInstanceGroup_1.default(allInstances); + }; + // Freezing + // ----------------------------------------------------------------------------------------------------------------- + EventManager.prototype.freeze = function () { + if (this.currentPeriod) { + this.currentPeriod.freeze(); + } + }; + EventManager.prototype.thaw = function () { + if (this.currentPeriod) { + this.currentPeriod.thaw(); + } + }; + // methods that simply forward to EventPeriod + EventManager.prototype.getEventDefsById = function (eventDefId) { + return this.currentPeriod.getEventDefsById(eventDefId); + }; + EventManager.prototype.getEventInstances = function () { + return this.currentPeriod.getEventInstances(); + }; + EventManager.prototype.getEventInstancesWithId = function (eventDefId) { + return this.currentPeriod.getEventInstancesWithId(eventDefId); + }; + EventManager.prototype.getEventInstancesWithoutId = function (eventDefId) { + return this.currentPeriod.getEventInstancesWithoutId(eventDefId); + }; + return EventManager; +}()); +exports.default = EventManager; +EmitterMixin_1.default.mixInto(EventManager); +ListenerMixin_1.default.mixInto(EventManager); +function isSourcesEquivalent(source0, source1) { + return source0.getPrimitive() == source1.getPrimitive(); +} + + +/***/ }), +/* 79 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var $ = __webpack_require__(1); +var util_1 = __webpack_require__(2); +var Promise_1 = __webpack_require__(16); +var EmitterMixin_1 = __webpack_require__(8); +var UnzonedRange_1 = __webpack_require__(4); +var EventInstanceGroup_1 = __webpack_require__(17); +var EventPeriod = /** @class */ (function () { + function EventPeriod(start, end, timezone) { + this.pendingCnt = 0; + this.freezeDepth = 0; + this.stuntedReleaseCnt = 0; + this.releaseCnt = 0; + this.start = start; + this.end = end; + this.timezone = timezone; + this.unzonedRange = new UnzonedRange_1.default(start.clone().stripZone(), end.clone().stripZone()); + this.requestsByUid = {}; + this.eventDefsByUid = {}; + this.eventDefsById = {}; + this.eventInstanceGroupsById = {}; + } + EventPeriod.prototype.isWithinRange = function (start, end) { + // TODO: use a range util function? + return !start.isBefore(this.start) && !end.isAfter(this.end); + }; + // Requesting and Purging + // ----------------------------------------------------------------------------------------------------------------- + EventPeriod.prototype.requestSources = function (sources) { + this.freeze(); + for (var i = 0; i < sources.length; i++) { + this.requestSource(sources[i]); + } + this.thaw(); + }; + EventPeriod.prototype.requestSource = function (source) { + var _this = this; + var request = { source: source, status: 'pending', eventDefs: null }; + this.requestsByUid[source.uid] = request; + this.pendingCnt += 1; + source.fetch(this.start, this.end, this.timezone).then(function (eventDefs) { + if (request.status !== 'cancelled') { + request.status = 'completed'; + request.eventDefs = eventDefs; + _this.addEventDefs(eventDefs); + _this.pendingCnt--; + _this.tryRelease(); + } + }, function () { + if (request.status !== 'cancelled') { + request.status = 'failed'; + _this.pendingCnt--; + _this.tryRelease(); + } + }); + }; + EventPeriod.prototype.purgeSource = function (source) { + var request = this.requestsByUid[source.uid]; + if (request) { + delete this.requestsByUid[source.uid]; + if (request.status === 'pending') { + request.status = 'cancelled'; + this.pendingCnt--; + this.tryRelease(); + } + else if (request.status === 'completed') { + request.eventDefs.forEach(this.removeEventDef.bind(this)); + } + } + }; + EventPeriod.prototype.purgeAllSources = function () { + var requestsByUid = this.requestsByUid; + var uid, request; + var completedCnt = 0; + for (uid in requestsByUid) { + request = requestsByUid[uid]; + if (request.status === 'pending') { + request.status = 'cancelled'; + } + else if (request.status === 'completed') { + completedCnt++; + } + } + this.requestsByUid = {}; + this.pendingCnt = 0; + if (completedCnt) { + this.removeAllEventDefs(); // might release + } + }; + // Event Definitions + // ----------------------------------------------------------------------------------------------------------------- + EventPeriod.prototype.getEventDefByUid = function (eventDefUid) { + return this.eventDefsByUid[eventDefUid]; + }; + EventPeriod.prototype.getEventDefsById = function (eventDefId) { + var a = this.eventDefsById[eventDefId]; + if (a) { + return a.slice(); // clone + } + return []; + }; + EventPeriod.prototype.addEventDefs = function (eventDefs) { + for (var i = 0; i < eventDefs.length; i++) { + this.addEventDef(eventDefs[i]); + } + }; + EventPeriod.prototype.addEventDef = function (eventDef) { + var eventDefsById = this.eventDefsById; + var eventDefId = eventDef.id; + var eventDefs = eventDefsById[eventDefId] || (eventDefsById[eventDefId] = []); + var eventInstances = eventDef.buildInstances(this.unzonedRange); + var i; + eventDefs.push(eventDef); + this.eventDefsByUid[eventDef.uid] = eventDef; + for (i = 0; i < eventInstances.length; i++) { + this.addEventInstance(eventInstances[i], eventDefId); + } + }; + EventPeriod.prototype.removeEventDefsById = function (eventDefId) { + var _this = this; + this.getEventDefsById(eventDefId).forEach(function (eventDef) { + _this.removeEventDef(eventDef); + }); + }; + EventPeriod.prototype.removeAllEventDefs = function () { + var isEmpty = $.isEmptyObject(this.eventDefsByUid); + this.eventDefsByUid = {}; + this.eventDefsById = {}; + this.eventInstanceGroupsById = {}; + if (!isEmpty) { + this.tryRelease(); + } + }; + EventPeriod.prototype.removeEventDef = function (eventDef) { + var eventDefsById = this.eventDefsById; + var eventDefs = eventDefsById[eventDef.id]; + delete this.eventDefsByUid[eventDef.uid]; + if (eventDefs) { + util_1.removeExact(eventDefs, eventDef); + if (!eventDefs.length) { + delete eventDefsById[eventDef.id]; + } + this.removeEventInstancesForDef(eventDef); + } + }; + // Event Instances + // ----------------------------------------------------------------------------------------------------------------- + EventPeriod.prototype.getEventInstances = function () { + var eventInstanceGroupsById = this.eventInstanceGroupsById; + var eventInstances = []; + var id; + for (id in eventInstanceGroupsById) { + eventInstances.push.apply(eventInstances, // append + eventInstanceGroupsById[id].eventInstances); + } + return eventInstances; + }; + EventPeriod.prototype.getEventInstancesWithId = function (eventDefId) { + var eventInstanceGroup = this.eventInstanceGroupsById[eventDefId]; + if (eventInstanceGroup) { + return eventInstanceGroup.eventInstances.slice(); // clone + } + return []; + }; + EventPeriod.prototype.getEventInstancesWithoutId = function (eventDefId) { + var eventInstanceGroupsById = this.eventInstanceGroupsById; + var matchingInstances = []; + var id; + for (id in eventInstanceGroupsById) { + if (id !== eventDefId) { + matchingInstances.push.apply(matchingInstances, // append + eventInstanceGroupsById[id].eventInstances); + } + } + return matchingInstances; + }; + EventPeriod.prototype.addEventInstance = function (eventInstance, eventDefId) { + var eventInstanceGroupsById = this.eventInstanceGroupsById; + var eventInstanceGroup = eventInstanceGroupsById[eventDefId] || + (eventInstanceGroupsById[eventDefId] = new EventInstanceGroup_1.default()); + eventInstanceGroup.eventInstances.push(eventInstance); + this.tryRelease(); + }; + EventPeriod.prototype.removeEventInstancesForDef = function (eventDef) { + var eventInstanceGroupsById = this.eventInstanceGroupsById; + var eventInstanceGroup = eventInstanceGroupsById[eventDef.id]; + var removeCnt; + if (eventInstanceGroup) { + removeCnt = util_1.removeMatching(eventInstanceGroup.eventInstances, function (currentEventInstance) { + return currentEventInstance.def === eventDef; + }); + if (!eventInstanceGroup.eventInstances.length) { + delete eventInstanceGroupsById[eventDef.id]; + } + if (removeCnt) { + this.tryRelease(); + } + } + }; + // Releasing and Freezing + // ----------------------------------------------------------------------------------------------------------------- + EventPeriod.prototype.tryRelease = function () { + if (!this.pendingCnt) { + if (!this.freezeDepth) { + this.release(); + } + else { + this.stuntedReleaseCnt++; + } + } + }; + EventPeriod.prototype.release = function () { + this.releaseCnt++; + this.trigger('release', this.eventInstanceGroupsById); + }; + EventPeriod.prototype.whenReleased = function () { + var _this = this; + if (this.releaseCnt) { + return Promise_1.default.resolve(this.eventInstanceGroupsById); + } + else { + return Promise_1.default.construct(function (onResolve) { + _this.one('release', onResolve); + }); + } + }; + EventPeriod.prototype.freeze = function () { + if (!(this.freezeDepth++)) { + this.stuntedReleaseCnt = 0; + } + }; + EventPeriod.prototype.thaw = function () { + if (!(--this.freezeDepth) && this.stuntedReleaseCnt && !this.pendingCnt) { + this.release(); + } + }; + return EventPeriod; +}()); +exports.default = EventPeriod; +EmitterMixin_1.default.mixInto(EventPeriod); + + +/***/ }), +/* 80 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(0); +var Model_1 = __webpack_require__(32); +var Component = /** @class */ (function (_super) { + tslib_1.__extends(Component, _super); + function Component() { + return _super !== null && _super.apply(this, arguments) || this; + } + Component.prototype.setElement = function (el) { + this.el = el; + this.bindGlobalHandlers(); + this.renderSkeleton(); + this.set('isInDom', true); + }; + Component.prototype.removeElement = function () { + this.unset('isInDom'); + this.unrenderSkeleton(); + this.unbindGlobalHandlers(); + this.el.remove(); + // NOTE: don't null-out this.el in case the View was destroyed within an API callback. + // We don't null-out the View's other jQuery element references upon destroy, + // so we shouldn't kill this.el either. + }; + Component.prototype.bindGlobalHandlers = function () { + }; + Component.prototype.unbindGlobalHandlers = function () { + }; + /* + NOTE: Can't have a `render` method. Read the deprecation notice in View::executeDateRender + */ + // Renders the basic structure of the view before any content is rendered + Component.prototype.renderSkeleton = function () { + // subclasses should implement + }; + // Unrenders the basic structure of the view + Component.prototype.unrenderSkeleton = function () { + // subclasses should implement + }; + return Component; +}(Model_1.default)); +exports.default = Component; + + +/***/ }), +/* 81 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var $ = __webpack_require__(1); +var util_1 = __webpack_require__(2); +var ListenerMixin_1 = __webpack_require__(6); +/* Creates a clone of an element and lets it track the mouse as it moves +----------------------------------------------------------------------------------------------------------------------*/ +var MouseFollower = /** @class */ (function () { + function MouseFollower(sourceEl, options) { + this.isFollowing = false; + this.isHidden = false; + this.isAnimating = false; // doing the revert animation? + this.options = options = options || {}; + this.sourceEl = sourceEl; + this.parentEl = options.parentEl ? $(options.parentEl) : sourceEl.parent(); // default to sourceEl's parent + } + // Causes the element to start following the mouse + MouseFollower.prototype.start = function (ev) { + if (!this.isFollowing) { + this.isFollowing = true; + this.y0 = util_1.getEvY(ev); + this.x0 = util_1.getEvX(ev); + this.topDelta = 0; + this.leftDelta = 0; + if (!this.isHidden) { + this.updatePosition(); + } + if (util_1.getEvIsTouch(ev)) { + this.listenTo($(document), 'touchmove', this.handleMove); + } + else { + this.listenTo($(document), 'mousemove', this.handleMove); + } + } + }; + // Causes the element to stop following the mouse. If shouldRevert is true, will animate back to original position. + // `callback` gets invoked when the animation is complete. If no animation, it is invoked immediately. + MouseFollower.prototype.stop = function (shouldRevert, callback) { + var _this = this; + var revertDuration = this.options.revertDuration; + var complete = function () { + _this.isAnimating = false; + _this.removeElement(); + _this.top0 = _this.left0 = null; // reset state for future updatePosition calls + if (callback) { + callback(); + } + }; + if (this.isFollowing && !this.isAnimating) { + this.isFollowing = false; + this.stopListeningTo($(document)); + if (shouldRevert && revertDuration && !this.isHidden) { + this.isAnimating = true; + this.el.animate({ + top: this.top0, + left: this.left0 + }, { + duration: revertDuration, + complete: complete + }); + } + else { + complete(); + } + } + }; + // Gets the tracking element. Create it if necessary + MouseFollower.prototype.getEl = function () { + var el = this.el; + if (!el) { + el = this.el = this.sourceEl.clone() + .addClass(this.options.additionalClass || '') + .css({ + position: 'absolute', + visibility: '', + display: this.isHidden ? 'none' : '', + margin: 0, + right: 'auto', + bottom: 'auto', + width: this.sourceEl.width(), + height: this.sourceEl.height(), + opacity: this.options.opacity || '', + zIndex: this.options.zIndex + }); + // we don't want long taps or any mouse interaction causing selection/menus. + // would use preventSelection(), but that prevents selectstart, causing problems. + el.addClass('fc-unselectable'); + el.appendTo(this.parentEl); + } + return el; + }; + // Removes the tracking element if it has already been created + MouseFollower.prototype.removeElement = function () { + if (this.el) { + this.el.remove(); + this.el = null; + } + }; + // Update the CSS position of the tracking element + MouseFollower.prototype.updatePosition = function () { + var sourceOffset; + var origin; + this.getEl(); // ensure this.el + // make sure origin info was computed + if (this.top0 == null) { + sourceOffset = this.sourceEl.offset(); + origin = this.el.offsetParent().offset(); + this.top0 = sourceOffset.top - origin.top; + this.left0 = sourceOffset.left - origin.left; + } + this.el.css({ + top: this.top0 + this.topDelta, + left: this.left0 + this.leftDelta + }); + }; + // Gets called when the user moves the mouse + MouseFollower.prototype.handleMove = function (ev) { + this.topDelta = util_1.getEvY(ev) - this.y0; + this.leftDelta = util_1.getEvX(ev) - this.x0; + if (!this.isHidden) { + this.updatePosition(); + } + }; + // Temporarily makes the tracking element invisible. Can be called before following starts + MouseFollower.prototype.hide = function () { + if (!this.isHidden) { + this.isHidden = true; + if (this.el) { + this.el.hide(); + } + } + }; + // Show the tracking element after it has been temporarily hidden + MouseFollower.prototype.show = function () { + if (this.isHidden) { + this.isHidden = false; + this.updatePosition(); + this.getEl().show(); + } + }; + return MouseFollower; +}()); +exports.default = MouseFollower; +ListenerMixin_1.default.mixInto(MouseFollower); + + +/***/ }), +/* 82 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(0); +var HitDragListener_1 = __webpack_require__(18); +var Interaction_1 = __webpack_require__(13); +var DateClicking = /** @class */ (function (_super) { + tslib_1.__extends(DateClicking, _super); + /* + component must implement: + - bindDateHandlerToEl + - getSafeHitFootprint + - getHitEl + */ + function DateClicking(component) { + var _this = _super.call(this, component) || this; + _this.dragListener = _this.buildDragListener(); + return _this; + } + DateClicking.prototype.end = function () { + this.dragListener.endInteraction(); + }; + DateClicking.prototype.bindToEl = function (el) { + var component = this.component; + var dragListener = this.dragListener; + component.bindDateHandlerToEl(el, 'mousedown', function (ev) { + if (!component.shouldIgnoreMouse()) { + dragListener.startInteraction(ev); + } + }); + component.bindDateHandlerToEl(el, 'touchstart', function (ev) { + if (!component.shouldIgnoreTouch()) { + dragListener.startInteraction(ev); + } + }); + }; + // Creates a listener that tracks the user's drag across day elements, for day clicking. + DateClicking.prototype.buildDragListener = function () { + var _this = this; + var component = this.component; + var dayClickHit; // null if invalid dayClick + var dragListener = new HitDragListener_1.default(component, { + scroll: this.opt('dragScroll'), + interactionStart: function () { + dayClickHit = dragListener.origHit; + }, + hitOver: function (hit, isOrig, origHit) { + // if user dragged to another cell at any point, it can no longer be a dayClick + if (!isOrig) { + dayClickHit = null; + } + }, + hitOut: function () { + dayClickHit = null; + }, + interactionEnd: function (ev, isCancelled) { + var componentFootprint; + if (!isCancelled && dayClickHit) { + componentFootprint = component.getSafeHitFootprint(dayClickHit); + if (componentFootprint) { + _this.view.triggerDayClick(componentFootprint, component.getHitEl(dayClickHit), ev); + } + } + } + }); + // because dragListener won't be called with any time delay, "dragging" will begin immediately, + // which will kill any touchmoving/scrolling. Prevent this. + dragListener.shouldCancelTouchScroll = false; + dragListener.scrollAlwaysKills = true; + return dragListener; + }; + return DateClicking; +}(Interaction_1.default)); +exports.default = DateClicking; + + +/***/ }), +/* 83 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(0); +var util_1 = __webpack_require__(2); +var EventRenderer_1 = __webpack_require__(31); +/* +Only handles foreground segs. +Does not own rendering. Use for low-level util methods by TimeGrid. +*/ +var TimeGridEventRenderer = /** @class */ (function (_super) { + tslib_1.__extends(TimeGridEventRenderer, _super); + function TimeGridEventRenderer(timeGrid, fillRenderer) { + var _this = _super.call(this, timeGrid, fillRenderer) || this; + _this.timeGrid = timeGrid; + return _this; + } + TimeGridEventRenderer.prototype.renderFgSegs = function (segs) { + this.renderFgSegsIntoContainers(segs, this.timeGrid.fgContainerEls); + }; + // Given an array of foreground segments, render a DOM element for each, computes position, + // and attaches to the column inner-container elements. + TimeGridEventRenderer.prototype.renderFgSegsIntoContainers = function (segs, containerEls) { + var segsByCol; + var col; + segsByCol = this.timeGrid.groupSegsByCol(segs); + for (col = 0; col < this.timeGrid.colCnt; col++) { + this.updateFgSegCoords(segsByCol[col]); + } + this.timeGrid.attachSegsByCol(segsByCol, containerEls); + }; + TimeGridEventRenderer.prototype.unrenderFgSegs = function () { + if (this.fgSegs) { + this.fgSegs.forEach(function (seg) { + seg.el.remove(); + }); + } + }; + // Computes a default event time formatting string if `timeFormat` is not explicitly defined + TimeGridEventRenderer.prototype.computeEventTimeFormat = function () { + return this.opt('noMeridiemTimeFormat'); // like "6:30" (no AM/PM) + }; + // Computes a default `displayEventEnd` value if one is not expliclty defined + TimeGridEventRenderer.prototype.computeDisplayEventEnd = function () { + return true; + }; + // Renders the HTML for a single event segment's default rendering + TimeGridEventRenderer.prototype.fgSegHtml = function (seg, disableResizing) { + var view = this.view; + var calendar = view.calendar; + var componentFootprint = seg.footprint.componentFootprint; + var isAllDay = componentFootprint.isAllDay; + var eventDef = seg.footprint.eventDef; + var isDraggable = view.isEventDefDraggable(eventDef); + var isResizableFromStart = !disableResizing && seg.isStart && view.isEventDefResizableFromStart(eventDef); + var isResizableFromEnd = !disableResizing && seg.isEnd && view.isEventDefResizableFromEnd(eventDef); + var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd); + var skinCss = util_1.cssToStr(this.getSkinCss(eventDef)); + var timeText; + var fullTimeText; // more verbose time text. for the print stylesheet + var startTimeText; // just the start time text + classes.unshift('fc-time-grid-event', 'fc-v-event'); + // if the event appears to span more than one day... + if (view.isMultiDayRange(componentFootprint.unzonedRange)) { + // Don't display time text on segments that run entirely through a day. + // That would appear as midnight-midnight and would look dumb. + // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am) + if (seg.isStart || seg.isEnd) { + var zonedStart = calendar.msToMoment(seg.startMs); + var zonedEnd = calendar.msToMoment(seg.endMs); + timeText = this._getTimeText(zonedStart, zonedEnd, isAllDay); + fullTimeText = this._getTimeText(zonedStart, zonedEnd, isAllDay, 'LT'); + startTimeText = this._getTimeText(zonedStart, zonedEnd, isAllDay, null, false); // displayEnd=false + } + } + else { + // Display the normal time text for the *event's* times + timeText = this.getTimeText(seg.footprint); + fullTimeText = this.getTimeText(seg.footprint, 'LT'); + startTimeText = this.getTimeText(seg.footprint, null, false); // displayEnd=false + } + return '' + + '
          ' + + (timeText ? + '
          ' + + '' + util_1.htmlEscape(timeText) + '' + + '
          ' : + '') + + (eventDef.title ? + '
          ' + + util_1.htmlEscape(eventDef.title) + + '
          ' : + '') + + '
          ' + + '
          ' + + /* TODO: write CSS for this + (isResizableFromStart ? + '
          ' : + '' + ) + + */ + (isResizableFromEnd ? + '
          ' : + '') + + ''; + }; + // Given segments that are assumed to all live in the *same column*, + // compute their verical/horizontal coordinates and assign to their elements. + TimeGridEventRenderer.prototype.updateFgSegCoords = function (segs) { + this.timeGrid.computeSegVerticals(segs); // horizontals relies on this + this.computeFgSegHorizontals(segs); // compute horizontal coordinates, z-index's, and reorder the array + this.timeGrid.assignSegVerticals(segs); + this.assignFgSegHorizontals(segs); + }; + // Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each. + // NOTE: Also reorders the given array by date! + TimeGridEventRenderer.prototype.computeFgSegHorizontals = function (segs) { + var levels; + var level0; + var i; + this.sortEventSegs(segs); // order by certain criteria + levels = buildSlotSegLevels(segs); + computeForwardSlotSegs(levels); + if ((level0 = levels[0])) { + for (i = 0; i < level0.length; i++) { + computeSlotSegPressures(level0[i]); + } + for (i = 0; i < level0.length; i++) { + this.computeFgSegForwardBack(level0[i], 0, 0); + } + } + }; + // Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range + // from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to "left" and + // seg.forwardCoord maps to "right" (via percentage). Vice-versa if the calendar is right-to-left. + // + // The segment might be part of a "series", which means consecutive segments with the same pressure + // who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of + // segments behind this one in the current series, and `seriesBackwardCoord` is the starting + // coordinate of the first segment in the series. + TimeGridEventRenderer.prototype.computeFgSegForwardBack = function (seg, seriesBackwardPressure, seriesBackwardCoord) { + var forwardSegs = seg.forwardSegs; + var i; + if (seg.forwardCoord === undefined) { + if (!forwardSegs.length) { + // if there are no forward segments, this segment should butt up against the edge + seg.forwardCoord = 1; + } + else { + // sort highest pressure first + this.sortForwardSegs(forwardSegs); + // this segment's forwardCoord will be calculated from the backwardCoord of the + // highest-pressure forward segment. + this.computeFgSegForwardBack(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord); + seg.forwardCoord = forwardSegs[0].backwardCoord; + } + // calculate the backwardCoord from the forwardCoord. consider the series + seg.backwardCoord = seg.forwardCoord - + (seg.forwardCoord - seriesBackwardCoord) / // available width for series + (seriesBackwardPressure + 1); // # of segments in the series + // use this segment's coordinates to computed the coordinates of the less-pressurized + // forward segments + for (i = 0; i < forwardSegs.length; i++) { + this.computeFgSegForwardBack(forwardSegs[i], 0, seg.forwardCoord); + } + } + }; + TimeGridEventRenderer.prototype.sortForwardSegs = function (forwardSegs) { + forwardSegs.sort(util_1.proxy(this, 'compareForwardSegs')); + }; + // A cmp function for determining which forward segment to rely on more when computing coordinates. + TimeGridEventRenderer.prototype.compareForwardSegs = function (seg1, seg2) { + // put higher-pressure first + return seg2.forwardPressure - seg1.forwardPressure || + // put segments that are closer to initial edge first (and favor ones with no coords yet) + (seg1.backwardCoord || 0) - (seg2.backwardCoord || 0) || + // do normal sorting... + this.compareEventSegs(seg1, seg2); + }; + // Given foreground event segments that have already had their position coordinates computed, + // assigns position-related CSS values to their elements. + TimeGridEventRenderer.prototype.assignFgSegHorizontals = function (segs) { + var i, seg; + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + seg.el.css(this.generateFgSegHorizontalCss(seg)); + // if the height is short, add a className for alternate styling + if (seg.bottom - seg.top < 30) { + seg.el.addClass('fc-short'); + } + } + }; + // Generates an object with CSS properties/values that should be applied to an event segment element. + // Contains important positioning-related properties that should be applied to any event element, customized or not. + TimeGridEventRenderer.prototype.generateFgSegHorizontalCss = function (seg) { + var shouldOverlap = this.opt('slotEventOverlap'); + var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point + var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point + var props = this.timeGrid.generateSegVerticalCss(seg); // get top/bottom first + var isRTL = this.timeGrid.isRTL; + var left; // amount of space from left edge, a fraction of the total width + var right; // amount of space from right edge, a fraction of the total width + if (shouldOverlap) { + // double the width, but don't go beyond the maximum forward coordinate (1.0) + forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2); + } + if (isRTL) { + left = 1 - forwardCoord; + right = backwardCoord; + } + else { + left = backwardCoord; + right = 1 - forwardCoord; + } + props.zIndex = seg.level + 1; // convert from 0-base to 1-based + props.left = left * 100 + '%'; + props.right = right * 100 + '%'; + if (shouldOverlap && seg.forwardPressure) { + // add padding to the edge so that forward stacked events don't cover the resizer's icon + props[isRTL ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width + } + return props; + }; + return TimeGridEventRenderer; +}(EventRenderer_1.default)); +exports.default = TimeGridEventRenderer; +// Builds an array of segments "levels". The first level will be the leftmost tier of segments if the calendar is +// left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date. +function buildSlotSegLevels(segs) { + var levels = []; + var i, seg; + var j; + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + // go through all the levels and stop on the first level where there are no collisions + for (j = 0; j < levels.length; j++) { + if (!computeSlotSegCollisions(seg, levels[j]).length) { + break; + } + } + seg.level = j; + (levels[j] || (levels[j] = [])).push(seg); + } + return levels; +} +// For every segment, figure out the other segments that are in subsequent +// levels that also occupy the same vertical space. Accumulate in seg.forwardSegs +function computeForwardSlotSegs(levels) { + var i, level; + var j, seg; + var k; + for (i = 0; i < levels.length; i++) { + level = levels[i]; + for (j = 0; j < level.length; j++) { + seg = level[j]; + seg.forwardSegs = []; + for (k = i + 1; k < levels.length; k++) { + computeSlotSegCollisions(seg, levels[k], seg.forwardSegs); + } + } + } +} +// Figure out which path forward (via seg.forwardSegs) results in the longest path until +// the furthest edge is reached. The number of segments in this path will be seg.forwardPressure +function computeSlotSegPressures(seg) { + var forwardSegs = seg.forwardSegs; + var forwardPressure = 0; + var i, forwardSeg; + if (seg.forwardPressure === undefined) { + for (i = 0; i < forwardSegs.length; i++) { + forwardSeg = forwardSegs[i]; + // figure out the child's maximum forward path + computeSlotSegPressures(forwardSeg); + // either use the existing maximum, or use the child's forward pressure + // plus one (for the forwardSeg itself) + forwardPressure = Math.max(forwardPressure, 1 + forwardSeg.forwardPressure); + } + seg.forwardPressure = forwardPressure; + } +} +// Find all the segments in `otherSegs` that vertically collide with `seg`. +// Append into an optionally-supplied `results` array and return. +function computeSlotSegCollisions(seg, otherSegs, results) { + if (results === void 0) { results = []; } + for (var i = 0; i < otherSegs.length; i++) { + if (isSlotSegCollision(seg, otherSegs[i])) { + results.push(otherSegs[i]); + } + } + return results; +} +// Do these segments occupy the same vertical space? +function isSlotSegCollision(seg1, seg2) { + return seg1.bottom > seg2.top && seg1.top < seg2.bottom; +} + + +/***/ }), +/* 84 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(0); +var $ = __webpack_require__(1); +var HelperRenderer_1 = __webpack_require__(43); +var TimeGridHelperRenderer = /** @class */ (function (_super) { + tslib_1.__extends(TimeGridHelperRenderer, _super); + function TimeGridHelperRenderer() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimeGridHelperRenderer.prototype.renderSegs = function (segs, sourceSeg) { + var helperNodes = []; + var i, seg; + var sourceEl; + // TODO: not good to call eventRenderer this way + this.eventRenderer.renderFgSegsIntoContainers(segs, this.component.helperContainerEls); + // Try to make the segment that is in the same row as sourceSeg look the same + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + if (sourceSeg && sourceSeg.col === seg.col) { + sourceEl = sourceSeg.el; + seg.el.css({ + left: sourceEl.css('left'), + right: sourceEl.css('right'), + 'margin-left': sourceEl.css('margin-left'), + 'margin-right': sourceEl.css('margin-right') + }); + } + helperNodes.push(seg.el[0]); + } + return $(helperNodes); // must return the elements rendered + }; + return TimeGridHelperRenderer; +}(HelperRenderer_1.default)); +exports.default = TimeGridHelperRenderer; + + +/***/ }), +/* 85 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(0); +var FillRenderer_1 = __webpack_require__(42); +var TimeGridFillRenderer = /** @class */ (function (_super) { + tslib_1.__extends(TimeGridFillRenderer, _super); + function TimeGridFillRenderer() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimeGridFillRenderer.prototype.attachSegEls = function (type, segs) { + var timeGrid = this.component; + var containerEls; + // TODO: more efficient lookup + if (type === 'bgEvent') { + containerEls = timeGrid.bgContainerEls; + } + else if (type === 'businessHours') { + containerEls = timeGrid.businessContainerEls; + } + else if (type === 'highlight') { + containerEls = timeGrid.highlightContainerEls; + } + timeGrid.updateSegVerticals(segs); + timeGrid.attachSegsByCol(timeGrid.groupSegsByCol(segs), containerEls); + return segs.map(function (seg) { + return seg.el[0]; + }); + }; + return TimeGridFillRenderer; +}(FillRenderer_1.default)); +exports.default = TimeGridFillRenderer; + + +/***/ }), +/* 86 */ +/***/ (function(module, exports, __webpack_require__) { + +/* A rectangular panel that is absolutely positioned over other content +------------------------------------------------------------------------------------------------------------------------ +Options: + - className (string) + - content (HTML string or jQuery element set) + - parentEl + - top + - left + - right (the x coord of where the right edge should be. not a "CSS" right) + - autoHide (boolean) + - show (callback) + - hide (callback) +*/ +Object.defineProperty(exports, "__esModule", { value: true }); +var $ = __webpack_require__(1); +var util_1 = __webpack_require__(2); +var ListenerMixin_1 = __webpack_require__(6); +var Popover = /** @class */ (function () { + function Popover(options) { + this.isHidden = true; + this.margin = 10; // the space required between the popover and the edges of the scroll container + this.options = options || {}; + } + // Shows the popover on the specified position. Renders it if not already + Popover.prototype.show = function () { + if (this.isHidden) { + if (!this.el) { + this.render(); + } + this.el.show(); + this.position(); + this.isHidden = false; + this.trigger('show'); + } + }; + // Hides the popover, through CSS, but does not remove it from the DOM + Popover.prototype.hide = function () { + if (!this.isHidden) { + this.el.hide(); + this.isHidden = true; + this.trigger('hide'); + } + }; + // Creates `this.el` and renders content inside of it + Popover.prototype.render = function () { + var _this = this; + var options = this.options; + this.el = $('
          ') + .addClass(options.className || '') + .css({ + // position initially to the top left to avoid creating scrollbars + top: 0, + left: 0 + }) + .append(options.content) + .appendTo(options.parentEl); + // when a click happens on anything inside with a 'fc-close' className, hide the popover + this.el.on('click', '.fc-close', function () { + _this.hide(); + }); + if (options.autoHide) { + this.listenTo($(document), 'mousedown', this.documentMousedown); + } + }; + // Triggered when the user clicks *anywhere* in the document, for the autoHide feature + Popover.prototype.documentMousedown = function (ev) { + // only hide the popover if the click happened outside the popover + if (this.el && !$(ev.target).closest(this.el).length) { + this.hide(); + } + }; + // Hides and unregisters any handlers + Popover.prototype.removeElement = function () { + this.hide(); + if (this.el) { + this.el.remove(); + this.el = null; + } + this.stopListeningTo($(document), 'mousedown'); + }; + // Positions the popover optimally, using the top/left/right options + Popover.prototype.position = function () { + var options = this.options; + var origin = this.el.offsetParent().offset(); + var width = this.el.outerWidth(); + var height = this.el.outerHeight(); + var windowEl = $(window); + var viewportEl = util_1.getScrollParent(this.el); + var viewportTop; + var viewportLeft; + var viewportOffset; + var top; // the "position" (not "offset") values for the popover + var left; // + // compute top and left + top = options.top || 0; + if (options.left !== undefined) { + left = options.left; + } + else if (options.right !== undefined) { + left = options.right - width; // derive the left value from the right value + } + else { + left = 0; + } + if (viewportEl.is(window) || viewportEl.is(document)) { + viewportEl = windowEl; + viewportTop = 0; // the window is always at the top left + viewportLeft = 0; // (and .offset() won't work if called here) + } + else { + viewportOffset = viewportEl.offset(); + viewportTop = viewportOffset.top; + viewportLeft = viewportOffset.left; + } + // if the window is scrolled, it causes the visible area to be further down + viewportTop += windowEl.scrollTop(); + viewportLeft += windowEl.scrollLeft(); + // constrain to the view port. if constrained by two edges, give precedence to top/left + if (options.viewportConstrain !== false) { + top = Math.min(top, viewportTop + viewportEl.outerHeight() - height - this.margin); + top = Math.max(top, viewportTop + this.margin); + left = Math.min(left, viewportLeft + viewportEl.outerWidth() - width - this.margin); + left = Math.max(left, viewportLeft + this.margin); + } + this.el.css({ + top: top - origin.top, + left: left - origin.left + }); + }; + // Triggers a callback. Calls a function in the option hash of the same name. + // Arguments beyond the first `name` are forwarded on. + // TODO: better code reuse for this. Repeat code + Popover.prototype.trigger = function (name) { + if (this.options[name]) { + this.options[name].apply(this, Array.prototype.slice.call(arguments, 1)); + } + }; + return Popover; +}()); +exports.default = Popover; +ListenerMixin_1.default.mixInto(Popover); + + +/***/ }), +/* 87 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(0); +var $ = __webpack_require__(1); +var util_1 = __webpack_require__(2); +var EventRenderer_1 = __webpack_require__(31); +/* Event-rendering methods for the DayGrid class +----------------------------------------------------------------------------------------------------------------------*/ +var DayGridEventRenderer = /** @class */ (function (_super) { + tslib_1.__extends(DayGridEventRenderer, _super); + function DayGridEventRenderer(dayGrid, fillRenderer) { + var _this = _super.call(this, dayGrid, fillRenderer) || this; + _this.dayGrid = dayGrid; + return _this; + } + DayGridEventRenderer.prototype.renderBgRanges = function (eventRanges) { + // don't render timed background events + eventRanges = $.grep(eventRanges, function (eventRange) { + return eventRange.eventDef.isAllDay(); + }); + _super.prototype.renderBgRanges.call(this, eventRanges); + }; + // Renders the given foreground event segments onto the grid + DayGridEventRenderer.prototype.renderFgSegs = function (segs) { + var rowStructs = this.rowStructs = this.renderSegRows(segs); + // append to each row's content skeleton + this.dayGrid.rowEls.each(function (i, rowNode) { + $(rowNode).find('.fc-content-skeleton > table').append(rowStructs[i].tbodyEl); + }); + }; + // Unrenders all currently rendered foreground event segments + DayGridEventRenderer.prototype.unrenderFgSegs = function () { + var rowStructs = this.rowStructs || []; + var rowStruct; + while ((rowStruct = rowStructs.pop())) { + rowStruct.tbodyEl.remove(); + } + this.rowStructs = null; + }; + // Uses the given events array to generate elements that should be appended to each row's content skeleton. + // Returns an array of rowStruct objects (see the bottom of `renderSegRow`). + // PRECONDITION: each segment shoud already have a rendered and assigned `.el` + DayGridEventRenderer.prototype.renderSegRows = function (segs) { + var rowStructs = []; + var segRows; + var row; + segRows = this.groupSegRows(segs); // group into nested arrays + // iterate each row of segment groupings + for (row = 0; row < segRows.length; row++) { + rowStructs.push(this.renderSegRow(row, segRows[row])); + } + return rowStructs; + }; + // Given a row # and an array of segments all in the same row, render a element, a skeleton that contains + // the segments. Returns object with a bunch of internal data about how the render was calculated. + // NOTE: modifies rowSegs + DayGridEventRenderer.prototype.renderSegRow = function (row, rowSegs) { + var colCnt = this.dayGrid.colCnt; + var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels + var levelCnt = Math.max(1, segLevels.length); // ensure at least one level + var tbody = $(''); + var segMatrix = []; // lookup for which segments are rendered into which level+col cells + var cellMatrix = []; // lookup for all elements of the level+col matrix + var loneCellMatrix = []; // lookup for elements that only take up a single column + var i, levelSegs; + var col; + var tr; + var j, seg; + var td; + // populates empty cells from the current column (`col`) to `endCol` + function emptyCellsUntil(endCol) { + while (col < endCol) { + // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell + td = (loneCellMatrix[i - 1] || [])[col]; + if (td) { + td.attr('rowspan', parseInt(td.attr('rowspan') || 1, 10) + 1); + } + else { + td = $(''); + tr.append(td); + } + cellMatrix[i][col] = td; + loneCellMatrix[i][col] = td; + col++; + } + } + for (i = 0; i < levelCnt; i++) { + levelSegs = segLevels[i]; + col = 0; + tr = $(''); + segMatrix.push([]); + cellMatrix.push([]); + loneCellMatrix.push([]); + // levelCnt might be 1 even though there are no actual levels. protect against this. + // this single empty row is useful for styling. + if (levelSegs) { + for (j = 0; j < levelSegs.length; j++) { + seg = levelSegs[j]; + emptyCellsUntil(seg.leftCol); + // create a container that occupies or more columns. append the event element. + td = $('').append(seg.el); + if (seg.leftCol != seg.rightCol) { + td.attr('colspan', seg.rightCol - seg.leftCol + 1); + } + else { + loneCellMatrix[i][col] = td; + } + while (col <= seg.rightCol) { + cellMatrix[i][col] = td; + segMatrix[i][col] = seg; + col++; + } + tr.append(td); + } + } + emptyCellsUntil(colCnt); // finish off the row + this.dayGrid.bookendCells(tr); + tbody.append(tr); + } + return { + row: row, + tbodyEl: tbody, + cellMatrix: cellMatrix, + segMatrix: segMatrix, + segLevels: segLevels, + segs: rowSegs + }; + }; + // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels. + // NOTE: modifies segs + DayGridEventRenderer.prototype.buildSegLevels = function (segs) { + var levels = []; + var i, seg; + var j; + // Give preference to elements with certain criteria, so they have + // a chance to be closer to the top. + this.sortEventSegs(segs); + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + // loop through levels, starting with the topmost, until the segment doesn't collide with other segments + for (j = 0; j < levels.length; j++) { + if (!isDaySegCollision(seg, levels[j])) { + break; + } + } + // `j` now holds the desired subrow index + seg.level = j; + // create new level array if needed and append segment + (levels[j] || (levels[j] = [])).push(seg); + } + // order segments left-to-right. very important if calendar is RTL + for (j = 0; j < levels.length; j++) { + levels[j].sort(compareDaySegCols); + } + return levels; + }; + // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row + DayGridEventRenderer.prototype.groupSegRows = function (segs) { + var segRows = []; + var i; + for (i = 0; i < this.dayGrid.rowCnt; i++) { + segRows.push([]); + } + for (i = 0; i < segs.length; i++) { + segRows[segs[i].row].push(segs[i]); + } + return segRows; + }; + // Computes a default event time formatting string if `timeFormat` is not explicitly defined + DayGridEventRenderer.prototype.computeEventTimeFormat = function () { + return this.opt('extraSmallTimeFormat'); // like "6p" or "6:30p" + }; + // Computes a default `displayEventEnd` value if one is not expliclty defined + DayGridEventRenderer.prototype.computeDisplayEventEnd = function () { + return this.dayGrid.colCnt === 1; // we'll likely have space if there's only one day + }; + // Builds the HTML to be used for the default element for an individual segment + DayGridEventRenderer.prototype.fgSegHtml = function (seg, disableResizing) { + var view = this.view; + var eventDef = seg.footprint.eventDef; + var isAllDay = seg.footprint.componentFootprint.isAllDay; + var isDraggable = view.isEventDefDraggable(eventDef); + var isResizableFromStart = !disableResizing && isAllDay && + seg.isStart && view.isEventDefResizableFromStart(eventDef); + var isResizableFromEnd = !disableResizing && isAllDay && + seg.isEnd && view.isEventDefResizableFromEnd(eventDef); + var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd); + var skinCss = util_1.cssToStr(this.getSkinCss(eventDef)); + var timeHtml = ''; + var timeText; + var titleHtml; + classes.unshift('fc-day-grid-event', 'fc-h-event'); + // Only display a timed events time if it is the starting segment + if (seg.isStart) { + timeText = this.getTimeText(seg.footprint); + if (timeText) { + timeHtml = '' + util_1.htmlEscape(timeText) + ''; + } + } + titleHtml = + '' + + (util_1.htmlEscape(eventDef.title || '') || ' ') + // we always want one line of height + ''; + return '' + + '
          ' + + (this.dayGrid.isRTL ? + titleHtml + ' ' + timeHtml : // put a natural space in between + timeHtml + ' ' + titleHtml // + ) + + '
          ' + + (isResizableFromStart ? + '
          ' : + '') + + (isResizableFromEnd ? + '
          ' : + '') + + ''; + }; + return DayGridEventRenderer; +}(EventRenderer_1.default)); +exports.default = DayGridEventRenderer; +// Computes whether two segments' columns collide. They are assumed to be in the same row. +function isDaySegCollision(seg, otherSegs) { + var i, otherSeg; + for (i = 0; i < otherSegs.length; i++) { + otherSeg = otherSegs[i]; + if (otherSeg.leftCol <= seg.rightCol && + otherSeg.rightCol >= seg.leftCol) { + return true; + } + } + return false; +} +// A cmp function for determining the leftmost event +function compareDaySegCols(a, b) { + return a.leftCol - b.leftCol; +} + + +/***/ }), +/* 88 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(0); +var $ = __webpack_require__(1); +var HelperRenderer_1 = __webpack_require__(43); +var DayGridHelperRenderer = /** @class */ (function (_super) { + tslib_1.__extends(DayGridHelperRenderer, _super); + function DayGridHelperRenderer() { + return _super !== null && _super.apply(this, arguments) || this; + } + // Renders a mock "helper" event. `sourceSeg` is the associated internal segment object. It can be null. + DayGridHelperRenderer.prototype.renderSegs = function (segs, sourceSeg) { + var helperNodes = []; + var rowStructs; + // TODO: not good to call eventRenderer this way + rowStructs = this.eventRenderer.renderSegRows(segs); + // inject each new event skeleton into each associated row + this.component.rowEls.each(function (row, rowNode) { + var rowEl = $(rowNode); // the .fc-row + var skeletonEl = $('
          '); // will be absolutely positioned + var skeletonTopEl; + var skeletonTop; + // If there is an original segment, match the top position. Otherwise, put it at the row's top level + if (sourceSeg && sourceSeg.row === row) { + skeletonTop = sourceSeg.el.position().top; + } + else { + skeletonTopEl = rowEl.find('.fc-content-skeleton tbody'); + if (!skeletonTopEl.length) { + skeletonTopEl = rowEl.find('.fc-content-skeleton table'); + } + skeletonTop = skeletonTopEl.position().top; + } + skeletonEl.css('top', skeletonTop) + .find('table') + .append(rowStructs[row].tbodyEl); + rowEl.append(skeletonEl); + helperNodes.push(skeletonEl[0]); + }); + return $(helperNodes); // must return the elements rendered + }; + return DayGridHelperRenderer; +}(HelperRenderer_1.default)); +exports.default = DayGridHelperRenderer; + + +/***/ }), +/* 89 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(0); +var $ = __webpack_require__(1); +var FillRenderer_1 = __webpack_require__(42); +var DayGridFillRenderer = /** @class */ (function (_super) { + tslib_1.__extends(DayGridFillRenderer, _super); + function DayGridFillRenderer() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.fillSegTag = 'td'; // override the default tag name + return _this; + } + DayGridFillRenderer.prototype.attachSegEls = function (type, segs) { + var nodes = []; + var i, seg; + var skeletonEl; + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + skeletonEl = this.renderFillRow(type, seg); + this.component.rowEls.eq(seg.row).append(skeletonEl); + nodes.push(skeletonEl[0]); + } + return nodes; + }; + // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered. + DayGridFillRenderer.prototype.renderFillRow = function (type, seg) { + var colCnt = this.component.colCnt; + var startCol = seg.leftCol; + var endCol = seg.rightCol + 1; + var className; + var skeletonEl; + var trEl; + if (type === 'businessHours') { + className = 'bgevent'; + } + else { + className = type.toLowerCase(); + } + skeletonEl = $('
          ' + + '
          ' + + '
          '); + trEl = skeletonEl.find('tr'); + if (startCol > 0) { + trEl.append(''); + } + trEl.append(seg.el.attr('colspan', endCol - startCol)); + if (endCol < colCnt) { + trEl.append(''); + } + this.component.bookendCells(trEl); + return skeletonEl; + }; + return DayGridFillRenderer; +}(FillRenderer_1.default)); +exports.default = DayGridFillRenderer; + + +/***/ }), +/* 90 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(0); +var util_1 = __webpack_require__(2); +var EventRenderer_1 = __webpack_require__(31); +var ListEventRenderer = /** @class */ (function (_super) { + tslib_1.__extends(ListEventRenderer, _super); + function ListEventRenderer() { + return _super !== null && _super.apply(this, arguments) || this; + } + ListEventRenderer.prototype.renderFgSegs = function (segs) { + if (!segs.length) { + this.component.renderEmptyMessage(); + } + else { + this.component.renderSegList(segs); + } + }; + // generates the HTML for a single event row + ListEventRenderer.prototype.fgSegHtml = function (seg) { + var view = this.view; + var calendar = view.calendar; + var theme = calendar.theme; + var eventFootprint = seg.footprint; + var eventDef = eventFootprint.eventDef; + var componentFootprint = eventFootprint.componentFootprint; + var url = eventDef.url; + var classes = ['fc-list-item'].concat(this.getClasses(eventDef)); + var bgColor = this.getBgColor(eventDef); + var timeHtml; + if (componentFootprint.isAllDay) { + timeHtml = view.getAllDayHtml(); + } + else if (view.isMultiDayRange(componentFootprint.unzonedRange)) { + if (seg.isStart || seg.isEnd) { + timeHtml = util_1.htmlEscape(this._getTimeText(calendar.msToMoment(seg.startMs), calendar.msToMoment(seg.endMs), componentFootprint.isAllDay)); + } + else { + timeHtml = view.getAllDayHtml(); + } + } + else { + // Display the normal time text for the *event's* times + timeHtml = util_1.htmlEscape(this.getTimeText(eventFootprint)); + } + if (url) { + classes.push('fc-has-url'); + } + return '' + + (this.displayEventTime ? + '' + + (timeHtml || '') + + '' : + '') + + '' + + '' + + '' + + '' + + '' + + util_1.htmlEscape(eventDef.title || '') + + '' + + '' + + ''; + }; + // like "4:00am" + ListEventRenderer.prototype.computeEventTimeFormat = function () { + return this.opt('mediumTimeFormat'); + }; + return ListEventRenderer; +}(EventRenderer_1.default)); +exports.default = ListEventRenderer; + + +/***/ }), +/* 91 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(0); +var $ = __webpack_require__(1); +var EventPointing_1 = __webpack_require__(44); +var ListEventPointing = /** @class */ (function (_super) { + tslib_1.__extends(ListEventPointing, _super); + function ListEventPointing() { + return _super !== null && _super.apply(this, arguments) || this; + } + // for events with a url, the whole should be clickable, + // but it's impossible to wrap with an tag. simulate this. + ListEventPointing.prototype.handleClick = function (seg, ev) { + var url; + _super.prototype.handleClick.call(this, seg, ev); // might prevent the default action + // not clicking on or within an with an href + if (!$(ev.target).closest('a[href]').length) { + url = seg.footprint.eventDef.url; + if (url && !ev.isDefaultPrevented()) { + window.location.href = url; // simulate link click + } + } + }; + return ListEventPointing; +}(EventPointing_1.default)); +exports.default = ListEventPointing; + + +/***/ }), +/* 92 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var EventSourceParser_1 = __webpack_require__(25); +var ArrayEventSource_1 = __webpack_require__(34); +var FuncEventSource_1 = __webpack_require__(57); +var JsonFeedEventSource_1 = __webpack_require__(58); +EventSourceParser_1.default.registerClass(ArrayEventSource_1.default); +EventSourceParser_1.default.registerClass(FuncEventSource_1.default); +EventSourceParser_1.default.registerClass(JsonFeedEventSource_1.default); + + +/***/ }), +/* 93 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var ThemeRegistry_1 = __webpack_require__(36); +var StandardTheme_1 = __webpack_require__(55); +var JqueryUiTheme_1 = __webpack_require__(56); +var BootstrapTheme_1 = __webpack_require__(94); +ThemeRegistry_1.default.register('standard', StandardTheme_1.default); +ThemeRegistry_1.default.register('jquery-ui', JqueryUiTheme_1.default); +ThemeRegistry_1.default.register('bootstrap3', BootstrapTheme_1.default); + + +/***/ }), +/* 94 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = __webpack_require__(0); +var Theme_1 = __webpack_require__(27); +var BootstrapTheme = /** @class */ (function (_super) { + tslib_1.__extends(BootstrapTheme, _super); + function BootstrapTheme() { + return _super !== null && _super.apply(this, arguments) || this; + } + return BootstrapTheme; +}(Theme_1.default)); +exports.default = BootstrapTheme; +BootstrapTheme.prototype.classes = { + widget: 'fc-bootstrap3', + tableGrid: 'table-bordered', + tableList: 'table table-striped', + buttonGroup: 'btn-group', + button: 'btn btn-default', + stateActive: 'active', + stateDisabled: 'disabled', + today: 'alert alert-info', + popover: 'panel panel-default', + popoverHeader: 'panel-heading', + popoverContent: 'panel-body', + // day grid + headerRow: 'panel-default', + dayRow: 'panel-default', + // list view + listView: 'panel panel-default' +}; +BootstrapTheme.prototype.baseIconClass = 'glyphicon'; +BootstrapTheme.prototype.iconClasses = { + close: 'glyphicon-remove', + prev: 'glyphicon-chevron-left', + next: 'glyphicon-chevron-right', + prevYear: 'glyphicon-backward', + nextYear: 'glyphicon-forward' +}; +BootstrapTheme.prototype.iconOverrideOption = 'bootstrapGlyphicons'; +BootstrapTheme.prototype.iconOverrideCustomButtonOption = 'bootstrapGlyphicon'; +BootstrapTheme.prototype.iconOverridePrefix = 'glyphicon-'; + + +/***/ }), +/* 95 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var namespace_hooks_1 = __webpack_require__(7); +var BasicView_1 = __webpack_require__(47); +var MonthView_1 = __webpack_require__(70); +var views = namespace_hooks_1.default.views; +views.basic = { + 'class': BasicView_1.default +}; +views.basicDay = { + type: 'basic', + duration: { days: 1 } +}; +views.basicWeek = { + type: 'basic', + duration: { weeks: 1 } +}; +views.month = { + 'class': MonthView_1.default, + duration: { months: 1 }, + defaults: { + fixedWeekCount: true + } +}; + + +/***/ }), +/* 96 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var namespace_hooks_1 = __webpack_require__(7); +var AgendaView_1 = __webpack_require__(67); +var views = namespace_hooks_1.default.views; +views.agenda = { + 'class': AgendaView_1.default, + defaults: { + allDaySlot: true, + slotDuration: '00:30:00', + slotEventOverlap: true // a bad name. confused with overlap/constraint system + } +}; +views.agendaDay = { + type: 'agenda', + duration: { days: 1 } +}; +views.agendaWeek = { + type: 'agenda', + duration: { weeks: 1 } +}; + + +/***/ }), +/* 97 */ +/***/ (function(module, exports, __webpack_require__) { + +Object.defineProperty(exports, "__esModule", { value: true }); +var namespace_hooks_1 = __webpack_require__(7); +var ListView_1 = __webpack_require__(71); +var views = namespace_hooks_1.default.views; +views.list = { + 'class': ListView_1.default, + buttonTextKey: 'list', + defaults: { + buttonText: 'list', + listDayFormat: 'LL', + noEventsMessage: 'No events to display' + } +}; +views.listDay = { + type: 'list', + duration: { days: 1 }, + defaults: { + listDayFormat: 'dddd' // day-of-week is all we need. full date is probably in header + } +}; +views.listWeek = { + type: 'list', + duration: { weeks: 1 }, + defaults: { + listDayFormat: 'dddd', + listDayAltFormat: 'LL' + } +}; +views.listMonth = { + type: 'list', + duration: { month: 1 }, + defaults: { + listDayAltFormat: 'dddd' // day-of-week is nice-to-have + } +}; +views.listYear = { + type: 'list', + duration: { year: 1 }, + defaults: { + listDayAltFormat: 'dddd' // day-of-week is nice-to-have + } +}; + + +/***/ }) +/******/ ]); +}); +/*! + * FullCalendar v3.7.0 Google Calendar Plugin + * Docs & License: https://fullcalendar.io/ + * (c) 2017 Adam Shaw + */ + +(function(factory) { + if (typeof define === 'function' && define.amd) { + define([ 'jquery' ], factory); + } + else if (typeof exports === 'object') { // Node/CommonJS + module.exports = factory(require('jquery')); + } + else { + factory(window.jQuery); + } +})(function($) { + + +var FC = $.fullCalendar; +var Promise = FC.Promise; +var EventSource = FC.EventSource; +var JsonFeedEventSource = FC.JsonFeedEventSource; +var EventSourceParser = FC.EventSourceParser; +var applyAll = FC.applyAll; + +;; + +var GcalEventSource = EventSource.extend({ + + // TODO: eventually remove "googleCalendar" prefix (API-breaking) + googleCalendarApiKey: null, + googleCalendarId: null, + googleCalendarError: null, // optional function + ajaxSettings: null, + + + fetch: function(start, end, timezone) { + var _this = this; + var url = this.buildUrl(); + var requestParams = this.buildRequestParams(start, end, timezone); + var ajaxSettings = this.ajaxSettings || {}; + var onSuccess = ajaxSettings.success; + + if (!requestParams) { // could have failed + return Promise.reject(); + } + + this.calendar.pushLoading(); + + return Promise.construct(function(onResolve, onReject) { + $.ajax($.extend( + {}, // destination + JsonFeedEventSource.AJAX_DEFAULTS, + ajaxSettings, + { + url: url, + data: requestParams, + success: function(responseData) { + var rawEventDefs; + var successRes; + + _this.calendar.popLoading(); + + if (responseData.error) { + _this.reportError('Google Calendar API: ' + responseData.error.message, responseData.error.errors); + onReject(); + } + else if (responseData.items) { + rawEventDefs = _this.gcalItemsToRawEventDefs( + responseData.items, + requestParams.timeZone + ); + + successRes = applyAll( + onSuccess, + this, // forward `this` + // call the success handler(s) and allow it to return a new events array + [ rawEventDefs ].concat(Array.prototype.slice.call(arguments, 1)) + ); + + if ($.isArray(successRes)) { + rawEventDefs = successRes; + } + + onResolve(_this.parseEventDefs(rawEventDefs)); + } + } + } + )); + }); + }, + + + gcalItemsToRawEventDefs: function(items, gcalTimezone) { + var _this = this; + + return items.map(function(item) { + return _this.gcalItemToRawEventDef(item, gcalTimezone); + }); + }, + + + gcalItemToRawEventDef: function(item, gcalTimezone) { + var url = item.htmlLink || null; + + // make the URLs for each event show times in the correct timezone + if (url && gcalTimezone) { + url = injectQsComponent(url, 'ctz=' + gcalTimezone); + } + + return { + id: item.id, + title: item.summary, + start: item.start.dateTime || item.start.date, // try timed. will fall back to all-day + end: item.end.dateTime || item.end.date, // same + url: url, + location: item.location, + description: item.description + }; + }, + + + buildUrl: function() { + return GcalEventSource.API_BASE + '/' + + encodeURIComponent(this.googleCalendarId) + + '/events?callback=?'; // jsonp + }, + + + buildRequestParams: function(start, end, timezone) { + var apiKey = this.googleCalendarApiKey || this.calendar.opt('googleCalendarApiKey'); + var params; + + if (!apiKey) { + this.reportError("Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/"); + return null; + } + + // The API expects an ISO8601 datetime with a time and timezone part. + // Since the calendar's timezone offset isn't always known, request the date in UTC and pad it by a day on each + // side, guaranteeing we will receive all events in the desired range, albeit a superset. + // .utc() will set a zone and give it a 00:00:00 time. + if (!start.hasZone()) { + start = start.clone().utc().add(-1, 'day'); + } + if (!end.hasZone()) { + end = end.clone().utc().add(1, 'day'); + } + + params = $.extend( + this.ajaxSettings.data || {}, + { + key: apiKey, + timeMin: start.format(), + timeMax: end.format(), + singleEvents: true, + maxResults: 9999 + } + ); + + if (timezone && timezone !== 'local') { + // when sending timezone names to Google, only accepts underscores, not spaces + params.timeZone = timezone.replace(' ', '_'); + } + + return params; + }, + + + reportError: function(message, apiErrorObjs) { + var calendar = this.calendar; + var calendarOnError = calendar.opt('googleCalendarError'); + var errorObjs = apiErrorObjs || [ { message: message } ]; // to be passed into error handlers + + if (this.googleCalendarError) { + this.googleCalendarError.apply(calendar, errorObjs); + } + + if (calendarOnError) { + calendarOnError.apply(calendar, errorObjs); + } + + // print error to debug console + FC.warn.apply(null, [ message ].concat(apiErrorObjs || [])); + }, + + + getPrimitive: function() { + return this.googleCalendarId; + }, + + + applyManualStandardProps: function(rawProps) { + var superSuccess = EventSource.prototype.applyManualStandardProps.apply(this, arguments); + var googleCalendarId = rawProps.googleCalendarId; + + if (googleCalendarId == null && rawProps.url) { + googleCalendarId = parseGoogleCalendarId(rawProps.url); + } + + if (googleCalendarId != null) { + this.googleCalendarId = googleCalendarId; + + return superSuccess; + } + + return false; + }, + + + applyMiscProps: function(rawProps) { + if (!this.ajaxSettings) { + this.ajaxSettings = {}; + } + $.extend(this.ajaxSettings, rawProps); + } + +}); + + +GcalEventSource.API_BASE = 'https://www.googleapis.com/calendar/v3/calendars'; + + +GcalEventSource.defineStandardProps({ + // manually process... + url: false, + googleCalendarId: false, + + // automatically transfer... + googleCalendarApiKey: true, + googleCalendarError: true +}); + + +GcalEventSource.parse = function(rawInput, calendar) { + var rawProps; + + if (typeof rawInput === 'object') { // long form. might fail in applyManualStandardProps + rawProps = rawInput; + } + else if (typeof rawInput === 'string') { // short form + rawProps = { url: rawInput }; // url will be parsed with parseGoogleCalendarId + } + + if (rawProps) { + return EventSource.parse.call(this, rawProps, calendar); + } + + return false; +}; + + +function parseGoogleCalendarId(url) { + var match; + + // detect if the ID was specified as a single string. + // will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars. + if (/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) { + return url; + } + // try to scrape it out of a V1 or V3 API feed URL + else if ( + (match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(url)) || + (match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(url)) + ) { + return decodeURIComponent(match[1]); + } +} + + +// Injects a string like "arg=value" into the querystring of a URL +function injectQsComponent(url, component) { + // inject it after the querystring but before the fragment + return url.replace(/(\?.*?)?(#|$)/, function(whole, qs, hash) { + return (qs ? qs + '&' : '?') + component + hash; + }); +} + + +// expose + +EventSourceParser.registerClass(GcalEventSource); + +FC.GcalEventSource = GcalEventSource; + +;; + +}); diff --git a/public/assets/vendors/custom/gmaps/gmaps.js b/public/assets/vendors/custom/gmaps/gmaps.js new file mode 100644 index 00000000..400996e1 --- /dev/null +++ b/public/assets/vendors/custom/gmaps/gmaps.js @@ -0,0 +1,2409 @@ +"use strict"; +(function(root, factory) { + if(typeof exports === 'object') { + module.exports = factory(); + } + else if(typeof define === 'function' && define.amd) { + define(['jquery', 'googlemaps!'], factory); + } + else { + root.GMaps = factory(); + } + + +}(this, function() { + +/*! + * GMaps.js v0.4.24 + * http://hpneo.github.com/gmaps/ + * + * Copyright 2016, Gustavo Leon + * Released under the MIT License. + */ + +var extend_object = function(obj, new_obj) { + var name; + + if (obj === new_obj) { + return obj; + } + + for (name in new_obj) { + if (new_obj[name] !== undefined) { + obj[name] = new_obj[name]; + } + } + + return obj; +}; + +var replace_object = function(obj, replace) { + var name; + + if (obj === replace) { + return obj; + } + + for (name in replace) { + if (obj[name] != undefined) { + obj[name] = replace[name]; + } + } + + return obj; +}; + +var array_map = function(array, callback) { + var original_callback_params = Array.prototype.slice.call(arguments, 2), + array_return = [], + array_length = array.length, + i; + + if (Array.prototype.map && array.map === Array.prototype.map) { + array_return = Array.prototype.map.call(array, function(item) { + var callback_params = original_callback_params.slice(0); + callback_params.splice(0, 0, item); + + return callback.apply(this, callback_params); + }); + } + else { + for (i = 0; i < array_length; i++) { + callback_params = original_callback_params; + callback_params.splice(0, 0, array[i]); + array_return.push(callback.apply(this, callback_params)); + } + } + + return array_return; +}; + +var array_flat = function(array) { + var new_array = [], + i; + + for (i = 0; i < array.length; i++) { + new_array = new_array.concat(array[i]); + } + + return new_array; +}; + +var coordsToLatLngs = function(coords, useGeoJSON) { + var first_coord = coords[0], + second_coord = coords[1]; + + if (useGeoJSON) { + first_coord = coords[1]; + second_coord = coords[0]; + } + + return new google.maps.LatLng(first_coord, second_coord); +}; + +var arrayToLatLng = function(coords, useGeoJSON) { + var i; + + for (i = 0; i < coords.length; i++) { + if (!(coords[i] instanceof google.maps.LatLng)) { + if (coords[i].length > 0 && typeof(coords[i][0]) === "object") { + coords[i] = arrayToLatLng(coords[i], useGeoJSON); + } + else { + coords[i] = coordsToLatLngs(coords[i], useGeoJSON); + } + } + } + + return coords; +}; + +var getElementsByClassName = function (class_name, context) { + var element, + _class = class_name.replace('.', ''); + + if ('jQuery' in this && context) { + element = $("." + _class, context)[0]; + } else { + element = document.getElementsByClassName(_class)[0]; + } + return element; + +}; + +var getElementById = function(id, context) { + var element, + id = id.replace('#', ''); + + if ('jQuery' in window && context) { + element = $('#' + id, context)[0]; + } else { + element = document.getElementById(id); + }; + + return element; +}; + +var findAbsolutePosition = function(obj) { + var curleft = 0, + curtop = 0; + + if (obj.offsetParent) { + do { + curleft += obj.offsetLeft; + curtop += obj.offsetTop; + } while (obj = obj.offsetParent); + } + + return [curleft, curtop]; +}; + +var GMaps = (function(global) { + "use strict"; + + var doc = document; + /** + * Creates a new GMaps instance, including a Google Maps map. + * @class GMaps + * @constructs + * @param {object} options - `options` accepts all the [MapOptions](https://developers.google.com/maps/documentation/javascript/reference#MapOptions) and [events](https://developers.google.com/maps/documentation/javascript/reference#Map) listed in the Google Maps API. Also accepts: + * * `lat` (number): Latitude of the map's center + * * `lng` (number): Longitude of the map's center + * * `el` (string or HTMLElement): container where the map will be rendered + * * `markerClusterer` (function): A function to create a marker cluster. You can use MarkerClusterer or MarkerClustererPlus. + */ + var GMaps = function(options) { + + if (!(typeof window.google === 'object' && window.google.maps)) { + if (typeof window.console === 'object' && window.console.error) { + console.error('Google Maps API is required. Please register the following JavaScript library https://maps.googleapis.com/maps/api/js.'); + } + + return function() {}; + } + + if (!this) return new GMaps(options); + + options.zoom = options.zoom || 15; + options.mapType = options.mapType || 'roadmap'; + + var valueOrDefault = function(value, defaultValue) { + return value === undefined ? defaultValue : value; + }; + + var self = this, + i, + events_that_hide_context_menu = [ + 'bounds_changed', 'center_changed', 'click', 'dblclick', 'drag', + 'dragend', 'dragstart', 'idle', 'maptypeid_changed', 'projection_changed', + 'resize', 'tilesloaded', 'zoom_changed' + ], + events_that_doesnt_hide_context_menu = ['mousemove', 'mouseout', 'mouseover'], + options_to_be_deleted = ['el', 'lat', 'lng', 'mapType', 'width', 'height', 'markerClusterer', 'enableNewStyle'], + identifier = options.el || options.div, + markerClustererFunction = options.markerClusterer, + mapType = google.maps.MapTypeId[options.mapType.toUpperCase()], + map_center = new google.maps.LatLng(options.lat, options.lng), + zoomControl = valueOrDefault(options.zoomControl, true), + zoomControlOpt = options.zoomControlOpt || { + style: 'DEFAULT', + position: 'TOP_LEFT' + }, + zoomControlStyle = zoomControlOpt.style || 'DEFAULT', + zoomControlPosition = zoomControlOpt.position || 'TOP_LEFT', + panControl = valueOrDefault(options.panControl, true), + mapTypeControl = valueOrDefault(options.mapTypeControl, true), + scaleControl = valueOrDefault(options.scaleControl, true), + streetViewControl = valueOrDefault(options.streetViewControl, true), + overviewMapControl = valueOrDefault(overviewMapControl, true), + map_options = {}, + map_base_options = { + zoom: this.zoom, + center: map_center, + mapTypeId: mapType + }, + map_controls_options = { + panControl: panControl, + zoomControl: zoomControl, + zoomControlOptions: { + style: google.maps.ZoomControlStyle[zoomControlStyle], + position: google.maps.ControlPosition[zoomControlPosition] + }, + mapTypeControl: mapTypeControl, + scaleControl: scaleControl, + streetViewControl: streetViewControl, + overviewMapControl: overviewMapControl + }; + + if (typeof(options.el) === 'string' || typeof(options.div) === 'string') { + if (identifier.indexOf("#") > -1) { + /** + * Container element + * + * @type {HTMLElement} + */ + this.el = getElementById(identifier, options.context); + } else { + this.el = getElementsByClassName.apply(this, [identifier, options.context]); + } + } else { + this.el = identifier; + } + + if (typeof(this.el) === 'undefined' || this.el === null) { + throw 'No element defined.'; + } + + window.context_menu = window.context_menu || {}; + window.context_menu[self.el.id] = {}; + + /** + * Collection of custom controls in the map UI + * + * @type {array} + */ + this.controls = []; + /** + * Collection of map's overlays + * + * @type {array} + */ + this.overlays = []; + /** + * Collection of KML/GeoRSS and FusionTable layers + * + * @type {array} + */ + this.layers = []; + /** + * Collection of data layers (See {@link GMaps#addLayer}) + * + * @type {object} + */ + this.singleLayers = {}; + /** + * Collection of map's markers + * + * @type {array} + */ + this.markers = []; + /** + * Collection of map's lines + * + * @type {array} + */ + this.polylines = []; + /** + * Collection of map's routes requested by {@link GMaps#getRoutes}, {@link GMaps#renderRoute}, {@link GMaps#drawRoute}, {@link GMaps#travelRoute} or {@link GMaps#drawSteppedRoute} + * + * @type {array} + */ + this.routes = []; + /** + * Collection of map's polygons + * + * @type {array} + */ + this.polygons = []; + this.infoWindow = null; + this.overlay_el = null; + /** + * Current map's zoom + * + * @type {number} + */ + this.zoom = options.zoom; + this.registered_events = {}; + + this.el.style.width = options.width || this.el.scrollWidth || this.el.offsetWidth; + this.el.style.height = options.height || this.el.scrollHeight || this.el.offsetHeight; + + google.maps.visualRefresh = options.enableNewStyle; + + for (i = 0; i < options_to_be_deleted.length; i++) { + delete options[options_to_be_deleted[i]]; + } + + if(options.disableDefaultUI != true) { + map_base_options = extend_object(map_base_options, map_controls_options); + } + + map_options = extend_object(map_base_options, options); + + for (i = 0; i < events_that_hide_context_menu.length; i++) { + delete map_options[events_that_hide_context_menu[i]]; + } + + for (i = 0; i < events_that_doesnt_hide_context_menu.length; i++) { + delete map_options[events_that_doesnt_hide_context_menu[i]]; + } + + /** + * Google Maps map instance + * + * @type {google.maps.Map} + */ + this.map = new google.maps.Map(this.el, map_options); + + if (markerClustererFunction) { + /** + * Marker Clusterer instance + * + * @type {object} + */ + this.markerClusterer = markerClustererFunction.apply(this, [this.map]); + } + + var buildContextMenuHTML = function(control, e) { + var html = '', + options = window.context_menu[self.el.id][control]; + + for (var i in options){ + if (options.hasOwnProperty(i)) { + var option = options[i]; + + html += '
        • ' + option.title + '
        • '; + } + } + + if (!getElementById('gmaps_context_menu')) return; + + var context_menu_element = getElementById('gmaps_context_menu'); + + context_menu_element.innerHTML = html; + + var context_menu_items = context_menu_element.getElementsByTagName('a'), + context_menu_items_count = context_menu_items.length, + i; + + for (i = 0; i < context_menu_items_count; i++) { + var context_menu_item = context_menu_items[i]; + + var assign_menu_item_action = function(ev){ + ev.preventDefault(); + + options[this.id.replace(control + '_', '')].action.apply(self, [e]); + self.hideContextMenu(); + }; + + google.maps.event.clearListeners(context_menu_item, 'click'); + google.maps.event.addDomListenerOnce(context_menu_item, 'click', assign_menu_item_action, false); + } + + var position = findAbsolutePosition.apply(this, [self.el]), + left = position[0] + e.pixel.x - 15, + top = position[1] + e.pixel.y- 15; + + context_menu_element.style.left = left + "px"; + context_menu_element.style.top = top + "px"; + + // context_menu_element.style.display = 'block'; + }; + + this.buildContextMenu = function(control, e) { + if (control === 'marker') { + e.pixel = {}; + + var overlay = new google.maps.OverlayView(); + overlay.setMap(self.map); + + overlay.draw = function() { + var projection = overlay.getProjection(), + position = e.marker.getPosition(); + + e.pixel = projection.fromLatLngToContainerPixel(position); + + buildContextMenuHTML(control, e); + }; + } + else { + buildContextMenuHTML(control, e); + } + + var context_menu_element = getElementById('gmaps_context_menu'); + + setTimeout(function() { + context_menu_element.style.display = 'block'; + }, 0); + }; + + /** + * Add a context menu for a map or a marker. + * + * @param {object} options - The `options` object should contain: + * * `control` (string): Kind of control the context menu will be attached. Can be "map" or "marker". + * * `options` (array): A collection of context menu items: + * * `title` (string): Item's title shown in the context menu. + * * `name` (string): Item's identifier. + * * `action` (function): Function triggered after selecting the context menu item. + */ + this.setContextMenu = function(options) { + window.context_menu[self.el.id][options.control] = {}; + + var i, + ul = doc.createElement('ul'); + + for (i in options.options) { + if (options.options.hasOwnProperty(i)) { + var option = options.options[i]; + + window.context_menu[self.el.id][options.control][option.name] = { + title: option.title, + action: option.action + }; + } + } + + ul.id = 'gmaps_context_menu'; + ul.style.display = 'none'; + ul.style.position = 'absolute'; + ul.style.minWidth = '100px'; + ul.style.background = 'white'; + ul.style.listStyle = 'none'; + ul.style.padding = '8px'; + ul.style.boxShadow = '2px 2px 6px #ccc'; + + if (!getElementById('gmaps_context_menu')) { + doc.body.appendChild(ul); + } + + var context_menu_element = getElementById('gmaps_context_menu'); + + google.maps.event.addDomListener(context_menu_element, 'mouseout', function(ev) { + if (!ev.relatedTarget || !this.contains(ev.relatedTarget)) { + window.setTimeout(function(){ + context_menu_element.style.display = 'none'; + }, 400); + } + }, false); + }; + + /** + * Hide the current context menu + */ + this.hideContextMenu = function() { + var context_menu_element = getElementById('gmaps_context_menu'); + + if (context_menu_element) { + context_menu_element.style.display = 'none'; + } + }; + + var setupListener = function(object, name) { + google.maps.event.addListener(object, name, function(e){ + if (e == undefined) { + e = this; + } + + options[name].apply(this, [e]); + + self.hideContextMenu(); + }); + }; + + //google.maps.event.addListener(this.map, 'idle', this.hideContextMenu); + google.maps.event.addListener(this.map, 'zoom_changed', this.hideContextMenu); + + for (var ev = 0; ev < events_that_hide_context_menu.length; ev++) { + var name = events_that_hide_context_menu[ev]; + + if (name in options) { + setupListener(this.map, name); + } + } + + for (var ev = 0; ev < events_that_doesnt_hide_context_menu.length; ev++) { + var name = events_that_doesnt_hide_context_menu[ev]; + + if (name in options) { + setupListener(this.map, name); + } + } + + google.maps.event.addListener(this.map, 'rightclick', function(e) { + if (options.rightclick) { + options.rightclick.apply(this, [e]); + } + + if(window.context_menu[self.el.id]['map'] != undefined) { + self.buildContextMenu('map', e); + } + }); + + /** + * Trigger a `resize` event, useful if you need to repaint the current map (for changes in the viewport or display / hide actions). + */ + this.refresh = function() { + google.maps.event.trigger(this.map, 'resize'); + }; + + /** + * Adjust the map zoom to include all the markers added in the map. + */ + this.fitZoom = function() { + var latLngs = [], + markers_length = this.markers.length, + i; + + for (i = 0; i < markers_length; i++) { + if(typeof(this.markers[i].visible) === 'boolean' && this.markers[i].visible) { + latLngs.push(this.markers[i].getPosition()); + } + } + + this.fitLatLngBounds(latLngs); + }; + + /** + * Adjust the map zoom to include all the coordinates in the `latLngs` array. + * + * @param {array} latLngs - Collection of `google.maps.LatLng` objects. + */ + this.fitLatLngBounds = function(latLngs) { + var total = latLngs.length, + bounds = new google.maps.LatLngBounds(), + i; + + for(i = 0; i < total; i++) { + bounds.extend(latLngs[i]); + } + + this.map.fitBounds(bounds); + }; + + /** + * Center the map using the `lat` and `lng` coordinates. + * + * @param {number} lat - Latitude of the coordinate. + * @param {number} lng - Longitude of the coordinate. + * @param {function} [callback] - Callback that will be executed after the map is centered. + */ + this.setCenter = function(lat, lng, callback) { + this.map.panTo(new google.maps.LatLng(lat, lng)); + + if (callback) { + callback(); + } + }; + + /** + * Return the HTML element container of the map. + * + * @returns {HTMLElement} the element container. + */ + this.getElement = function() { + return this.el; + }; + + /** + * Increase the map's zoom. + * + * @param {number} [magnitude] - The number of times the map will be zoomed in. + */ + this.zoomIn = function(value) { + value = value || 1; + + this.zoom = this.map.getZoom() + value; + this.map.setZoom(this.zoom); + }; + + /** + * Decrease the map's zoom. + * + * @param {number} [magnitude] - The number of times the map will be zoomed out. + */ + this.zoomOut = function(value) { + value = value || 1; + + this.zoom = this.map.getZoom() - value; + this.map.setZoom(this.zoom); + }; + + var native_methods = [], + method; + + for (method in this.map) { + if (typeof(this.map[method]) == 'function' && !this[method]) { + native_methods.push(method); + } + } + + for (i = 0; i < native_methods.length; i++) { + (function(gmaps, scope, method_name) { + gmaps[method_name] = function(){ + return scope[method_name].apply(scope, arguments); + }; + })(this, this.map, native_methods[i]); + } + }; + + return GMaps; +})(this); + +GMaps.prototype.createControl = function(options) { + var control = document.createElement('div'); + + control.style.cursor = 'pointer'; + + if (options.disableDefaultStyles !== true) { + control.style.fontFamily = 'Roboto, Arial, sans-serif'; + control.style.fontSize = '11px'; + control.style.boxShadow = 'rgba(0, 0, 0, 0.298039) 0px 1px 4px -1px'; + } + + for (var option in options.style) { + control.style[option] = options.style[option]; + } + + if (options.id) { + control.id = options.id; + } + + if (options.title) { + control.title = options.title; + } + + if (options.classes) { + control.className = options.classes; + } + + if (options.content) { + if (typeof options.content === 'string') { + control.innerHTML = options.content; + } + else if (options.content instanceof HTMLElement) { + control.appendChild(options.content); + } + } + + if (options.position) { + control.position = google.maps.ControlPosition[options.position.toUpperCase()]; + } + + for (var ev in options.events) { + (function(object, name) { + google.maps.event.addDomListener(object, name, function(){ + options.events[name].apply(this, [this]); + }); + })(control, ev); + } + + control.index = 1; + + return control; +}; + +/** + * Add a custom control to the map UI. + * + * @param {object} options - The `options` object should contain: + * * `style` (object): The keys and values of this object should be valid CSS properties and values. + * * `id` (string): The HTML id for the custom control. + * * `classes` (string): A string containing all the HTML classes for the custom control. + * * `content` (string or HTML element): The content of the custom control. + * * `position` (string): Any valid [`google.maps.ControlPosition`](https://developers.google.com/maps/documentation/javascript/controls#ControlPositioning) value, in lower or upper case. + * * `events` (object): The keys of this object should be valid DOM events. The values should be functions. + * * `disableDefaultStyles` (boolean): If false, removes the default styles for the controls like font (family and size), and box shadow. + * @returns {HTMLElement} + */ +GMaps.prototype.addControl = function(options) { + var control = this.createControl(options); + + this.controls.push(control); + this.map.controls[control.position].push(control); + + return control; +}; + +/** + * Remove a control from the map. `control` should be a control returned by `addControl()`. + * + * @param {HTMLElement} control - One of the controls returned by `addControl()`. + * @returns {HTMLElement} the removed control. + */ +GMaps.prototype.removeControl = function(control) { + var position = null, + i; + + for (i = 0; i < this.controls.length; i++) { + if (this.controls[i] == control) { + position = this.controls[i].position; + this.controls.splice(i, 1); + } + } + + if (position) { + for (i = 0; i < this.map.controls.length; i++) { + var controlsForPosition = this.map.controls[control.position]; + + if (controlsForPosition.getAt(i) == control) { + controlsForPosition.removeAt(i); + + break; + } + } + } + + return control; +}; + +GMaps.prototype.createMarker = function(options) { + if (options.lat == undefined && options.lng == undefined && options.position == undefined) { + throw 'No latitude or longitude defined.'; + } + + var self = this, + details = options.details, + fences = options.fences, + outside = options.outside, + base_options = { + position: new google.maps.LatLng(options.lat, options.lng), + map: null + }, + marker_options = extend_object(base_options, options); + + delete marker_options.lat; + delete marker_options.lng; + delete marker_options.fences; + delete marker_options.outside; + + var marker = new google.maps.Marker(marker_options); + + marker.fences = fences; + + if (options.infoWindow) { + marker.infoWindow = new google.maps.InfoWindow(options.infoWindow); + + var info_window_events = ['closeclick', 'content_changed', 'domready', 'position_changed', 'zindex_changed']; + + for (var ev = 0; ev < info_window_events.length; ev++) { + (function(object, name) { + if (options.infoWindow[name]) { + google.maps.event.addListener(object, name, function(e){ + options.infoWindow[name].apply(this, [e]); + }); + } + })(marker.infoWindow, info_window_events[ev]); + } + } + + var marker_events = ['animation_changed', 'clickable_changed', 'cursor_changed', 'draggable_changed', 'flat_changed', 'icon_changed', 'position_changed', 'shadow_changed', 'shape_changed', 'title_changed', 'visible_changed', 'zindex_changed']; + + var marker_events_with_mouse = ['dblclick', 'drag', 'dragend', 'dragstart', 'mousedown', 'mouseout', 'mouseover', 'mouseup']; + + for (var ev = 0; ev < marker_events.length; ev++) { + (function(object, name) { + if (options[name]) { + google.maps.event.addListener(object, name, function(){ + options[name].apply(this, [this]); + }); + } + })(marker, marker_events[ev]); + } + + for (var ev = 0; ev < marker_events_with_mouse.length; ev++) { + (function(map, object, name) { + if (options[name]) { + google.maps.event.addListener(object, name, function(me){ + if(!me.pixel){ + me.pixel = map.getProjection().fromLatLngToPoint(me.latLng) + } + + options[name].apply(this, [me]); + }); + } + })(this.map, marker, marker_events_with_mouse[ev]); + } + + google.maps.event.addListener(marker, 'click', function() { + this.details = details; + + if (options.click) { + options.click.apply(this, [this]); + } + + if (marker.infoWindow) { + self.hideInfoWindows(); + marker.infoWindow.open(self.map, marker); + } + }); + + google.maps.event.addListener(marker, 'rightclick', function(e) { + e.marker = this; + + if (options.rightclick) { + options.rightclick.apply(this, [e]); + } + + if (window.context_menu[self.el.id]['marker'] != undefined) { + self.buildContextMenu('marker', e); + } + }); + + if (marker.fences) { + google.maps.event.addListener(marker, 'dragend', function() { + self.checkMarkerGeofence(marker, function(m, f) { + outside(m, f); + }); + }); + } + + return marker; +}; + +GMaps.prototype.addMarker = function(options) { + var marker; + if(options.hasOwnProperty('gm_accessors_')) { + // Native google.maps.Marker object + marker = options; + } + else { + if ((options.hasOwnProperty('lat') && options.hasOwnProperty('lng')) || options.position) { + marker = this.createMarker(options); + } + else { + throw 'No latitude or longitude defined.'; + } + } + + marker.setMap(this.map); + + if(this.markerClusterer) { + this.markerClusterer.addMarker(marker); + } + + this.markers.push(marker); + + GMaps.fire('marker_added', marker, this); + + return marker; +}; + +GMaps.prototype.addMarkers = function(array) { + for (var i = 0, marker; marker=array[i]; i++) { + this.addMarker(marker); + } + + return this.markers; +}; + +GMaps.prototype.hideInfoWindows = function() { + for (var i = 0, marker; marker = this.markers[i]; i++){ + if (marker.infoWindow) { + marker.infoWindow.close(); + } + } +}; + +GMaps.prototype.removeMarker = function(marker) { + for (var i = 0; i < this.markers.length; i++) { + if (this.markers[i] === marker) { + this.markers[i].setMap(null); + this.markers.splice(i, 1); + + if(this.markerClusterer) { + this.markerClusterer.removeMarker(marker); + } + + GMaps.fire('marker_removed', marker, this); + + break; + } + } + + return marker; +}; + +GMaps.prototype.removeMarkers = function (collection) { + var new_markers = []; + + if (typeof collection == 'undefined') { + for (var i = 0; i < this.markers.length; i++) { + var marker = this.markers[i]; + marker.setMap(null); + + GMaps.fire('marker_removed', marker, this); + } + + if(this.markerClusterer && this.markerClusterer.clearMarkers) { + this.markerClusterer.clearMarkers(); + } + + this.markers = new_markers; + } + else { + for (var i = 0; i < collection.length; i++) { + var index = this.markers.indexOf(collection[i]); + + if (index > -1) { + var marker = this.markers[index]; + marker.setMap(null); + + if(this.markerClusterer) { + this.markerClusterer.removeMarker(marker); + } + + GMaps.fire('marker_removed', marker, this); + } + } + + for (var i = 0; i < this.markers.length; i++) { + var marker = this.markers[i]; + if (marker.getMap() != null) { + new_markers.push(marker); + } + } + + this.markers = new_markers; + } +}; + +GMaps.prototype.drawOverlay = function(options) { + var overlay = new google.maps.OverlayView(), + auto_show = true; + + overlay.setMap(this.map); + + if (options.auto_show != null) { + auto_show = options.auto_show; + } + + overlay.onAdd = function() { + var el = document.createElement('div'); + + el.style.borderStyle = "none"; + el.style.borderWidth = "0px"; + el.style.position = "absolute"; + el.style.zIndex = 100; + el.innerHTML = options.content; + + overlay.el = el; + + if (!options.layer) { + options.layer = 'overlayLayer'; + } + + var panes = this.getPanes(), + overlayLayer = panes[options.layer], + stop_overlay_events = ['contextmenu', 'DOMMouseScroll', 'dblclick', 'mousedown']; + + overlayLayer.appendChild(el); + + for (var ev = 0; ev < stop_overlay_events.length; ev++) { + (function(object, name) { + google.maps.event.addDomListener(object, name, function(e){ + if (navigator.userAgent.toLowerCase().indexOf('msie') != -1 && document.all) { + e.cancelBubble = true; + e.returnValue = false; + } + else { + e.stopPropagation(); + } + }); + })(el, stop_overlay_events[ev]); + } + + if (options.click) { + panes.overlayMouseTarget.appendChild(overlay.el); + google.maps.event.addDomListener(overlay.el, 'click', function() { + options.click.apply(overlay, [overlay]); + }); + } + + google.maps.event.trigger(this, 'ready'); + }; + + overlay.draw = function() { + var projection = this.getProjection(), + pixel = projection.fromLatLngToDivPixel(new google.maps.LatLng(options.lat, options.lng)); + + options.horizontalOffset = options.horizontalOffset || 0; + options.verticalOffset = options.verticalOffset || 0; + + var el = overlay.el, + content = el.children[0], + content_height = content.clientHeight, + content_width = content.clientWidth; + + switch (options.verticalAlign) { + case 'top': + el.style.top = (pixel.y - content_height + options.verticalOffset) + 'px'; + break; + default: + case 'middle': + el.style.top = (pixel.y - (content_height / 2) + options.verticalOffset) + 'px'; + break; + case 'bottom': + el.style.top = (pixel.y + options.verticalOffset) + 'px'; + break; + } + + switch (options.horizontalAlign) { + case 'left': + el.style.left = (pixel.x - content_width + options.horizontalOffset) + 'px'; + break; + default: + case 'center': + el.style.left = (pixel.x - (content_width / 2) + options.horizontalOffset) + 'px'; + break; + case 'right': + el.style.left = (pixel.x + options.horizontalOffset) + 'px'; + break; + } + + el.style.display = auto_show ? 'block' : 'none'; + + if (!auto_show) { + options.show.apply(this, [el]); + } + }; + + overlay.onRemove = function() { + var el = overlay.el; + + if (options.remove) { + options.remove.apply(this, [el]); + } + else { + overlay.el.parentNode.removeChild(overlay.el); + overlay.el = null; + } + }; + + this.overlays.push(overlay); + return overlay; +}; + +GMaps.prototype.removeOverlay = function(overlay) { + for (var i = 0; i < this.overlays.length; i++) { + if (this.overlays[i] === overlay) { + this.overlays[i].setMap(null); + this.overlays.splice(i, 1); + + break; + } + } +}; + +GMaps.prototype.removeOverlays = function() { + for (var i = 0, item; item = this.overlays[i]; i++) { + item.setMap(null); + } + + this.overlays = []; +}; + +GMaps.prototype.drawPolyline = function(options) { + var path = [], + points = options.path; + + if (points.length) { + if (points[0][0] === undefined) { + path = points; + } + else { + for (var i = 0, latlng; latlng = points[i]; i++) { + path.push(new google.maps.LatLng(latlng[0], latlng[1])); + } + } + } + + var polyline_options = { + map: this.map, + path: path, + strokeColor: options.strokeColor, + strokeOpacity: options.strokeOpacity, + strokeWeight: options.strokeWeight, + geodesic: options.geodesic, + clickable: true, + editable: false, + visible: true + }; + + if (options.hasOwnProperty("clickable")) { + polyline_options.clickable = options.clickable; + } + + if (options.hasOwnProperty("editable")) { + polyline_options.editable = options.editable; + } + + if (options.hasOwnProperty("icons")) { + polyline_options.icons = options.icons; + } + + if (options.hasOwnProperty("zIndex")) { + polyline_options.zIndex = options.zIndex; + } + + var polyline = new google.maps.Polyline(polyline_options); + + var polyline_events = ['click', 'dblclick', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'rightclick']; + + for (var ev = 0; ev < polyline_events.length; ev++) { + (function(object, name) { + if (options[name]) { + google.maps.event.addListener(object, name, function(e){ + options[name].apply(this, [e]); + }); + } + })(polyline, polyline_events[ev]); + } + + this.polylines.push(polyline); + + GMaps.fire('polyline_added', polyline, this); + + return polyline; +}; + +GMaps.prototype.removePolyline = function(polyline) { + for (var i = 0; i < this.polylines.length; i++) { + if (this.polylines[i] === polyline) { + this.polylines[i].setMap(null); + this.polylines.splice(i, 1); + + GMaps.fire('polyline_removed', polyline, this); + + break; + } + } +}; + +GMaps.prototype.removePolylines = function() { + for (var i = 0, item; item = this.polylines[i]; i++) { + item.setMap(null); + } + + this.polylines = []; +}; + +GMaps.prototype.drawCircle = function(options) { + options = extend_object({ + map: this.map, + center: new google.maps.LatLng(options.lat, options.lng) + }, options); + + delete options.lat; + delete options.lng; + + var polygon = new google.maps.Circle(options), + polygon_events = ['click', 'dblclick', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'rightclick']; + + for (var ev = 0; ev < polygon_events.length; ev++) { + (function(object, name) { + if (options[name]) { + google.maps.event.addListener(object, name, function(e){ + options[name].apply(this, [e]); + }); + } + })(polygon, polygon_events[ev]); + } + + this.polygons.push(polygon); + + return polygon; +}; + +GMaps.prototype.drawRectangle = function(options) { + options = extend_object({ + map: this.map + }, options); + + var latLngBounds = new google.maps.LatLngBounds( + new google.maps.LatLng(options.bounds[0][0], options.bounds[0][1]), + new google.maps.LatLng(options.bounds[1][0], options.bounds[1][1]) + ); + + options.bounds = latLngBounds; + + var polygon = new google.maps.Rectangle(options), + polygon_events = ['click', 'dblclick', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'rightclick']; + + for (var ev = 0; ev < polygon_events.length; ev++) { + (function(object, name) { + if (options[name]) { + google.maps.event.addListener(object, name, function(e){ + options[name].apply(this, [e]); + }); + } + })(polygon, polygon_events[ev]); + } + + this.polygons.push(polygon); + + return polygon; +}; + +GMaps.prototype.drawPolygon = function(options) { + var useGeoJSON = false; + + if(options.hasOwnProperty("useGeoJSON")) { + useGeoJSON = options.useGeoJSON; + } + + delete options.useGeoJSON; + + options = extend_object({ + map: this.map + }, options); + + if (useGeoJSON == false) { + options.paths = [options.paths.slice(0)]; + } + + if (options.paths.length > 0) { + if (options.paths[0].length > 0) { + options.paths = array_flat(array_map(options.paths, arrayToLatLng, useGeoJSON)); + } + } + + var polygon = new google.maps.Polygon(options), + polygon_events = ['click', 'dblclick', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'rightclick']; + + for (var ev = 0; ev < polygon_events.length; ev++) { + (function(object, name) { + if (options[name]) { + google.maps.event.addListener(object, name, function(e){ + options[name].apply(this, [e]); + }); + } + })(polygon, polygon_events[ev]); + } + + this.polygons.push(polygon); + + GMaps.fire('polygon_added', polygon, this); + + return polygon; +}; + +GMaps.prototype.removePolygon = function(polygon) { + for (var i = 0; i < this.polygons.length; i++) { + if (this.polygons[i] === polygon) { + this.polygons[i].setMap(null); + this.polygons.splice(i, 1); + + GMaps.fire('polygon_removed', polygon, this); + + break; + } + } +}; + +GMaps.prototype.removePolygons = function() { + for (var i = 0, item; item = this.polygons[i]; i++) { + item.setMap(null); + } + + this.polygons = []; +}; + +GMaps.prototype.getFromFusionTables = function(options) { + var events = options.events; + + delete options.events; + + var fusion_tables_options = options, + layer = new google.maps.FusionTablesLayer(fusion_tables_options); + + for (var ev in events) { + (function(object, name) { + google.maps.event.addListener(object, name, function(e) { + events[name].apply(this, [e]); + }); + })(layer, ev); + } + + this.layers.push(layer); + + return layer; +}; + +GMaps.prototype.loadFromFusionTables = function(options) { + var layer = this.getFromFusionTables(options); + layer.setMap(this.map); + + return layer; +}; + +GMaps.prototype.getFromKML = function(options) { + var url = options.url, + events = options.events; + + delete options.url; + delete options.events; + + var kml_options = options, + layer = new google.maps.KmlLayer(url, kml_options); + + for (var ev in events) { + (function(object, name) { + google.maps.event.addListener(object, name, function(e) { + events[name].apply(this, [e]); + }); + })(layer, ev); + } + + this.layers.push(layer); + + return layer; +}; + +GMaps.prototype.loadFromKML = function(options) { + var layer = this.getFromKML(options); + layer.setMap(this.map); + + return layer; +}; + +GMaps.prototype.addLayer = function(layerName, options) { + //var default_layers = ['weather', 'clouds', 'traffic', 'transit', 'bicycling', 'panoramio', 'places']; + options = options || {}; + var layer; + + switch(layerName) { + case 'weather': this.singleLayers.weather = layer = new google.maps.weather.WeatherLayer(); + break; + case 'clouds': this.singleLayers.clouds = layer = new google.maps.weather.CloudLayer(); + break; + case 'traffic': this.singleLayers.traffic = layer = new google.maps.TrafficLayer(); + break; + case 'transit': this.singleLayers.transit = layer = new google.maps.TransitLayer(); + break; + case 'bicycling': this.singleLayers.bicycling = layer = new google.maps.BicyclingLayer(); + break; + case 'panoramio': + this.singleLayers.panoramio = layer = new google.maps.panoramio.PanoramioLayer(); + layer.setTag(options.filter); + delete options.filter; + + //click event + if (options.click) { + google.maps.event.addListener(layer, 'click', function(event) { + options.click(event); + delete options.click; + }); + } + break; + case 'places': + this.singleLayers.places = layer = new google.maps.places.PlacesService(this.map); + + //search, nearbySearch, radarSearch callback, Both are the same + if (options.search || options.nearbySearch || options.radarSearch) { + var placeSearchRequest = { + bounds : options.bounds || null, + keyword : options.keyword || null, + location : options.location || null, + name : options.name || null, + radius : options.radius || null, + rankBy : options.rankBy || null, + types : options.types || null + }; + + if (options.radarSearch) { + layer.radarSearch(placeSearchRequest, options.radarSearch); + } + + if (options.search) { + layer.search(placeSearchRequest, options.search); + } + + if (options.nearbySearch) { + layer.nearbySearch(placeSearchRequest, options.nearbySearch); + } + } + + //textSearch callback + if (options.textSearch) { + var textSearchRequest = { + bounds : options.bounds || null, + location : options.location || null, + query : options.query || null, + radius : options.radius || null + }; + + layer.textSearch(textSearchRequest, options.textSearch); + } + break; + } + + if (layer !== undefined) { + if (typeof layer.setOptions == 'function') { + layer.setOptions(options); + } + if (typeof layer.setMap == 'function') { + layer.setMap(this.map); + } + + return layer; + } +}; + +GMaps.prototype.removeLayer = function(layer) { + if (typeof(layer) == "string" && this.singleLayers[layer] !== undefined) { + this.singleLayers[layer].setMap(null); + + delete this.singleLayers[layer]; + } + else { + for (var i = 0; i < this.layers.length; i++) { + if (this.layers[i] === layer) { + this.layers[i].setMap(null); + this.layers.splice(i, 1); + + break; + } + } + } +}; + +var travelMode, unitSystem; + +GMaps.prototype.getRoutes = function(options) { + switch (options.travelMode) { + case 'bicycling': + travelMode = google.maps.TravelMode.BICYCLING; + break; + case 'transit': + travelMode = google.maps.TravelMode.TRANSIT; + break; + case 'driving': + travelMode = google.maps.TravelMode.DRIVING; + break; + default: + travelMode = google.maps.TravelMode.WALKING; + break; + } + + if (options.unitSystem === 'imperial') { + unitSystem = google.maps.UnitSystem.IMPERIAL; + } + else { + unitSystem = google.maps.UnitSystem.METRIC; + } + + var base_options = { + avoidHighways: false, + avoidTolls: false, + optimizeWaypoints: false, + waypoints: [] + }, + request_options = extend_object(base_options, options); + + request_options.origin = /string/.test(typeof options.origin) ? options.origin : new google.maps.LatLng(options.origin[0], options.origin[1]); + request_options.destination = /string/.test(typeof options.destination) ? options.destination : new google.maps.LatLng(options.destination[0], options.destination[1]); + request_options.travelMode = travelMode; + request_options.unitSystem = unitSystem; + + delete request_options.callback; + delete request_options.error; + + var self = this, + routes = [], + service = new google.maps.DirectionsService(); + + service.route(request_options, function(result, status) { + if (status === google.maps.DirectionsStatus.OK) { + for (var r in result.routes) { + if (result.routes.hasOwnProperty(r)) { + routes.push(result.routes[r]); + } + } + + if (options.callback) { + options.callback(routes, result, status); + } + } + else { + if (options.error) { + options.error(result, status); + } + } + }); +}; + +GMaps.prototype.removeRoutes = function() { + this.routes.length = 0; +}; + +GMaps.prototype.getElevations = function(options) { + options = extend_object({ + locations: [], + path : false, + samples : 256 + }, options); + + if (options.locations.length > 0) { + if (options.locations[0].length > 0) { + options.locations = array_flat(array_map([options.locations], arrayToLatLng, false)); + } + } + + var callback = options.callback; + delete options.callback; + + var service = new google.maps.ElevationService(); + + //location request + if (!options.path) { + delete options.path; + delete options.samples; + + service.getElevationForLocations(options, function(result, status) { + if (callback && typeof(callback) === "function") { + callback(result, status); + } + }); + //path request + } else { + var pathRequest = { + path : options.locations, + samples : options.samples + }; + + service.getElevationAlongPath(pathRequest, function(result, status) { + if (callback && typeof(callback) === "function") { + callback(result, status); + } + }); + } +}; + +GMaps.prototype.cleanRoute = GMaps.prototype.removePolylines; + +GMaps.prototype.renderRoute = function(options, renderOptions) { + var self = this, + panel = ((typeof renderOptions.panel === 'string') ? document.getElementById(renderOptions.panel.replace('#', '')) : renderOptions.panel), + display; + + renderOptions.panel = panel; + renderOptions = extend_object({ + map: this.map + }, renderOptions); + display = new google.maps.DirectionsRenderer(renderOptions); + + this.getRoutes({ + origin: options.origin, + destination: options.destination, + travelMode: options.travelMode, + waypoints: options.waypoints, + unitSystem: options.unitSystem, + error: options.error, + avoidHighways: options.avoidHighways, + avoidTolls: options.avoidTolls, + optimizeWaypoints: options.optimizeWaypoints, + callback: function(routes, response, status) { + if (status === google.maps.DirectionsStatus.OK) { + display.setDirections(response); + } + } + }); +}; + +GMaps.prototype.drawRoute = function(options) { + var self = this; + + this.getRoutes({ + origin: options.origin, + destination: options.destination, + travelMode: options.travelMode, + waypoints: options.waypoints, + unitSystem: options.unitSystem, + error: options.error, + avoidHighways: options.avoidHighways, + avoidTolls: options.avoidTolls, + optimizeWaypoints: options.optimizeWaypoints, + callback: function(routes) { + if (routes.length > 0) { + var polyline_options = { + path: routes[routes.length - 1].overview_path, + strokeColor: options.strokeColor, + strokeOpacity: options.strokeOpacity, + strokeWeight: options.strokeWeight + }; + + if (options.hasOwnProperty("icons")) { + polyline_options.icons = options.icons; + } + + self.drawPolyline(polyline_options); + + if (options.callback) { + options.callback(routes[routes.length - 1]); + } + } + } + }); +}; + +GMaps.prototype.travelRoute = function(options) { + if (options.origin && options.destination) { + this.getRoutes({ + origin: options.origin, + destination: options.destination, + travelMode: options.travelMode, + waypoints : options.waypoints, + unitSystem: options.unitSystem, + error: options.error, + callback: function(e) { + //start callback + if (e.length > 0 && options.start) { + options.start(e[e.length - 1]); + } + + //step callback + if (e.length > 0 && options.step) { + var route = e[e.length - 1]; + if (route.legs.length > 0) { + var steps = route.legs[0].steps; + for (var i = 0, step; step = steps[i]; i++) { + step.step_number = i; + options.step(step, (route.legs[0].steps.length - 1)); + } + } + } + + //end callback + if (e.length > 0 && options.end) { + options.end(e[e.length - 1]); + } + } + }); + } + else if (options.route) { + if (options.route.legs.length > 0) { + var steps = options.route.legs[0].steps; + for (var i = 0, step; step = steps[i]; i++) { + step.step_number = i; + options.step(step); + } + } + } +}; + +GMaps.prototype.drawSteppedRoute = function(options) { + var self = this; + + if (options.origin && options.destination) { + this.getRoutes({ + origin: options.origin, + destination: options.destination, + travelMode: options.travelMode, + waypoints : options.waypoints, + error: options.error, + callback: function(e) { + //start callback + if (e.length > 0 && options.start) { + options.start(e[e.length - 1]); + } + + //step callback + if (e.length > 0 && options.step) { + var route = e[e.length - 1]; + if (route.legs.length > 0) { + var steps = route.legs[0].steps; + for (var i = 0, step; step = steps[i]; i++) { + step.step_number = i; + var polyline_options = { + path: step.path, + strokeColor: options.strokeColor, + strokeOpacity: options.strokeOpacity, + strokeWeight: options.strokeWeight + }; + + if (options.hasOwnProperty("icons")) { + polyline_options.icons = options.icons; + } + + self.drawPolyline(polyline_options); + options.step(step, (route.legs[0].steps.length - 1)); + } + } + } + + //end callback + if (e.length > 0 && options.end) { + options.end(e[e.length - 1]); + } + } + }); + } + else if (options.route) { + if (options.route.legs.length > 0) { + var steps = options.route.legs[0].steps; + for (var i = 0, step; step = steps[i]; i++) { + step.step_number = i; + var polyline_options = { + path: step.path, + strokeColor: options.strokeColor, + strokeOpacity: options.strokeOpacity, + strokeWeight: options.strokeWeight + }; + + if (options.hasOwnProperty("icons")) { + polyline_options.icons = options.icons; + } + + self.drawPolyline(polyline_options); + options.step(step); + } + } + } +}; + +GMaps.Route = function(options) { + this.origin = options.origin; + this.destination = options.destination; + this.waypoints = options.waypoints; + + this.map = options.map; + this.route = options.route; + this.step_count = 0; + this.steps = this.route.legs[0].steps; + this.steps_length = this.steps.length; + + var polyline_options = { + path: new google.maps.MVCArray(), + strokeColor: options.strokeColor, + strokeOpacity: options.strokeOpacity, + strokeWeight: options.strokeWeight + }; + + if (options.hasOwnProperty("icons")) { + polyline_options.icons = options.icons; + } + + this.polyline = this.map.drawPolyline(polyline_options).getPath(); +}; + +GMaps.Route.prototype.getRoute = function(options) { + var self = this; + + this.map.getRoutes({ + origin : this.origin, + destination : this.destination, + travelMode : options.travelMode, + waypoints : this.waypoints || [], + error: options.error, + callback : function() { + self.route = e[0]; + + if (options.callback) { + options.callback.call(self); + } + } + }); +}; + +GMaps.Route.prototype.back = function() { + if (this.step_count > 0) { + this.step_count--; + var path = this.route.legs[0].steps[this.step_count].path; + + for (var p in path){ + if (path.hasOwnProperty(p)){ + this.polyline.pop(); + } + } + } +}; + +GMaps.Route.prototype.forward = function() { + if (this.step_count < this.steps_length) { + var path = this.route.legs[0].steps[this.step_count].path; + + for (var p in path){ + if (path.hasOwnProperty(p)){ + this.polyline.push(path[p]); + } + } + this.step_count++; + } +}; + +GMaps.prototype.checkGeofence = function(lat, lng, fence) { + return fence.containsLatLng(new google.maps.LatLng(lat, lng)); +}; + +GMaps.prototype.checkMarkerGeofence = function(marker, outside_callback) { + if (marker.fences) { + for (var i = 0, fence; fence = marker.fences[i]; i++) { + var pos = marker.getPosition(); + if (!this.checkGeofence(pos.lat(), pos.lng(), fence)) { + outside_callback(marker, fence); + } + } + } +}; + +GMaps.prototype.toImage = function(options) { + var options = options || {}, + static_map_options = {}; + + static_map_options['size'] = options['size'] || [this.el.clientWidth, this.el.clientHeight]; + static_map_options['lat'] = this.getCenter().lat(); + static_map_options['lng'] = this.getCenter().lng(); + + if (this.markers.length > 0) { + static_map_options['markers'] = []; + + for (var i = 0; i < this.markers.length; i++) { + static_map_options['markers'].push({ + lat: this.markers[i].getPosition().lat(), + lng: this.markers[i].getPosition().lng() + }); + } + } + + if (this.polylines.length > 0) { + var polyline = this.polylines[0]; + + static_map_options['polyline'] = {}; + static_map_options['polyline']['path'] = google.maps.geometry.encoding.encodePath(polyline.getPath()); + static_map_options['polyline']['strokeColor'] = polyline.strokeColor + static_map_options['polyline']['strokeOpacity'] = polyline.strokeOpacity + static_map_options['polyline']['strokeWeight'] = polyline.strokeWeight + } + + return GMaps.staticMapURL(static_map_options); +}; + +GMaps.staticMapURL = function(options){ + var parameters = [], + data, + static_root = (location.protocol === 'file:' ? 'http:' : location.protocol ) + '//maps.googleapis.com/maps/api/staticmap'; + + if (options.url) { + static_root = options.url; + delete options.url; + } + + static_root += '?'; + + var markers = options.markers; + + delete options.markers; + + if (!markers && options.marker) { + markers = [options.marker]; + delete options.marker; + } + + var styles = options.styles; + + delete options.styles; + + var polyline = options.polyline; + delete options.polyline; + + /** Map options **/ + if (options.center) { + parameters.push('center=' + options.center); + delete options.center; + } + else if (options.address) { + parameters.push('center=' + options.address); + delete options.address; + } + else if (options.lat) { + parameters.push(['center=', options.lat, ',', options.lng].join('')); + delete options.lat; + delete options.lng; + } + else if (options.visible) { + var visible = encodeURI(options.visible.join('|')); + parameters.push('visible=' + visible); + } + + var size = options.size; + if (size) { + if (size.join) { + size = size.join('x'); + } + delete options.size; + } + else { + size = '630x300'; + } + parameters.push('size=' + size); + + if (!options.zoom && options.zoom !== false) { + options.zoom = 15; + } + + var sensor = options.hasOwnProperty('sensor') ? !!options.sensor : true; + delete options.sensor; + parameters.push('sensor=' + sensor); + + for (var param in options) { + if (options.hasOwnProperty(param)) { + parameters.push(param + '=' + options[param]); + } + } + + /** Markers **/ + if (markers) { + var marker, loc; + + for (var i = 0; data = markers[i]; i++) { + marker = []; + + if (data.size && data.size !== 'normal') { + marker.push('size:' + data.size); + delete data.size; + } + else if (data.icon) { + marker.push('icon:' + encodeURI(data.icon)); + delete data.icon; + } + + if (data.color) { + marker.push('color:' + data.color.replace('#', '0x')); + delete data.color; + } + + if (data.label) { + marker.push('label:' + data.label[0].toUpperCase()); + delete data.label; + } + + loc = (data.address ? data.address : data.lat + ',' + data.lng); + delete data.address; + delete data.lat; + delete data.lng; + + for(var param in data){ + if (data.hasOwnProperty(param)) { + marker.push(param + ':' + data[param]); + } + } + + if (marker.length || i === 0) { + marker.push(loc); + marker = marker.join('|'); + parameters.push('markers=' + encodeURI(marker)); + } + // New marker without styles + else { + marker = parameters.pop() + encodeURI('|' + loc); + parameters.push(marker); + } + } + } + + /** Map Styles **/ + if (styles) { + for (var i = 0; i < styles.length; i++) { + var styleRule = []; + if (styles[i].featureType){ + styleRule.push('feature:' + styles[i].featureType.toLowerCase()); + } + + if (styles[i].elementType) { + styleRule.push('element:' + styles[i].elementType.toLowerCase()); + } + + for (var j = 0; j < styles[i].stylers.length; j++) { + for (var p in styles[i].stylers[j]) { + var ruleArg = styles[i].stylers[j][p]; + if (p == 'hue' || p == 'color') { + ruleArg = '0x' + ruleArg.substring(1); + } + styleRule.push(p + ':' + ruleArg); + } + } + + var rule = styleRule.join('|'); + if (rule != '') { + parameters.push('style=' + rule); + } + } + } + + /** Polylines **/ + function parseColor(color, opacity) { + if (color[0] === '#'){ + color = color.replace('#', '0x'); + + if (opacity) { + opacity = parseFloat(opacity); + opacity = Math.min(1, Math.max(opacity, 0)); + if (opacity === 0) { + return '0x00000000'; + } + opacity = (opacity * 255).toString(16); + if (opacity.length === 1) { + opacity += opacity; + } + + color = color.slice(0,8) + opacity; + } + } + return color; + } + + if (polyline) { + data = polyline; + polyline = []; + + if (data.strokeWeight) { + polyline.push('weight:' + parseInt(data.strokeWeight, 10)); + } + + if (data.strokeColor) { + var color = parseColor(data.strokeColor, data.strokeOpacity); + polyline.push('color:' + color); + } + + if (data.fillColor) { + var fillcolor = parseColor(data.fillColor, data.fillOpacity); + polyline.push('fillcolor:' + fillcolor); + } + + var path = data.path; + if (path.join) { + for (var j=0, pos; pos=path[j]; j++) { + polyline.push(pos.join(',')); + } + } + else { + polyline.push('enc:' + path); + } + + polyline = polyline.join('|'); + parameters.push('path=' + encodeURI(polyline)); + } + + /** Retina support **/ + var dpi = window.devicePixelRatio || 1; + parameters.push('scale=' + dpi); + + parameters = parameters.join('&'); + return static_root + parameters; +}; + +GMaps.prototype.addMapType = function(mapTypeId, options) { + if (options.hasOwnProperty("getTileUrl") && typeof(options["getTileUrl"]) == "function") { + options.tileSize = options.tileSize || new google.maps.Size(256, 256); + + var mapType = new google.maps.ImageMapType(options); + + this.map.mapTypes.set(mapTypeId, mapType); + } + else { + throw "'getTileUrl' function required."; + } +}; + +GMaps.prototype.addOverlayMapType = function(options) { + if (options.hasOwnProperty("getTile") && typeof(options["getTile"]) == "function") { + var overlayMapTypeIndex = options.index; + + delete options.index; + + this.map.overlayMapTypes.insertAt(overlayMapTypeIndex, options); + } + else { + throw "'getTile' function required."; + } +}; + +GMaps.prototype.removeOverlayMapType = function(overlayMapTypeIndex) { + this.map.overlayMapTypes.removeAt(overlayMapTypeIndex); +}; + +GMaps.prototype.addStyle = function(options) { + var styledMapType = new google.maps.StyledMapType(options.styles, { name: options.styledMapName }); + + this.map.mapTypes.set(options.mapTypeId, styledMapType); +}; + +GMaps.prototype.setStyle = function(mapTypeId) { + this.map.setMapTypeId(mapTypeId); +}; + +GMaps.prototype.createPanorama = function(streetview_options) { + if (!streetview_options.hasOwnProperty('lat') || !streetview_options.hasOwnProperty('lng')) { + streetview_options.lat = this.getCenter().lat(); + streetview_options.lng = this.getCenter().lng(); + } + + this.panorama = GMaps.createPanorama(streetview_options); + + this.map.setStreetView(this.panorama); + + return this.panorama; +}; + +GMaps.createPanorama = function(options) { + var el = getElementById(options.el, options.context); + + options.position = new google.maps.LatLng(options.lat, options.lng); + + delete options.el; + delete options.context; + delete options.lat; + delete options.lng; + + var streetview_events = ['closeclick', 'links_changed', 'pano_changed', 'position_changed', 'pov_changed', 'resize', 'visible_changed'], + streetview_options = extend_object({visible : true}, options); + + for (var i = 0; i < streetview_events.length; i++) { + delete streetview_options[streetview_events[i]]; + } + + var panorama = new google.maps.StreetViewPanorama(el, streetview_options); + + for (var i = 0; i < streetview_events.length; i++) { + (function(object, name) { + if (options[name]) { + google.maps.event.addListener(object, name, function(){ + options[name].apply(this); + }); + } + })(panorama, streetview_events[i]); + } + + return panorama; +}; + +GMaps.prototype.on = function(event_name, handler) { + return GMaps.on(event_name, this, handler); +}; + +GMaps.prototype.off = function(event_name) { + GMaps.off(event_name, this); +}; + +GMaps.prototype.once = function(event_name, handler) { + return GMaps.once(event_name, this, handler); +}; + +GMaps.custom_events = ['marker_added', 'marker_removed', 'polyline_added', 'polyline_removed', 'polygon_added', 'polygon_removed', 'geolocated', 'geolocation_failed']; + +GMaps.on = function(event_name, object, handler) { + if (GMaps.custom_events.indexOf(event_name) == -1) { + if(object instanceof GMaps) object = object.map; + return google.maps.event.addListener(object, event_name, handler); + } + else { + var registered_event = { + handler : handler, + eventName : event_name + }; + + object.registered_events[event_name] = object.registered_events[event_name] || []; + object.registered_events[event_name].push(registered_event); + + return registered_event; + } +}; + +GMaps.off = function(event_name, object) { + if (GMaps.custom_events.indexOf(event_name) == -1) { + if(object instanceof GMaps) object = object.map; + google.maps.event.clearListeners(object, event_name); + } + else { + object.registered_events[event_name] = []; + } +}; + +GMaps.once = function(event_name, object, handler) { + if (GMaps.custom_events.indexOf(event_name) == -1) { + if(object instanceof GMaps) object = object.map; + return google.maps.event.addListenerOnce(object, event_name, handler); + } +}; + +GMaps.fire = function(event_name, object, scope) { + if (GMaps.custom_events.indexOf(event_name) == -1) { + google.maps.event.trigger(object, event_name, Array.prototype.slice.apply(arguments).slice(2)); + } + else { + if(event_name in scope.registered_events) { + var firing_events = scope.registered_events[event_name]; + + for(var i = 0; i < firing_events.length; i++) { + (function(handler, scope, object) { + handler.apply(scope, [object]); + })(firing_events[i]['handler'], scope, object); + } + } + } +}; + +GMaps.geolocate = function(options) { + var complete_callback = options.always || options.complete; + + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition(function(position) { + options.success(position); + + if (complete_callback) { + complete_callback(); + } + }, function(error) { + options.error(error); + + if (complete_callback) { + complete_callback(); + } + }, options.options); + } + else { + options.not_supported(); + + if (complete_callback) { + complete_callback(); + } + } +}; + +GMaps.geocode = function(options) { + this.geocoder = new google.maps.Geocoder(); + var callback = options.callback; + if (options.hasOwnProperty('lat') && options.hasOwnProperty('lng')) { + options.latLng = new google.maps.LatLng(options.lat, options.lng); + } + + delete options.lat; + delete options.lng; + delete options.callback; + + this.geocoder.geocode(options, function(results, status) { + callback(results, status); + }); +}; + +if (typeof window.google === 'object' && window.google.maps) { + //========================== + // Polygon containsLatLng + // https://github.com/tparkin/Google-Maps-Point-in-Polygon + // Poygon getBounds extension - google-maps-extensions + // http://code.google.com/p/google-maps-extensions/source/browse/google.maps.Polygon.getBounds.js + if (!google.maps.Polygon.prototype.getBounds) { + google.maps.Polygon.prototype.getBounds = function(latLng) { + var bounds = new google.maps.LatLngBounds(); + var paths = this.getPaths(); + var path; + + for (var p = 0; p < paths.getLength(); p++) { + path = paths.getAt(p); + for (var i = 0; i < path.getLength(); i++) { + bounds.extend(path.getAt(i)); + } + } + + return bounds; + }; + } + + if (!google.maps.Polygon.prototype.containsLatLng) { + // Polygon containsLatLng - method to determine if a latLng is within a polygon + google.maps.Polygon.prototype.containsLatLng = function(latLng) { + // Exclude points outside of bounds as there is no way they are in the poly + var bounds = this.getBounds(); + + if (bounds !== null && !bounds.contains(latLng)) { + return false; + } + + // Raycast point in polygon method + var inPoly = false; + + var numPaths = this.getPaths().getLength(); + for (var p = 0; p < numPaths; p++) { + var path = this.getPaths().getAt(p); + var numPoints = path.getLength(); + var j = numPoints - 1; + + for (var i = 0; i < numPoints; i++) { + var vertex1 = path.getAt(i); + var vertex2 = path.getAt(j); + + if (vertex1.lng() < latLng.lng() && vertex2.lng() >= latLng.lng() || vertex2.lng() < latLng.lng() && vertex1.lng() >= latLng.lng()) { + if (vertex1.lat() + (latLng.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) < latLng.lat()) { + inPoly = !inPoly; + } + } + + j = i; + } + } + + return inPoly; + }; + } + + if (!google.maps.Circle.prototype.containsLatLng) { + google.maps.Circle.prototype.containsLatLng = function(latLng) { + if (google.maps.geometry) { + return google.maps.geometry.spherical.computeDistanceBetween(this.getCenter(), latLng) <= this.getRadius(); + } + else { + return true; + } + }; + } + + google.maps.Rectangle.prototype.containsLatLng = function(latLng) { + return this.getBounds().contains(latLng); + }; + + google.maps.LatLngBounds.prototype.containsLatLng = function(latLng) { + return this.contains(latLng); + }; + + google.maps.Marker.prototype.setFences = function(fences) { + this.fences = fences; + }; + + google.maps.Marker.prototype.addFence = function(fence) { + this.fences.push(fence); + }; + + google.maps.Marker.prototype.getId = function() { + return this['__gm_id']; + }; +} + +//========================== +// Array indexOf +// https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf +if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) { + "use strict"; + if (this == null) { + throw new TypeError(); + } + var t = Object(this); + var len = t.length >>> 0; + if (len === 0) { + return -1; + } + var n = 0; + if (arguments.length > 1) { + n = Number(arguments[1]); + if (n != n) { // shortcut for verifying if it's NaN + n = 0; + } else if (n != 0 && n != Infinity && n != -Infinity) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + } + if (n >= len) { + return -1; + } + var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); + for (; k < len; k++) { + if (k in t && t[k] === searchElement) { + return k; + } + } + return -1; + } +} + +return GMaps; +})); diff --git a/public/assets/vendors/custom/jquery-ui/jquery-ui.bundle.css b/public/assets/vendors/custom/jquery-ui/jquery-ui.bundle.css new file mode 100644 index 00000000..e87ff82e --- /dev/null +++ b/public/assets/vendors/custom/jquery-ui/jquery-ui.bundle.css @@ -0,0 +1,836 @@ +/*! jQuery UI - v1.12.1 - 2017-10-20 +* http://jqueryui.com +* Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif +* Copyright jQuery Foundation and other contributors; Licensed MIT */ +.ui-draggable-handle { + -ms-touch-action: none; + touch-action: none; } + +.ui-helper-hidden { + display: none; } + +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; } + +.ui-helper-clearfix:before, .ui-helper-clearfix:after { + content: ""; + display: table; + border-collapse: collapse; } + +.ui-helper-clearfix:after { + clear: both; } + +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + filter: Alpha(Opacity=0); } + +.ui-front { + z-index: 100; } + +.ui-state-disabled { + cursor: default !important; + pointer-events: none; } + +.ui-icon { + display: inline-block; + vertical-align: middle; + margin-top: -.25em; + position: relative; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; } + +.ui-widget-icon-block { + left: 50%; + margin-left: -8px; + display: block; } + +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; } + +.ui-resizable { + position: relative; } + +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; + -ms-touch-action: none; + touch-action: none; } + +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { + display: none; } + +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; } + +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0; } + +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; } + +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; } + +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; } + +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; } + +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; } + +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; } + +.ui-selectable { + -ms-touch-action: none; + touch-action: none; } + +.ui-selectable-helper { + position: absolute; + z-index: 100; + border: 1px dotted black; } + +.ui-sortable-handle { + -ms-touch-action: none; + touch-action: none; } + +.ui-widget { + font-family: Arial,Helvetica,sans-serif; + font-size: 1em; } + +.ui-widget .ui-widget { + font-size: 1em; } + +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { + font-family: Arial,Helvetica,sans-serif; + font-size: 1em; } + +.ui-widget.ui-widget-content { + border: 1px solid #c5c5c5; } + +.ui-widget-content { + border: 1px solid #ddd; + background: #fff; + color: #333; } + +.ui-widget-content a { + color: #333; } + +.ui-widget-header { + border: 1px solid #ddd; + background: #e9e9e9; + color: #333; + font-weight: bold; } + +.ui-widget-header a { + color: #333; } + +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default, .ui-button, html .ui-button.ui-state-disabled:hover, html .ui-button.ui-state-disabled:active { + border: 1px solid #c5c5c5; + background: #f6f6f6; + font-weight: normal; + color: #454545; } + +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited, a.ui-button, a:link.ui-button, a:visited.ui-button, .ui-button { + color: #454545; + text-decoration: none; } + +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus, .ui-button:hover, .ui-button:focus { + border: 1px solid #ccc; + background: #ededed; + font-weight: normal; + color: #2b2b2b; } + +.ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited, .ui-state-focus a, .ui-state-focus a:hover, .ui-state-focus a:link, .ui-state-focus a:visited, a.ui-button:hover, a.ui-button:focus { + color: #2b2b2b; + text-decoration: none; } + +.ui-visual-focus { + box-shadow: 0 0 3px 1px #5e9ed6; } + +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active, a.ui-button:active, .ui-button:active, .ui-button.ui-state-active:hover { + border: 1px solid #003eff; + background: #007fff; + font-weight: normal; + color: #fff; } + +.ui-icon-background, .ui-state-active .ui-icon-background { + border: #003eff; + background-color: #fff; } + +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { + color: #fff; + text-decoration: none; } + +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight { + border: 1px solid #dad55e; + background: #fffa90; + color: #777620; } + +.ui-state-checked { + border: 1px solid #dad55e; + background: #fffa90; } + +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a, .ui-widget-header .ui-state-highlight a { + color: #777620; } + +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error { + border: 1px solid #f1a899; + background: #fddfdf; + color: #5f3f3f; } + +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { + color: #5f3f3f; } + +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { + color: #5f3f3f; } + +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { + font-weight: bold; } + +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { + opacity: .7; + filter: Alpha(Opacity=70); + font-weight: normal; } + +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { + opacity: .35; + filter: Alpha(Opacity=35); + background-image: none; } + +.ui-state-disabled .ui-icon { + filter: Alpha(Opacity=35); } + +.ui-icon { + width: 16px; + height: 16px; } + +.ui-icon, .ui-widget-content .ui-icon { + background-image: url("images/jquery-ui/ui-icons_444444_256x240.png"); } + +.ui-widget-header .ui-icon { + background-image: url("images/jquery-ui/ui-icons_444444_256x240.png"); } + +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon, .ui-button:hover .ui-icon, .ui-button:focus .ui-icon { + background-image: url("images/jquery-ui/ui-icons_555555_256x240.png"); } + +.ui-state-active .ui-icon, .ui-button:active .ui-icon { + background-image: url("images/jquery-ui/ui-icons_ffffff_256x240.png"); } + +.ui-state-highlight .ui-icon, .ui-button .ui-state-highlight.ui-icon { + background-image: url("images/jquery-ui/ui-icons_777620_256x240.png"); } + +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon { + background-image: url("images/jquery-ui/ui-icons_cc0000_256x240.png"); } + +.ui-button .ui-icon { + background-image: url("images/jquery-ui/ui-icons_777777_256x240.png"); } + +.ui-icon-blank { + background-position: 16px 16px; } + +.ui-icon-caret-1-n { + background-position: 0 0; } + +.ui-icon-caret-1-ne { + background-position: -16px 0; } + +.ui-icon-caret-1-e { + background-position: -32px 0; } + +.ui-icon-caret-1-se { + background-position: -48px 0; } + +.ui-icon-caret-1-s { + background-position: -65px 0; } + +.ui-icon-caret-1-sw { + background-position: -80px 0; } + +.ui-icon-caret-1-w { + background-position: -96px 0; } + +.ui-icon-caret-1-nw { + background-position: -112px 0; } + +.ui-icon-caret-2-n-s { + background-position: -128px 0; } + +.ui-icon-caret-2-e-w { + background-position: -144px 0; } + +.ui-icon-triangle-1-n { + background-position: 0 -16px; } + +.ui-icon-triangle-1-ne { + background-position: -16px -16px; } + +.ui-icon-triangle-1-e { + background-position: -32px -16px; } + +.ui-icon-triangle-1-se { + background-position: -48px -16px; } + +.ui-icon-triangle-1-s { + background-position: -65px -16px; } + +.ui-icon-triangle-1-sw { + background-position: -80px -16px; } + +.ui-icon-triangle-1-w { + background-position: -96px -16px; } + +.ui-icon-triangle-1-nw { + background-position: -112px -16px; } + +.ui-icon-triangle-2-n-s { + background-position: -128px -16px; } + +.ui-icon-triangle-2-e-w { + background-position: -144px -16px; } + +.ui-icon-arrow-1-n { + background-position: 0 -32px; } + +.ui-icon-arrow-1-ne { + background-position: -16px -32px; } + +.ui-icon-arrow-1-e { + background-position: -32px -32px; } + +.ui-icon-arrow-1-se { + background-position: -48px -32px; } + +.ui-icon-arrow-1-s { + background-position: -65px -32px; } + +.ui-icon-arrow-1-sw { + background-position: -80px -32px; } + +.ui-icon-arrow-1-w { + background-position: -96px -32px; } + +.ui-icon-arrow-1-nw { + background-position: -112px -32px; } + +.ui-icon-arrow-2-n-s { + background-position: -128px -32px; } + +.ui-icon-arrow-2-ne-sw { + background-position: -144px -32px; } + +.ui-icon-arrow-2-e-w { + background-position: -160px -32px; } + +.ui-icon-arrow-2-se-nw { + background-position: -176px -32px; } + +.ui-icon-arrowstop-1-n { + background-position: -192px -32px; } + +.ui-icon-arrowstop-1-e { + background-position: -208px -32px; } + +.ui-icon-arrowstop-1-s { + background-position: -224px -32px; } + +.ui-icon-arrowstop-1-w { + background-position: -240px -32px; } + +.ui-icon-arrowthick-1-n { + background-position: 1px -48px; } + +.ui-icon-arrowthick-1-ne { + background-position: -16px -48px; } + +.ui-icon-arrowthick-1-e { + background-position: -32px -48px; } + +.ui-icon-arrowthick-1-se { + background-position: -48px -48px; } + +.ui-icon-arrowthick-1-s { + background-position: -64px -48px; } + +.ui-icon-arrowthick-1-sw { + background-position: -80px -48px; } + +.ui-icon-arrowthick-1-w { + background-position: -96px -48px; } + +.ui-icon-arrowthick-1-nw { + background-position: -112px -48px; } + +.ui-icon-arrowthick-2-n-s { + background-position: -128px -48px; } + +.ui-icon-arrowthick-2-ne-sw { + background-position: -144px -48px; } + +.ui-icon-arrowthick-2-e-w { + background-position: -160px -48px; } + +.ui-icon-arrowthick-2-se-nw { + background-position: -176px -48px; } + +.ui-icon-arrowthickstop-1-n { + background-position: -192px -48px; } + +.ui-icon-arrowthickstop-1-e { + background-position: -208px -48px; } + +.ui-icon-arrowthickstop-1-s { + background-position: -224px -48px; } + +.ui-icon-arrowthickstop-1-w { + background-position: -240px -48px; } + +.ui-icon-arrowreturnthick-1-w { + background-position: 0 -64px; } + +.ui-icon-arrowreturnthick-1-n { + background-position: -16px -64px; } + +.ui-icon-arrowreturnthick-1-e { + background-position: -32px -64px; } + +.ui-icon-arrowreturnthick-1-s { + background-position: -48px -64px; } + +.ui-icon-arrowreturn-1-w { + background-position: -64px -64px; } + +.ui-icon-arrowreturn-1-n { + background-position: -80px -64px; } + +.ui-icon-arrowreturn-1-e { + background-position: -96px -64px; } + +.ui-icon-arrowreturn-1-s { + background-position: -112px -64px; } + +.ui-icon-arrowrefresh-1-w { + background-position: -128px -64px; } + +.ui-icon-arrowrefresh-1-n { + background-position: -144px -64px; } + +.ui-icon-arrowrefresh-1-e { + background-position: -160px -64px; } + +.ui-icon-arrowrefresh-1-s { + background-position: -176px -64px; } + +.ui-icon-arrow-4 { + background-position: 0 -80px; } + +.ui-icon-arrow-4-diag { + background-position: -16px -80px; } + +.ui-icon-extlink { + background-position: -32px -80px; } + +.ui-icon-newwin { + background-position: -48px -80px; } + +.ui-icon-refresh { + background-position: -64px -80px; } + +.ui-icon-shuffle { + background-position: -80px -80px; } + +.ui-icon-transfer-e-w { + background-position: -96px -80px; } + +.ui-icon-transferthick-e-w { + background-position: -112px -80px; } + +.ui-icon-folder-collapsed { + background-position: 0 -96px; } + +.ui-icon-folder-open { + background-position: -16px -96px; } + +.ui-icon-document { + background-position: -32px -96px; } + +.ui-icon-document-b { + background-position: -48px -96px; } + +.ui-icon-note { + background-position: -64px -96px; } + +.ui-icon-mail-closed { + background-position: -80px -96px; } + +.ui-icon-mail-open { + background-position: -96px -96px; } + +.ui-icon-suitcase { + background-position: -112px -96px; } + +.ui-icon-comment { + background-position: -128px -96px; } + +.ui-icon-person { + background-position: -144px -96px; } + +.ui-icon-print { + background-position: -160px -96px; } + +.ui-icon-trash { + background-position: -176px -96px; } + +.ui-icon-locked { + background-position: -192px -96px; } + +.ui-icon-unlocked { + background-position: -208px -96px; } + +.ui-icon-bookmark { + background-position: -224px -96px; } + +.ui-icon-tag { + background-position: -240px -96px; } + +.ui-icon-home { + background-position: 0 -112px; } + +.ui-icon-flag { + background-position: -16px -112px; } + +.ui-icon-calendar { + background-position: -32px -112px; } + +.ui-icon-cart { + background-position: -48px -112px; } + +.ui-icon-pencil { + background-position: -64px -112px; } + +.ui-icon-clock { + background-position: -80px -112px; } + +.ui-icon-disk { + background-position: -96px -112px; } + +.ui-icon-calculator { + background-position: -112px -112px; } + +.ui-icon-zoomin { + background-position: -128px -112px; } + +.ui-icon-zoomout { + background-position: -144px -112px; } + +.ui-icon-search { + background-position: -160px -112px; } + +.ui-icon-wrench { + background-position: -176px -112px; } + +.ui-icon-gear { + background-position: -192px -112px; } + +.ui-icon-heart { + background-position: -208px -112px; } + +.ui-icon-star { + background-position: -224px -112px; } + +.ui-icon-link { + background-position: -240px -112px; } + +.ui-icon-cancel { + background-position: 0 -128px; } + +.ui-icon-plus { + background-position: -16px -128px; } + +.ui-icon-plusthick { + background-position: -32px -128px; } + +.ui-icon-minus { + background-position: -48px -128px; } + +.ui-icon-minusthick { + background-position: -64px -128px; } + +.ui-icon-close { + background-position: -80px -128px; } + +.ui-icon-closethick { + background-position: -96px -128px; } + +.ui-icon-key { + background-position: -112px -128px; } + +.ui-icon-lightbulb { + background-position: -128px -128px; } + +.ui-icon-scissors { + background-position: -144px -128px; } + +.ui-icon-clipboard { + background-position: -160px -128px; } + +.ui-icon-copy { + background-position: -176px -128px; } + +.ui-icon-contact { + background-position: -192px -128px; } + +.ui-icon-image { + background-position: -208px -128px; } + +.ui-icon-video { + background-position: -224px -128px; } + +.ui-icon-script { + background-position: -240px -128px; } + +.ui-icon-alert { + background-position: 0 -144px; } + +.ui-icon-info { + background-position: -16px -144px; } + +.ui-icon-notice { + background-position: -32px -144px; } + +.ui-icon-help { + background-position: -48px -144px; } + +.ui-icon-check { + background-position: -64px -144px; } + +.ui-icon-bullet { + background-position: -80px -144px; } + +.ui-icon-radio-on { + background-position: -96px -144px; } + +.ui-icon-radio-off { + background-position: -112px -144px; } + +.ui-icon-pin-w { + background-position: -128px -144px; } + +.ui-icon-pin-s { + background-position: -144px -144px; } + +.ui-icon-play { + background-position: 0 -160px; } + +.ui-icon-pause { + background-position: -16px -160px; } + +.ui-icon-seek-next { + background-position: -32px -160px; } + +.ui-icon-seek-prev { + background-position: -48px -160px; } + +.ui-icon-seek-end { + background-position: -64px -160px; } + +.ui-icon-seek-start { + background-position: -80px -160px; } + +.ui-icon-seek-first { + background-position: -80px -160px; } + +.ui-icon-stop { + background-position: -96px -160px; } + +.ui-icon-eject { + background-position: -112px -160px; } + +.ui-icon-volume-off { + background-position: -128px -160px; } + +.ui-icon-volume-on { + background-position: -144px -160px; } + +.ui-icon-power { + background-position: 0 -176px; } + +.ui-icon-signal-diag { + background-position: -16px -176px; } + +.ui-icon-signal { + background-position: -32px -176px; } + +.ui-icon-battery-0 { + background-position: -48px -176px; } + +.ui-icon-battery-1 { + background-position: -64px -176px; } + +.ui-icon-battery-2 { + background-position: -80px -176px; } + +.ui-icon-battery-3 { + background-position: -96px -176px; } + +.ui-icon-circle-plus { + background-position: 0 -192px; } + +.ui-icon-circle-minus { + background-position: -16px -192px; } + +.ui-icon-circle-close { + background-position: -32px -192px; } + +.ui-icon-circle-triangle-e { + background-position: -48px -192px; } + +.ui-icon-circle-triangle-s { + background-position: -64px -192px; } + +.ui-icon-circle-triangle-w { + background-position: -80px -192px; } + +.ui-icon-circle-triangle-n { + background-position: -96px -192px; } + +.ui-icon-circle-arrow-e { + background-position: -112px -192px; } + +.ui-icon-circle-arrow-s { + background-position: -128px -192px; } + +.ui-icon-circle-arrow-w { + background-position: -144px -192px; } + +.ui-icon-circle-arrow-n { + background-position: -160px -192px; } + +.ui-icon-circle-zoomin { + background-position: -176px -192px; } + +.ui-icon-circle-zoomout { + background-position: -192px -192px; } + +.ui-icon-circle-check { + background-position: -208px -192px; } + +.ui-icon-circlesmall-plus { + background-position: 0 -208px; } + +.ui-icon-circlesmall-minus { + background-position: -16px -208px; } + +.ui-icon-circlesmall-close { + background-position: -32px -208px; } + +.ui-icon-squaresmall-plus { + background-position: -48px -208px; } + +.ui-icon-squaresmall-minus { + background-position: -64px -208px; } + +.ui-icon-squaresmall-close { + background-position: -80px -208px; } + +.ui-icon-grip-dotted-vertical { + background-position: 0 -224px; } + +.ui-icon-grip-dotted-horizontal { + background-position: -16px -224px; } + +.ui-icon-grip-solid-vertical { + background-position: -32px -224px; } + +.ui-icon-grip-solid-horizontal { + background-position: -48px -224px; } + +.ui-icon-gripsmall-diagonal-se { + background-position: -64px -224px; } + +.ui-icon-grip-diagonal-se { + background-position: -80px -224px; } + +.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { + border-top-left-radius: 3px; } + +.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { + border-top-right-radius: 3px; } + +.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { + border-bottom-left-radius: 3px; } + +.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { + border-bottom-right-radius: 3px; } + +.ui-widget-overlay { + background: #aaa; + opacity: .3; + filter: Alpha(Opacity=30); } + +.ui-widget-shadow { + -webkit-box-shadow: 0 0 5px #666; + box-shadow: 0 0 5px #666; } diff --git a/public/assets/vendors/custom/jquery-ui/jquery-ui.bundle.js b/public/assets/vendors/custom/jquery-ui/jquery-ui.bundle.js new file mode 100644 index 00000000..6036aced --- /dev/null +++ b/public/assets/vendors/custom/jquery-ui/jquery-ui.bundle.js @@ -0,0 +1,8 @@ +/*! jQuery UI - v1.12.1 - 2017-10-20 +* http://jqueryui.com +* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/mouse.js +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}t.ui=t.ui||{},t.ui.version="1.12.1";var i=0,s=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},l=e.split(".")[0];e=e.split(".")[1];var h=l+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][h.toLowerCase()]=function(e){return!!t.data(e,h)},t[l]=t[l]||{},n=t[l][e],o=t[l][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:l,widgetName:e,widgetFullName:h}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,n,o=s.call(arguments,1),a=0,r=o.length;r>a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),l=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(l=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(l=i&&i.jquery?l.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):l=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
          ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var l=s.match(/^([\w:-]*)\s*(.*)$/),h=l[1]+o.eventNamespace,c=l[2];c?n.on(h,c,r):i.on(h,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,l=/top|center|bottom/,h=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
          "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};h>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),l.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,l=n-r,h=r+e.collisionWidth-a-n;e.collisionWidth>a?l>0&&0>=h?(i=t.left+l+e.collisionWidth-a-n,t.left+=l-i):t.left=h>0&&0>=l?n:l>h?n+a-e.collisionWidth:n:l>0?t.left+=l:h>0?t.left-=h:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,l=n-r,h=r+e.collisionHeight-a-n;e.collisionHeight>a?l>0&&0>=h?(i=t.top+l+e.collisionHeight-a-n,t.top+=l-i):t.top=h>0&&0>=l?n:l>h?n+a-e.collisionHeight:n:l>0?t.top+=l:h>0?t.top-=h:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,l=n.isWindow?n.scrollLeft:n.offset.left,h=t.left-e.collisionPosition.marginLeft,c=h-l,u=h+e.collisionWidth-r-l,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-l,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,l=n.isWindow?n.scrollTop:n.offset.top,h=t.top-e.collisionPosition.marginTop,c=h-l,u=h+e.collisionHeight-r-l,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-l,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,l,h=i.nodeName.toLowerCase();return"area"===h?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(h)?(r=!i.disabled,r&&(l=t(i).closest("fieldset")[0],l&&(r=!l.disabled))):r="a"===h?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.ui.safeBlur=function(e){e&&"body"!==e.nodeName.toLowerCase()&&t(e).trigger("blur")},t.widget("ui.draggable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this._addClass("ui-draggable"),this._setHandleClassName(),this._mouseInit()},_setOption:function(t,e){this._super(t,e),"handle"===t&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(e){var i=this.options;return this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(e),this.handle?(this._blurActiveElement(e),this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(e){this.iframeBlocks=this.document.find(e).map(function(){var e=t(this);return t("
          ").css("position","absolute").appendTo(e.parent()).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(e){var i=t.ui.safeActiveElement(this.document[0]),s=t(e.target);s.closest(i).length||t.ui.safeBlur(i)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this._addClass(this.helper,"ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===t(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(e),this.originalPosition=this.position=this._generatePosition(e,!1),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",e)===!1?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_refreshOffsets:function(t){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:t.pageX-this.offset.left,top:t.pageY-this.offset.top}},_mouseDrag:function(e,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",e,s)===!1)return this._mouseUp(new t.Event("mouseup",e)),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,s=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(s=t.ui.ddmanager.drop(this,e)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",e)!==!1&&i._clear()}):this._trigger("stop",e)!==!1&&this._clear(),!1},_mouseUp:function(e){return this._unblockFrames(),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),this.handleElement.is(e.target)&&this.element.trigger("focus"),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp(new t.Event("mouseup",{target:this.element[0]})):this._clear(),this},_getHandle:function(e){return this.options.handle?!!t(e.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this._addClass(this.handleElement,"ui-draggable-handle")},_removeHandleClassName:function(){this._removeClass(this.handleElement,"ui-draggable-handle")},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper),n=s?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_isRootNode:function(t){return/(html|body)/i.test(t.tagName)||t===this.document[0]},_getParentOffset:function(){var e=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var t=this.element.position(),e=this._isRootNode(this.scrollParent[0]);return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+(e?0:this.scrollParent.scrollTop()),left:t.left-(parseInt(this.helper.css("left"),10)||0)+(e?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options,o=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,t(o).width()-this.helperProportions.width-this.margins.left,(t(o).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=t(n.containment),s=i[0],s&&(e=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)},_convertPositionTo:function(t,e){e||(e=this.position);var i="absolute"===t?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(t,e){var i,s,n,o,a=this.options,r=this._isRootNode(this.scrollParent[0]),l=t.pageX,h=t.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),e&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,t.pageX-this.offset.click.lefti[2]&&(l=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(h=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,h=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-a.grid[1]:n+a.grid[1]:n,o=a.grid[0]?this.originalPageX+Math.round((l-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,l=i?o-this.offset.click.left>=i[0]||o-this.offset.click.left>i[2]?o:o-this.offset.click.left>=i[0]?o-a.grid[0]:o+a.grid[0]:o),"y"===a.axis&&(l=this.originalPageX),"x"===a.axis&&(h=this.originalPageY)),{top:h-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:l-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)} +},_clear:function(){this._removeClass(this.helper,"ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(e,i,s){return s=s||this._uiHash(),t.ui.plugin.call(this,e,[i,s,this],!0),/^(drag|start|stop)/.test(e)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),t.Widget.prototype._trigger.call(this,e,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i,s){var n=t.extend({},i,{item:s.element});s.sortables=[],t(s.options.connectToSortable).each(function(){var i=t(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",e,n))})},stop:function(e,i,s){var n=t.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,t.each(s.sortables,function(){var t=this;t.isOver?(t.isOver=0,s.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css("position"),top:t.placeholder.css("top"),left:t.placeholder.css("left")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger("deactivate",e,n))})},drag:function(e,i,s){t.each(s.sortables,function(){var n=!1,o=this;o.positionAbs=s.positionAbs,o.helperProportions=s.helperProportions,o.offset.click=s.offset.click,o._intersectsWith(o.containerCache)&&(n=!0,t.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==o&&this._intersectsWith(this.containerCache)&&t.contains(o.element[0],this.element[0])&&(n=!1),n})),n?(o.isOver||(o.isOver=1,s._parent=i.helper.parent(),o.currentItem=i.helper.appendTo(o.element).data("ui-sortable-item",!0),o.options._helper=o.options.helper,o.options.helper=function(){return i.helper[0]},e.target=o.currentItem[0],o._mouseCapture(e,!0),o._mouseStart(e,!0,!0),o.offset.click.top=s.offset.click.top,o.offset.click.left=s.offset.click.left,o.offset.parent.left-=s.offset.parent.left-o.offset.parent.left,o.offset.parent.top-=s.offset.parent.top-o.offset.parent.top,s._trigger("toSortable",e),s.dropped=o.element,t.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,o.fromOutside=s),o.currentItem&&(o._mouseDrag(e),i.position=o.position)):o.isOver&&(o.isOver=0,o.cancelHelperRemoval=!0,o.options._revert=o.options.revert,o.options.revert=!1,o._trigger("out",e,o._uiHash(o)),o._mouseStop(e,!0),o.options.revert=o.options._revert,o.options.helper=o.options._helper,o.placeholder&&o.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(e),i.position=s._generatePosition(e,!0),s._trigger("fromSortable",e),s.dropped=!1,t.each(s.sortables,function(){this.refreshPositions()}))})}}),t.ui.plugin.add("draggable","cursor",{start:function(e,i,s){var n=t("body"),o=s.options;n.css("cursor")&&(o._cursor=n.css("cursor")),n.css("cursor",o.cursor)},stop:function(e,i,s){var n=s.options;n._cursor&&t("body").css("cursor",n._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("opacity")&&(o._opacity=n.css("opacity")),n.css("opacity",o.opacity)},stop:function(e,i,s){var n=s.options;n._opacity&&t(i.helper).css("opacity",n._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(e,i,s){var n=s.options,o=!1,a=s.scrollParentNotHidden[0],r=s.document[0];a!==r&&"HTML"!==a.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+a.offsetHeight-e.pageY=0;d--)l=s.snapElements[d].left-s.margins.left,h=l+s.snapElements[d].width,c=s.snapElements[d].top-s.margins.top,u=c+s.snapElements[d].height,l-g>_||m>h+g||c-g>b||v>u+g||!t.contains(s.snapElements[d].item.ownerDocument,s.snapElements[d].item)?(s.snapElements[d].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=!1):("inner"!==f.snapMode&&(n=g>=Math.abs(c-b),o=g>=Math.abs(u-v),a=g>=Math.abs(l-_),r=g>=Math.abs(h-m),n&&(i.position.top=s._convertPositionTo("relative",{top:c-s.helperProportions.height,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left)),p=n||o||a||r,"outer"!==f.snapMode&&(n=g>=Math.abs(c-v),o=g>=Math.abs(u-b),a=g>=Math.abs(l-m),r=g>=Math.abs(h-_),n&&(i.position.top=s._convertPositionTo("relative",{top:c,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left)),!s.snapElements[d].snapping&&(n||o||a||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=n||o||a||r||p)}}),t.ui.plugin.add("draggable","stack",{start:function(e,i,s){var n,o=s.options,a=t.makeArray(t(o.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});a.length&&(n=parseInt(t(a[0]).css("zIndex"),10)||0,t(a).each(function(e){t(this).css("zIndex",n+e)}),this.css("zIndex",n+a.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("zIndex")&&(o._zIndex=n.css("zIndex")),n.css("zIndex",o.zIndex)},stop:function(e,i,s){var n=s.options;n._zIndex&&t(i.helper).css("zIndex",n._zIndex)}}),t.ui.draggable,t.widget("ui.droppable",{version:"1.12.1",widgetEventPrefix:"drop",options:{accept:"*",addClasses:!0,greedy:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var e,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=t.isFunction(s)?s:function(t){return t.is(s)},this.proportions=function(){return arguments.length?(e=arguments[0],void 0):e?e:e={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this._addClass("ui-droppable")},_addToManager:function(e){t.ui.ddmanager.droppables[e]=t.ui.ddmanager.droppables[e]||[],t.ui.ddmanager.droppables[e].push(this)},_splice:function(t){for(var e=0;t.length>e;e++)t[e]===this&&t.splice(e,1)},_destroy:function(){var e=t.ui.ddmanager.droppables[this.options.scope];this._splice(e)},_setOption:function(e,i){if("accept"===e)this.accept=t.isFunction(i)?i:function(t){return t.is(i)};else if("scope"===e){var s=t.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(e,i)},_activate:function(e){var i=t.ui.ddmanager.current;this._addActiveClass(),i&&this._trigger("activate",e,this.ui(i))},_deactivate:function(e){var i=t.ui.ddmanager.current;this._removeActiveClass(),i&&this._trigger("deactivate",e,this.ui(i))},_over:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._addHoverClass(),this._trigger("over",e,this.ui(i)))},_out:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._removeHoverClass(),this._trigger("out",e,this.ui(i)))},_drop:function(e,i){var s=i||t.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=t(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&o(s,t.extend(i,{offset:i.element.offset()}),i.options.tolerance,e)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this._removeActiveClass(),this._removeHoverClass(),this._trigger("drop",e,this.ui(s)),this.element):!1):!1},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}},_addHoverClass:function(){this._addClass("ui-droppable-hover")},_removeHoverClass:function(){this._removeClass("ui-droppable-hover")},_addActiveClass:function(){this._addClass("ui-droppable-active")},_removeActiveClass:function(){this._removeClass("ui-droppable-active")}});var o=t.ui.intersect=function(){function t(t,e,i){return t>=e&&e+i>t}return function(e,i,s,n){if(!i.offset)return!1;var o=(e.positionAbs||e.position.absolute).left+e.margins.left,a=(e.positionAbs||e.position.absolute).top+e.margins.top,r=o+e.helperProportions.width,l=a+e.helperProportions.height,h=i.offset.left,c=i.offset.top,u=h+i.proportions().width,d=c+i.proportions().height;switch(s){case"fit":return o>=h&&u>=r&&a>=c&&d>=l;case"intersect":return o+e.helperProportions.width/2>h&&u>r-e.helperProportions.width/2&&a+e.helperProportions.height/2>c&&d>l-e.helperProportions.height/2;case"pointer":return t(n.pageY,c,i.proportions().height)&&t(n.pageX,h,i.proportions().width);case"touch":return(a>=c&&d>=a||l>=c&&d>=l||c>a&&l>d)&&(o>=h&&u>=o||r>=h&&u>=r||h>o&&r>u);default:return!1}}}();t.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,i){var s,n,o=t.ui.ddmanager.droppables[e.options.scope]||[],a=i?i.type:null,r=(e.currentItem||e.element).find(":data(ui-droppable)").addBack();t:for(s=0;o.length>s;s++)if(!(o[s].options.disabled||e&&!o[s].accept.call(o[s].element[0],e.currentItem||e.element))){for(n=0;r.length>n;n++)if(r[n]===o[s].element[0]){o[s].proportions().height=0;continue t}o[s].visible="none"!==o[s].element.css("display"),o[s].visible&&("mousedown"===a&&o[s]._activate.call(o[s],i),o[s].offset=o[s].element.offset(),o[s].proportions({width:o[s].element[0].offsetWidth,height:o[s].element[0].offsetHeight}))}},drop:function(e,i){var s=!1;return t.each((t.ui.ddmanager.droppables[e.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&o(e,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(e,i){e.element.parentsUntil("body").on("scroll.droppable",function(){e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)})},drag:function(e,i){e.options.refreshPositions&&t.ui.ddmanager.prepareOffsets(e,i),t.each(t.ui.ddmanager.droppables[e.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,r=o(e,this,this.options.tolerance,i),l=!r&&this.isover?"isout":r&&!this.isover?"isover":null;l&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return t(this).droppable("instance").options.scope===n}),a.length&&(s=t(a[0]).droppable("instance"),s.greedyChild="isover"===l)),s&&"isover"===l&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[l]=!0,this["isout"===l?"isover":"isout"]=!1,this["isover"===l?"_over":"_out"].call(this,i),s&&"isout"===l&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(e,i){e.element.parentsUntil("body").off("scroll.droppable"),e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)}},t.uiBackCompat!==!1&&t.widget("ui.droppable",t.ui.droppable,{options:{hoverClass:!1,activeClass:!1},_addActiveClass:function(){this._super(),this.options.activeClass&&this.element.addClass(this.options.activeClass)},_removeActiveClass:function(){this._super(),this.options.activeClass&&this.element.removeClass(this.options.activeClass)},_addHoverClass:function(){this._super(),this.options.hoverClass&&this.element.addClass(this.options.hoverClass)},_removeHoverClass:function(){this._super(),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass)}}),t.ui.droppable,t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
          ").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
          "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,l=this._change[o];return this._updatePrevProperties(),l?(i=l.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,l,h=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,l=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,h.animate||this.element.css(t.extend(a,{top:l,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!h.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,l=this.originalPosition.top+this.originalSize.height,h=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&h&&(t.left=r-e.minWidth),s&&h&&(t.left=r-e.maxWidth),a&&c&&(t.top=l-e.minHeight),n&&c&&(t.top=l-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
          "),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,l={width:i.size.width-r,height:i.size.height-a},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(l,c&&h?{top:c,left:h}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,l=t(this).resizable("instance"),h=l.options,c=l.element,u=h.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(l.containerElement=t(d),/document/.test(u)||u===document?(l.containerOffset={left:0,top:0},l.containerPosition={left:0,top:0},l.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=l._num(e.css("padding"+s))}),l.containerOffset=e.offset(),l.containerPosition=e.position(),l.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=l.containerOffset,n=l.containerSize.height,o=l.containerSize.width,a=l._hasScroll(d,"left")?d.scrollWidth:o,r=l._hasScroll(d)?d.scrollHeight:n,l.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,l=a.containerOffset,h=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=l),h.left<(a._helper?l.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-l.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?l.left:0),h.top<(a._helper?l.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-l.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?l.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-l.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-l.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),l=a.outerWidth()-e.sizeDiff.width,h=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:l,height:h}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:l,height:h})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,l="number"==typeof s.grid?[s.grid,s.grid]:s.grid,h=l[0]||1,c=l[1]||1,u=Math.round((n.width-o.width)/h)*h,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,g=s.maxWidth&&p>s.maxWidth,m=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=l,_&&(p+=h),v&&(f+=c),g&&(p-=h),m&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-h)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-h>0?(i.size.width=p,i.position.left=a.left-u):(p=h-e.width,i.size.width=p,i.position.left=a.left+o.width-p)) +}}),t.ui.resizable,t.widget("ui.selectable",t.ui.mouse,{version:"1.12.1",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var e=this;this._addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){e.elementPos=t(e.element[0]).offset(),e.selectees=t(e.options.filter,e.element[0]),e._addClass(e.selectees,"ui-selectee"),e.selectees.each(function(){var i=t(this),s=i.offset(),n={left:s.left-e.elementPos.left,top:s.top-e.elementPos.top};t.data(this,"selectable-item",{element:this,$element:i,left:n.left,top:n.top,right:n.left+i.outerWidth(),bottom:n.top+i.outerHeight(),startselected:!1,selected:i.hasClass("ui-selected"),selecting:i.hasClass("ui-selecting"),unselecting:i.hasClass("ui-unselecting")})})},this.refresh(),this._mouseInit(),this.helper=t("
          "),this._addClass(this.helper,"ui-selectable-helper")},_destroy:function(){this.selectees.removeData("selectable-item"),this._mouseDestroy()},_mouseStart:function(e){var i=this,s=this.options;this.opos=[e.pageX,e.pageY],this.elementPos=t(this.element[0]).offset(),this.options.disabled||(this.selectees=t(s.filter,this.element[0]),this._trigger("start",e),t(s.appendTo).append(this.helper),this.helper.css({left:e.pageX,top:e.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=t.data(this,"selectable-item");s.startselected=!0,e.metaKey||e.ctrlKey||(i._removeClass(s.$element,"ui-selected"),s.selected=!1,i._addClass(s.$element,"ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",e,{unselecting:s.element}))}),t(e.target).parents().addBack().each(function(){var s,n=t.data(this,"selectable-item");return n?(s=!e.metaKey&&!e.ctrlKey||!n.$element.hasClass("ui-selected"),i._removeClass(n.$element,s?"ui-unselecting":"ui-selected")._addClass(n.$element,s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",e,{selecting:n.element}):i._trigger("unselecting",e,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(e){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,o=this.opos[0],a=this.opos[1],r=e.pageX,l=e.pageY;return o>r&&(i=r,r=o,o=i),a>l&&(i=l,l=a,a=i),this.helper.css({left:o,top:a,width:r-o,height:l-a}),this.selectees.each(function(){var i=t.data(this,"selectable-item"),h=!1,c={};i&&i.element!==s.element[0]&&(c.left=i.left+s.elementPos.left,c.right=i.right+s.elementPos.left,c.top=i.top+s.elementPos.top,c.bottom=i.bottom+s.elementPos.top,"touch"===n.tolerance?h=!(c.left>r||o>c.right||c.top>l||a>c.bottom):"fit"===n.tolerance&&(h=c.left>o&&r>c.right&&c.top>a&&l>c.bottom),h?(i.selected&&(s._removeClass(i.$element,"ui-selected"),i.selected=!1),i.unselecting&&(s._removeClass(i.$element,"ui-unselecting"),i.unselecting=!1),i.selecting||(s._addClass(i.$element,"ui-selecting"),i.selecting=!0,s._trigger("selecting",e,{selecting:i.element}))):(i.selecting&&((e.metaKey||e.ctrlKey)&&i.startselected?(s._removeClass(i.$element,"ui-selecting"),i.selecting=!1,s._addClass(i.$element,"ui-selected"),i.selected=!0):(s._removeClass(i.$element,"ui-selecting"),i.selecting=!1,i.startselected&&(s._addClass(i.$element,"ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",e,{unselecting:i.element}))),i.selected&&(e.metaKey||e.ctrlKey||i.startselected||(s._removeClass(i.$element,"ui-selected"),i.selected=!1,s._addClass(i.$element,"ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",e,{unselecting:i.element})))))}),!1}},_mouseStop:function(e){var i=this;return this.dragged=!1,t(".ui-unselecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");i._removeClass(s.$element,"ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",e,{unselected:s.element})}),t(".ui-selecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");i._removeClass(s.$element,"ui-selecting")._addClass(s.$element,"ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",e,{selected:s.element})}),this._trigger("stop",e),this.helper.remove(),!1}}),t.widget("ui.sortable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return t>=e&&e+i>t},_isFloating:function(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))},_create:function(){this.containerCache={},this._addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),"handle"===t&&this._setHandleClassName()},_setHandleClassName:function(){var e=this;this._removeClass(this.element.find(".ui-sortable-handle"),"ui-sortable-handle"),t.each(this.items,function(){e._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,"ui-sortable-handle")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):void 0}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp(new t.Event("mouseup",{target:null})),"original"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,l=r+t.height,h=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+h>r&&l>s+h,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&l>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var e,i,s="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),n="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width),o=s&&n;return o?(e=this._getDragVerticalDirection(),i=this._getDragHorizontalDirection(),this.floating?"right"===i||"down"===e?2:1:e&&("down"===e?2:1)):!1},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&e||"up"===s&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){r.push(this)}var s,n,o,a,r=[],l=[],h=this._connectWith();if(h&&e)for(s=h.length-1;s>=0;s--)for(o=t(h[s],this.document[0]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&l.push([t.isFunction(a.options.items)?a.options.items.call(a.element):t(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a]);for(l.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=l.length-1;s>=0;s--)l[s][0].each(i);return t(r)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,l,h,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i],this.document[0]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,h=r.length;h>s;s++)l=t(r[s]),l.data(this.widgetName+"-item",a),c.push({item:l,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]);return e._addClass(n,"ui-sortable-placeholder",i||e.currentItem[0].className)._removeClass(n,"ui-sortable-helper"),"tbody"===s?e._createTrPlaceholder(e.currentItem.find("tr").eq(0),t("",e.document[0]).appendTo(n)):"tr"===s?e._createTrPlaceholder(e.currentItem,n):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_createTrPlaceholder:function(e,i){var s=this;e.children().each(function(){t(" ",s.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(e){var i,s,n,o,a,r,l,h,c,u,d=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!t.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(d&&t.contains(this.containers[i].element[0],d.element[0]))continue;d=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",e,this._uiHash(this)),this.containers[i].containerCache.over=0);if(d)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,o=null,c=d.floating||this._isFloating(this.currentItem),a=c?"left":"top",r=c?"width":"height",u=c?"pageX":"pageY",s=this.items.length-1;s>=0;s--)t.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(l=this.items[s].item.offset()[a],h=!1,e[u]-l>this.items[s][r]/2&&(h=!0),n>Math.abs(e[u]-l)&&(n=Math.abs(e[u]-l),o=this.items[s],this.direction=h?"up":"down"));if(!o&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;o?this._rearrange(e,o,null,!0):this._rearrange(e,null,this.containers[p].element,!0),this._trigger("change",e,this._uiHash()),this.containers[p]._trigger("change",e,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,l=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.leftthis.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():l?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():l?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){function i(t,e,i){return function(s){i._trigger(t,s,e._uiHash(e))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&n.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||n.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(n.push(function(t){this._trigger("remove",t,this._uiHash())}),n.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)e||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}})}); \ No newline at end of file diff --git a/public/assets/vendors/custom/jqvmap/jqvmap.bundle.css b/public/assets/vendors/custom/jqvmap/jqvmap.bundle.css new file mode 100644 index 00000000..2a774a0f --- /dev/null +++ b/public/assets/vendors/custom/jqvmap/jqvmap.bundle.css @@ -0,0 +1,43 @@ +.jqvmap-label { + position: absolute; + display: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + background: #292929; + color: white; + font-family: sans-serif, Verdana; + font-size: smaller; + padding: 3px; + pointer-events: none; } + +.jqvmap-pin { + pointer-events: none; } + +.jqvmap-zoomin, .jqvmap-zoomout { + position: absolute; + left: 10px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + background: #000000; + padding: 3px; + color: white; + width: 10px; + height: 10px; + cursor: pointer; + line-height: 10px; + text-align: center; } + +.jqvmap-zoomin { + top: 10px; } + +.jqvmap-zoomout { + top: 30px; } + +.jqvmap-region { + cursor: pointer; } + +.jqvmap-ajax_response { + width: 100%; + height: 500px; } diff --git a/public/assets/vendors/custom/jqvmap/jqvmap.bundle.js b/public/assets/vendors/custom/jqvmap/jqvmap.bundle.js new file mode 100644 index 00000000..f7947828 --- /dev/null +++ b/public/assets/vendors/custom/jqvmap/jqvmap.bundle.js @@ -0,0 +1,1296 @@ +/*! + * JQVMap: jQuery Vector Map Library + * @author JQVMap + * @version 1.5.0 + * @link http://jqvmap.com + * @license https://github.com/manifestinteractive/jqvmap/blob/master/LICENSE + * @builddate 2016/03/15 + */ + +var VectorCanvas = function (width, height, params) { + this.mode = window.SVGAngle ? 'svg' : 'vml'; + this.params = params; + + if (this.mode === 'svg') { + this.createSvgNode = function (nodeName) { + return document.createElementNS(this.svgns, nodeName); + }; + } else { + try { + if (!document.namespaces.rvml) { + document.namespaces.add('rvml', 'urn:schemas-microsoft-com:vml'); + } + this.createVmlNode = function (tagName) { + return document.createElement(''); + }; + } catch (e) { + this.createVmlNode = function (tagName) { + return document.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">'); + }; + } + + document.createStyleSheet().addRule('.rvml', 'behavior:url(#default#VML)'); + } + + if (this.mode === 'svg') { + this.canvas = this.createSvgNode('svg'); + } else { + this.canvas = this.createVmlNode('group'); + this.canvas.style.position = 'absolute'; + } + + this.setSize(width, height); +}; + +VectorCanvas.prototype = { + svgns: 'http://www.w3.org/2000/svg', + mode: 'svg', + width: 0, + height: 0, + canvas: null +}; + +var ColorScale = function (colors, normalizeFunction, minValue, maxValue) { + if (colors) { + this.setColors(colors); + } + if (normalizeFunction) { + this.setNormalizeFunction(normalizeFunction); + } + if (minValue) { + this.setMin(minValue); + } + if (minValue) { + this.setMax(maxValue); + } +}; + +ColorScale.prototype = { + colors: [] +}; + +var JQVMap = function (params) { + params = params || {}; + var map = this; + var mapData = JQVMap.maps[params.map]; + var mapPins; + + if( !mapData){ + throw new Error('Invalid "' + params.map + '" map parameter. Please make sure you have loaded this map file in your HTML.'); + } + + this.selectedRegions = []; + this.multiSelectRegion = params.multiSelectRegion; + + this.container = params.container; + + this.defaultWidth = mapData.width; + this.defaultHeight = mapData.height; + + this.color = params.color; + this.selectedColor = params.selectedColor; + this.hoverColor = params.hoverColor; + this.hoverColors = params.hoverColors; + this.hoverOpacity = params.hoverOpacity; + this.setBackgroundColor(params.backgroundColor); + + this.width = params.container.width(); + this.height = params.container.height(); + + this.resize(); + + jQuery(window).resize(function () { + var newWidth = params.container.width(); + var newHeight = params.container.height(); + + if(newWidth && newHeight){ + map.width = newWidth; + map.height = newHeight; + map.resize(); + map.canvas.setSize(map.width, map.height); + map.applyTransform(); + + var resizeEvent = jQuery.Event('resize.jqvmap'); + jQuery(params.container).trigger(resizeEvent, [newWidth, newHeight]); + + if(mapPins){ + jQuery('.jqvmap-pin').remove(); + map.pinHandlers = false; + map.placePins(mapPins.pins, mapPins.mode); + } + } + }); + + this.canvas = new VectorCanvas(this.width, this.height, params); + params.container.append(this.canvas.canvas); + + this.makeDraggable(); + + this.rootGroup = this.canvas.createGroup(true); + + this.index = JQVMap.mapIndex; + this.label = jQuery('
          ').addClass('jqvmap-label').appendTo(jQuery('body')).hide(); + + if (params.enableZoom) { + jQuery('
          ').addClass('jqvmap-zoomin').text('+').appendTo(params.container); + jQuery('
          ').addClass('jqvmap-zoomout').html('−').appendTo(params.container); + } + + map.countries = []; + + for (var key in mapData.paths) { + var path = this.canvas.createPath({ + path: mapData.paths[key].path + }); + + path.setFill(this.color); + path.id = map.getCountryId(key); + map.countries[key] = path; + + if (this.canvas.mode === 'svg') { + path.setAttribute('class', 'jqvmap-region'); + } else { + jQuery(path).addClass('jqvmap-region'); + } + + jQuery(this.rootGroup).append(path); + } + + jQuery(params.container).delegate(this.canvas.mode === 'svg' ? 'path' : 'shape', 'mouseover mouseout', function (e) { + var containerPath = e.target, + code = e.target.id.split('_').pop(), + labelShowEvent = jQuery.Event('labelShow.jqvmap'), + regionMouseOverEvent = jQuery.Event('regionMouseOver.jqvmap'); + + code = code.toLowerCase(); + + if (e.type === 'mouseover') { + jQuery(params.container).trigger(regionMouseOverEvent, [code, mapData.paths[code].name]); + if (!regionMouseOverEvent.isDefaultPrevented()) { + map.highlight(code, containerPath); + } + if (params.showTooltip) { + map.label.text(mapData.paths[code].name); + jQuery(params.container).trigger(labelShowEvent, [map.label, code]); + + if (!labelShowEvent.isDefaultPrevented()) { + map.label.show(); + map.labelWidth = map.label.width(); + map.labelHeight = map.label.height(); + } + } + } else { + map.unhighlight(code, containerPath); + + map.label.hide(); + jQuery(params.container).trigger('regionMouseOut.jqvmap', [code, mapData.paths[code].name]); + } + }); + + jQuery(params.container).delegate(this.canvas.mode === 'svg' ? 'path' : 'shape', 'click', function (regionClickEvent) { + + var targetPath = regionClickEvent.target; + var code = regionClickEvent.target.id.split('_').pop(); + var mapClickEvent = jQuery.Event('regionClick.jqvmap'); + + code = code.toLowerCase(); + + jQuery(params.container).trigger(mapClickEvent, [code, mapData.paths[code].name]); + + if ( !params.multiSelectRegion && !mapClickEvent.isDefaultPrevented()) { + for (var keyPath in mapData.paths) { + map.countries[keyPath].currentFillColor = map.countries[keyPath].getOriginalFill(); + map.countries[keyPath].setFill(map.countries[keyPath].getOriginalFill()); + } + } + + if ( !mapClickEvent.isDefaultPrevented()) { + if (map.isSelected(code)) { + map.deselect(code, targetPath); + } else { + map.select(code, targetPath); + } + } + }); + + if (params.showTooltip) { + params.container.mousemove(function (e) { + if (map.label.is(':visible')) { + var left = e.pageX - 15 - map.labelWidth; + var top = e.pageY - 15 - map.labelHeight; + + if(left < 0) { + left = e.pageX + 15; + } + if(top < 0) { + top = e.pageY + 15; + } + + map.label.css({ + left: left, + top: top + }); + } + }); + } + + this.setColors(params.colors); + + this.canvas.canvas.appendChild(this.rootGroup); + + this.applyTransform(); + + this.colorScale = new ColorScale(params.scaleColors, params.normalizeFunction, params.valueMin, params.valueMax); + + if (params.values) { + this.values = params.values; + this.setValues(params.values); + } + + if (params.selectedRegions) { + if (params.selectedRegions instanceof Array) { + for(var k in params.selectedRegions) { + this.select(params.selectedRegions[k].toLowerCase()); + } + } else { + this.select(params.selectedRegions.toLowerCase()); + } + } + + this.bindZoomButtons(); + + if(params.pins) { + mapPins = { + pins: params.pins, + mode: params.pinMode + }; + + this.pinHandlers = false; + this.placePins(params.pins, params.pinMode); + } + + if(params.showLabels){ + this.pinHandlers = false; + + var pins = {}; + for (key in map.countries){ + if (typeof map.countries[key] !== 'function') { + if( !params.pins || !params.pins[key] ){ + pins[key] = key.toUpperCase(); + } + } + } + + mapPins = { + pins: pins, + mode: 'content' + }; + + this.placePins(pins, 'content'); + } + + JQVMap.mapIndex++; +}; + +JQVMap.prototype = { + transX: 0, + transY: 0, + scale: 1, + baseTransX: 0, + baseTransY: 0, + baseScale: 1, + width: 0, + height: 0, + countries: {}, + countriesColors: {}, + countriesData: {}, + zoomStep: 1.4, + zoomMaxStep: 4, + zoomCurStep: 1 +}; + +JQVMap.xlink = 'http://www.w3.org/1999/xlink'; +JQVMap.mapIndex = 1; +JQVMap.maps = {}; + +(function(){ + + var apiParams = { + colors: 1, + values: 1, + backgroundColor: 1, + scaleColors: 1, + normalizeFunction: 1, + enableZoom: 1, + showTooltip: 1, + borderColor: 1, + borderWidth: 1, + borderOpacity: 1, + selectedRegions: 1, + multiSelectRegion: 1 + }; + + var apiEvents = { + onLabelShow: 'labelShow', + onLoad: 'load', + onRegionOver: 'regionMouseOver', + onRegionOut: 'regionMouseOut', + onRegionClick: 'regionClick', + onRegionSelect: 'regionSelect', + onRegionDeselect: 'regionDeselect', + onResize: 'resize' + }; + + jQuery.fn.vectorMap = function (options) { + + var defaultParams = { + map: 'world_en', + backgroundColor: '#a5bfdd', + color: '#f4f3f0', + hoverColor: '#c9dfaf', + hoverColors: {}, + selectedColor: '#c9dfaf', + scaleColors: ['#b6d6ff', '#005ace'], + normalizeFunction: 'linear', + enableZoom: true, + showTooltip: true, + borderColor: '#818181', + borderWidth: 1, + borderOpacity: 0.25, + selectedRegions: null, + multiSelectRegion: false + }, map = this.data('mapObject'); + + if (options === 'addMap') { + JQVMap.maps[arguments[1]] = arguments[2]; + } else if (options === 'set' && apiParams[arguments[1]]) { + map['set' + arguments[1].charAt(0).toUpperCase() + arguments[1].substr(1)].apply(map, Array.prototype.slice.call(arguments, 2)); + } else if (typeof options === 'string' && + typeof map[options] === 'function') { + return map[options].apply(map, Array.prototype.slice.call(arguments, 1)); + } else { + jQuery.extend(defaultParams, options); + defaultParams.container = this; + this.css({ position: 'relative', overflow: 'hidden' }); + + map = new JQVMap(defaultParams); + + this.data('mapObject', map); + + this.unbind('.jqvmap'); + + for (var e in apiEvents) { + if (defaultParams[e]) { + this.bind(apiEvents[e] + '.jqvmap', defaultParams[e]); + } + } + + var loadEvent = jQuery.Event('load.jqvmap'); + jQuery(defaultParams.container).trigger(loadEvent, map); + + return map; + } + }; + +})(jQuery); + +ColorScale.arrayToRgb = function (ar) { + var rgb = '#'; + var d; + for (var i = 0; i < ar.length; i++) { + d = ar[i].toString(16); + rgb += d.length === 1 ? '0' + d : d; + } + return rgb; +}; + +ColorScale.prototype.getColor = function (value) { + if (typeof this.normalize === 'function') { + value = this.normalize(value); + } + + var lengthes = []; + var fullLength = 0; + var l; + + for (var i = 0; i < this.colors.length - 1; i++) { + l = this.vectorLength(this.vectorSubtract(this.colors[i + 1], this.colors[i])); + lengthes.push(l); + fullLength += l; + } + + var c = (this.maxValue - this.minValue) / fullLength; + + for (i = 0; i < lengthes.length; i++) { + lengthes[i] *= c; + } + + i = 0; + value -= this.minValue; + + while (value - lengthes[i] >= 0) { + value -= lengthes[i]; + i++; + } + + var color; + if (i === this.colors.length - 1) { + color = this.vectorToNum(this.colors[i]).toString(16); + } else { + color = (this.vectorToNum(this.vectorAdd(this.colors[i], this.vectorMult(this.vectorSubtract(this.colors[i + 1], this.colors[i]), (value) / (lengthes[i]))))).toString(16); + } + + while (color.length < 6) { + color = '0' + color; + } + return '#' + color; +}; + +ColorScale.rgbToArray = function (rgb) { + rgb = rgb.substr(1); + return [parseInt(rgb.substr(0, 2), 16), parseInt(rgb.substr(2, 2), 16), parseInt(rgb.substr(4, 2), 16)]; +}; + +ColorScale.prototype.setColors = function (colors) { + for (var i = 0; i < colors.length; i++) { + colors[i] = ColorScale.rgbToArray(colors[i]); + } + this.colors = colors; +}; + +ColorScale.prototype.setMax = function (max) { + this.clearMaxValue = max; + if (typeof this.normalize === 'function') { + this.maxValue = this.normalize(max); + } else { + this.maxValue = max; + } +}; + +ColorScale.prototype.setMin = function (min) { + this.clearMinValue = min; + + if (typeof this.normalize === 'function') { + this.minValue = this.normalize(min); + } else { + this.minValue = min; + } +}; + +ColorScale.prototype.setNormalizeFunction = function (f) { + if (f === 'polynomial') { + this.normalize = function (value) { + return Math.pow(value, 0.2); + }; + } else if (f === 'linear') { + delete this.normalize; + } else { + this.normalize = f; + } + this.setMin(this.clearMinValue); + this.setMax(this.clearMaxValue); +}; + +ColorScale.prototype.vectorAdd = function (vector1, vector2) { + var vector = []; + for (var i = 0; i < vector1.length; i++) { + vector[i] = vector1[i] + vector2[i]; + } + return vector; +}; + +ColorScale.prototype.vectorLength = function (vector) { + var result = 0; + for (var i = 0; i < vector.length; i++) { + result += vector[i] * vector[i]; + } + return Math.sqrt(result); +}; + +ColorScale.prototype.vectorMult = function (vector, num) { + var result = []; + for (var i = 0; i < vector.length; i++) { + result[i] = vector[i] * num; + } + return result; +}; + +ColorScale.prototype.vectorSubtract = function (vector1, vector2) { + var vector = []; + for (var i = 0; i < vector1.length; i++) { + vector[i] = vector1[i] - vector2[i]; + } + return vector; +}; + +ColorScale.prototype.vectorToNum = function (vector) { + var num = 0; + for (var i = 0; i < vector.length; i++) { + num += Math.round(vector[i]) * Math.pow(256, vector.length - i - 1); + } + return num; +}; + +JQVMap.prototype.applyTransform = function () { + var maxTransX, maxTransY, minTransX, minTransY; + if (this.defaultWidth * this.scale <= this.width) { + maxTransX = (this.width - this.defaultWidth * this.scale) / (2 * this.scale); + minTransX = (this.width - this.defaultWidth * this.scale) / (2 * this.scale); + } else { + maxTransX = 0; + minTransX = (this.width - this.defaultWidth * this.scale) / this.scale; + } + + if (this.defaultHeight * this.scale <= this.height) { + maxTransY = (this.height - this.defaultHeight * this.scale) / (2 * this.scale); + minTransY = (this.height - this.defaultHeight * this.scale) / (2 * this.scale); + } else { + maxTransY = 0; + minTransY = (this.height - this.defaultHeight * this.scale) / this.scale; + } + + if (this.transY > maxTransY) { + this.transY = maxTransY; + } else if (this.transY < minTransY) { + this.transY = minTransY; + } + if (this.transX > maxTransX) { + this.transX = maxTransX; + } else if (this.transX < minTransX) { + this.transX = minTransX; + } + + this.canvas.applyTransformParams(this.scale, this.transX, this.transY); +}; + +JQVMap.prototype.bindZoomButtons = function () { + var map = this; + this.container.find('.jqvmap-zoomin').click(function(){ + map.zoomIn(); + }); + this.container.find('.jqvmap-zoomout').click(function(){ + map.zoomOut(); + }); +}; + +JQVMap.prototype.deselect = function (cc, path) { + cc = cc.toLowerCase(); + path = path || jQuery('#' + this.getCountryId(cc))[0]; + + if (this.isSelected(cc)) { + this.selectedRegions.splice(this.selectIndex(cc), 1); + + jQuery(this.container).trigger('regionDeselect.jqvmap', [cc]); + path.currentFillColor = path.getOriginalFill(); + path.setFill(path.getOriginalFill()); + } else { + for (var key in this.countries) { + this.selectedRegions.splice(this.selectedRegions.indexOf(key), 1); + this.countries[key].currentFillColor = this.color; + this.countries[key].setFill(this.color); + } + } +}; + +JQVMap.prototype.getCountryId = function (cc) { + return 'jqvmap' + this.index + '_' + cc; +}; + +JQVMap.prototype.getPin = function(cc){ + var pinObj = jQuery('#' + this.getPinId(cc)); + return pinObj.html(); +}; + +JQVMap.prototype.getPinId = function (cc) { + return this.getCountryId(cc) + '_pin'; +}; + +JQVMap.prototype.getPins = function(){ + var pins = this.container.find('.jqvmap-pin'); + var ret = {}; + jQuery.each(pins, function(index, pinObj){ + pinObj = jQuery(pinObj); + var cc = pinObj.attr('for').toLowerCase(); + var pinContent = pinObj.html(); + ret[cc] = pinContent; + }); + return JSON.stringify(ret); +}; + +JQVMap.prototype.highlight = function (cc, path) { + path = path || jQuery('#' + this.getCountryId(cc))[0]; + if (this.hoverOpacity) { + path.setOpacity(this.hoverOpacity); + } else if (this.hoverColors && (cc in this.hoverColors)) { + path.currentFillColor = path.getFill() + ''; + path.setFill(this.hoverColors[cc]); + } else if (this.hoverColor) { + path.currentFillColor = path.getFill() + ''; + path.setFill(this.hoverColor); + } +}; + +JQVMap.prototype.isSelected = function(cc) { + return this.selectIndex(cc) >= 0; +}; + +JQVMap.prototype.makeDraggable = function () { + var mouseDown = false; + var oldPageX, oldPageY; + var self = this; + + self.isMoving = false; + self.isMovingTimeout = false; + + var lastTouchCount; + var touchCenterX; + var touchCenterY; + var touchStartDistance; + var touchStartScale; + var touchX; + var touchY; + + this.container.mousemove(function (e) { + + if (mouseDown) { + self.transX -= (oldPageX - e.pageX) / self.scale; + self.transY -= (oldPageY - e.pageY) / self.scale; + + self.applyTransform(); + + oldPageX = e.pageX; + oldPageY = e.pageY; + + self.isMoving = true; + if (self.isMovingTimeout) { + clearTimeout(self.isMovingTimeout); + } + + self.container.trigger('drag'); + } + + return false; + + }).mousedown(function (e) { + + mouseDown = true; + oldPageX = e.pageX; + oldPageY = e.pageY; + + return false; + + }).mouseup(function () { + + mouseDown = false; + + clearTimeout(self.isMovingTimeout); + self.isMovingTimeout = setTimeout(function () { + self.isMoving = false; + }, 100); + + return false; + + }).mouseout(function () { + + if(mouseDown && self.isMoving){ + + clearTimeout(self.isMovingTimeout); + self.isMovingTimeout = setTimeout(function () { + mouseDown = false; + self.isMoving = false; + }, 100); + + return false; + } + }); + + jQuery(this.container).bind('touchmove', function (e) { + + var offset; + var scale; + var touches = e.originalEvent.touches; + var transformXOld; + var transformYOld; + + if (touches.length === 1) { + if (lastTouchCount === 1) { + + if(touchX === touches[0].pageX && touchY === touches[0].pageY){ + return; + } + + transformXOld = self.transX; + transformYOld = self.transY; + + self.transX -= (touchX - touches[0].pageX) / self.scale; + self.transY -= (touchY - touches[0].pageY) / self.scale; + + self.applyTransform(); + + if (transformXOld !== self.transX || transformYOld !== self.transY) { + e.preventDefault(); + } + + self.isMoving = true; + if (self.isMovingTimeout) { + clearTimeout(self.isMovingTimeout); + } + } + + touchX = touches[0].pageX; + touchY = touches[0].pageY; + + } else if (touches.length === 2) { + + if (lastTouchCount === 2) { + scale = Math.sqrt( + Math.pow(touches[0].pageX - touches[1].pageX, 2) + + Math.pow(touches[0].pageY - touches[1].pageY, 2) + ) / touchStartDistance; + + self.setScale( + touchStartScale * scale, + touchCenterX, + touchCenterY + ); + + e.preventDefault(); + + } else { + + offset = jQuery(self.container).offset(); + if (touches[0].pageX > touches[1].pageX) { + touchCenterX = touches[1].pageX + (touches[0].pageX - touches[1].pageX) / 2; + } else { + touchCenterX = touches[0].pageX + (touches[1].pageX - touches[0].pageX) / 2; + } + + if (touches[0].pageY > touches[1].pageY) { + touchCenterY = touches[1].pageY + (touches[0].pageY - touches[1].pageY) / 2; + } else { + touchCenterY = touches[0].pageY + (touches[1].pageY - touches[0].pageY) / 2; + } + + touchCenterX -= offset.left; + touchCenterY -= offset.top; + touchStartScale = self.scale; + + touchStartDistance = Math.sqrt( + Math.pow(touches[0].pageX - touches[1].pageX, 2) + + Math.pow(touches[0].pageY - touches[1].pageY, 2) + ); + } + } + + lastTouchCount = touches.length; + }); + + jQuery(this.container).bind('touchstart', function () { + lastTouchCount = 0; + }); + + jQuery(this.container).bind('touchend', function () { + lastTouchCount = 0; + }); +}; + +JQVMap.prototype.placePins = function(pins, pinMode){ + var map = this; + + if(!pinMode || (pinMode !== 'content' && pinMode !== 'id')) { + pinMode = 'content'; + } + + if(pinMode === 'content') {//treat pin as content + jQuery.each(pins, function(index, pin){ + if(jQuery('#' + map.getCountryId(index)).length === 0){ + return; + } + + var pinIndex = map.getPinId(index); + var $pin = jQuery('#' + pinIndex); + if($pin.length > 0){ + $pin.remove(); + } + map.container.append('
          ' + pin + '
          '); + }); + } else { //treat pin as id of an html content + jQuery.each(pins, function(index, pin){ + if(jQuery('#' + map.getCountryId(index)).length === 0){ + return; + } + var pinIndex = map.getPinId(index); + var $pin = jQuery('#' + pinIndex); + if($pin.length > 0){ + $pin.remove(); + } + map.container.append('
          '); + $pin.append(jQuery('#' + pin)); + }); + } + + this.positionPins(); + if(!this.pinHandlers){ + this.pinHandlers = true; + var positionFix = function(){ + map.positionPins(); + }; + this.container.bind('zoomIn', positionFix) + .bind('zoomOut', positionFix) + .bind('drag', positionFix); + } +}; + +JQVMap.prototype.positionPins = function(){ + var map = this; + var pins = this.container.find('.jqvmap-pin'); + jQuery.each(pins, function(index, pinObj){ + pinObj = jQuery(pinObj); + var countryId = map.getCountryId(pinObj.attr('for').toLowerCase()); + var countryObj = jQuery('#' + countryId); + + var bbox = document.getElementById(countryId).getBBox(); + var position = countryObj.position(); + + var scale = map.scale; + + var left = position.left + (bbox.width / 2) * scale - pinObj.width() / 2, + top = position.top + (bbox.height / 2) * scale - pinObj.height() / 2; + + pinObj.css('left', left).css('top', top); + }); +}; + +JQVMap.prototype.removePin = function(cc) { + cc = cc.toLowerCase(); + jQuery('#' + this.getPinId(cc)).remove(); +}; + +JQVMap.prototype.removePins = function(){ + this.container.find('.jqvmap-pin').remove(); +}; + +JQVMap.prototype.reset = function () { + for (var key in this.countries) { + this.countries[key].setFill(this.color); + } + this.scale = this.baseScale; + this.transX = this.baseTransX; + this.transY = this.baseTransY; + this.applyTransform(); +}; + +JQVMap.prototype.resize = function () { + var curBaseScale = this.baseScale; + if (this.width / this.height > this.defaultWidth / this.defaultHeight) { + this.baseScale = this.height / this.defaultHeight; + this.baseTransX = Math.abs(this.width - this.defaultWidth * this.baseScale) / (2 * this.baseScale); + } else { + this.baseScale = this.width / this.defaultWidth; + this.baseTransY = Math.abs(this.height - this.defaultHeight * this.baseScale) / (2 * this.baseScale); + } + this.scale *= this.baseScale / curBaseScale; + this.transX *= this.baseScale / curBaseScale; + this.transY *= this.baseScale / curBaseScale; +}; + +JQVMap.prototype.select = function (cc, path) { + cc = cc.toLowerCase(); + path = path || jQuery('#' + this.getCountryId(cc))[0]; + + if (!this.isSelected(cc)) { + if (this.multiSelectRegion) { + this.selectedRegions.push(cc); + } else { + this.selectedRegions = [cc]; + } + + jQuery(this.container).trigger('regionSelect.jqvmap', [cc]); + if (this.selectedColor && path) { + path.currentFillColor = this.selectedColor; + path.setFill(this.selectedColor); + } + } +}; + +JQVMap.prototype.selectIndex = function (cc) { + cc = cc.toLowerCase(); + for (var i = 0; i < this.selectedRegions.length; i++) { + if (cc === this.selectedRegions[i]) { + return i; + } + } + return -1; +}; + +JQVMap.prototype.setBackgroundColor = function (backgroundColor) { + this.container.css('background-color', backgroundColor); +}; + +JQVMap.prototype.setColors = function (key, color) { + if (typeof key === 'string') { + this.countries[key].setFill(color); + this.countries[key].setAttribute('original', color); + } else { + var colors = key; + + for (var code in colors) { + if (this.countries[code]) { + this.countries[code].setFill(colors[code]); + this.countries[code].setAttribute('original', colors[code]); + } + } + } +}; + +JQVMap.prototype.setNormalizeFunction = function (f) { + this.colorScale.setNormalizeFunction(f); + + if (this.values) { + this.setValues(this.values); + } +}; + +JQVMap.prototype.setScale = function (scale) { + this.scale = scale; + this.applyTransform(); +}; + +JQVMap.prototype.setScaleColors = function (colors) { + this.colorScale.setColors(colors); + + if (this.values) { + this.setValues(this.values); + } +}; + +JQVMap.prototype.setValues = function (values) { + var max = 0, + min = Number.MAX_VALUE, + val; + + for (var cc in values) { + cc = cc.toLowerCase(); + val = parseFloat(values[cc]); + + if (isNaN(val)) { + continue; + } + if (val > max) { + max = values[cc]; + } + if (val < min) { + min = val; + } + } + + if (min === max) { + max++; + } + + this.colorScale.setMin(min); + this.colorScale.setMax(max); + + var colors = {}; + for (cc in values) { + cc = cc.toLowerCase(); + val = parseFloat(values[cc]); + colors[cc] = isNaN(val) ? this.color : this.colorScale.getColor(val); + } + this.setColors(colors); + this.values = values; +}; + +JQVMap.prototype.unhighlight = function (cc, path) { + cc = cc.toLowerCase(); + path = path || jQuery('#' + this.getCountryId(cc))[0]; + path.setOpacity(1); + if (path.currentFillColor) { + path.setFill(path.currentFillColor); + } +}; + +JQVMap.prototype.zoomIn = function () { + var map = this; + var sliderDelta = (jQuery('#zoom').innerHeight() - 6 * 2 - 15 * 2 - 3 * 2 - 7 - 6) / (this.zoomMaxStep - this.zoomCurStep); + + if (map.zoomCurStep < map.zoomMaxStep) { + map.transX -= (map.width / map.scale - map.width / (map.scale * map.zoomStep)) / 2; + map.transY -= (map.height / map.scale - map.height / (map.scale * map.zoomStep)) / 2; + map.setScale(map.scale * map.zoomStep); + map.zoomCurStep++; + + var $slider = jQuery('#zoomSlider'); + + $slider.css('top', parseInt($slider.css('top'), 10) - sliderDelta); + + map.container.trigger('zoomIn'); + } +}; + +JQVMap.prototype.zoomOut = function () { + var map = this; + var sliderDelta = (jQuery('#zoom').innerHeight() - 6 * 2 - 15 * 2 - 3 * 2 - 7 - 6) / (this.zoomMaxStep - this.zoomCurStep); + + if (map.zoomCurStep > 1) { + map.transX += (map.width / (map.scale / map.zoomStep) - map.width / map.scale) / 2; + map.transY += (map.height / (map.scale / map.zoomStep) - map.height / map.scale) / 2; + map.setScale(map.scale / map.zoomStep); + map.zoomCurStep--; + + var $slider = jQuery('#zoomSlider'); + + $slider.css('top', parseInt($slider.css('top'), 10) + sliderDelta); + + map.container.trigger('zoomOut'); + } +}; + +VectorCanvas.prototype.applyTransformParams = function (scale, transX, transY) { + if (this.mode === 'svg') { + this.rootGroup.setAttribute('transform', 'scale(' + scale + ') translate(' + transX + ', ' + transY + ')'); + } else { + this.rootGroup.coordorigin = (this.width - transX) + ',' + (this.height - transY); + this.rootGroup.coordsize = this.width / scale + ',' + this.height / scale; + } +}; + +VectorCanvas.prototype.createGroup = function (isRoot) { + var node; + if (this.mode === 'svg') { + node = this.createSvgNode('g'); + } else { + node = this.createVmlNode('group'); + node.style.width = this.width + 'px'; + node.style.height = this.height + 'px'; + node.style.left = '0px'; + node.style.top = '0px'; + node.coordorigin = '0 0'; + node.coordsize = this.width + ' ' + this.height; + } + + if (isRoot) { + this.rootGroup = node; + } + return node; +}; + +VectorCanvas.prototype.createPath = function (config) { + var node; + if (this.mode === 'svg') { + node = this.createSvgNode('path'); + node.setAttribute('d', config.path); + + if (this.params.borderColor !== null) { + node.setAttribute('stroke', this.params.borderColor); + } + if (this.params.borderWidth > 0) { + node.setAttribute('stroke-width', this.params.borderWidth); + node.setAttribute('stroke-linecap', 'round'); + node.setAttribute('stroke-linejoin', 'round'); + } + if (this.params.borderOpacity > 0) { + node.setAttribute('stroke-opacity', this.params.borderOpacity); + } + + node.setFill = function (color) { + this.setAttribute('fill', color); + if (this.getAttribute('original') === null) { + this.setAttribute('original', color); + } + }; + + node.getFill = function () { + return this.getAttribute('fill'); + }; + + node.getOriginalFill = function () { + return this.getAttribute('original'); + }; + + node.setOpacity = function (opacity) { + this.setAttribute('fill-opacity', opacity); + }; + } else { + node = this.createVmlNode('shape'); + node.coordorigin = '0 0'; + node.coordsize = this.width + ' ' + this.height; + node.style.width = this.width + 'px'; + node.style.height = this.height + 'px'; + node.fillcolor = JQVMap.defaultFillColor; + node.stroked = false; + node.path = VectorCanvas.pathSvgToVml(config.path); + + var scale = this.createVmlNode('skew'); + scale.on = true; + scale.matrix = '0.01,0,0,0.01,0,0'; + scale.offset = '0,0'; + + node.appendChild(scale); + + var fill = this.createVmlNode('fill'); + node.appendChild(fill); + + node.setFill = function (color) { + this.getElementsByTagName('fill')[0].color = color; + if (this.getAttribute('original') === null) { + this.setAttribute('original', color); + } + }; + + node.getFill = function () { + return this.getElementsByTagName('fill')[0].color; + }; + node.getOriginalFill = function () { + return this.getAttribute('original'); + }; + node.setOpacity = function (opacity) { + this.getElementsByTagName('fill')[0].opacity = parseInt(opacity * 100, 10) + '%'; + }; + } + return node; +}; + +VectorCanvas.prototype.pathSvgToVml = function (path) { + var result = ''; + var cx = 0, cy = 0, ctrlx, ctrly; + + return path.replace(/([MmLlHhVvCcSs])((?:-?(?:\d+)?(?:\.\d+)?,?\s?)+)/g, function (segment, letter, coords) { + coords = coords.replace(/(\d)-/g, '$1,-').replace(/\s+/g, ',').split(','); + if (!coords[0]) { + coords.shift(); + } + + for (var i = 0, l = coords.length; i < l; i++) { + coords[i] = Math.round(100 * coords[i]); + } + + switch (letter) { + case 'm': + cx += coords[0]; + cy += coords[1]; + result = 't' + coords.join(','); + break; + + case 'M': + cx = coords[0]; + cy = coords[1]; + result = 'm' + coords.join(','); + break; + + case 'l': + cx += coords[0]; + cy += coords[1]; + result = 'r' + coords.join(','); + break; + + case 'L': + cx = coords[0]; + cy = coords[1]; + result = 'l' + coords.join(','); + break; + + case 'h': + cx += coords[0]; + result = 'r' + coords[0] + ',0'; + break; + + case 'H': + cx = coords[0]; + result = 'l' + cx + ',' + cy; + break; + + case 'v': + cy += coords[0]; + result = 'r0,' + coords[0]; + break; + + case 'V': + cy = coords[0]; + result = 'l' + cx + ',' + cy; + break; + + case 'c': + ctrlx = cx + coords[coords.length - 4]; + ctrly = cy + coords[coords.length - 3]; + cx += coords[coords.length - 2]; + cy += coords[coords.length - 1]; + result = 'v' + coords.join(','); + break; + + case 'C': + ctrlx = coords[coords.length - 4]; + ctrly = coords[coords.length - 3]; + cx = coords[coords.length - 2]; + cy = coords[coords.length - 1]; + result = 'c' + coords.join(','); + break; + + case 's': + coords.unshift(cy - ctrly); + coords.unshift(cx - ctrlx); + ctrlx = cx + coords[coords.length - 4]; + ctrly = cy + coords[coords.length - 3]; + cx += coords[coords.length - 2]; + cy += coords[coords.length - 1]; + result = 'v' + coords.join(','); + break; + + case 'S': + coords.unshift(cy + cy - ctrly); + coords.unshift(cx + cx - ctrlx); + ctrlx = coords[coords.length - 4]; + ctrly = coords[coords.length - 3]; + cx = coords[coords.length - 2]; + cy = coords[coords.length - 1]; + result = 'c' + coords.join(','); + break; + + default: + break; + } + + return result; + + }).replace(/z/g, ''); +}; + +VectorCanvas.prototype.setSize = function (width, height) { + if (this.mode === 'svg') { + this.canvas.setAttribute('width', width); + this.canvas.setAttribute('height', height); + } else { + this.canvas.style.width = width + 'px'; + this.canvas.style.height = height + 'px'; + this.canvas.coordsize = width + ' ' + height; + this.canvas.coordorigin = '0 0'; + if (this.rootGroup) { + var paths = this.rootGroup.getElementsByTagName('shape'); + for (var i = 0, l = paths.length; i < l; i++) { + paths[i].coordsize = width + ' ' + height; + paths[i].style.width = width + 'px'; + paths[i].style.height = height + 'px'; + } + this.rootGroup.coordsize = width + ' ' + height; + this.rootGroup.style.width = width + 'px'; + this.rootGroup.style.height = height + 'px'; + } + } + this.width = width; + this.height = height; +}; + +/** Add Europe Map Data Points */ +jQuery.fn.vectorMap('addMap', 'europe_en', {"width":680,"height":520,"paths":{"gl":{"path":"M13.47,93.57C12.35,92.52 12.34,90 10.44,89.14 10.62,88.14 13.84,87.66 11.35,86.39 10.05,87.17 9.25,86.92 8.71,87.58 6.27,88.12 8.6,85.09 6.17,85.17 5.23,84.47 10.33,84.75 9.98,83.14 11.32,83.4 14.67,82.04 12.37,81.03 11.23,81.19 6.54,82.06 10.06,81.32 13.04,80.64 9.92,76.6 8.71,79.05 9.24,77.06 11.03,78.05 12.88,77.78 14.68,74.59 9.38,77.17 8.23,75.54 7.26,73.61 12.43,77.09 11.48,74.6c2.44,-0.76 -0.97,1.23 1.21,1.43 1,0.07 3.06,0.24 1.26,-0.8C15.39,74.51 14.27,73.05 14.04,72.76 16.26,70.08 9.73,69.39 11.65,72.54 9.43,70.77 7.4,69.72 5.62,68.37 4.84,67.27 3.62,65.14 5.75,64.54 6.27,63.17 3.83,63.23 6.08,62.64 8.52,60.62 3.8,58.38 3.79,56.87 4.78,56.07 3.39,53.57 4.92,55.82c2,1.48 -1.5,0.05 -0.41,1.67 0.7,1.18 4.94,4.58 4.09,1.22C7.96,57.37 6.11,57.21 8.09,56.47 5.75,56.14 4.83,52.58 8.11,53.61c1.58,0.65 2.17,-1 2.13,-1.24 1.86,-0.56 0.99,-3.89 0.14,-5.02 -2.29,-0.92 1.59,-2.34 -1.23,-2.91 0.6,-3.73 4.98,-2.29 7.51,-3.37 2.78,-1.33 -1.33,-1.73 -1.69,-3.06 -3.07,-1.99 2.8,-0.5 3.28,-2.76 2.87,0.22 -2.67,-2.82 -1.49,-3.84 1.34,0.59 4.57,3.1 4.27,-0.2C20.58,29.48 17.09,31.14 17.33,29.6c1.78,1.02 0.79,-3.69 2.33,-1.12 1.76,1.21 4.05,-0.81 1.11,-1.21 -0.72,-0.16 1.96,-1.91 2.18,-0.31 2.04,0.89 2.39,3.26 4.86,3.29 1.12,-1.58 -2.89,-2.38 -0.16,-2.31 1.35,-1.83 -5.03,-0.94 -1.14,-2.29 1.39,-1.55 1.81,4.29 2.64,1.36 -0.57,-1.39 -0.41,-4.67 1.53,-2.59 0.16,2.02 -2.74,3.73 -1.03,6.23 2.7,1.13 0.11,-4.85 3.69,-4.25 2.74,-0.7 0.37,-3.01 -1.39,-3.16 0.93,-1.59 -0.48,-0.52 -0.91,-1.1 -1.26,0.42 -2.63,-0.27 -1.15,-1.19 -0.81,-1.9 -3.85,0.74 -5.54,0.53 -3.44,0.64 1.14,-2.76 2.36,-3.3 2.28,-0.77 4.66,2.97 6.55,0.04C34.81,17.14 33.04,17.79 32.17,17.97 30.61,18.81 30.38,17.32 30.54,16.77 29.14,17.79 26.4,16.27 29.42,16.34 29.89,14.12 31.85,14.39 33.58,13.44c0.27,-2.21 -3.96,0.03 -1.92,-1.94 2.34,1.37 5.29,0.49 7.37,1.6 0.49,1.25 2.93,3.07 2.07,0.58C40.16,10.86 37.07,10.79 34.89,10.94 32.01,10.71 38.39,8.92 36.45,6.69 35.49,6.8 33.31,6.65 34.75,5.53c1.74,0.57 3.45,1.31 2.13,3.63 0.97,-0.77 3.6,0.14 4.92,-0.01C42.62,6.51 37.36,8.29 39.31,5.97 39.94,4.69 35.39,5.71 36.07,3.41c2.18,-0.52 6.21,0.1 8.48,1.64 1.78,-0.72 2.84,-0.23 4.07,0.55 1.73,-0.23 3.46,0.06 2.78,2.25C52.75,9.86 54.51,8.35 52.72,6.73 52.71,4.07 54.56,10.07 55.78,8.98 56.01,5.87 52.57,4.02 49.87,3.57 48.45,2.66 43.96,4.29 45.02,2.48 44.96,1.07 43.75,0.16 45.71,1.28 47.56,3.52 50.55,-0.47 53.01,0.78 55.13,-0.05 52.02,4.62 54.57,4.07 55.09,3.62 56.43,7.62 57.26,5.53 57.36,3.28 54.5,4.61 54.71,2.93 54.66,0.68 56.28,0.89 57.93,0.78 59.1,1.36 57.92,5.72 60.98,5.64 61.74,4.33 57.63,0.17 61.09,2.11 61.53,3.09 65.18,3.43 63.42,2.17 61.88,1.53 60.02,-0.12 62.69,1.24c1.18,0.74 1.27,-0.27 2.37,-0.09 0.49,-0.8 2.06,-0.17 3.01,-0.37 45.89,0 91.78,0 137.67,0 0.61,1.21 1.15,3.04 -0.24,1.09 -2.48,-0.7 1.23,2.94 1.58,3.94 1.63,2.86 -1.86,0.67 -3.36,1.88 1.28,-1.72 -2.26,-4.24 -1.57,-1.36 0.03,2.25 1.64,3.73 3.68,2.39 1.03,0.77 -1.42,2.8 -1.62,3.53 -3.09,0.12 0.02,1.62 1.04,2.22 0.66,2.09 4.04,0.64 2.3,3.22 -1.05,1.95 -3.92,1.82 -3.21,-0.86 0.14,-3.28 -4.67,-1.36 -4.04,-5.02 -2.02,-0.71 -0.18,3.84 -2.96,2.48 -0.73,0.74 0.41,1.75 -1.42,1.32 -2.61,0.54 1.71,4.84 -0.38,4.25 -1.39,0.66 -1.21,4.72 0.33,2.08 -0.04,-1.13 1.18,-4.09 2.39,-2.05 0.43,1.69 3.14,3.16 0.34,3.59 0.86,3.33 -3.29,2.48 -4.22,0.42 -0.56,1.42 -4.92,2.25 -4.96,-1.01 -1.09,-1.09 -0.61,-6.28 0.38,-2.79 -0.38,2.15 4.88,3.94 3.74,1.34 -3.75,0.99 -2.13,-7.24 -6.06,-4.79 -0.93,1.3 -1.66,1.94 -1.57,-0.09 0.87,-1.48 -0.65,-6.36 -1.62,-2.76 -0.29,1.71 1.87,5.7 -1.38,4.23 -1.61,0.79 -3.43,1.95 -3.68,-0.56 -1.68,-1 0.16,-4.48 -2.68,-3.04 -0.67,1.11 2.68,6.25 0.02,3.71 -0.94,-1.89 -3.02,-1.6 -4.56,-0.77 1.83,0.09 2.37,0.85 0.57,2.18 0.59,2.05 2.81,-2.2 3.66,0.12 1.38,0.4 3.13,-0.11 3.81,2.17 2.43,3.24 -2.95,0.83 -4.01,1.04 -0.05,-1.82 -4.79,-3.3 -3.23,-1.13 1.49,0.95 1.71,0.82 0.15,1.51 -1.1,2.37 1.53,3.48 2.9,1.87 3.12,-1.53 5.02,4.79 1.15,3.53 -2.62,-0.97 -1.48,2.05 -3.89,2.7 -0.43,2.18 2.56,-0.04 2.88,-0.79 2.47,-0.74 2.4,2.46 3.26,3.28 -2.41,2.08 2.06,1.61 0.72,3.86 0.87,0.94 2.37,2.01 0.05,2.28 -2.05,0.35 -0.86,2.02 0.59,1.45 -1.67,-0.11 -1.69,1.85 -1.36,2.27 -1.73,0.52 -2.08,4.37 -0.55,3.78 -0.25,-2.23 4.33,-2.23 2.08,-0.24 -2.82,-0.46 -0.7,2.99 -3.43,2.2 2.08,0.81 0.22,1 -1.03,1.19 -1.32,0.16 3.49,1.1 1.39,1.26 -1.9,0.07 -0.29,1.99 -2.31,1.42 1.18,0.54 1.34,1.84 1.35,2.8 -2.18,2.04 -4.44,-0.74 -2.18,-2.64 1.63,-0.69 0.76,-4.19 -0.17,-2.1 -0.64,2.71 -4.66,4.66 -4.98,0.68 -0.13,-3.43 1.98,-6.57 2.12,-10.01 -0.26,-1.47 -2.38,-1.12 -1.92,-3.26 0.2,-2.67 -2.43,-4.09 -3.97,-4.66 0.54,-2.82 0.04,-5.39 -1.15,-7.72 0.49,-2.96 -3.2,-2.36 -2.3,0.29 0.39,1.99 2.16,3.98 1.82,5.79 -0.98,-1.18 -4.72,-2.37 -4.53,0.09 1.53,0.74 4.96,0.32 3.23,3.09 -0.36,0.92 2.65,-0.97 2.92,1.14 1.39,1.16 4.2,3.13 1.09,4.33 -2.3,0.81 -7.78,0.76 -7.23,-2.79 1.56,-1.72 -2.19,-2.27 -1.32,0.16 -1.72,-2.55 -3.53,-0.09 -1.9,1.66 -2.13,2.01 -4.41,0.62 -6.81,0.57 -2.19,2.71 4.76,1.16 2.08,3.05 0.58,1.9 4.08,1.91 5.81,2.83 1.96,1.43 -0.47,2.15 -1.35,0.46 -1.82,-1.08 -3.45,2.21 -4.74,-0.62 -0.64,-2.28 -4.68,1.1 -2.47,0.81 1.98,0.42 2.27,5.38 5.07,2.98 1.84,-3.35 3.57,2.14 6.26,0.44 1.29,-0.17 2.13,-0.02 0.67,0.65 1.09,1.24 2.33,0.17 2.6,1.96 1.19,2.8 4.25,5.41 6.32,6.4 -0.65,1.36 -3.26,-1.74 -3.14,1.07 -0.24,-1.71 -1.8,-0.78 -1.41,0.45 -1.2,-0.78 -1.84,-2.07 -1.82,0.08 -0.39,2.77 -2.92,-1.74 -2.76,-0.46 0.55,1.51 -0.55,2.28 -0.85,0.45 -2.38,-1.66 -2.14,3.66 -3.7,0.79 -1.88,-0.98 -0.85,3.28 -2.38,0.99 -2,-0.69 -1.48,2.95 -3.73,1.98 -1.43,0.57 -1.73,-1.87 -2.48,0.33 -1.28,0.15 -2.02,-1.77 -3.67,-0.49 -1.51,-0.59 -3.89,-0.69 -5.18,-1.79 -1.83,0.4 -3.94,-2.71 -4.99,0.05 -1.52,0.2 0.6,-5.44 -2.51,-2.84 -0.5,1.46 -2.44,2.79 -1.46,0.41 -0.04,-2.08 -3.47,-2.35 -1.81,-0.01 -0.33,2.95 -2.47,-1.46 -3.31,-2.22 2.66,-0.66 -1.9,-3.4 0.58,-4.85 0.98,-1.25 -0.43,-3.9 -1.29,-1.57 -2.2,1.2 0.59,4.8 -2.3,3.1 0.07,1.58 0.73,2.33 -0.49,2.37 -0.31,3.19 -2.4,-0.77 -3.7,1.08 -1.26,-0.57 -3.86,-0.58 -3.24,0.73 -1.86,1.54 -5.17,-0.4 -5.06,3.18 -2.02,-0.95 -3.43,1.13 -4.24,1.49 -0.67,-0.74 -1.24,2.48 -2,1.23 2.12,-2.45 -2.15,-1.8 -1.8,0.58 -2.16,1.39 -3.92,0.18 -2.08,-1.7 -1.67,0.05 -3.09,2.47 -2.5,-0.4 -0.88,-2.96 -1.92,-0.22 -2,1.13 -1.96,-0.26 -4.27,2.16 -3.76,-0.97 -0.78,-1.12 -2.93,1.49 -3.4,-0.02 1.83,-0.91 0.7,-3.4 -0.63,-1.07 -0.78,1.04 -1.78,1.59 -1.04,-0.05 -2.35,-3.54 3.85,-1.66 4.59,-3.73 -0.17,-1.96 -2.75,-5.32 -4.26,-2.64 1.79,0.66 -1.44,2.8 -2.07,2.43 -1.51,-3.02 -4.63,-0.57 -2.13,1.56 0.17,1.83 -2.38,1.81 -1.85,-0.14 -1.36,-2.38 -2.64,3.42 -2.69,-0.09 0.92,-1.47 0.05,-4.47 -1.39,-1.81 0.69,-2.4 -1.59,-1.67 -2.42,-0.69 -1.63,-2.6 -2.81,-0.08 -1.32,1.39 -0.12,2.09 -5.82,3.27 -3.43,0.33 -0.7,-1.39 -2.14,-1.09 -2.9,-2.54 -1.31,0.12 -1.87,1.12 -2.63,1.96 -0.18,2.43 -0.75,4.74 -2.05,6.98 -0.56,-1.99 -3.06,-1.81 -4.45,-3.2 -2.37,1.32 0.55,4.85 0.85,5.51 -2.93,-1.09 -0.49,5.23 -3.18,2.66C53.03,69.44 53.8,64.37 51.35,66.72c-0.01,1.25 1.67,5.14 1.03,4.67 -0.53,-2.51 -2.88,0.37 -2.61,-2.21 -1.56,-2.63 -4.32,1.46 -2.75,2.77 0.01,1.17 -1.56,2.39 -0.5,0.42 0.86,-3.51 -4.59,-2.97 -3.27,0.28 1.49,1.65 -0.07,2.95 -1.09,0.84 -1.55,-1.63 -4.28,0.31 -4.69,-2.84 -1.38,-1.87 -1.94,1.56 -0.77,2.26 -0.06,1.31 -0.47,2.49 -0.74,0.56 -1.54,-2.22 -1.58,2.78 -0.86,3.53 1.64,2.36 -5.86,1.67 -2.64,3.82 2.3,1.03 -2.22,1.12 -2.82,0.61 -1.74,0.43 1.87,2.58 -0.75,1.83C27.52,82.87 27.84,78.97 25.72,81.05c-0.33,1.79 3.97,2.08 0.81,3.67C24.18,85.6 27.77,81.48 24.7,81.96c-1.65,-0.58 -3.25,0.94 -2.07,2.52 -0.13,-1.56 -3.34,-2.97 -2.3,-0.65 0.92,1 3.65,4.19 0.68,3.11 -0.39,-1.36 -2.18,-3.54 -2.55,-1.53 -2.1,0.36 1.98,3.44 0.79,3.95 -0.52,-1.87 -2.86,-1.68 -1.64,0.35 -0.16,0.51 -2.67,-2.78 -2.9,-4.29 -1.64,-2.64 -1.84,0.81 -1.4,1.86 -0.78,1.52 2.24,0.79 1.57,2.42 -1.75,-0.73 -3.2,1.28 -0.75,1.28 -0.16,0.78 0.34,2.28 -0.65,2.59z M34.12,18.3c-1.05,0.6 -2.47,3.81 -0.57,3.47 1.95,-0.22 4.06,-4.82 0.57,-3.47z m-22.97,56.17c-2.31,-0.35 -0.79,-1.58 0,0z M2.14,66.59c-1.38,-1.11 -0.95,-1.35 0.46,-0.36 -0.18,-0.08 -0.27,0.6 -0.46,0.36z m168.23,-6.32c-0.28,-1.85 2.85,0.02 0.03,0l-0.03,0z M7.85,51.96c-0.57,-0.92 1.55,0.27 0,0z m1.18,-1.63C7.41,50.26 7.17,48.77 8.95,49.87 10,50.07 10.77,49.96 9.03,50.33z M184.09,37.53c-0.77,-1.48 -1.43,-4.23 -2.73,-6.24 -2.01,-2.67 1.21,-6.02 3.05,-2.64 0.95,1.04 0.93,3.38 1.44,4.42 -4.98,-0.16 0.39,3.51 -1.76,4.46z M23.01,25.35c-1.12,-0.81 -0.79,-3.25 0.17,-0.92 0.17,0.37 -0.49,0.58 -0.17,0.92z M209.99,8.88c0.65,-1.41 0.2,-3.29 -1.61,-3.21 -0.07,-1.5 -1.95,-5.46 0.62,-4.89 1.44,0 2.88,0 4.31,0 1.06,2.38 -1.6,4.58 -1.58,7.24 -0.32,0.7 -1.06,0.8 -1.74,0.86z M44.32,3.05c-1.74,-0.98 -6.31,0.12 -6.14,-2.09 1.47,1.81 3.05,0.95 2.25,-0.17 2.2,-0.52 2.82,0.46 3.89,2.27z","name":"Greenland"},"is":{"path":"m151.61,141.44c-2.42,-0.05 -4.73,-1.12 -5.95,-3.36 -0.71,-2.06 -4.34,-1.68 -3.81,-4.38 0.8,-0.95 3.4,-0.95 1.03,-1.6 -1.69,0.92 -0.37,-1.61 -2.18,-0.86 -0.88,-0.03 -1.32,-2.12 -2.96,-2.05 -1.43,-1.13 -6,-1.27 -4.53,-3.48 1.4,1.45 5.16,1.15 5.29,-1.63 0.95,-0.08 4.39,1.14 2.46,-0.91 -1.28,-0.31 -3.16,-1.27 -0.58,-1.35 2.41,0.51 2.39,-2.69 -0.02,-1.57 -1.25,0.39 -2.36,1.06 -1.66,-0.43 -0.34,-1.62 1.57,-4.11 -1.54,-3.94 -1.49,-1.7 -3.83,-2.36 -5.98,-2.91 1.9,-1.43 2.13,2 4.45,0.36 0.58,-0.11 0.84,1.82 1.93,0.36 1.45,0.02 2.12,1.75 4.12,1.85 1.57,1.88 4.72,-0.08 2.56,-1.73 -1.13,0.23 -4.71,-0.08 -2.41,-1.51 1.13,0.1 5.66,-0.35 3.94,-1.58 -2.53,-0.05 -1.4,-0.83 -0.29,-1.63 0.84,-2.83 -2.64,-1.96 -3.34,-1.81 -1.47,-0.72 -2,-0.85 -1.64,-2.44 2.52,0.42 0.64,-2.75 -0.27,-3.56 -0.04,-0.34 1.76,2 1.91,-0.11 -0.65,-3.43 1.88,0.34 1.11,2 -0.95,4.21 5.86,2.44 3.19,-0.73 -1.94,-1.31 0.11,-2.67 -1.13,-4.2 1.13,0.42 1.67,1.6 2.04,1.18 1.98,0.31 -0.01,2.5 1.33,3.37 0.86,1.89 -0.77,4.19 1.64,5.57 -1.28,0.64 -3.87,-0.52 -2.63,1.99 -0.4,1.18 -1.92,2.25 -0.42,2.93 -1.31,1.46 -1.09,4.59 1.22,2.7 0.49,-1.4 2.89,-6.12 2.22,-2.37 2.69,2.22 4.53,-3.04 4.48,-5.25 2.58,0.03 -0.68,6.63 3.51,5.53 -0.01,-0.74 0.05,-5.1 1.81,-2.72 1.08,-2.01 3.5,-0.36 1.83,1.62 2.1,1.36 -0.53,3.45 0.95,5.46 2.69,-0.06 0.02,-7.39 2.92,-6.07 -0.32,2.52 1.49,4.92 3.27,1.85 1.68,-2.37 1.62,3.33 3.69,1.28 1.71,-0.8 1.1,-6.38 3.47,-3.02 -0.81,1.5 1.32,1.54 -0.24,3.29 -0.5,2.17 2.82,1.16 2.36,3.29 2.02,0.52 2.1,1.62 0.19,2.57 -2.6,1.53 3.45,1.86 0.49,3.25 -0.74,0.55 -3.68,1.15 -1.27,1.34 1.72,-0.23 4.34,-1.28 4.35,1.54 -0.04,2.17 -4.93,1.21 -2.47,3.09 1.83,0.33 2.75,2.38 0.41,2.2 -1.18,-0.56 -1.74,-0.63 -0.71,0.56 -0.6,-0.3 -3.92,0.12 -2.06,0.55 2.71,0.87 -0.55,1.36 -1.7,1.52 -1.06,0.04 -2.49,1.02 -2.87,2.69 -1.35,-0.83 -1.72,1.98 -2.29,-0.35 -0.72,-2.57 -2.1,-0.68 -2.71,0.31 -2.09,-0.1 -4.17,0.18 -5.78,1.63 -1.89,0.57 -3.52,-3.04 -3.52,0.21 -2.4,-1.75 -5.62,-1.53 -6.88,1.4l-0.35,0.08 0,0z m24.31,-7.94c-1.58,1.64 1.17,1.65 0.84,-0.23 -0.28,0.08 -0.56,0.15 -0.84,0.23z M147.49,99.76c-2.33,0.02 -1.42,1.38 0.2,1.79 0.14,-0.38 0.69,-1.97 -0.2,-1.79z m33.62,15.99c1.19,-0.59 1.6,-0.17 0,0z m-44.05,-9.09c-1.62,-0.01 -0.68,-1.6 0.37,-0.74 1.34,-0.47 -0.84,-4.6 0.49,-2.48 -0.6,1.82 2.54,3.42 -0.86,3.22z m-1.42,-1.5c-1.66,0.2 -1.5,-3.06 -0.29,-0.86 -0.05,0.3 1.22,0.95 0.29,0.86z m4.48,-1.49c-0.86,-0.96 -0.83,-1.57 0,0z","name":"Iceland"},"pt":{"path":"m126.31,476.79c-3.11,-0.89 -5.74,-4.21 -9.28,-3.12 -1.78,0.38 1.76,-2.58 1.47,-3.95 0.39,-1.92 1.56,-3.11 1.18,-4.56 -0.46,-1.65 0.47,-3.6 1.4,-5.27 -0.61,-1.65 3.07,-0.14 2.33,-1.74 -1.59,-1.17 -2.48,-2.71 -4.71,-1.61 -1.89,-0.04 -2.12,-3.1 -2.67,-4.46 0.27,-2.21 3.57,-4.27 2.21,-6.5 2.42,0.37 3.47,-2.17 4.77,-3.81 0.98,-1.71 1.87,-3.43 3.16,-4.47 -0.79,-1.76 1.02,-5.31 3.28,-5.87 1.59,-1.26 -0.95,-2.63 0.8,-4.09 0.23,-2.53 -1.05,-5.19 -0.11,-7.75 2.54,0.06 0.15,-1.87 0.17,-2.24 1.59,-1.44 4.74,-3.3 6.49,-1.31 -3.35,1.53 -0.16,3.98 2.09,3.19 1.85,-0.17 3.87,2.53 6.45,0.97 1.56,-0.13 6.26,-0.07 4.22,3.05 0.22,1.77 4.81,2.08 1.88,3.98 -2.66,0.33 -4.02,2.88 -6.33,3.35 -0.97,1.66 1.09,4.53 -0.81,6.49 -1.07,1.01 0.55,2.39 -1.62,2.77 -2.6,1.54 1.62,6.06 -2.82,6.49 -1.74,-0.37 -5.6,-2.08 -3.57,1.31 1.07,1.89 -0.41,4.57 2.03,6.2 1.92,2.91 -3.81,2.81 -3.68,5.95 -1.09,1.6 0.5,5.45 2.67,5.41 -1.19,1.2 -4.31,1 -5,3.34 -3.07,2.07 -0.28,7.22 -4.25,7.62 -0.55,0.29 -1.11,0.63 -1.75,0.65z","name":"Portugal"},"ma":{"path":"m114.26,519.26c5.38,-1.06 11.75,-0.39 15.9,-4.63 5.26,-4.88 8.22,-11.54 11.83,-17.6 2.3,-1.64 3.11,0.89 3.7,2.43 3.25,0.06 3.27,5.03 6.51,6.18 2.01,2.4 5.02,1.6 7.69,1.35 1.26,1.84 3.78,-0.68 5.41,1.5 1.48,1.09 4.97,-1.46 5.09,1.72 1.76,1.07 3.75,0.97 5.94,1.12 1.21,2.49 5.27,4 3.5,6.77 1.55,1.82 -0.97,1 -2.11,1.18 -21.15,0 -42.31,0 -63.46,0z","name":"Morocco"},"es":{"path":"m170.08,507.95c-0.69,-0.45 0.64,-1.19 0,0z m-23.1,-9.15c-1.89,-0.27 -1.23,-3.36 0.81,-2.76 -1.01,0.61 -0.28,2.16 -0.81,2.76z m-1.53,-5.41c-1.92,-1.84 -4.81,-3.55 -4.78,-6.5 1.74,-1.65 -3.05,-2.72 0.06,-3.62 1.8,0.08 1.95,-2.62 0.29,-1.71 -1.68,1.92 -1.49,-3.2 -3.57,-3.37 -1.21,-2.54 -5.06,-1.7 -6.26,-3.7 0.08,-2.72 1.22,-5.37 3.58,-6.95 1.91,0.46 5.66,-3.3 1.98,-3.27 -1.9,-2.17 -1.67,-5.74 1.14,-6.99 3.7,-0.95 1.1,-4.57 -0.28,-6.35 0.58,-1.68 0.45,-3.01 -0.84,-4.53 2.46,2.34 7.45,0.07 6.4,-3.43 -2.26,-2.56 3.15,-2.71 1.97,-5.34 1.81,-1.67 0.28,-5.41 1.17,-6.21 1.77,-2.14 4.99,-2.46 6.88,-4.55 1.92,-2.79 -4.07,-2.45 -2.2,-4.91 0.43,-3.16 -4.07,-2.3 -5.69,-3.2 -1.8,2.37 -3.89,-1.02 -6.23,-0.51 -0.28,-1.34 -3.49,1.05 -2.42,-0.88 2.82,-1.19 -0.75,-4.5 -2.73,-2.96 -2.11,1.45 -3.86,-0.78 -1.34,-1.64 0.94,0.28 2.32,-1.98 0.72,-1.58 2.23,-1.63 -2.16,-0.92 -0.24,-2.66 2.41,-1.99 0.28,-4.66 -2.06,-3.75 -2.26,-1.66 -0.12,-3.23 1.07,-4.13 3.66,0.29 6.76,-2.08 9.92,-3.51 1.78,-2.19 1.34,2.22 3.29,-0.21 3.33,-0.27 2.62,6.64 6.6,4.09 2.47,1.16 5.51,0.94 8.02,1.44 1.9,-1.24 3.14,2.45 5.32,2.3 2.35,0.57 4.3,2.34 6.75,2.93 2.65,1.41 5.29,-0 7.84,-0 2.13,0.65 4.69,5.39 6.5,1.98 2.5,1.32 5.04,3.91 8.46,3.08 1.39,-0.01 3.8,0.79 4.14,1.8 -1.87,1.22 0.06,2.67 1.22,2.4 1.66,1.57 5.29,1.19 5.34,4 1.46,0.54 4.43,-0.57 4.33,1.92 1.41,-0.29 3.73,0.98 4.54,0.5 1.54,0.01 3.53,0.67 3.72,-1.35 1.63,1.02 3.94,2.12 5.05,3.3 -0.62,2.48 1.62,2.94 3.4,2.37 1.23,1.43 2.74,2.23 4.47,1.42 1.62,0.92 3.85,2.1 4.94,-0.04 1.38,-0.43 5.47,1.31 2.5,2.25 -0.52,2.49 0.35,5.62 -3.02,6.24 -3.95,0.65 -6.55,3.99 -10.24,4.85 -4,0.26 -8.86,0.24 -11.41,3.91 0.64,1.13 2.06,1.75 -0.08,1.82 -2.98,1.35 -3.8,5 -6.55,6.72 -2.04,2.09 -4.6,4.27 -5.09,7.29 -0.14,3.13 0.72,6.8 3.86,8.19 -0.28,2.13 -4.94,1.61 -6.14,3.93 -1.51,0.81 -1.84,2.35 -3.08,3.65 0.22,1.68 -4.27,3.01 -1.46,5.03 -0.94,1.1 -4.96,-1.49 -6.88,0.41 -2.79,1.13 -4.55,3.71 -5.69,6.37 -2.11,3.74 -4.63,-2.34 -7.31,0.69 -2.28,0.2 -4.7,-1.72 -7.4,-1.1 -2.51,-0.92 -5.12,-1.75 -7.89,-1.82 -2.99,0.03 -4.54,3.25 -7.74,1.83 -3.45,-0.48 -3.73,3.46 -6.83,4.06z M229.67,469.73c-3.03,-0.94 2.34,-1.17 0,0z m-3.28,-1.86c-1.31,-1.98 3.63,-2.8 0.96,-0.55 -0.28,0.23 -0.58,0.51 -0.96,0.55z m8.15,-0.95c-0.99,-1.19 -3.24,-1.21 -2.69,-3.07 -1.57,-0.61 -4.43,-0.57 -1.44,-1.83 1.82,-0.69 5.61,-3.6 5.15,-0.13 1.01,1.13 4.03,0.64 1.76,2.77 -0.83,0.87 -1.8,1.58 -2.78,2.26z m11.67,-5.53c-0.43,-1.32 -5.6,-1.9 -2.47,-2.15 1.42,0.04 2.4,0.66 2.47,2.15z","name":"Spain"},"tn":{"path":"m284.9,519.26c-2.21,-1.12 0.73,-3.64 -0.95,-5.51 -1.46,-3.16 2.15,-6.93 -0.12,-9.45 -0.67,-0.73 2.93,-1.29 1.98,-2.95 2.23,-0.03 1.46,-2.58 3.74,-2.85 2.52,-1.83 5.41,-3.02 8.35,-3.78 1.3,0.18 -1.34,3.29 1.51,2.64 0.71,-1.15 1.1,-2.15 2.08,-1.26 -0.76,0.27 1.03,1.6 0.03,2.09 1.72,0.55 2.13,5.46 4.03,3.7 1.46,-0.73 4.4,-5.15 5.37,-2.71 -0.9,2.37 -2.28,5.07 -4.51,6.35 -3.22,1.82 -2.27,6.37 0.87,7.67 1.26,0.82 1.66,2.08 3.04,2.36 -0.15,1.99 1.01,4.41 -1.79,3.68 -7.88,0 -15.77,-0.01 -23.63,0.01z","name":"Tunisia"},"dz":{"path":"m181.84,519.26c-2.16,-1 0.09,-2.29 0.05,-3.03 -0.8,-1.48 -5.28,-4.37 -1.47,-3.7 2.83,-0.51 5.98,-1.33 7.84,-3.67 1.17,-2.46 3.66,-2.95 5.89,-2.07 1.44,-0.79 2.77,-2.77 3.38,-0.29 3.67,1.9 4.38,-3.05 7.15,-3.91 3.27,-1.17 6.41,-3.1 10.01,-2.8 3.04,0.05 6.13,0.57 9.13,-0.19 2.74,1.56 5.53,-0.24 7.63,-1.26 2.46,0.75 5.2,0.79 7.75,-0.34 2.83,-0.67 5.62,0.67 8.61,0.23 3.35,0.17 5.17,6.05 8.94,3.1 1.43,-2.77 7.09,0.3 7.33,-3.88 2.03,-1.62 1.87,1.59 2.96,1.23 1.79,0.05 6.14,2.99 6.01,-0.61 2.5,-2 5.17,3.33 8.12,2.16 1.57,-1.13 4.46,-0.6 5.35,-0.15 -1.62,-0.02 -2.54,1.2 -1.93,2.18 -1.87,0.63 -3.58,2.5 -1.04,3.3 0.38,2.87 -2.09,5.94 -0.27,8.63 -0.06,1.4 0.31,4.98 -0.86,5.05 -33.52,0 -67.05,0 -100.57,0z","name":"Algeria"},"be":{"path":"m265.32,343.64c-0.99,-1.16 -1.81,-2.49 -3.73,-3.37 -2.08,-0.35 -0.28,-1.85 -1.25,-2.79 1.47,-1.88 -0.53,-2.73 -1.47,-0.87 -1.28,2.32 -4.46,0.99 -3.2,-0.74 -0.78,-0.74 1.11,-3.63 -1.62,-3.19 -2.17,0.83 -2.23,-1.41 -2.67,-2.1 -3.94,1.05 -1.51,-5.53 -5.39,-3.71 -2.36,1.07 -3.02,-4.27 -0.45,-4.53 1.73,-0.62 4.14,-3.17 4.52,-0.63 2.42,-0.22 3.66,2.56 5.83,0.13 1.3,-0.02 1.88,1.91 1.96,-0.36 0.89,-2.95 2.67,0.31 4.45,-0.43 0.58,-0.7 1.45,3.34 3.54,2.07 2.55,0.01 1.99,1.94 1.4,3.06 -1.22,1.97 -0.15,4.06 2.13,3.5 1.5,1.19 1.36,3.16 2.63,4.39 -1.48,2.22 -4.2,1.28 -5.1,4.2 -1.39,2.28 2.74,5.98 -1.59,5.37z","name":"Belgium"},"it":{"path":"m350.4,500.36c-1.75,-1.38 -4.77,0.56 -6.21,-2.11 -0.98,-3.12 -4.25,-2.35 -6.74,-3.12 -2.11,-1.47 -4.61,-1.93 -6.58,-3.76 -2.2,-1.23 -6.25,0.31 -6.1,-3.66 0.15,-1.98 2.31,-4.17 3.5,-1.8 2.52,0.49 3.53,-4.85 5.24,-0.9 2.01,0.26 4.02,2.27 5.97,0.45 2.63,-0.1 5.81,0.01 7.46,-2.47 1.45,0.01 4.12,1.89 4.36,-0.76 1.1,1.6 3.69,-2.6 2.02,0.26 -1.4,3.25 -4.08,7.31 -3.12,10.66 1.21,0.69 0.93,2.35 2.17,3.37 -1.93,0.14 -1.88,2.41 -1.97,3.84z m7.22,-15.37c-2.78,-0.14 -2.87,-3.99 -0.28,-4.55 1.37,-2.08 -1.36,-4.79 2.17,-5.13 3.25,-2.22 -1.35,-4.63 -1.21,-7.46 -1.16,-2.63 -2.56,-4.66 -3.09,-7.45 -1.59,-2.98 -4.91,-0.29 -6.78,-2.73 -1.65,-0.84 -0.12,-5.17 -3.33,-5.63 -1.56,-0.37 -4.03,2.8 -2.57,0.22 0.06,-2.91 -3.33,-1.3 -4.25,-2.37 -0.69,-2.23 -3.26,-6.17 -5.36,-4.2 -1.73,-2.18 -4.5,1.85 -5.25,-1.44 -2.69,-0.65 -4.1,-2.62 -6.18,-4.28 -0.73,-3.32 -5.19,-3.11 -5.74,-6.57 -1.05,-1.9 -5.27,-0.02 -4.05,-2.26 -1.1,-2.38 -3.86,-3.39 -4.73,-5.46 -3.13,0.51 0.07,-2.73 -1.71,-4.47 -2.14,-2.56 -1.2,-6.42 -3.6,-8.63 -2.19,-1.12 -4.5,-0.88 -6.03,-3.28 -2.22,-0.9 -4.82,-2.51 -7.33,-1.86 -1.74,1.89 -3.46,3.3 -4.61,5.48 -1.55,2.14 -5.91,2.59 -3.27,-0.76 1.07,-4.25 -4.16,-0.46 -5.52,-3.08 -2.08,-1.9 -1.08,-4.02 0.62,-5.53 0.76,-2.12 -4.77,-3.84 -2.88,-4.68 2.55,0.23 5.53,-3.6 2.83,-5.28 -0.93,-1.94 -2.92,-4.5 0.7,-3.9 2.4,0.04 4.29,-1.2 6.65,-0.24 1.85,-1.05 2.45,-2.98 2.51,-4.87 1.03,-0.35 2.29,-2.18 1.57,0.13 -0.67,2.56 4.99,2.17 2.47,4.45 0.19,0.08 2.08,0.32 2.23,1.7 1.41,1.01 2.54,-1.65 0.98,-2.25 0.53,-2.02 3.41,-3.57 2.37,-5.9 0.68,2.09 2.82,3.69 4.41,1.42 0.81,0.91 2.52,3.75 3.07,0.97 -0.97,-1.55 1.29,-1.81 -0.84,-2.7 -0.29,-2.99 3.05,2.3 3.43,-1.02 -1.77,-2.29 0.88,-4.07 2.84,-1.92 2.41,1.34 1.9,-4.15 4.64,-2.65 2.33,0.51 5.21,-2.28 6.13,0.74 1.38,2.34 4.22,3.29 6.93,3.47 1.41,0.44 5.26,-0.07 4.99,0.93 -2.13,0.92 -2.35,3.92 0.43,3.72 -1.26,1.22 -1.47,2.53 -0.57,3.56 0.79,3.16 -4.05,-1.16 -3.93,2.42 -2.22,1.73 -5.54,2.13 -7.33,4.03 -0.52,1.97 1.06,2.99 1.39,4.46 3.61,0.71 -1.06,2.87 -0.87,4.28 0.35,2.85 0.62,6.32 3.48,7.85 2.75,2.1 5.47,4.43 8.75,5.58 2.03,1.86 2.11,4.88 3.12,7.29 0.93,3.7 3.47,6.75 6.72,8.67 2.2,2.52 5.18,4.19 8.71,3.54 1.79,0.5 5.88,-2.59 5.92,0.29 -0.8,1.53 -3.65,2.89 -1.29,4.86 4.13,2.94 10.13,1.81 13.75,5.65 1.89,1.55 5.85,0.5 6.34,3.52 1.71,1.18 6.04,2.73 4.13,5.37 0.4,1.63 -0.95,3.55 -2.34,1.36 -0.96,-2.97 -3.23,-5.68 -6.54,-4.48 -2.32,-1.32 -6.05,-2.69 -6.78,1.09 -1.28,2.2 -1.32,4.97 -2.42,7.17 0.64,2.84 4.59,1.65 5.83,3.73 1.59,0.26 0.35,2.98 1.81,3.8 -0.21,3.1 -5.83,1.6 -5.88,5 0.28,1.92 0.81,4.68 -1.72,5.06 -1.23,1.65 -1.39,4.64 -3.63,5.25z m-35.56,-71.98c1.98,1.43 0.5,-2.39 0,0z m-33.54,62.41c-0.72,-1.6 -3.1,-3.35 -3.37,-5.68 1.54,-2 1.07,-4.81 2.16,-7.03 -3.26,0.28 0.82,-2.8 -0.89,-4.55 -0.02,-1.96 -1.35,-4.24 -2.94,-4.22 0.19,-1.55 0.4,-3.39 2.06,-1.78 3.1,0.15 5.25,-2.55 7.52,-4.29 0.91,-0.84 5.63,1.48 2.53,2.55 -0.36,1.47 2.3,1.33 1.41,2.66 3.07,1.36 0.3,4.08 -0.53,6.16 1.23,2.67 0.22,5.65 0.3,8.76 -0.33,1.29 -0.37,5.73 -2.35,3.37 -1.49,-1.18 -4.61,-1.6 -3.46,1.11 -0.38,1.17 -0.94,2.88 -2.43,2.94z","name":"Italy"},"by":{"path":"m402.72,308.87c0.99,-3.18 0.27,-7 -3.79,-7.04 -0.71,-2.3 3.14,-4.07 4.34,-6.18 -0.26,-5.15 -3.83,-9.19 -5.74,-13.77 2.18,-0.83 4.01,-0.87 5.95,-0.9 0.86,-1.84 2.51,-1.83 3.98,-0.84 -1.05,-1.12 -2.37,-3.07 0.28,-3.17 1.9,0.02 -0.71,-2.58 2.17,-2.24 -1.28,2.76 4.76,1.14 2.24,-1.38 -2.85,-0.47 0.33,-3.89 -1.4,-5.76 0.96,-1.56 2.7,-3.08 2.72,-4.65 2.53,0.76 4.43,-4.49 0.94,-3.47 -1.1,-1.17 0.25,-4.78 1.91,-6.11 2.45,0.48 4.37,-0.43 4.51,-3.22 0.17,-2.25 2.08,-1.78 3.18,-1.85 2.02,-2.32 2.15,2.85 3.69,0.14 1.75,-1.51 3.73,-0.83 3.53,1.45 2.17,2.99 3.24,-2.73 5.87,-2.54 1.93,0.2 3.24,2.17 5.04,1.95 0.25,2.02 -0.47,3.85 1.8,5.15 0.82,1.65 -1.87,4.51 1.47,4.95 2.1,-0.08 0.99,1.32 1.56,1.96 1.72,2.18 3.98,3.94 6.71,3.73 0,1.84 0.71,4.69 2.92,2.85 2.09,-1.22 3.09,0.78 3.28,1.76 2.02,-0.38 3.13,1.46 1.26,2.31 -0.06,3.07 -3.04,4.09 -5.35,2.65 -3.54,0.27 -2.85,5.57 0.51,5.52 0.97,2.55 1.33,5.72 3.91,7.42 -2.66,1.35 -6.88,2 -6.85,5.76 -1.23,2.53 1.43,5.57 1.33,7.2 -1.16,-1.33 -5.51,-3.73 -5.13,-0.77 -2.24,-2.52 -3.75,4.16 -4.59,0.03 -1.77,-2.65 -4.04,1.4 -4.28,1.56 -1.22,-2.58 -2.82,1.6 -3.58,-0.67 -1.01,0.66 -2.93,1.68 -4.34,1.01 -1.39,0.16 -1.96,2.41 -2.67,0.56 -2.3,-2.34 -5.69,0.72 -8.43,-0.73 -2.87,-0.21 -5.7,0.69 -8.51,0.87 -1.69,1.51 -4.3,1.17 -5.72,2.79 -0.82,1.63 -1.2,4.18 -3.37,2.88 -0.54,-0.03 -1.11,0.27 -1.34,0.78z","name":"Belarus"},"pl":{"path":"m378.8,342.69c0.85,-2.71 -2.77,-1.44 -3.2,-3.81 -2.16,-0.74 -2.68,4.74 -4.1,1.6 -1.34,-0.42 -0.38,-2.05 -2.3,-2.3 -1.38,-1.23 -0.72,-3.2 -2.99,-2.63 -1.39,-1.14 -3.17,-0.83 -4.08,-0.27 -2.65,-1 1.12,-2.8 -1.66,-3.95 -1.04,2.08 -3.71,0.51 -5.13,-0.34 -2.56,-1.21 -1.29,2 -1.13,2.64 -1.27,1.67 -2.44,1.3 -2.92,-0.65 -1.25,-0.75 -2.67,-1.29 -0.72,-2.16 1.16,-2.1 -2.17,-2.93 -3.11,-1.63 -1.5,-2.25 -5.49,-1.16 -6.45,-4 -1.21,-1.39 -2.59,1.06 -1.9,-1.41 0.23,-2.18 -0.48,-4.58 -2.34,-5.49 -1.37,-2.65 0.61,-5.37 -0.78,-8.1 -2.17,-1.37 0.53,-5.96 -3.41,-5.97 -3.09,-2.11 2.9,-5.25 0.3,-8.13 -0.64,-1.64 -2.11,-4.93 -1.01,-5.69 2.39,-0.86 4.49,-2.6 7.02,-3.34 1.88,-0.91 4.34,-1.13 5.97,-2.18 0.73,-2.97 3.72,-4.13 6.19,-5.25 2.44,-1.51 5.22,-3.64 8.26,-2.74 0.34,2.92 2.37,6.29 5.83,5.11 2.32,-0.46 3.66,-2.87 6.19,-1.88 5.94,0.22 12.06,0.04 17.77,-1.75 2.19,-1.89 4.37,-0.56 6.59,0.69 0.91,5.68 5.67,10 6.52,15.73 -0.74,2.77 -4.55,3.76 -4.71,6.89 0.95,2.08 5.51,0.97 4.43,4.48 -0.75,3.1 1.11,5.48 1.99,8.14 0.77,2 4.89,2.48 3.07,4.57 1.18,1.35 3.03,3.77 0.15,4.64 -2.63,0.49 -3.02,4.28 -4.54,6.17 -0.82,2.29 -3.04,4.17 -2.56,6.78 1.11,1.72 -0.12,4.53 2.39,4.91 -2.96,0.2 -5.66,-0.81 -7.88,-2.64 -2.12,-1.23 -4.34,-0.31 -6.37,0.12 -1.06,0.6 -0.02,2.66 -2.03,1.15 -2.7,-1.27 -4.67,0.77 -6.02,2.87 -0.44,-0.92 -1.49,0.48 -1.34,-0.18z","name":"Poland"},"jo":{"path":"m566.3,519.26c-0.01,-4.69 -2.26,-8.97 -3.12,-13.51 1.51,-3.32 4.45,-0.15 6.76,0.1 3.02,0.33 6.94,0.22 8.51,-2.87 4.44,-5.57 8.37,-11.53 12.83,-17.08 1.86,2.51 3.76,5 5.38,7.68 -2.06,2.03 2.19,4.71 3.12,1.72 0.91,2.72 -2.48,4.53 -4.03,6.38 -4,3.47 -8.47,6.39 -12.72,9.51 -2.44,0.61 -3.15,3.3 -0.46,3.9 2.58,1.36 5.17,2.72 7.71,4.17 -7.99,0 -15.99,-0 -23.98,0z","name":"Jordan"},"gr":{"path":"m449.88,508.26c-1.41,-0.44 -0.91,-2.43 -2.98,-2.05 -2.92,-1.02 -4.66,0.87 -7.49,-0.12 -2.89,2.86 -3.34,-3.03 -1.84,-3.28 2.13,1.48 4.85,0.78 6.99,2.27 2.66,-1.89 5.67,-2.41 8.68,-1.61 1.64,-0.07 3.7,-0.37 4.57,-0.83 -1.03,2.5 2.95,2.63 3.64,0.39 1.59,-1.01 2.86,-0.15 1.23,1.36 -4.14,0.67 -8.27,1.86 -12.04,3.72l-0.39,0.1 -0.37,0.03 0,0z m-26.29,-13.55c-0.61,-2.64 -1.46,-5.84 -4.37,-6.76 -3.02,-0.62 -1.68,2.8 -1.92,4.11 -2.48,0.25 -0.03,-2.58 -2.33,-3.13 -1.56,-1.69 2.11,-3.33 -0.42,-5.29 -1.75,-1.46 -3.48,-2.23 -4.88,-3.8 -1.71,-0.32 1.67,-2.18 0.95,-3.89 1.31,0.41 3.43,-0.58 4.2,-2.4 2.31,-0.03 5.27,1.8 8.03,2.01 1.1,0.72 3.08,0.98 3.24,1.46 1.77,0.36 1.5,3.47 4.29,3.78 1.97,0.86 -3.33,1.22 -3.75,-0.39 -3.29,-1.87 -3.6,3.04 -0.88,3.97 1.42,2.4 3.54,4.49 2.98,7.25 0.93,1.21 1.93,2.16 0.11,0.68 -1.13,-1.37 -3.59,-4.36 -5,-1.33 -0.38,1.2 -0.28,2.48 -0.25,3.72z m12.62,-17.67c-0.61,-1.76 -3.37,-2.18 -4.61,-3.83 -1.54,-1.35 -1.12,2.07 -3.22,1.63 -1.32,1.11 -3.33,0.37 -1.06,-0.31 2.53,-1.38 -0.23,-3.22 -1.98,-2.17 -2.19,0.64 -2.76,-3.59 -4.29,-0.5 0.28,-1.81 -1.78,-2.98 -1.95,-0.63 -1.85,0.67 -5.66,-0.17 -7.42,2.31 -1.43,-1.51 -2.69,-1.73 -3.58,0.32 -0.06,-3.13 -3.02,-4.71 -4.64,-5.97 -0.05,-3.03 -3.45,-4.15 -5.3,-5.69 0.58,-2.13 -4.66,-2.22 -1.22,-2.7 1.45,0.13 1.31,-1.81 1.97,-2.79 -2.74,-2.59 4.57,-2.51 2.29,-5.81 0.57,-2.27 3.93,-4.04 1.77,-6.57 2.29,-1.19 5.68,-0.59 7.21,-3.12 0.92,-4.2 5.51,-0.91 7.7,-3.66 0.88,-0.81 0.03,-3.12 2.26,-2.13 2.68,-1.49 5.94,-1.98 8.75,-3.4 1.35,-1.69 4.25,-2.43 5.72,-0.71 1.88,0.93 3.48,-0.95 5.39,0.66 2.83,0.48 5.06,-1.99 7.75,-2.56 2.63,-1.48 -0.92,-3.81 -0.19,-4.93 2.53,-0.82 6.54,2.78 3.07,4.45 -2.66,1.03 1.16,6.08 -1.92,6.2 -2.59,-1.16 -5.58,1.42 -8.08,-0.62 -2.31,-0.06 -3.98,4.61 -5.94,1.87 -2.75,-0.21 -2.93,5.39 -5.82,3.29 -2.56,0.13 -2.19,2.87 -0.61,3.88 1.51,1.31 -0.02,1.67 -0.46,3.12 -2.01,-0.91 -2.94,1.12 -4.72,-0.3 -3.05,1.25 -3.01,-2.2 -1.76,-3.97 -0.09,-0.54 -2.81,1.81 -3.44,2.49 -1.02,1.92 0.18,3.87 -0.21,6.03 1.55,1.98 3.8,3.4 4.84,5.84 0.92,0.8 4.25,2.4 3.42,2.64 -2.14,-2.19 -4.85,-0.02 -3.78,2.46 1.31,0.13 3.2,1.7 0.6,2.21 -1.13,0.04 -4.23,2.36 -2.68,2.49 2.62,-1.25 4.96,1.17 7.41,0.98 0.52,2.36 2.91,0.77 3.98,2.53 2.06,0.36 4.93,0.25 3.64,2.95 0.1,1.33 1.96,3.02 1.13,4.05z m-32.41,-12.35c-2.66,1.97 2.35,4.76 3.65,1.72 0.88,-3.08 -2.48,0.37 -3.25,-1.63l-0.4,-0.09 0,0z m1.2,12.17c-2.12,0.67 -3.94,-2.49 -2.24,-3.05 -0.52,2.11 1.79,2.11 2.24,3.05z m35.21,-4.75c-1.33,-0.45 -3.15,-2.25 -0.48,-1.45 1.91,-0.84 2.27,1.01 0.48,1.45z m-3.1,-3.76c-1.98,-1.68 -5.22,0.85 -5.86,-2.11 -1.43,-1.48 -5.05,-2.2 -5.77,-2.78 2.78,-2.67 4.14,2.1 7.15,1.68 1.66,0.78 3.06,-0.62 3.9,1.22 0.4,0.59 0.43,1.32 0.58,1.99z m-10.1,-17.81c-3.53,-1.73 2.32,0.07 0,0z m3.59,-1.57c-2.32,-1.62 -0.44,-1.62 0.45,0.12l-0.11,0.22 -0.34,-0.34z","name":"Greece"},"tm":{"path":"m679.06,344.59c-1.21,-0.72 -0.78,-2.05 -2.51,-2.48 -0.91,-2.53 -0.44,-5.74 -2.11,-7.9 1.43,2.3 3.65,0.44 4.81,-0.09 -0.04,3.47 0.02,6.95 -0.03,10.42l-0.16,0.04z m-9.11,-14.43c-1.83,0.29 -2,-1.85 -2.97,-2.07 -2.67,-0.77 0.57,-4.63 0.48,-6.52 1.65,-3.13 3.89,-6.16 6.88,-8.09 1.36,-0.18 5.09,-1.73 4.9,0.43 0,2.65 0,5.3 0,7.95 -2.35,-1.52 -3.83,-5.43 -6.79,-5.11 -2.41,2.22 -6.24,4.38 -5.17,8.26 -0.05,1.27 0.71,3.09 1.95,2.4 0.34,0.89 0.41,1.85 0.72,2.75z m9.29,-40.46c-2.98,-4.77 -6.29,-9.32 -9.41,-14 0.44,-3.11 3.69,-4.89 4.74,-7.82 1.56,-2.45 3.21,-4.85 4.68,-7.37 0,9.73 0,19.46 0,29.19z","name":"Turkmenistan"},"kz":{"path":"m665.18,326.25c-2.97,-1.86 -1.2,-5.67 -2.65,-8.21 0.53,-3.17 -3.51,-2.8 -4.88,-0.83 -1.79,-1.67 -2.48,2.95 -4.91,0.84 -1.43,-2.21 -3.22,-0.68 -4.76,0.52 -0.4,-3.09 -3.28,-5.18 -6.16,-5.75 -2.02,-1.36 -4.24,-5.19 -6.86,-2.37 -2.9,1.87 -4.15,-4.1 -0.51,-3.35 1.06,-1.32 1.8,-1.79 3.42,-0.84 1.53,-0.78 2.76,-2.24 4.06,-3.11 -1.44,-2.18 -5.78,0.43 -7.07,-2.22 0.12,-1.34 3.47,-2.2 0.83,-3.45 -1.26,-2.14 2.16,-2.43 1.45,-4.52 2.51,-0.62 4.01,-2.7 6.42,-3.67 1.55,-0.68 5.82,-1.56 4.27,-3.73 -2.44,0.42 -5.53,1.2 -4.64,-2.51 0.27,-3.12 -0.67,-6.7 -3.34,-8.56 -1.46,-0.11 0.78,-3.59 -1.86,-3.15 -1.5,-2.77 -4.84,0.02 -6.51,0.7 0.1,2.2 -0.93,4.69 -3.45,3.61 -2.4,0.56 -6.57,-0.38 -7.49,3.29 -0,2.58 -2.65,3.31 -2.68,6 -1.27,1.57 -1.07,5.37 -3.43,5.36 -2.12,-0.08 -2.2,2.62 -2.46,3.63 -1.26,0.74 -5.86,0.39 -4.64,-0.82 3.5,0.56 3.47,-4.4 0.06,-4.32 -3.14,-1.51 -5.73,-4.02 -8.93,-5.36 -2.47,-0.32 -4.25,2.11 -6.54,2.07 -0.12,1.28 0.37,2.59 -1.35,1.17 -1.8,-0.93 0.01,-2.79 -2.21,-3.3 0,-2.52 -4.2,-0.23 -5.74,-0.66 -0.96,-2.72 -0.8,-5.85 -0.41,-8.82 0.73,-3.23 -4.34,-1.07 -3.74,-4.61 -1.48,-2.21 -1.17,-5.16 0.32,-7.28 -2.58,-1.5 -1.53,-6.73 1.82,-4.04 2.29,0.54 4.78,3.98 7.13,1.98 1.97,-1.65 2.09,-5.06 -0.41,-5.79 -0.5,-2.08 -4.31,-2.93 -1.9,-4.7 0.1,-1.7 1.79,-4.1 2.05,-4.93 -2.7,-0.86 -1.25,-3.39 0.39,-3.59 0.3,-2.73 3.83,-4.97 2.24,-7.88 -1.16,-1.26 2.12,-0.49 0.87,-2.37 -0.73,-0.82 1.71,-0.82 1.99,-1.86 2.14,-0.45 -1.05,2.08 1.69,2.02 1.48,-0.55 1.41,-1.96 2.93,-1.7 0.29,-1.63 -1.06,-3.26 1.01,-4 0.5,-1.63 0.88,-2.2 1.87,-0.46 3.2,2.4 4.8,-3.1 7.46,-3.43 1.62,1.55 3.73,2.04 5.43,0.37 1.27,1.42 3.01,1.43 4.62,1.61 -0.26,2.56 4.05,4.44 3.68,0.87 -0.11,-2.04 -2.23,-3.06 -3.52,-3.49 2.49,-1.89 5.28,1.44 8.06,-0.13 2.65,1.71 2.89,-3.09 2.88,-4.82 -0.94,-1.46 1.32,-2.87 0.36,-4.29 1.64,0.4 1.75,-1.1 1.34,-1.85 1.08,-2.25 2.79,-1.39 4.44,-0.52 1,-0.8 1.78,-2.46 2.98,-2.01 -1.89,-1.21 -2.16,-3.64 0.61,-3.9 -0.26,-1.23 0.14,-1.29 1.28,-1.45 1.06,-0.94 2.07,2.58 4.01,1.26 1.98,1.74 4.96,-3.12 5.37,-1.36 0.29,1.89 3.37,-0.99 2.39,-2.55 -0.11,-1.94 -1.41,-4.21 1.46,-3.17 2.91,-0.36 4.26,-3.79 5.34,-6.17 1.47,-2.93 -2.47,-4.1 -2.09,-6.64 -1.36,-2.25 -4.48,-0.11 -5.91,0.2 -2.22,-2.09 -4.58,3.81 -4.91,0.16 -1.29,-0.68 -2.71,2.23 -3.65,0.73 1.29,-1.47 1.19,-4.25 2.39,-6.18 1.51,-3.13 -2.02,-3.28 -3.58,-4.22 -3.1,0.97 0.81,-3.99 -1.61,-4.03 1.01,-2.42 4.84,-2.6 5.47,-5.2 -0.01,-2.9 -4.66,-1.68 -5.74,0.02 -1.13,1.71 -4.5,-0.24 -1.75,-0.92 2.16,-2.49 -2.77,-3.66 -2.05,-1.2 -2.33,3.55 -0.85,-4.14 -3.83,-1.64 1.26,-0.48 -0.31,-3.76 1.92,-2.68 1.3,1.04 0.21,-2.26 2.14,-1.3 2.74,-0.21 -1.15,-2.68 1.49,-3.26 1.26,2.1 3.9,-0.29 1.53,-1.19 0.54,-2.35 2.7,-4.74 3.28,-7.51 1.48,-0.31 3.12,-1.58 1.37,-2.69 1.12,-2.77 3.18,-4.87 5.44,-6.15 -0.1,-1.8 -3.04,-1.6 -1.06,-3.51 0.73,-2.38 2.55,-3.81 3.48,-6.49 2.08,-2.53 2.36,-5.49 3.47,-8.34 0.29,-1.69 3.72,-3.96 0.35,-4.97 -1.01,-0.43 2.31,-2.04 0.29,-3.41 -1.75,-1.68 3.22,-0.78 0.65,-2.37 -1.73,-0.49 3.06,-0.82 1.8,-2.5 2.25,-1.54 6.79,-0.26 5.35,-4.64 -0.2,-2.91 3.08,-0.72 4.32,0.28 1.69,1.75 4.12,-0.2 4.78,2.52 1.5,0.9 1.01,3.62 3.74,3.35 2.67,0.01 -0.81,-3.38 2.11,-2.14 1.93,-0.51 -0.97,-4.41 1.41,-3.27 0,52.65 0,105.3 0,157.95 -2.28,4.16 -5.07,8.03 -7.49,12.09 -2.11,1.94 -4.29,5.26 -1.49,7.58 3.01,4.53 6.37,8.91 8.98,13.65 0.02,6.62 -0.04,13.29 0.04,19.87 -3.05,0.34 -6.58,0.54 -8.5,3.49 -2.48,2.8 -4.81,5.91 -5.35,9.73 -0.09,0.46 -0.18,0.92 -0.25,1.38z","name":"Kazakhstan"},"fi":{"path":"m382.62,208.07c0.7,-3.07 -2.78,1.32 -3.86,-1.32 0.05,-0.96 1.56,-3.75 -0.71,-2.21 -1.13,1.69 -1.33,-1.45 -2.92,-0.68 -0.94,0.89 -2.97,-0.9 -3.55,-0.42 -0.14,-2.36 -1.97,-0.15 -2.25,-0.03 -0.63,-1.67 -0.91,-3.6 -2.08,-5.17 1.86,-0.74 1.72,-4.06 0.26,-5.25 -0.34,-1.47 3.17,-0.38 1.07,-2.02 -1.2,-2.15 -2.78,-4.06 -3.52,-6.25 0.62,-2.08 -0.63,-3.97 -1.49,-4.42 0.49,-1.2 -0.5,-2.29 -0.95,-2.29 0.13,-1.71 3.82,-4.59 2.52,-5.52 -3.07,-0.18 0.32,-3.17 1.17,-0.45 1.02,-1.23 3.05,-2.66 2.12,-4.84 0.01,-1.7 0.15,-2.94 1.36,-1.21 0.12,-2.42 1.26,-4.91 3.64,-5.85 -0.72,-2.45 1.54,-4.8 2.24,-7.01 -0.27,-2.84 0.9,-5.24 3.71,-6.24 1.6,-1.13 1.77,-3.36 -0.51,-2.84 -0.44,-2.27 -0.12,-5.32 -2.74,-6.02 -2.3,1.99 -2.43,-3.68 -4.97,-1.88 -1.75,-2.03 -4.37,-4.52 -3.48,-7.48 1.52,-3.03 -0.83,-5.16 -2.34,-7.18 -0.2,-1.46 0.87,-4.46 -1.6,-3.74 -0.01,-2.39 -0.15,-4.83 -1.27,-7.01 -2.48,-1.84 -4.57,-4.14 -8.05,-4.18 -1.93,-1.7 -6.43,-2.88 -5.46,-6.12 -0.41,-2.16 1.14,-3.53 2.73,-1.48 2.59,1.31 1.85,6.17 5.39,5.44 2.27,0.35 4.34,-0.45 4.98,-2.51 2.4,-0.26 6.27,3.96 5.78,-0.87 -0.39,-2.02 3.32,-1.43 1.97,-3.98 -1.32,-3.02 -2.11,-7.03 -0.35,-9.99 -0.31,-2.74 4.21,-0.11 4.22,-3.35 1.47,-1.91 3.36,2.08 5.49,1.78 2.95,0.9 3.14,3.84 1.7,6.03 1.41,1.64 0.21,2.38 -0.46,3.84 1.14,0.8 2.75,1.02 1.72,2.87 -0.47,3.13 2.02,6.77 5.45,6.28 1.67,2.35 6.13,3.59 3.92,7.14 -0.75,2.27 -1.97,4.85 -0.96,7.21 3.59,3.29 6.5,7.25 9.05,11.36 0.06,1.49 -2.83,0.38 -0.84,2.06 -0.22,2.17 0.21,4.77 1.29,6.07 -1.26,3.74 5.08,3.34 3.58,6.82 0.48,3.1 6.13,1.5 4.41,5.52 -0.25,1.99 -2.95,4.48 0.53,5.03 2.93,1.69 6.43,2.67 8.87,5.07 1.06,2.48 -0.3,5.24 -0.57,7.75 -2.26,6.49 -4.21,13.14 -7.27,19.3 -1.55,2.69 -3.59,5.26 -4.3,8.32 -1.76,0.21 -3.5,-1.24 -4.38,1.19 1.52,0.77 -3.01,1.75 -1.49,-0.16 -0.76,-2.31 -1.99,0.16 -1.56,1.47 -1.82,-2.09 -4.5,1.44 -1.45,2.01 0.62,2.53 -3.67,-2.15 -3.14,-0.28 0.89,2.06 -2.52,3.25 -2.85,3.52 -2.72,0.33 -4.14,2.39 -6.64,3.79l-0.57,0.27 -0.58,0.1 0,0z","name":"Finland"},"de":{"path":"m302.45,372.15c0.39,-0.91 1.99,-2.77 0.16,-1.49 -1.57,0.93 -2.11,-2.91 -4.19,-2.08 -2.04,1.85 -3.44,-2.27 -6.01,-1.15 -2.15,0.46 -2.02,-2.87 -4.5,-1.23 -1.72,0.52 0.38,3.76 -1.44,1.73 -1.84,0.2 -4.84,0.84 -5.69,-0.07 -0.64,-1 1.16,-4.13 0.65,-5.99 1.9,-2.36 0.91,-6.25 3.86,-7.87 2.56,-1.63 0.59,-4.12 -1.86,-3.67 -2.56,0.2 -2.84,-3.15 -5.48,-1.32 -1.23,0.08 -2.11,-2.54 -3.28,-1.12 -0.17,-2.33 -4.09,-3.23 -1.38,-5.35 1.81,-3.01 -5.32,-3.18 -1.88,-6.63 1.67,-1.33 2.21,-2.89 0.22,-4.22 1.95,-2 -1.2,-0.75 -1.34,-2.77 1.01,-1.22 0.18,-2.51 -0.16,-3.21 1.78,-1.86 2.88,-5.05 1.22,-7.64 -2.19,-2.06 0.71,-2.52 2.29,-1.67 2.39,0.34 3.33,-2.08 3.64,-3.33 2.38,-1.19 2.15,-5.11 -0.59,-5.64 -0.03,-1.55 3.42,0.08 2.83,-2.66 0.31,-2.54 1.52,-4.9 2.38,-7.37 -0.34,-0.18 -3.53,0.96 -2.22,-1.41 0.9,-2.9 4.25,-1.28 6.2,-2.15 0.16,2.03 2.57,6.54 4.4,3.34 0.14,-1.85 -1,-6.59 2.18,-4.76 1.27,0.28 4.88,-0.75 2.09,-1.66 -3.15,0.44 1.18,-4.81 -1.98,-5.31 4.2,-1.72 -2.92,-4.5 -0.43,-6.3 2.37,1.37 6.56,0.38 7.64,2.55 -0.45,0.53 1.55,0.68 -0.04,1.71 -1.46,1.22 0.47,2.21 1.51,1.23 -1.09,2.31 1.04,2.07 1.81,0.68 1.67,1.18 3.81,1.56 5.14,0.49 0.21,1.77 -4.56,3.93 -2.04,5 1.38,0.2 3.65,-1.17 3.27,1.31 2.66,-0.01 2.46,-4.21 4.91,-4.12 1.43,1.57 3,-1.39 3.56,-2.49 0.61,-2.1 3.54,-0.7 4.16,-0.17 0.88,1.8 2.57,3.83 4.93,3.32 -0.95,4 4.51,3.57 4.6,6.93 3.14,3.28 -3.49,6.24 0.16,9.19 2.04,0.76 2.91,2.01 2.23,4.17 0.93,1.99 2.9,4.81 0.48,6.79 1.68,1.23 1.03,4.11 3.18,4.83 0.68,1.92 0.82,5.65 -0.66,6.5 -0.87,-1.78 -4.46,-3.53 -3.95,-0.41 1.16,0.88 -2.8,1.08 -3.3,2.22 -2.5,0.18 -3.71,2.69 -5.8,3.41 -0.73,-0.12 -0.57,1.65 -2.06,0.72 -2.78,-0.99 -2.28,4.11 -4.17,1.96 -3.51,0.44 1.56,4.5 2.19,5.46 -2.26,2.79 1.42,6 3.88,7.15 1.53,1.88 3.04,3.44 5.43,4.44 2.44,1.22 2.24,4.86 -1.02,3.8 -0.57,1.52 -0.37,3.53 -2.79,3.73 -3.29,0.46 -2.9,3.65 -1.01,5.5 0.76,1.93 -3,3.3 -3.36,1.75 -0.45,-0 -3.6,-1.29 -2.93,0.98 -3.48,-0.65 -5.56,1.87 -8.47,2.95 -1.59,-0.45 -2.06,-3.03 -4.27,-1.95 -2.85,-1.05 -0.37,3.13 -2.89,3.37z m-6.7,-79.27c-0.21,2.06 4.44,6.44 3.78,2.2 -1.59,0.14 -2.26,-2.95 -3.66,-2.25L295.75,292.88z m29,76.43c-1.59,-1.17 -0.3,-3.24 0.69,-1.13 -0.04,0.43 -0.23,0.99 -0.69,1.13z m-0.01,-83.07c-2.42,-0.16 -2.07,-4.22 0.32,-2.83 -1.17,-1.29 -0.5,-0.74 0.89,-0.58 -1.82,1.06 2.32,2.92 -0.86,3.34l-0.35,0.07 0,0z","name":"Germany"},"se":{"path":"m323.06,272.38c-2.85,0.68 -1.5,-2.92 -0.88,-3.47 -1.34,-1.73 -2.37,-3.77 -4.04,-5.01 0.79,-1.22 -1.53,-2.8 1.01,-1.48 2.77,0.18 -2.19,-2.84 0.98,-2.65 2.38,-2.15 -2.21,-3.59 -2.38,-5.5 -2.18,-0.93 -1.38,-4.24 -3.57,-5.03 -0.5,-2.35 -1.05,-4.69 -2.37,-6.57 0.36,-2.06 3.34,-6.36 -0.08,-6.96 -1.38,2.23 -3.39,1.39 -2.89,-1.18 0.66,-1.66 -0.9,-5.32 -0.3,-5.55 1.22,1.95 2.5,1.63 3.29,-0.5 0.91,-2.52 -0.9,-5.03 -0.38,-7.57 2.08,-1.14 -0.02,-3.96 3.05,-4 2.39,-1.51 1.37,-4.54 1.71,-6.85 0.8,-2.58 -4.53,-6.31 0,-6.91 1.04,-0.81 1.22,-3.31 1.37,-4.79 -1.12,-2.38 -6.01,-2.81 -4.1,-6.25 1.84,-3.74 -1.45,-6.92 -1.02,-10.47 0.52,-2.44 0.53,-5.73 -0.14,-7.32 0.64,-2.96 1.19,-6.43 4.34,-7.91 2.35,-0.49 6.23,1.31 6.51,-2.71 0.96,-3.43 -4.73,-4.28 -1.85,-7.71 0.9,-2.93 3.32,-5.66 2.42,-8.87 0.15,-1.92 0.67,-3.87 -0.11,-5.73 -1.01,-2.32 3.73,-0.74 3.99,-3.33 -0.13,-2.25 -0.54,-4.21 1.52,-5.81 2.69,-2.56 2.7,-6.48 0.46,-8.94 2.93,-1.39 1.66,-4.89 3.52,-7.09 1.35,-0.88 5.1,1.96 4.84,-1.65 -0.51,-1.95 -1.78,-6.23 1.75,-4.92 2.24,0.45 5.5,2.66 7.12,-0.07 1.29,-1.53 -2.75,-1.44 -0.66,-3.53 0.95,-1.42 0.76,-3.57 -0.83,-4.28 3.02,-0.52 2.64,2.5 5.35,3.5 2.17,2.8 6.24,2.01 8.45,4.17 1.81,1.26 3.78,2.76 3.22,5.22 1.03,1.27 -0.68,4.42 1.98,4.24 -0.85,2.83 1.11,4.63 2.62,6.51 0.04,2.86 -1.49,6.25 1.05,8.57 1.6,1.29 3.31,4.27 -0.1,3.45 -1.76,0.14 -2.91,-0.92 -2.17,1.42 -0.95,1.6 -5.22,-2.83 -4.14,0.58 0.84,1.65 -2.05,2.45 -1.57,1.13 -2.06,-0.65 -0.53,1.54 0.66,1.49 -0.6,0.2 -1.52,0.57 -0.3,1.82 -1.49,0.26 -4.7,1.58 -1.68,2.64 2.32,2.25 -3.2,4.64 -1.02,7.19 1.54,0.9 4.4,2.82 1.64,4.33 -1.68,2.21 -0.66,5.89 -3.12,7.17 -0.94,1.59 -3.16,2.96 -4.81,3.45 -0.21,1.34 -1.22,2.8 -1.35,4.54 -1.77,-1.72 -2.61,0.56 -2.76,1.85 -1.12,0.81 -2.56,2.13 0.01,2.01 -0.44,1.31 -4.33,0.73 -2.47,3.43 -0.06,0.73 -0.49,2.94 -1.88,1.95 -2.76,-0.24 -2.07,3.37 0.06,3.69 -0.77,1.95 -1.46,4.89 0.24,6.81 -3.74,-1.85 -2.36,2.41 -0.94,3.91 0.18,1.27 -3.07,0.5 -0.73,1.44 0.84,1.85 1.12,4.66 1.43,6.67 -0.32,2.79 5.02,-0.22 4.86,2.53 0.7,1.96 4.04,1.71 4.48,1.82 -3.19,-0.43 -0.28,3.53 1.17,3.32 1.13,1.08 3.55,2.93 0.69,3.17 -0.96,1.32 -2.08,3.54 -3.42,3.71 1.54,1.27 -2.79,1.25 -1.63,-0.68 0.49,-2.21 -4.13,-4.8 -3.64,-1.69 1.43,0.51 0.2,2.21 2.13,2.69 -1.79,0.21 -3.94,-2.79 -5.52,-0.41 -0.59,-1.15 -2.36,-1.3 -1.99,0.35 -2.53,-0.76 -3.68,2.49 -1.03,1.96 1.95,-0.49 4.14,0.17 6.05,0.67 -0.71,2.97 4.28,-1.28 2.88,1.93 -0.14,2.13 -0.95,4.88 -3.12,4.77 0.18,1.44 -0.14,1.56 -2.15,1.24 -1.48,-0.93 -5.69,1.16 -2.24,1.59 0.93,-0.93 4.88,0.08 2.51,0.95 -1.3,-0.74 -2.65,-1.15 -1.6,0.7 1.1,0.49 3.58,1.85 1.37,2.42 -0.48,1.93 2.49,4.34 -0.83,3.78 -1.22,1.55 3.46,2.55 0.79,3.59 -0.59,1.57 1.8,1.83 -0.1,3.07 -0.36,1.71 1.22,3.68 -0.24,4.3 0.8,1.29 0.72,4.62 -0.49,4.51 -0.92,1.99 -0.01,8.09 -3.9,5.74 -0.75,-0.04 -1.2,1.04 -1.28,-0.03 -1.81,1.13 -4.91,0.3 -5.24,2.54 -3.47,0.86 -2.77,5.15 -1.48,7.22 -1.25,2.12 -3.78,-0.71 -5.21,1.44 -0.58,0.2 -1.19,0.28 -1.8,0.28z m21.76,-13.69c-0.6,-1.64 -0.03,-5.51 0.58,-5.62 -0.47,1.84 -0.07,3.79 -0.58,5.62z m11.16,-10.28c-1.47,-2.04 -0.57,-3.97 -1.15,-6.17 0.13,-1.54 3.5,-5.82 3.93,-3.32 -1.59,1.67 -1.23,4.3 -0.42,5.29 -0.56,1.58 -2.33,2.58 -2.36,4.21z m-6.04,-22.62c-0.58,-0.9 -1.01,-2.64 0.37,-3.19 0.51,-2.57 3.62,1.5 0.73,1.06 -0.71,0.44 -0.93,1.57 -1.1,2.14z m3.41,-4.74c-1.71,-0.56 1.15,-0.98 0,0z","name":"Sweden"},"no":{"path":"m283.92,239.69c-2.05,0.82 -1.04,-2.38 -3.04,-0.45 -2.25,0.63 -2.45,-1.19 -0.48,-1.71 1.16,-1.98 -1.94,-1.69 -2.54,-0.89 -1.88,-1.69 -4.73,-3.13 -5.46,-5.54 0.16,-1.17 0.04,-2.84 1.26,-1.53 2.45,-0.31 0.5,-3.28 2.63,-3.15 -0.92,-1.74 3.6,-1.24 2.16,-3.19 -1.49,-0.01 -3.77,0.75 -1.5,-1.08 1.07,-1.87 -4.03,-2.48 -3.95,0.31 -0.43,1.99 -1.31,-1.27 0.03,-1.59 -0.59,-1.71 3.37,0.46 2.3,-1.73 2.11,-0.09 3.7,-3.31 0.62,-1.92 -2.12,1.06 -0.9,-1.62 0.69,-0.69 -1.77,-1.8 3.78,-2.21 0.57,-3.6 -0.56,-4.05 -3.61,3.53 -2.9,-0.4 -0.09,-1.07 2.45,-2.14 0.56,-2.38 1.23,-1.75 0.14,-1.45 -1.12,-1.67 -0.48,-2.03 3.39,-0.54 1.29,-2.62 -1.57,-0.11 -2.3,1.01 -2.92,1.83 0.23,-1.47 -0.96,-1.1 0.71,-1.97 1.17,-0.81 3,-0.92 0.68,-1.9 -1.68,1.41 -3.48,-0.55 -1.63,-1.27 2.35,2.15 4.25,-2.5 6.35,0.43 1.83,1.86 1.2,0.18 2.05,-1.15 2.54,-0.3 -0.18,4.44 3.17,3.6 2.08,-1.21 -0.36,-4.05 -1.72,-4.82 -1.87,-1.19 -2.86,1.17 -4.77,-0.24 -1.71,-0.32 -5.74,2.24 -5.21,-1.12 1.24,-0.84 -1.48,-1.91 1.02,-1.63 0.93,-0.21 -1.41,2 0.86,1.55 1.15,0.42 4.11,-2.74 2.32,-2.56 -1.17,0.24 -3.58,0.07 -2.04,-0.78 0.01,-1.15 -2.86,-0.72 -1.37,-2.6 1.92,-1.21 1.67,-2.06 2.44,-3.76 1.13,0.7 1.55,1.95 2.59,0.89 1.71,1.83 3.67,-1.21 0.78,-1.26 -1.72,-1.7 2.02,-2.98 1.47,-0.81 -0.08,1.94 2.1,2.28 1.49,0.15 -1.54,-0.73 -0.39,-3.26 1.26,-2.04 -0.9,2.54 1.99,2.46 3.2,1.29 -0.57,-1.07 -3.07,-0.84 -2.76,-2.61 -1.93,-0.78 -0.88,-1.18 0.63,-1.75 -0.31,2.53 1.54,0.84 1.46,0.89 0.76,2.66 4.97,0.16 2.35,-0.64 -1.68,1.13 0.97,-2.47 -1.62,-1.35 -1.33,0.1 -1.92,0.19 -0.62,-0.55 0.77,-1.45 -3.3,-3.11 -0.25,-2.56 1.36,2.34 4.5,0.23 4.77,-0.42 0.76,1.21 1.99,4.78 3.9,2.5 -0.19,-1.38 -1.61,-1.13 -0.15,-1.91 -0.52,-0.88 -3.96,-0.82 -1.31,-0.98 2.56,1.07 3.94,-2.68 1.6,-3.22 -2.38,3 -0.29,-2.57 1.23,-0.79 -1.13,2.54 3.47,1.05 2.52,-0.37 0.79,-1.1 1.41,-2.4 1.63,-0.68 1.42,0.16 -1.15,3.34 1.22,2.27 1.23,1.9 3.05,-0.32 1.25,-1.45 2.02,0.81 5.84,0.23 4.08,-2.68 2.55,-0.11 3.44,-2.71 1.89,-3.48 2.7,-0.44 1.04,-4.25 -0.61,-2.47 -0.94,0.99 -4.98,3.53 -3.32,4.59 1.36,-0.14 -3.55,4.36 -3.84,1.11 1.8,-0.4 1.59,-2.97 -0.14,-1.47 -1.54,1.59 -1.58,-0.15 0.05,-0.55 1.29,-0.12 3.11,-2.23 0.74,-1.96 0.49,-1.84 0.69,-1.57 2.55,-2.66 -0.01,-1.8 3.87,-1.75 1.44,-3.46 1.6,-3.11 2.62,3.25 4.94,0.36 -0.07,-0.91 1.83,-2.92 -0.44,-2.32 -1.97,0.37 0.51,-3.35 0.91,-3.77 2.46,-0.4 5.23,-2.14 6.04,-4.52 -0.69,-1.41 -1.97,0.46 -0.84,-1.25 0.83,-2.9 -4.58,-0.06 -1.84,-2.23 2.88,-0.42 -1.2,-4.08 2.2,-4.17 1.93,2.26 1.6,-1.88 -0.02,-2.41 1.79,-0.55 2.5,-1.55 4.25,-0.42 0.51,-2.76 -3.45,-2.33 -4.43,-3.58 -0.26,-3.01 2.59,-3.12 4.58,-3.67 0.29,-0.78 -0.81,-3.13 0.47,-2.48 2.46,0.65 2.45,-2.36 2.11,-3.23 1.27,-0.62 3.06,1.08 2.81,-1.49 0.06,-2.75 -4.88,2.23 -2.7,-0.53 -0.33,-1.84 3.17,-2.65 3.79,-1 0.44,2.38 2.69,0.96 0.74,-0.53 -0.37,-0.19 2.89,-3.12 0.16,-2.12 -1.52,1.62 -2.69,-1.67 -0.67,-0.49 2.18,0.6 1.78,-2.26 0.1,-2.63 1.64,-0.99 1.76,-1.25 3.09,0.31 2.65,0.05 -0.04,3.53 -1.13,3.83 -0.13,2.43 3.49,4.78 1.03,6.94 -1.52,2.38 -4.26,5.02 -2.96,8.1 -1.03,2.23 -5.62,0.34 -3.97,3.87 1.08,2.24 -0.41,4.62 0.29,6.91 -0.21,2.4 -1.5,4.65 -2.48,6.84 -1.89,2.33 -0.64,4.78 1.42,6.24 1.36,2.71 -1.06,4.75 -3.56,3.4 -3.47,0.13 -6.05,3.54 -6.55,6.75 -0.09,2.61 -2.39,4.76 -0.87,7.58 1.7,0.33 -0.26,3.51 0.65,5.09 0.93,2.11 2.11,4.27 1.04,6.66 -1.85,3.6 1.33,5.61 3.87,7.28 0.34,1.26 -0.49,2.52 -0.69,3.78 -4.37,0.5 -1.64,4.45 -0.68,6.73 -0.19,2.39 0.87,5.69 -1.37,7.29 -2.33,-0.08 -2.37,2.05 -2.44,3.42 -2.81,2.64 1.45,6.5 -0.89,9.33 -0.63,-0.51 -0.86,-4.28 -3.41,-3.07 -1.98,0.66 -1.1,-2.02 -2.18,-2.85 0.06,-1.66 0.25,-4.8 -1.34,-6.05 -1.51,0.96 0.6,3.37 -1.47,1.82 -1.6,1.08 1.29,3.05 0.43,4.75 1.82,1.57 -1.36,1.57 -0.61,3.28 -0.57,0.33 -1.78,3.28 -2.33,0.68 -1.69,-2.25 -3.03,0.06 -1.93,1.1 -2.37,0.2 -1.22,2.58 -3.27,2.72 0.26,1.74 0.63,2.15 -0.66,0.4 -0.55,-0.29 -0.31,3.24 -1.72,3.89 -1.13,1.13 -2.53,1.14 -2.96,2.81 -1.25,-1.4 -1.53,-2.14 -2.1,0.08 -0.58,1.07 -1.97,0.9 -2.97,1.19z m1.79,-42.62c-2.02,0.59 -1.81,3.69 -1.92,5.35 2.29,1.58 5.16,-1.56 2.82,-2.47 -2.51,1.62 -0.41,-2.26 1.2,-2.22 -0.69,-0.24 -1.35,-0.63 -2.1,-0.66z m-8.26,-3.48c1.26,1.05 1.96,-0.59 3.75,0.18 2.86,-0.7 0.32,-3.31 -1.23,-1.63 -0.54,1.11 -4.66,-2.16 -3.53,0.83 -0.64,0.74 0.98,1.54 1.01,0.63z m-1.56,-1.31c1.64,-1.54 -2.29,-0.9 0,0l0,0z m-3.39,20.54c-1.15,-1.48 -0.79,-2.31 1.27,-2.09 -0.5,0.65 -0.76,1.45 -1.27,2.09z m20.58,-43.12c1.89,-0.99 1.05,0.09 0,0z m18.74,-19.12c-0.11,-1.35 1.21,-2.72 0.71,-0.65l-0.24,0.29 -0.47,0.36 0,0z m7.46,-19.18c-1.61,-0.55 0.1,-1.14 0,0l0,0z m3.95,-10.61c-1.42,-0.85 2.16,-3.22 0.98,-0.56 -0.23,0.31 -0.59,0.56 -0.98,0.56z m8.03,-3.21c-0.35,-1.4 -4.22,-5.53 -0.69,-3.55 1.98,-0.66 -2.87,-2.41 0.24,-2.21 2.34,-1.07 1.29,3.96 3.81,2.24 0.12,-1.58 -1.95,-2.83 0.76,-2.09 1.98,-2.01 2.51,5.82 -0.36,3.01 -2.2,-1.1 -3.01,1.06 -3.76,2.6z m-5.57,-1.57c-2.14,-0.36 2.05,-0.11 0,0z m-7.93,-1.09c-0.6,-2.04 2.47,-0.64 0,0z m7.12,-4.13c0.59,-2.37 4.58,-1.01 4.01,-4.46 0.66,-1.69 0.95,3.05 2.77,1.99 1.53,1.25 -2.5,3.06 -1.7,0.6 -1.05,-1.01 -2.27,1.66 -3.77,0.7 -0.56,0.22 -0.96,0.7 -1.3,1.17z m7.58,-0.78c-1.19,-2.28 3.86,-0.43 2.34,-2.88 -3.7,-0.04 1.43,-1.56 0.6,-2.56 -2.52,-1.2 0.41,-2.37 1.15,-2.81 0.41,-3.22 -2.85,-1.84 -4.06,-0.47 -1.59,-2.04 2.26,-2.36 2.32,-4.57 0.14,1.33 0.46,2.85 1.65,2.42 0.8,1.52 3.32,1.84 3.24,-0.37 1.68,1.68 2.77,1.67 2.31,-0.48 0.79,-1.17 0.35,-2.79 1.61,-3.02 -0.4,-0.66 -1.42,-3.92 0.2,-3.31 0.95,2.39 -0.14,5.28 -0.89,7.26 2.94,1.88 1.55,-3.57 4.12,-3.05 0.22,-1.76 -3.3,-2.79 -1.17,-4.59 1.11,2.64 2.9,-1.39 2.9,-1.08 0.95,0.44 4.33,3.19 2.86,0.58 0.52,-1.54 -0.4,-5.86 -2.92,-3.36 -3.05,-0.22 1.04,-4.05 2.23,-1.43 1.8,-0.47 3.36,-0.55 3.65,1.78 1.6,2.82 3.68,-1.17 2.1,-1.52 0.07,-0.51 -0.69,-2.47 -0.41,-3.71 -0.86,-0.45 -2.21,1.67 -1.86,-0.59 0.28,-1.23 2.77,-3.11 1.94,-0.75 0.94,1.47 4.41,-0.15 2,-1.03 0.6,-1.49 3.48,0.04 1.97,-2.16 -0.79,-0.71 -2.04,-3.95 0.25,-3.13 1.93,-0.42 3.84,0.45 2.02,2.21 -1.75,1.98 -0.56,3.61 -0.42,5.65 -2.28,2.68 3.1,3.87 2.24,0.45 -0.18,-2.74 0.93,-5.32 1.76,-8.05 1.89,-3.05 -1.06,3.6 0.33,2.81 1.3,-1.62 0.64,3.35 2.9,1.4 2.12,-1.22 -1.68,-4.46 1.77,-4.91 0.72,-1.47 -2.34,-1.18 -0.57,-2.18 -0.51,-2.17 4.79,-1.62 2.39,1.11 -1.65,1.09 -1.95,4.14 -0.56,3.08 -0.4,2.24 2.84,0.85 3.62,0.4 -0.89,-1.13 -1.79,-4.79 0.32,-4.87 0.09,2.52 4.6,3.29 3.84,0.25 1.3,0.25 1.81,0.78 0.68,1.44 0.12,2.4 2.78,-0.68 3.9,1.46 2.08,1.26 -1.72,0.74 -1.03,2.68 -0.51,3.31 -7.08,0.08 -6.25,3.51 1.53,-0.19 4.57,0.06 4.67,1.27 -0.73,2.54 2.28,1.63 2.62,2.01 1.41,2.24 -3.5,3.67 -1.9,6.17 0.12,3.04 -1.51,0.49 -0.35,-1.03 0.73,-2.35 -0.61,-5.22 -3.22,-5.51 -2.52,-0.23 -4.95,-4.8 -6.83,-0.86 -0.98,2.59 -3.07,-0.98 -3.73,2.03 -1.82,2.85 -1.43,6.39 -0.81,9.47 1.12,1.85 1.17,3.38 -0.82,4.1 -0.7,1.31 0.29,4.41 -1.67,2.5 -2.14,-1.69 -5.02,-0.86 -5.85,1.4 -2.54,0.85 -4.72,0.04 -5.34,-2.66 -0.99,-2.14 -5.91,-6.2 -6.14,-1.61 0.57,2.13 -0.39,0.96 -1.13,1.23 -0.7,0.99 -4.96,0.92 -2.14,2.3 2.85,1.94 -1.88,4.5 0.34,5.92 1.59,3.24 -4.12,0.39 -5.68,0.21 -2.06,-1.04 -3.15,2.55 -4.42,0.38 -1.01,-0.36 -2.16,1.19 -2.67,1.07z m-9.01,-1c0.11,-2.56 2.91,0.13 0,0z m-1.13,-1.28c-0.8,-1.29 3.49,-1.49 0.69,-0.52l-0.34,0.34 -0.36,0.18 0,0z m4.3,-0.48c-1.71,-0.47 -0.9,-2.93 0.17,-2.2 -0,0.74 -0.11,1.47 -0.17,2.2z m4.79,-4.64c0.18,-0.78 1.29,-1.07 0,0z m7.64,-3.83c-2.24,0.29 -1.11,-3.47 -0.22,-0.75 0.06,0.35 1.74,0.98 0.22,0.75z m2.2,-0.62c-2.38,-0.91 -2.84,-5.4 0.1,-4.68 0.37,1.54 -0.1,3.12 -0.1,4.68z m-1.72,-6.1c-4,-0.97 3.45,-2.52 1.03,-0.52 -0.42,0.05 -0.59,0.56 -1.03,0.52z m5.27,-4.48c-0.27,-0.28 0.7,-0.67 0,0z m42.25,-2.91c-1.73,0.39 -2.88,-3.16 -0.45,-1.74 1.34,-0.78 2.3,1.96 0.45,1.74z m-35.9,-2.93c0.17,-2 2.33,-0.17 0,0z m1.12,-1.12c1.6,0.69 0.37,-2.16 2.16,-2.14 -0.43,0.5 -1.9,3.93 -2.16,2.14z m20.87,-4.79c0.68,-1.68 0.54,-0.43 0,0z m-9.67,-2.21c-2.58,-0.52 -0.4,-3.09 0.65,-0.8 -0.07,0.3 -0.24,0.8 -0.65,0.8z M319.32,12.08c-0.3,-1.14 -1.45,-2.77 -2.39,-2.03 -1.57,-1.66 3.97,-2.79 -0.11,-4.02 -1.19,0.78 -1.7,1.41 -2.54,-0.32 -1.8,0.29 -3.52,-4 -2,-4.15 0.28,2.4 2.41,-1.85 3.57,0.39 1.62,1.46 1.99,-0.61 1.81,-1.03 1.1,0 2.2,0 3.3,0 -1.65,1.5 0.79,4.98 -1.45,5.97 1.81,0.96 -0.87,3.73 0.84,4.72 -0.27,0.27 -0.64,0.46 -1.03,0.47z M334.56,1.41c-0.71,-0.78 1.26,-0.59 0,0z","name":"Norway"},"ua":{"path":"m458.88,376.43c-1.65,0.13 -4.78,-1.76 -1.5,-2.12 1.11,-0.94 -0.88,-2.9 1.02,-4.06 0.62,-1.77 2.75,-4.95 1.17,-6.55 -2.35,-0.6 0.77,-4.92 0.58,-1.37 1.22,0.09 1.33,-0.46 2.29,-1.4 1.42,1.03 2.11,1.68 2.01,-0.49 0.8,-0.31 0.98,2.31 1.91,0.48 2.09,-0.77 2.07,-2.38 0.02,-2.62 0.48,-3.05 -2.01,-4.08 -4.34,-4.76 -1.03,-1.35 0.14,-4.1 -2.32,-4.58 -0.19,2.48 -3.85,-0.68 -2.94,-2.62 0.58,-1.57 -1.58,-5.77 -2.62,-3.02 -1.32,-0.9 -3.45,-3.78 -4.76,-1.05 -0.61,-1.26 -0.31,-1.31 -2.39,-0.85 -1.59,-0.19 -3.7,-2.91 -5.96,-1.05 -1.9,1.41 -4.52,1.99 -6.34,2.49 -0.3,1.21 -2.98,2.87 -3.26,4.06 0.69,2.88 -3.92,2.94 -5.88,3.36 -1.91,1.06 -2.85,5.5 -5.12,2.22 -2.55,-1.4 -4.85,1.16 -7.45,0.17 -2.78,0.68 -6.22,-1.81 -7.42,1.27 -1.7,-1.79 -4.36,-1.99 -6.08,-3.8 -1.69,-1.99 1.67,-4.76 1.1,-7.32 0.71,-2.08 3.89,1.72 3.03,-0.71 -0.43,-1.86 -2.14,-2.21 -2.09,-4.41 -1.6,-2.52 1.02,-5.01 1.85,-7.4 1.48,-2.09 2.06,-5.46 4.76,-6.09 3,-1.14 0.85,-4.79 0.14,-5.51 2.5,-2.1 -3.76,-3.23 -3.93,-5.84 -0.3,-1.41 -1.88,-4.75 0.96,-3.25 2.78,-0.65 2.08,-4.77 5.31,-4.83 2.44,-2.13 5.65,-1.09 8.41,-2.29 2.86,0.12 5.82,0.8 8.71,-0.13 1.44,0.02 2.96,3.43 4.46,0.67 0.48,-0.61 1.02,3.11 2.27,0.92 -0.68,-2.01 1.68,-0.28 2.33,-1.83 1.72,1.64 3.14,-2.06 4.36,1.19 0.98,-0.83 1.53,-5.36 3.12,-2.13 0.91,1.83 2.9,1.59 3.18,-0.37 1.11,-0.89 4.84,0.77 2.92,-1.35 2.22,-0.55 3.94,4.29 5.74,0.82 -0.53,-2.27 -3.24,-4.21 -1.65,-7.03 0.3,-2.91 3.55,-3.36 5.73,-4.62 2.8,0.98 5.55,-1.1 4.6,-3.99 2.15,-0.59 4.74,-0.01 5.62,-2.79 1.28,-1.72 2.08,2.03 2.83,-0.54 3.15,-1.7 3.09,3.74 6.17,3.78 2.69,0.81 -2.77,1.83 -0.06,3.34 0.97,1.1 0.27,1.92 1.66,2.64 0.13,1.93 0.76,2.76 1.8,0.93 1.75,0.21 3.63,-0.42 4.86,-1.04 1.22,1.6 2.86,1.33 3.58,3.44 0.66,2.12 2.97,6.38 5.86,3.86 0.95,-2.66 2.98,0.62 4.61,-0.26 2.96,0.38 3.76,-3.58 5.99,-4.66 2.15,1.36 3.87,3.07 6.32,3.78 2.39,1.73 1.46,-2.06 1.83,-2.22 2.04,0.83 3.63,-0.35 5.65,0.78 1.64,-1.06 3.29,-0.67 5.4,-0.98 -0.34,2.96 3.78,0.35 3.93,-0.21 -1.54,1.79 2.89,1.91 1.36,4.34 -0.91,1.71 -3.3,4.32 0.42,4.36 1.34,-0.17 -2.51,1.76 -0.87,3.22 0.73,1.16 4.31,0.82 2.94,3.4 -1.12,2.14 2.56,-1.79 1.05,1.32 0.04,1.92 1.74,4.67 -1.56,4.6 -2.59,0.04 -5.57,1.58 -4.88,4.34 -1.93,1.59 -3.46,4.3 -2.04,6.74 1.21,-0.9 1.4,3.27 -0.48,2.33 -2.61,-0.17 -4.34,2.86 -4.47,4.25 -3.32,-0.37 -1.93,5.58 -4.94,3.83 -1.97,0.68 -1.55,3.31 -3.9,2.83 -2.31,2.16 -4.28,4.87 -4.46,8.16 0.05,2.37 -1.89,1.63 -2.69,0.94 -1.43,2.66 1.92,4.83 3.49,6.52 1.72,1.52 4.3,4.21 6.67,2.42 1.12,-1.05 0.41,-2.57 2.09,-1.56 1.41,-0.15 1,-2.82 3.17,-2.37 1.15,-0 0.13,2.98 0.5,4.21 -1.72,0.79 -3.13,2.24 -5.41,1.17 -2.72,0.19 -1.51,3.05 -3.33,4.45 -1.46,1.36 -5.27,2.16 -5.39,5.34 -0.65,2.52 -2.91,5.33 -5.63,3.62 -2.92,-0.52 2.13,-0.53 -0.45,-1.77 -0.6,-1.76 -0.24,-6.9 -3.31,-5.63 -2.51,0.74 -5.09,-2.4 -7.49,-0.19 -0.84,-1.11 2.17,-2.44 2.5,-3.9 1.15,-2.11 4.76,-3.17 5,-5.4 -1.21,-0.47 -1.1,-4.45 -2.98,-2.14 -0.01,2.53 -3.55,-2.55 -3,-0.06 -1.18,1.35 -4.02,3.26 -6.29,3.26 -0.55,-2.41 -5.82,0.8 -2.84,-2.01 -2.07,-2.11 3.13,-0.37 2.51,-2.12 0.43,-0.87 2.54,-3.83 0.04,-2.33 -1.67,2.49 -5.64,0.74 -4.34,-2.2 -3.44,-0.71 0.17,4.67 -3.05,4.35 -0.95,0.4 -1.24,-2.89 -2.18,-0.81 1.19,3.1 -5.65,1.69 -4.31,5.43 -0.19,2.64 -0.71,6.16 -2.65,8.5 -1.92,0.15 -2.28,-0.37 -1.97,1.56 1.06,2.6 -1.47,1.65 -1.44,-0.04 -3.03,0.54 1.86,5.97 -1.63,4.84 -1.69,1.04 -2.76,2.58 -4.85,3.23 -0.33,0.68 0.22,1.06 -0.9,0.94z m8.84,-3.13c-1.24,-0.5 0.31,-1.59 0,0z M480,354.71c-2.02,-0.24 1.4,-0.94 0,0z","name":"Ukraine"},"il":{"path":"m564.91,519.32c-2.79,-0.13 -5.59,-0.02 -8.39,-0.06 1.03,-3 0.55,-6.35 0.36,-9.47 -0.77,-1.89 -0.08,-3.97 0.69,-5.38 -2.21,-3.68 3.62,-1.36 3.34,-4.63 0.16,-2.5 0.5,0.45 0.78,1.3 0.41,1.74 0.97,3.45 0.64,5.26 0.64,4.15 2.85,8.05 2.93,12.32 -0.33,0.17 0.28,0.88 -0.36,0.66z","name":"Israel"},"sa":{"path":"m593.15,519.31c-2.83,-0.62 -5.1,-2.77 -7.77,-3.86 -1.58,-0.98 -5.22,-1.86 -2.02,-3.26 5.2,-3.81 10.77,-7.23 15.26,-11.9 1.43,-2.99 4.63,-3.12 7.49,-3.98 3.73,-1.26 7.76,-1.54 11.57,-0.41 3.34,1.04 6.79,1.79 10.32,1.49 3.1,-0.23 6.16,0.27 9.07,1.36 7.05,2.14 14.23,3.86 21.25,6.06 3.22,1.22 7.13,2.8 10.33,0.7 3.47,-1.54 7.12,-2.66 10.59,-4.19 0,5.98 0,11.96 0,17.94 -28.52,0 -57.04,0 -85.55,0l-0.54,0.05z","name":"Saudi Arabia"},"iq":{"path":"m665.09,505.54c-3.93,-0.14 -7.37,-2.41 -11.2,-3.08 -6.98,-1.9 -13.93,-3.92 -20.88,-5.88 -4.51,-0.55 -9.21,0.46 -13.56,-1.25 -4.06,-1.23 -8.45,-1.67 -12.53,-0.27 -2.28,0.01 -6.14,3.28 -6.23,-0.28 -1.25,-1.52 -3.9,2.58 -3.26,-0.38 2.09,0.09 -1.51,-3.02 -1.67,-4.04 -1.32,-2.57 -5.49,-5.02 -2.13,-7.49 4.5,-5.84 9.16,-11.56 13.6,-17.45 2.04,-3.07 2.39,-7.4 0.02,-10.4 -1.41,-3.28 0.38,-7.66 -2.62,-10.31 -3.09,-2.29 -2.71,-6.73 0.85,-8.16 2.5,-2.92 2.33,-7.04 4.39,-10.19 0.66,-2.04 0.93,-3.47 3.19,-3.89 2.1,-2.75 5.72,-0.13 8.03,-2.44 0.9,-1.04 2.2,-3.85 2.95,-0.99 0.24,2.01 2.47,2.98 2.75,0.39 0.38,-1.99 1.84,-3.41 3.5,-1.73 2.25,0.16 -1.13,2.67 1.73,2.71 2.42,-0.18 1.65,4.3 5.21,2.73 1.14,1.18 1.93,5.76 4.16,3.01 2.6,0.76 5.25,0.47 7.14,-1.59 0.61,0.22 -3.19,2.13 -1.4,3.83 1.09,1.94 5.9,4.19 1.79,5.59 0.41,2.25 -2.38,5.11 0.78,6.65 -2.86,-0.58 -2.74,5.86 0.16,4.24 -0.52,2.48 -0.45,5.39 2.6,5.52 0.99,0.71 1.98,1.43 2.96,2.14 0.34,-1.31 1.06,-1.78 0.88,-0.17 1.65,-0.62 3.99,0.32 4.03,2.59 0.12,1.35 0.91,3.75 2.75,1.76 3.33,-1.46 6.61,1.38 9.97,1.03 2.56,-1.77 4.83,0.86 6.18,2.91 0,13.19 0,26.38 0,39.57 -4.3,1.87 -8.8,3.32 -13.06,5.23 -0.36,0.05 -0.72,0.08 -1.09,0.08z","name":"Iraq"},"az":{"path":"m625.84,392.01c-2.29,-1.74 -6.12,-1.39 -7.67,-4.17 -2.87,-0.9 2.82,-3.1 1.5,0.21 -0.29,2.16 0.66,-0.38 1.38,-0.86 1.98,0.67 2.99,-0.38 4.14,-1.97 0.78,0.36 1.17,3.12 3.09,2.25 0.41,1.86 5.4,3.6 1.25,3.88 -1.24,0.15 -2.44,0.52 -3.69,0.66z m9.25,-4.53c-1.22,-1.31 -1.37,-1.74 -0.58,-3.22 -0.7,-1.79 -4.05,0.28 -2.18,-2.45 -0.71,-3.07 -3.86,1.6 -5.74,-0.73 -1.12,-1.04 -4.8,-0.64 -2.24,-1.72 1.66,-3.91 -3.46,-4.05 -5.96,-4.45 -3.06,-0.54 1.31,-0.13 -0.04,-1.79 -1.74,-0.11 0.76,-3.32 -2.15,-2.78 -1.13,-2.07 -3.77,1.24 -3.43,-1.3 -3.83,0.78 -1.14,-4.07 1.25,-3.79 1.55,-0.11 2.45,2.19 4.64,1.11 1.17,-0.47 1.66,-2.32 3.53,-1.24 4.04,0.44 2.81,-5.63 -0.82,-5.09 -1.19,-0.23 -4.57,-0.92 -2.6,-1.97 -1.03,-3.22 2.59,-2.79 4.29,-1.55 1.8,0.76 4.71,-0.66 4.29,1.94 2.3,1.27 5.96,-0.02 6.83,-2.57 -0.51,-2.81 0.78,-5.44 1.5,-8.17 0.77,-1.87 3.93,1.21 5.57,1.75 2.04,2.28 4.63,3.86 7.4,4.84 2.72,2.9 5,-2.29 8.05,-0.66 2.42,0.7 -1.69,0.86 -2.16,1.8 -1.58,1 -0.94,2.98 -2.64,4.05 -0.87,2.65 2.35,4.7 1.48,7.28 0.01,2.24 2,3.06 1.53,5.18 2.05,2.31 -2.94,0.21 -1.67,3.07 0.41,2.71 2.06,5.63 2.66,7.96 -1.4,1.58 -3.89,-2.8 -4.72,-0.12 -0.51,-2.33 -5.01,-0.05 -2.24,-2.75 1.89,-2.25 -0.89,-2.79 -2.14,-3.4 -0.39,-1.7 3.13,-2.19 0.43,-2.98 -2.55,-2.17 -6.8,-1.82 -7.18,2.01 -1.56,2.2 -2.45,4.87 -3.2,7.25 -1.02,1.28 -1.42,2.9 -1.76,4.47z","name":"Azerbaijan"},"ir":{"path":"m679.21,458.81c-1.85,-0.64 -2.96,-4.67 -5.07,-2.4 -2.51,1.13 -4.99,-0.69 -7.5,-0.94 -1.54,-1.25 -4.65,1.4 -4.88,0.3 -0.35,-2 -1.76,-5.08 -4.31,-4.59 -0.55,-2.48 -2.8,0.93 -4,-1.28 -1.15,-1.36 -3.82,-0.5 -2.7,-3.18 1.2,-2.24 -1.18,-2.93 -1.92,-2.92 -0.76,-2.14 0.85,-1.8 1.93,-2.95 -0.87,-1.54 -2.25,-2.23 -1.18,-3.98 1.41,-1.22 -0.93,-2.74 1.62,-3.12 2.22,-2.84 -3.32,-4.02 -3.44,-6.68 1.23,-0.62 3.69,-3.96 0.62,-3.5 -2.16,1.88 -4.6,2.34 -7.4,1.61 -2.13,2.68 -1.52,-4.01 -4.35,-3.02 -2.59,1.12 -1.74,-3.71 -4.6,-2.9 0.47,-2.81 -2.6,-2.62 -3.34,-4.74 -3.51,-0.37 -2.73,-5.88 -6.79,-4.9 -2.43,-0.23 0.88,-4.74 -1.15,-6.42 -2.63,1.81 -2.65,-3.09 -4,-4.32 -2.26,0.51 -1.17,-4.01 -3.82,-4.01 -1.08,-1.34 3.43,-0.98 2.24,-3.41 -0.62,-1.73 -1.46,-4.27 1.42,-2.93 2.06,1.49 5.14,2.91 7.63,3.88 2.25,1.24 5.18,-0.04 7.5,-0.74 2.07,-1.71 5.07,-2.61 4.75,-5.97 2.3,-2.33 1.71,-5.53 3.7,-8.09 0.98,-2.61 2.58,-5.68 5.71,-3.44 1.82,0.32 -1.95,3.66 1.08,3.95 4.06,-0.35 -2.73,4.32 1.52,4.83 1.27,-1.49 2.59,2.44 3.8,0.15 1.45,1.58 3.99,1.1 4.87,0.71 1.82,2.85 3.68,6.92 7.62,6.9 3.17,0.36 5.34,-2.56 8.13,-3.02 2.01,0.9 4.99,2.01 6.34,2.88 -0.02,22.74 0.03,45.49 -0.03,68.23z","name":"Iran"},"ge":{"path":"m581.92,380.27c-2.26,-0.5 1.41,-3.83 -0.72,-5.4 -1.82,-2.3 -4.05,-4.17 -5.45,-6.77 -1.72,-2.18 -4.46,-0.36 -5.95,-2.58 -2.48,-1.15 -5.99,1.77 -7.69,-0.38 -1.24,-0.61 -3.4,-1.34 -1.11,-2.52 2.92,-1.18 5.31,-0.74 8.31,-1.17 2.62,-0.64 4.81,0.81 7.27,-1.05 1.64,-1.03 2.03,-2.53 4.37,-2.32 3.09,-1.55 5.23,0.93 8.34,0.23 1.97,-0.34 3.8,-1.06 3.76,1.37 3.33,1.16 4.09,-3.43 6.09,-4.97 1.82,1.19 3.56,0.44 3.29,-1.84 2.38,1.1 4.89,0.94 6.98,-0.29 0.1,2.19 0.6,4.52 3.44,3.9 1.82,0.87 6.7,-2.08 4.44,1.62 -1.04,4.09 6.18,1.33 6.51,4.88 -0.55,2.71 -3.63,-0.63 -4.78,1.93 -2.42,2.07 -3.95,-2.25 -6.59,-0.28 -2.88,0.84 -1.75,4.15 -4.11,5.26 -2.15,1.64 -6.02,2.97 -7.99,5.72 -1.4,1.55 -3.24,0.61 -4.57,1.11 -0.32,-2.7 -4.41,-0.39 -5.08,-2.59 -2.74,0.39 -1.4,4.41 -4.46,3.55 -2.08,-0.04 -2.63,2.5 -4.3,2.58z","name":"Georgia"},"sy":{"path":"m570.98,505.1c-2.37,-0.06 -4.22,-2.23 -6.66,-1.9 -1.76,1.54 -0.95,-3.61 -2.17,-4.66 0.26,-2.1 3.06,-4.25 2.48,-6.23 -2.86,0.37 -0.12,-3.18 1.61,-2.81 1.41,-1.1 -2.08,-2 0.23,-3.24 2.46,-1.85 0.82,-6.41 -2.32,-5.73 1.74,-2.54 -3.41,-1.48 -4.52,-0.5 -2.16,-1.45 -1.71,-4.59 -2.2,-6.89 -0.72,-2.13 -3.63,-2.2 -2.69,-4.95 -1.91,-3.07 4.61,0.44 2.96,-3.37 1.96,-1.34 -0.54,-4.12 2.56,-4.37 1.92,-1.95 -2.9,-3.08 -1.96,-5.67 -0.17,-2.68 3.53,-1.88 4.07,-0.24 2.8,-1.4 6.26,-2.87 7.96,-6.08 1.77,-3.87 6.01,-0.57 8.96,-1.32 4.89,-1.98 9.3,-5.28 12.15,-9.78 2.06,-3.09 5.52,-4.42 8.88,-5.51 3.15,-0.62 4.71,-4.01 6.68,-5.54 2.16,2.06 -0.35,4.49 -0.71,6.75 -0.34,2.94 -3.64,3.54 -4.67,5.93 -0.77,2.72 0.96,5.34 2.92,7.06 1.91,2.86 0.25,6.61 2.05,9.52 1.43,2.7 2.07,6.08 0.11,8.71 -2.41,4.04 -5.84,7.35 -8.54,11.19 -6.92,8.84 -13.8,17.72 -20.31,26.87 -1.64,2.62 -4.19,2.66 -6.86,2.76z","name":"Syrian Arab Republic"},"tr":{"path":"m494.91,482.2c-2.64,-0.83 -6.61,0.7 -6.69,-3.38 -0.28,-2.26 -4.06,-2.7 -3.32,0.14 -2.13,0.72 -2.01,-4.36 -4.24,-2.06 -1.1,1.64 -1.71,4.09 -2.75,1.3 -0.06,-0.7 3.87,-0.84 1.58,-2.85 -2.66,-0.75 -4.9,2.05 -7.56,2.3 -3.22,0.12 2.63,-2.09 -0.16,-3.58 -1.02,-1.26 -2.59,-1.78 -3.85,-0.25 0.8,-2.14 -2.11,-2.59 -0.3,-4.42 0.7,-2.91 -3.46,-4.14 -4.72,-3.08 -0.35,-2.13 -2.41,-1.66 -2.94,-0.12 -0.96,-0.52 -4.49,-1.13 -1.65,-1.67 1.95,-1.12 -0.35,-1.93 -0.64,-2.3 -0.1,-2.91 1.76,1.21 2.44,2.3 1.21,0.53 0.61,-1.54 2.32,-0.91 2.14,0.31 3.08,-4.19 0.9,-2.3 -2.98,0.71 -3.35,-2.88 -0.63,-3.63 1.42,-2.31 -2.41,-1.49 -2.02,-3.47 -1.48,-1.26 -3.08,-1.7 -1.12,-3.61 1.88,-4.06 -3.41,-1.44 -4.89,-0.21 -3.22,2.13 -1.41,-2.71 -2.53,-4.43 0.27,-1.5 2.4,-1.02 1.65,-3 1.08,-2.79 3.49,-3.54 5.85,-4.95 1.33,-0.2 3.18,2.13 5.06,0.5 2.19,-0.32 0.53,-4.12 2.21,-2.66 -1.01,2.78 3.65,-0.5 5.07,-0.34 1.73,-0.22 7.01,-0.13 5.15,-2.97 -1.48,-0.21 -3.18,0.39 -0.99,-0.95 1.96,-1.62 4.19,-2.4 6.66,-2.8 2.77,-0.54 1.2,-2.91 -0.89,-1.86 -1.93,1.45 -3.4,0.81 -4.38,0.32 -3.58,0.35 -2.31,-4.79 0.81,-3.52 2.71,0.01 5.57,-0.39 7.64,-2.28 2.46,-0.32 5.31,1.16 7.39,-0.69 2.9,-0.41 1.41,-4.52 4.23,-5.54 2.71,-2.98 4.61,-6.84 8.39,-8.68 2.29,-1.78 4.29,-3.83 7.39,-4.02 3.16,-0.7 6.47,-1.22 9.26,-2.97 -0.18,-2.01 2.92,-3.03 2.12,-0.46 1.09,2.77 5.37,3.22 7.04,0.72 1.14,-1.37 -0.27,2.45 1.16,0.14 2.04,-1.94 2.88,3.79 5.57,2.83 1.27,-1.86 4.62,-3.78 5.67,-1.09 1.67,-0.99 4.1,0.27 5.52,-0.17 -0.07,-1.45 1.44,-1.93 0.76,-0.72 3.48,0.31 7.66,-0.08 9.71,-3.32 2.34,-1.18 4.33,-4.18 7.15,-3.36 2.71,-0.07 6.67,-0.67 7.5,-3.83 1.38,-2.88 4.81,-4.34 5.49,-7.63 0.34,-3.02 3.69,-0.01 3.89,-2.79 0.79,-1.71 6.06,-0.8 5.2,-2.54 -0.27,-1.98 1.64,-2.11 0.91,-0.61 1.97,-1.13 4.24,-0.33 5.11,0.95 0.95,1.76 2.34,-1.7 3.43,0.93 2.07,0.94 4.5,1.8 3.64,4.81 0.12,2.83 2.56,6.38 5.64,4.35 1.45,-1.61 6.05,-1.12 6.12,-0.28 -2.87,1.25 2.28,4.65 -1.45,5.76 -2.31,0.86 -1.86,1.74 0.02,2.55 2.07,1.41 1.16,4.02 3.6,4.69 1.23,1.57 1.59,5.71 3.8,4.2 0.43,2.37 -1.79,7.52 2.74,6.05 2.64,-0.44 0.94,3.97 3.94,4.02 3.58,1.02 -1.74,2.3 -1.12,4.76 -1.2,0.98 -0.5,-3.85 -3.12,-2.67 -1.98,1.2 -2.57,4.14 -5.61,3.29 -2.88,-0.31 -4.84,1.72 -7.02,2.7 -0.69,1.88 -0.86,5.21 -2.91,2.44 -2.75,-0.22 -2.61,4.46 -5.58,4.92 -2.98,1.72 -6.75,1.93 -9.15,4.66 -2.61,2.66 -4.36,6.14 -7.61,8.16 -2.25,1.32 -4.52,3.36 -7.26,3.28 -3.54,-1.52 -7.49,-0.78 -9.08,3.03 -1.68,2.28 -5.43,4.75 -7.39,2.82 -3.82,-1.14 -4.64,3.62 -2.75,6 0.73,1.14 2.5,1.57 0.17,2.12 -3,0.1 0.83,3.76 -2.09,4.07 1.59,1.89 -1.39,2.48 -1.35,0.31 -1.32,-1.73 -3.85,-3.07 -1.43,-5.18 3.46,-2.09 -0.87,-8.48 -3.12,-4.45 -0.21,1.09 -4.52,4.06 -1.07,3.29 -0.14,0.32 -3.7,3.62 -5.39,1.57 -3.14,-1.5 -6.7,0.91 -7.75,3.93 -2.31,1.12 0.64,5.77 -2.52,4.44 -0.89,2.68 -3.25,3.27 -5.84,4.06 -1.96,1.06 -3.83,3.65 -6.37,2.47 -2.84,-1.55 -5.07,-4.65 -8.7,-4.14 -2.94,-0.38 -6,-0.94 -8.9,-0.06 -3.48,-0.29 -3.26,3.57 -2.85,5.62 -0.19,1.75 1.15,3.5 -1.34,2.67 -2.13,0.36 -2.94,2.88 -4.85,3.38z m-22.48,-0.92c1.54,-1.56 1.67,0.46 0,0z m4.91,-2.51c-0.79,-0.93 0.97,-1.15 0,0z m-7.81,-0.87c-2.21,-0.79 -0.04,-1.14 0.54,-0.39 -0.12,0.2 -0.29,0.4 -0.54,0.39z m-17.07,-35.78c-2.05,-1.66 3.84,-4.8 1.02,-1.64 -0.17,0.27 -1.7,3.54 -1.02,1.64z m-2.5,-4.63c-2.27,-0.95 2.99,-3.59 0.8,-5.77 -1.18,-2.59 4.67,-3.55 1.64,-6.24 -1.25,-1.27 -3.7,-1.75 -1.56,-3.41 0.31,-2.43 2.93,-0.92 3.7,-3.21 1.99,-1.8 4.08,2.49 6.12,-0.22 3,-2.82 1.8,3.03 4.59,3.75 2.54,1.72 5.71,1.31 8.59,1.46 1.59,1.71 -1.83,5.17 -3.31,2.87 -1.59,0.83 -4.21,-0.49 -5.46,2.07 -2.23,0.06 -4.36,0.17 -4.68,3.06 -0.43,2.55 -2.87,5.66 -5.23,3.75 -1.9,0.1 -3.3,1.78 -5.2,1.9z","name":"Turkey"},"am":{"path":"m631.96,389.85c-1.96,-0.78 -2.5,-4.05 -4.9,-3.4 0,-2.98 -2.99,-2.85 -3.89,-0.42 -0.72,0.59 -2.05,-1 -2.73,0.47 -1.44,-4.24 -3.82,2.15 -6.08,-0.34 -2.43,-1.36 -5.05,-0.13 -7.33,0.88 -1.6,1.02 -2.24,-1.35 -3.25,-2.19 -0.22,-2.63 -0.35,-6.8 -3.95,-6.8 -1.56,-1.33 3.34,-2.22 3.67,-4.1 2.01,-1.81 4.84,-2.17 7,-3.75 -1.93,-0.72 2.92,-0.35 0.29,0.72 0.12,2.73 3.55,-1.6 5.25,0.33 2.07,0.17 -1.51,3.12 1.09,4.06 1.57,1.97 7.78,-0.09 6.04,3.56 -1.81,0.88 -2.21,2.81 0.36,2.27 2.62,0.26 4.73,3.06 7.3,0.67 1.25,-0.38 -1.56,2.52 0.95,2.4 1.37,0.14 2.22,0.32 0.58,1.07 -0.16,1.55 3.78,3 0.58,4.04l-0.53,0.37 -0.44,0.16 0,0z","name":"Armenia"},"cy":{"path":"m527.35,491.44c-2,0.03 -5.42,-2.87 -2.34,-3.85 0.27,-2.84 4.77,-0.45 3.78,-3.88 -1.1,-2.02 2.82,-0.4 4.03,-1.67 3.21,-1.08 5.34,-3.84 7.9,-5.9 -1.85,1.69 -5.66,5.67 -1.55,7.09 -1.16,0.96 -4.02,1.69 -3.88,3.92 -1.79,0.94 -4.14,2.55 -4.75,3.95 -1.18,-1.33 -2.1,0.23 -3.19,0.34z","name":"Cyprus"},"ie":{"path":"m160.13,300.45c-1.94,-0.73 -5.41,-0.29 -5.93,-1.1 2.68,-0.96 1.02,-3.47 -1.27,-2.29 -2.17,-0.03 4.61,-0.27 1.86,-1.87 -1.29,0.35 -5.82,0.84 -4.6,-0.88 0.33,-2.41 5.15,0.07 4.57,-2.91 -1.5,-0.99 -3.62,0.6 -3.81,-1.26 1.2,-0.91 6.26,2.54 3.91,-0.67 0.38,-1.38 3.44,-1.82 5,-1.34 1.1,0.96 5.65,0.21 3.16,-0.84 -0.11,-2.83 -2.54,-0.03 -3.01,-0.47 -0.23,-0.23 -3.43,-0.5 -1.1,-1.34 2.22,-1.01 0.54,-4 2.82,-3.42 2.56,1.02 3.91,-3.17 0.52,-2.46 -1.68,0.14 -2.56,-0.23 -2,-1.83 -0.18,-2.01 -5.12,-1.21 -3.94,-2.82 2.15,0.5 2.19,-2.65 4.57,-1.69 2.67,-0.16 1.13,-2.7 -0.21,-3.26 0.29,-1.31 0.02,-3.18 -0.75,-3.28 2.65,-0.82 4.91,0.87 5.93,2.56 1.46,-1.86 3.2,1.45 5.23,1.05 -1.45,-1.4 -1.04,-3.03 1.32,-2.78 1.21,-0.78 -0.05,1.72 1.32,2.45 1.11,1.84 4.55,5.05 6.16,2.17 -0.49,-1.92 2.26,-1.77 1.43,0.13 0.94,1.15 1.06,2.27 0.8,3.26 0.63,1.48 4.47,-0.64 2.75,0.86 -2.34,0.42 -0.05,3.2 -0.77,4.83 0.46,1.62 -0.08,2.98 -1.28,2.32 1.02,2.41 1.46,5.54 -0.48,7.61 -1.25,2.01 -3.34,4.38 -4.14,6.02 -2.56,-0.85 -5.09,-0.34 -7.67,-1.06 -1.16,0.41 -0.62,2.52 -2.3,1.42 -1.5,0.14 -2.91,2.49 -3.4,0.19 -2.29,-1.05 -1.04,2.27 -2.69,2.29 -0.11,0.95 -1.6,-1.12 -2.01,0.4z m13.73,-33.46c2.33,-2.06 -0.9,-1.95 -2,-2.14 -1.29,-0.53 -2.55,-1.96 -0.25,-1.08 1.89,0.69 2.47,-1.66 2.15,-3.1 -1.16,-1.71 7.03,-1.16 4.23,1.31 -0.31,1.85 2.66,-0.08 1.09,1.63 -0.53,1.73 -5.09,0.69 -2.83,2.72 -0.77,0.31 -1.61,0.36 -2.38,0.64z m6.45,-5.05c0.02,-0.88 0.61,0.23 0,0z","name":"Ireland"},"gb":{"path":"m182.64,325.46c0.06,-1.95 -4.47,-2.09 -0.74,-2.3 2.67,-0.61 3.94,-3.31 6.49,-4.14 2.12,-0.77 1.4,-4.5 3.94,-3.31 1.45,-3.67 5.43,-1.45 8.06,-0.26 2.91,0.6 2.6,-3.72 5.07,-4.06 1.35,-0.1 4.35,-3.93 1.42,-2.57 -1.86,1.99 -5.05,0.84 -6.82,2.84 -2.27,-0.51 -2.72,-5.62 -5.77,-3.31 0.24,-2.37 -1.53,-4.27 -3.69,-2.44 -0.87,0.75 -2.94,0.79 -1.58,-0.17 0.16,-1.27 -3.6,-0.88 -1.52,-2.98 1.52,-0.74 3.44,0.29 4.82,-1.36 2.13,0.95 4.49,-1.92 5.83,-3.38 1.68,-2.26 0.05,-8.36 -3.37,-5.58 -1.46,1.33 -0.19,-1.41 0.97,-0.91 1.28,-1.84 2.91,-2.79 5,-2.8 1.2,0.32 4.62,-0.54 5.23,2.01 0.71,1.84 0.61,0.28 0.62,-0.81 -0.49,-1.45 0.01,-1.88 0.83,-1.63 -1.44,-2.21 1.58,-2.99 1.67,-4.6 -1.45,-0.49 -1.63,-2.14 0.09,-1.51 0.69,-1.16 0.79,-2.38 1.37,-3.56 -0.63,-2.27 -3.62,2.01 -2.38,-1.12 -0.36,-1.35 -2.39,0.41 -1.46,-1.51 -2.08,-2.31 0.12,-6.19 3.07,-5.98 2.74,-1.73 -0.83,-1.86 -2.08,-2.37 -0.92,0.48 -3.28,2.29 -4.42,1.19 -1.32,1.2 -1.79,-3.4 -3.43,-0.83 0.32,2.13 0.14,1.46 -0.76,0.01 -1.33,-0.68 -2.66,-1.39 -1.32,-3.18 1.13,-2.26 5.13,-4.6 2.33,-7.17 0.52,-2.42 1.47,-4.31 0.99,-6.83 -1.19,-2.25 -5.91,3.7 -3.96,0.19 -1.17,-1.95 1,-2.29 1.54,-3.39 -1.93,-1.31 3.92,-1.92 1.97,-3.06 1.93,-2.14 -1.4,-1.12 -1.91,0.17 -2.64,0.37 -2.78,2.95 -5.17,3.25 1.64,-1.88 1.56,-3.32 4.36,-3.1 0.45,-1.67 -5.98,-1.25 -1.81,-1.19 1.82,-0.7 -1.08,-3.69 1.83,-2.58 2.2,1.18 2.55,-1.86 1.62,-2.28 3.21,-0.32 0.94,-5 -0.12,-6.67 -1.49,-3.19 1.62,1.59 1.66,-1.31 -0.16,-0.99 3.11,1.17 2.06,-1.21 -1.02,-1.19 -0.29,-1.17 0.73,-0.82 0.07,-1.49 0.01,-1.71 1.64,-1.31 1.56,-1.15 -0.74,-2.21 0.86,-3.26 -0.88,-3.08 1.49,-0.59 1.87,-0.27 0.74,0.04 0.92,2.92 2,0.79 2.21,-0.9 6.43,0.18 7.86,0.3 -1.51,1.12 -1.16,3.83 -3.76,4.28 -1.25,1.24 -5.25,2.21 -4.45,4.19 2.02,-0.77 1.46,0.73 0.51,0.2 -2.65,-1.31 -3.91,3.83 -0.65,3.27 1.6,-1 4.76,-1.27 6.96,-0.43 2.15,0.77 9,0.4 6.36,4.13 -2.17,1.32 -1.95,4.3 -3.79,5.88 -1.36,2.24 -3.73,4.99 -6.67,3.85 -2.54,0.88 -0.66,2.52 1.1,1.38 0.78,-0.5 3.15,3.35 0.84,1.99 -2.07,-0.28 -3.16,1.31 -5.18,1.63 -0.02,2.53 4.56,1.95 5.82,1.47 2.3,1.2 3.8,3.55 4.55,5.85 2,2.23 0.13,5.79 1.35,8.49 -0.45,3.02 1.26,4.86 3.81,6.01 1.66,1.49 2.34,4.19 3.57,5.37 -2.57,1.95 1.1,5.12 0.44,6.31 -2.04,-0.08 1.34,3.78 1.3,5.11 0.78,2.24 -5.08,2.32 -2.09,4.71 1.56,2.69 3.3,0.05 4.83,-1 2.51,1.1 6.37,1.79 6.61,5.25 -0.28,2.6 -1.71,7.67 -4.87,6.84 -2.14,0.29 1.39,3.23 -1.35,2.01 -1.64,-1.62 -4.38,2.64 -1.7,1.39 1.98,0.5 -1.21,2.23 -2.35,1.41 -3.04,0.03 -0.52,3.18 1.11,2.57 2.13,-1.55 -0.82,1.67 1.85,1 1.37,0.01 4.16,-1.13 2.4,1.04 0.18,1.94 -3.04,1.77 -3.79,3.01 -3.03,-0.26 -5.14,2.46 -7.81,0.22 -2.14,-0.87 -5.12,1.06 -5.71,-1.04 -0.97,0.35 -1.61,-1.39 -2.37,0.11 -0.34,-1.96 -3.3,-2.15 -1.9,0.13 -1.76,0.29 -4.97,-1.2 -5.38,0.98 -2.03,-0.7 -3.26,-0.69 -4.99,-2.14 -2.67,-1.4 -6.68,-1.13 -6.68,2.71 -0.68,3.61 -3.23,0.34 -4.72,-0.57 -1.81,-0.09 -4.28,-1.13 -5.91,0.19 -1.52,-0.34 -2.18,1.47 -2.78,2.5z m18.76,-70.13c1.65,1.54 3.03,-0.19 0.57,-0.92 -0.47,-0.23 -0.39,0.68 -0.57,0.92z m-3.12,31.93c0.55,0.53 0.27,0.88 0,0z m-1.17,-10.07c0.02,-1.53 3.39,-4.02 1.66,-1.22 -0.39,0.58 -0.96,1.08 -1.66,1.22z m-10.63,-1.73c-1.59,-0.31 -2.08,-2.29 -3.03,-0.36 -1.91,-0.73 1.49,-2.2 -1,-2.29 0.13,-2.31 -2.8,-4.88 -3.79,-2.04 0.08,3.32 -3.97,-0.09 -4.6,-1.78 -1.85,-2.46 4.1,-0.54 2.7,-3.31 3.07,0.55 2.59,-4.32 5.36,-2.92 1.06,-1.19 2,-1.61 3.15,-1.03 2.23,-0.98 4.88,1.21 3.52,3.35 -0.19,2.26 3.15,1.24 0.87,3.27 -2.06,1.44 -0.04,2.03 1.25,1.47 1.84,1.95 -0.91,4.87 -2.77,3.75 -0.28,0.8 -0.67,1.84 -1.67,1.88z m10.61,-7.92c-1.67,-0.09 0.88,-0.41 0,0z m-4.29,-6.97c1.08,-0.83 2.3,-4.85 2.33,-3.8 -0.86,1.14 -0.52,3.62 -2.33,3.8z m2.73,-6.13c0.35,-1.24 0.97,-0.17 0,0l0,0z m-3.97,-25.03c-1.05,-1.04 1.79,-1.33 0,0z m1.85,-1.48c-0.51,-1.01 -1.32,-1.32 -0.4,-1.6 -1.54,-1.3 0.12,-2.32 1.22,-0.9 1.22,-0.53 0.35,-2.59 1.9,-1.78 0.84,-0.86 3.02,-1.98 1.27,-0.28 -1.41,1.61 -1.17,5.41 -3.42,2.95 -0.74,0.32 -0.1,1.35 -0.58,1.61z m38.33,-20.76c-1.93,-1.65 4.17,-0.89 0.99,-0.51l-0.47,0.12 -0.53,0.39 0,0z","name":"United Kingdom"},"ch":{"path":"m292.05,389.98c-1.12,-2.03 -1.49,-3.96 -4.14,-4.68 0.24,-1.27 0.28,-4.19 -2.02,-2.48 -2.76,1.07 -0.98,6.19 -4.8,5.6 -1.34,-2.05 -4.35,2.18 -5.85,-0.49 -0.66,-1.9 -1.54,-2.82 -1.22,-5.23 -0.26,-1.58 -4.49,-1.34 -5.35,0.35 0,0.96 -0.92,3.04 -1.36,2.14 2.08,-0.65 -0.4,-3.99 1.78,-5.21 1.94,-0.57 2.18,-1.6 2.3,-3.5 2.42,-0.82 3.23,-3.53 5.4,-5.02 0.92,-1.36 3.51,-0.53 3.7,-1.93 2.51,-0.36 5.31,-0.33 7.48,-0.01 1.57,-0.63 0.5,-2.03 0.36,-2.23 1.31,-1.57 1.36,1.33 2.5,0.98 1.1,0.96 4.91,-0.68 5.97,2.04 0.36,1.7 -2.95,6.33 1.28,6.08 1.9,0.87 4.09,3.47 5.78,0.3 -0.28,1.18 -0.17,4.33 -0.42,4.42 -1.87,-2.39 -4.17,0.79 -2.27,2.33 0.4,3.64 -0.7,-1.85 -2.69,-0.06 -1.62,2.46 -2.25,-1.46 -3.43,-1.76 -2.43,0.76 -0.07,4.33 -2.78,4.97 -1.02,0.89 -0.72,2.33 -0.22,3.4z M275.63,370.8c0.49,-1.83 2.92,0.14 0.45,0.04l-0.53,0.11 0.08,-0.14 0,0z","name":"Switzerland"},"at":{"path":"m338.89,381.72c-2.92,-0.37 -5.68,-0.8 -8.68,-1.29 -3.41,-0.44 -7.47,0 -10.13,-2.59 -0.49,-1.79 -2.01,-0.99 -0.74,-2.9 -1.54,-1.34 -4.15,1.63 -6.36,0.74 -2.58,-0.56 -3.71,1.14 -4.67,3.02 -0.77,-1.61 -4.07,-0.58 -3.15,-2.45 -2.02,-1.72 -4.43,3.34 -5.34,-0.45 -2.71,0.05 -3.32,-2.5 -1.76,-4.48 -0.11,-1.92 0.65,-1.26 2.03,-1.24 0.77,2.34 2.91,4.54 4.57,1.3 -0.46,-2.13 1.09,-1.56 2.51,-1.62 1.01,3.44 4.52,1.32 6.34,0.3 1.07,-2.1 5.55,-0.39 5.96,-2.32 1.02,0.88 3.01,0.37 3.69,0.59 0.18,3.89 5.07,0.73 2.69,-1.53 -0.2,-1.43 -1.39,-3.39 -2.11,-5.03 1.93,-1.47 5.36,-2.58 5.54,-5.05 1.88,0.9 2.55,-1.98 3.13,-1.73 2,1.9 4.33,0.91 6.33,0.45 0.7,-1.97 2.92,-2.39 2.31,-5.03 1.96,0.92 4.91,0.17 6.97,1.75 1.9,2.39 4.37,-0.77 6.11,0.38 1.43,-0.03 2.77,1.31 1.21,2.94 -0.45,2.79 3.86,4.35 2.35,7.1 1.97,3.48 -4.51,0.08 -4.56,2.79 1.63,1.11 3.27,1.96 0.42,2.95 -0.98,1.81 1.97,4.01 -0.88,5.49 -1.01,1.14 -3.1,1.64 -2.24,3.63 -2.75,-0.79 -4.87,2.27 -7.7,0.89 -1.89,0.31 -2.39,2.61 -3.87,3.38z","name":"Austria"},"cz":{"path":"m335.18,355.05c-3.65,-0.41 -4.96,-4.57 -8.41,-5.66 -1.31,-1.75 -2.19,-2.91 -4.32,-3.66 -1.8,-1.56 -2.64,-3.53 -1.6,-5.57 -0.16,-1.57 -4.02,-3.53 -3.2,-4.17 1.42,3.2 2.44,-2.24 4.26,-2.25 1.35,1.3 3.09,-0.63 3.77,-1.12 1.58,-1.86 4.18,-2.74 6.59,-3.91 1.63,-0.69 3.11,-2.35 4.59,-0.56 2.65,1.13 2.61,-4.69 4.17,-1.06 1.38,1.66 3.64,0.69 5.11,2.36 0.67,1.75 5.33,-1.17 2.84,1.24 -1.67,2.06 2.09,2.81 2.61,4.74 2.09,1.86 2.12,-0.93 3.96,-1.42 0.43,-1.39 -1.9,-2.7 0.65,-1.55 1.23,1.3 3.29,0.96 4.4,0.53 -3.27,0.95 2.17,5.16 3.09,2.65 2.93,0.44 4.53,2.63 6.07,4.63 -2.15,1.71 -4.92,3.04 -5,6.15 -1.22,2.56 -3.35,3.75 -6.24,3.67 -1.85,1 -3.16,2.67 -5.05,0.79 -2.11,1.83 -4.69,0.96 -6.9,-0.42 -1.92,-1.1 -4.07,-0.45 -5.85,-0.93 -0.34,2.31 -2.03,3.48 -2.87,5.34 -1.07,-1.47 -1.28,0.34 -2.66,0.17z m-0.68,-28.45c-2.43,-2.03 2.32,0.24 0,0z","name":"Czech Republic"},"sk":{"path":"m364.44,362.94c-2.39,-2.37 -6.56,-2.63 -7.73,-6.02 -0.46,-2.43 0.4,-6.56 3.64,-6.16 3.23,0.29 4.91,-3 5.9,-5.48 0.17,-1.96 3.95,-5.08 5.19,-3.02 2.43,1.82 3.49,-4.97 4.66,-0.89 1.56,0.35 1.91,0.85 1.91,2.52 2.64,1.02 3.89,-1.84 5.57,-3.22 1.58,-0.07 4.26,1.88 5.1,-0.34 0.99,-1.59 4.74,-1.57 6.47,-0.13 1.28,2.35 6.24,0.73 4.22,4.32 -1.5,2.17 -0.53,7.67 -4.43,6.22 -0.53,-3.18 -3.88,-1.31 -5.83,-0.46 -2.77,-2.02 -4.98,0.68 -5.07,3.51 -1.08,0.67 -2.09,-0.14 -2.29,1.79 -1.29,1.17 -3.96,-2.16 -4.46,1.1 -0.72,2.43 -5.78,-0.07 -5.66,3.66 1.11,2.54 -4.04,1.94 -5.84,2.51 -0.44,0.04 -0.88,0.07 -1.32,0.1z","name":"Slovakia"},"hu":{"path":"m369.77,387.01c-2.75,-0.58 -5.39,-1.37 -7.78,-2.73 -2.27,-2.63 -5.77,-3.91 -7.5,-7.04 -1.21,-1.85 -2.06,-2.65 0.1,-3.74 1.43,-1.97 -1.64,-4.55 1.32,-5.48 2.04,-1.7 -3.3,-3.48 -0.09,-2.71 2.81,1.04 3.86,-1.91 3.11,-3.93 1.93,-1.05 3.43,2.43 5.44,2.58 3.24,-0.18 6.53,-0.68 9.48,-2.09 -2.94,-1.84 0.68,-3.88 2.85,-2.99 1.75,-0.27 1.26,-4.31 3.33,-2 2.26,0.8 3.01,-1.99 4.8,-2.5 0.41,-2.48 1.52,-4.92 4.25,-3.08 1.93,-0.18 4.28,-2.95 5.05,0.14 2.1,1.7 4.8,-1.81 6.38,0.84 2.12,-0.07 1.45,3.23 3.34,1.35 3.46,3.21 -4.18,3.49 -4.55,6.38 0.35,2.87 -2.65,4.72 -2.5,7.52 0.37,3.17 -2.46,5.43 -2.51,8.54 0.01,3.02 -4.16,0.17 -4.1,3.12 -3.14,1.57 -7.09,0.21 -9.73,1.82 -1.24,2.36 -3.12,1.16 -4.53,3 -2.57,0.36 -3.31,3.42 -6.16,3.01z","name":"Hungary"},"lt":{"path":"m397.76,280.99c-1.28,-1.32 -1.63,-4.58 -4.11,-3.7 -1.13,-2.07 -4.01,-0.28 -3.26,-3.14 1.62,-3.48 -2.4,-7.19 -5.64,-5.13 -2.28,0.26 -5.13,-1.48 -6.05,-2.17 -0.51,-2.23 -1.53,-3.51 -2.2,-5.4 -1.37,-2.68 1.24,-5.63 3.5,-7 1.88,-1.44 4.85,-0.65 6.6,-1.37 0.56,-1.26 2.33,2.09 2.82,-0.31 2.06,-0.86 4.97,0.1 6.62,-0.3 1.76,-0.28 3.35,-0.61 3.78,-2.83 1.19,2.4 3.3,3.12 5.7,2.26 2.79,0.52 4.16,3.86 7.04,4.08 1.64,1.42 -0.82,5.15 2.39,4.69 0.41,1.84 -3.75,0.79 -2.82,3.52 -2.05,1.6 -2.93,3.79 -1.88,6.23 -0.12,2.13 -0.68,3.69 -2.75,4.26 -0.43,1.13 -0.04,1.82 -1.97,2.11 -0.51,1.51 -1.38,2.09 -2.67,3.35 -1.72,-1.32 -3.41,0.53 -5.09,0.87z m13.27,-5.67c-0.11,-1.17 -1.77,-2.09 0.31,-1.22 0.43,0.34 0.36,1.19 -0.31,1.22z","name":"Lithuania"},"lv":{"path":"m375.49,257.31c-1.25,-2.79 -1.57,-6.54 -0.19,-9.24 2.63,-2.07 -0.8,-6.67 2.34,-8.6 1.69,0.07 4.11,-4.27 4.4,-1.32 2.44,1.48 4.79,3.19 5.76,5.78 2.55,1.96 6.17,0.07 7.13,-2.71 1.39,-2.75 -1.14,-5.3 -1.86,-7.82 1.34,-1.86 3.66,-3.57 5.64,-3.47 0.08,-0.9 1.63,1.08 2.69,0.67 1.72,0.06 3.13,2.25 4.97,3.22 2.21,0.36 3.53,-2.11 5.72,-1.12 1.76,-0.72 2.78,1.38 4.4,2.33 -0.55,1.5 -1.61,1.77 0.06,2.4 -0.17,1.1 -0.46,3.72 1.44,2.57 1.53,2.66 6.04,5.32 2.65,8.5 -1.42,1.56 -0.49,4.51 -3.48,3.69 -2.28,0.64 -3.94,4.9 -6.51,1.93 -2.03,-2.26 -5.06,-3.95 -7.91,-2.78 -1.1,-1.49 -3.6,-4.26 -4.46,-0.94 -1.47,1.77 -5.35,0.57 -7.87,1.17 -1.87,0.26 -2.16,0.89 -3.44,-0.06 -2.37,1.98 -6.1,0.17 -8.37,2.54 -1.6,0.14 -2,4.17 -3.11,3.25z","name":"Latvia"},"md":{"path":"m454.92,374.42c-0.33,-2.09 -1.86,-4.78 -2.23,-7.4 0.38,-3.56 0.07,-7.47 -2.96,-9.91 -3.2,-3.43 -7.96,-5.44 -9.93,-9.93 -0.24,-2.34 -6.31,-3.34 -2.39,-4.03 2.67,0.33 3.73,-3.48 6.57,-2.14 1.32,0.97 1.83,2.54 3.78,1.18 -0.02,0.82 2.42,2.73 2.56,0.37 1.33,-1.44 3.96,3.6 4.43,1.55 1.2,-1.55 0.65,3.03 1.22,3.93 0.07,2.32 4.57,4.13 4.42,2.59 -0.43,1.81 0.64,4.31 3.01,4.64 2.61,-0.41 1.35,4.32 2.84,4.34 -0.24,1.12 -3.35,-2.1 -2.5,0.78 -1.04,0.18 -2.3,-2.64 -2.02,-0.03 -1.22,0.21 -2.31,-1.71 -3.62,0.36 -1.34,1.85 1.39,3.73 0.77,5.48 -0.5,2.25 -2.95,4.34 -2.23,7.32 -0.82,-0.46 -1.48,0.35 -1.72,0.91z","name":"Moldova"},"ro":{"path":"m414.71,404.53c-2.94,-0.37 2.3,-2.82 -0.89,-3.86 -1.36,-0.38 -6.12,-1.72 -3.63,-3.39 3.62,-1.4 -2.29,-3.42 -3.82,-3.63 -1.25,0.73 1.78,4.33 -1.06,3.46 -0.47,-2.42 -4.24,0.23 -4.49,-2.27 -1.54,0.07 -1.87,0.1 -0.31,-0.74 0.46,-1.41 -2.15,-1.17 -0.71,-2.27 0.07,-4.02 -6.25,-1.24 -6.86,-4.86 0.56,-2.93 -2.25,-4.23 -4.45,-5.46 -1.23,-1.35 3.36,-1.23 3.59,-2.71 4.37,0.45 2.54,-4.6 4.68,-6.55 1.28,-2.95 0.7,-6.3 2.76,-8.97 0.62,-2.75 1.58,-5.21 4.69,-5.79 2.24,-1.25 2.4,-5.8 5.34,-3.67 2.44,-0.6 4.8,0.38 7.17,-0.21 2.51,-1.94 3.7,1.15 5.91,1.18 2.03,-1.31 2.68,-4.39 5.67,-3.96 2.31,-0.28 4.86,-1.95 4.49,-4.32 1.75,-2.97 4.98,-1.01 6.29,1.29 1.93,4.74 7.06,6.72 10.28,10.39 2.93,2.37 2.34,6.09 2.36,9.35 0.53,2.52 1.69,4.86 1.92,7.13 1.82,1.67 4.12,3.74 6.83,2.36 1.37,-1.24 4.51,-5.35 6.51,-2.84 1.18,1.97 2.1,5.63 -1.2,6.33 -1.85,1.04 -1.42,-3.67 -3.88,-1.61 -1.51,1.92 1.84,2.51 -0.11,4.51 -0.61,2.57 2.04,-0.86 0.82,1.98 -2.28,2.63 -0.38,5.59 -0.04,8.5 -1.15,2.51 -5.2,-0 -6.02,-1.11 -1.09,1.46 -1.67,-0.92 -3.54,0.54 -1.82,0.49 -3.31,-1.46 -5.44,0.01 -3.08,1.35 -6.52,2.81 -8.17,5.95 -1.31,3.55 -4.97,3.29 -8.01,2.77 -2.75,-0.48 -4.92,1.71 -7.44,1.75 -2.74,-0.25 -5.83,-1.37 -8.31,0.42l-0.52,0.24 -0.43,0.06 0,0z","name":"Romania"},"bg":{"path":"m419.98,434.43c-0.77,-1.6 0.33,-5.03 -1.67,-6.74 -1.14,-2.34 -7.05,-2.04 -4.41,-5.19 -0.49,-1.45 -2.46,-4.37 -1,-5.23 2.16,0.54 4.75,-3.78 2.92,-5.59 -2.57,-1.55 -5.66,-2.78 -5.98,-6.24 -0.97,-2.47 2.74,-1.99 1.69,-4.32 2.08,-0.06 3.2,1.11 1.22,2.59 -0.15,3.28 3.83,0.6 5.65,0.71 2.58,-0.64 5.13,0.94 7.65,0.08 2.61,-1.18 5.46,-2.28 8.27,-1.01 3.32,0.37 5.6,-2.51 6.93,-5.13 2.16,-2.35 5.29,-3.61 8.27,-4.56 1.69,0.75 3.92,0.92 5.2,0.32 0.77,1.61 2.46,-1.39 3.17,1.07 1.58,2.18 6.09,-1.71 5.26,2.45 0.21,2.63 -4.48,0.38 -4.02,3.94 -1.88,1.85 1.39,5.32 -0.17,7.14 -1.24,1.25 -1.7,3.03 -2.93,4.26 0.82,1.66 4.27,-0.37 3.64,2.02 1.44,0.86 3.71,1.89 1.23,2.18 -1.9,3.08 -4.18,-1.08 -6.49,0.5 -1.52,1.95 -4.37,1.58 -4.82,4.55 -1.37,1.04 -4.43,1.49 -2.91,4.13 3.08,3.26 -3.78,2.7 -5.13,4.68 -1.95,0.62 -4.22,-2.41 -5.93,-0.29 -2.04,-2.63 -5.18,-1.43 -7.46,0.15 -2.06,2.52 -5.54,1.17 -7.76,3.47l-0.43,0.06 0,0z","name":"Bulgaria"},"al":{"path":"m396.5,458.88c-2.16,0.08 -0.81,-2.55 -2.74,-3.41 -0.91,-2.13 -5.81,-2.06 -5.48,-3.81 2.36,-1.04 -1.62,-3.19 -0.48,-4.99 0.36,-1.26 2.66,-2.2 0.57,-3.3 1.39,-2.49 -3.57,-5.96 0.77,-6.52 2.37,-0.03 -1.92,-0.89 -0.55,-2.51 -0.14,-2.15 -3.24,-0.23 -2.21,-2.9 -1.48,-2.28 0.07,-4.41 1.36,-6.71 1.01,3.42 4.23,-2.13 4.66,1.78 1.21,1.69 4.6,1.07 3.88,4.25 -0.33,2.87 -0.02,5.6 0.51,8.19 0.21,1.77 2.38,5.51 4.15,4.74 1.69,-0.32 2.5,4.45 0.05,5.02 -0.86,1.75 -0.27,5.37 -3.24,5.56 -2.01,1.26 1.3,2.75 -0.81,3.98l-0.23,0.5 -0.19,0.12 0,0z","name":"Albania"},"ee":{"path":"m378.18,234.33c-0.29,-1.42 0.77,-0.85 0,0z m29.34,-1.46c-2.55,-0.18 -3.15,-3.15 -5.39,-3.23 -0.21,-1.76 -1.21,1.44 -2.27,-0.65 -2.12,-1.63 -4.52,1.21 -6.27,2.48 -1.26,-0.67 1.67,-5.98 -1.81,-5.74 -1.1,1.92 -1.82,2.36 -3.83,1.3 -0.08,-2.54 -3.43,-2.95 -2.01,-5.67 0.96,-2.03 -3.8,-2.6 -0.62,-3.95 1.35,-0.61 4.23,-0.97 2.3,-2.67 2.82,-0.9 4.5,-2.4 7.47,-2.41 1.66,-0.56 1.5,-2.75 3.42,-1.67 0.91,-1.72 4.64,0.07 6.63,-0.66 2.13,-0.1 4.26,0.22 6.03,-1.29 -1.43,2.67 -1.02,5.84 -2.24,8.62 2.11,2.2 1.2,5.64 3.15,7.83 0.24,0.52 1.89,2.24 1.35,2.38 -0.73,0.83 -0.81,2.27 -1.35,2.68 1.66,2.85 -2.28,0.25 -2.89,1.26 -0.29,0.68 -0.83,1.4 -1.65,1.38z m-28.89,-1.28c-1.29,-0.43 -2.59,-1.4 -0.92,-2.29 -0.22,-0.67 0.59,-1.5 0.99,-0.78 -0.53,-2.4 4.69,-3.37 4.19,-1.27 0.07,2.48 -3,2.5 -4.26,4.33z m1.02,-7.14c-0.54,-0.34 -0.96,-2.14 -1.01,-2.27 0.8,-1.29 0.79,-1.32 2,-0.55 1.89,-0.4 1.35,1.06 -0.17,0.69 0.83,0.84 0.55,2.1 -0.81,2.14z","name":"Estonia"},"lb":{"path":"m557.2,501.39c0.58,-2.8 0.32,-5.88 1.17,-8.53 -0.92,-2.02 1.77,-3.87 0.09,-5.88 -0.28,-2.6 2.65,-3.83 2.23,-6.01 1.03,-0.93 3.35,-2.1 2.42,0.09 1.64,0.57 3.96,0.89 3.49,3.25 -1.11,1.34 -2.61,3.51 -1.84,4.51 -2.48,0.69 -2.89,3.8 -1.53,5.08 -0.04,2.15 -2.43,3.34 -3.12,4.26 0.57,1.87 -1.28,3.1 -2.91,3.25z","name":"Lebanon"},"ad":{"path":"m225.99,427.08c-4.4,2.06 -0.81,-5.33 0.49,-0.98l-0.2,0.53 -0.29,0.45z","name":"Andorra"},"sm":{"path":"m321.66,413.68c0.71,-2.83 1.59,1.21 0,0z","name":"San Marino"},"mc":{"path":"m273.92,416.64c-2.8,-1.65 2.23,-1.64 0.39,-0.13l-0.39,0.13 0,0z","name":"Monaco"},"lu":{"path":"m268.7,344.38c-1.34,-0.37 0.48,-2.79 -0.9,-3.99 -1.47,-1.94 2.76,-5.38 1.98,-1.49 0.37,1.78 4.79,2.33 1.84,4.09 -0.47,1.66 -1.49,1.22 -2.93,1.39z","name":"Luxembourg"},"fr":{"path":"m292.72,444.55c-0.12,-2 -3.86,-0.94 -2.75,-2.99 -2.34,-0.62 -0.11,-2.51 0.75,-3.57 0.35,-0.55 -3.76,1.07 -1.24,-0.63 0.32,-1.34 -2.6,-2.05 -0.51,-3.01 -0.25,-1.14 -1.13,-1.51 -0.02,-1.71 -0.89,-2.66 3.14,-1.71 3.48,-3.51 1.94,0.96 2.98,-0.2 2.33,-2.11 1.79,-2.18 -0.99,3.51 1.02,4.43 1.2,3.29 -2.09,6.35 -1.33,9.73 -0.95,0.89 -1.15,2.64 -1.75,3.36z m-58.87,-15.16c-2.27,-2.01 -5.59,-0.28 -7.2,-2.87 1.48,-2.11 -2.14,-2.13 -2.92,-2.19 -1.78,-1.34 -3.82,-2.36 -5.67,-3.53 -1.54,0.58 -1.53,2.27 -3.51,1.46 -1.54,0.07 -2.66,-0.59 -3.93,-0.35 -0.8,-2.33 -2.93,-1.69 -4.53,-2.09 -1.06,-2 -2.81,-3.32 -5.06,-3.18 -1.57,-1.15 -1.33,-1.7 -1.45,-3.5 -1.23,-0.24 -3.44,-0.96 -1.02,-1.55 3.04,-3.75 2.96,-8.84 4.5,-13.21 0.85,-1.4 2.99,0.68 2.08,-1.85 -1.2,-1.06 -2.14,-0.84 -1.15,-2.81 1.1,-1.59 0.63,-5.99 2.35,-6.1 1.89,1.55 0.82,3.87 1.88,5.79 -0.05,2.01 2.7,3.12 1.93,0.38 -2.25,-2.11 -0.08,-5.11 -2.23,-7.23 -1.52,-1.07 -0.74,-1.21 -0.52,-2.39 -2.12,-1.87 0.87,-2.79 -0.3,-5.08 -0.91,-0.78 2.06,-4.15 0.31,-2.92 -1.7,1.58 -2.8,-0.99 -4.34,-1.54 -1.66,-0.48 -1.34,-4.04 -3.07,-5.27 1.45,-1.37 2.03,-3.5 -0.17,-4.21 -1.28,-1.38 -1.85,-1.7 -0.64,-3.42 1.28,-3.05 -5.85,-0.88 -2.14,-2.3 -0.4,-2.26 -4.49,0.28 -3.4,-2.31 -0.36,-2.67 -3.56,0.62 -4,-1.74 -2.28,-0.09 -2.42,-4.2 -4.81,-1.84 -1.78,1.57 -0.33,-2.39 -2.37,-2.56 1.59,0.62 3.87,-0.51 1.92,-2.13 1.84,1.1 2.88,-0.7 0.65,-1.01 0.13,0.05 1.59,-2.28 -0.46,-1.5 -1.34,1.45 -4.19,-0.07 -1.73,-1.25 1.3,-0.76 2.79,-0.81 2.95,-0 1.4,-0.85 2.87,-0.97 3.66,0.09 0.65,-1.02 3.21,1.35 3.19,-1.26 2.43,-1.62 2.22,2.03 2.47,2.06 1.69,-2.75 1.86,2.19 3.17,3.11 1.26,-0.74 3.83,-3.16 3.73,-0.14 1.62,2.63 2.82,-1.65 4.78,0.11 0.83,-0.47 4.32,1.06 3.36,-0.07 -1.65,-1.65 -2.42,-4.02 -1.35,-6.19 0.76,-2.4 -2.42,-4.6 -1.19,-7.04 1.21,1.81 5.2,-0.98 3.31,2.03 -0.19,2.43 1.93,3.76 3.68,2.84 2.59,0.56 5.12,3.56 7.68,1.11 2.16,-0.17 1.32,-1.39 0.53,-2.64 1.54,-3 5.41,-2.03 8.05,-3.16 1.81,-0.67 4.58,-1.88 5.31,-3.4 -1.75,-1.03 0.04,-4.18 -0.3,-6.15 0.44,-3.1 4.2,-2.36 6.44,-2.8 0.98,0.77 1.49,6.24 4.58,4.17 1.46,-0.35 0.7,4.82 3.67,3.62 -0.14,3.07 3.12,1.53 4.18,2.82 -0.64,1.44 -0.56,1.83 -0.25,2.78 -0.88,2.67 3.93,2.4 4.83,0.49 0.88,1.69 -1.1,3.55 1.66,3.61 2.55,0.29 2.49,4.49 5.21,3.37 2.65,1.52 6.43,-0.33 7.5,3.53 0.45,0.9 2.96,3.41 2.01,0.96 0.54,-1.16 0.79,1.42 0.5,1.49 1.47,-0.3 3.92,-1.81 4.53,0.32 1.92,0.28 7.08,0.84 3.22,2.94 -2.39,2.02 -1.66,5.55 -3.51,7.88 -0.4,2.45 -0.29,5.21 -1.25,7.67 -1.85,0.33 -4.65,-1.22 -4.94,2.33 0.2,1.24 -1.59,3.49 -3.64,4.12 -0.97,0.48 0.4,3.01 -1.75,3.44 -3.21,1.4 -0.53,4.69 -2.87,6.5 1.14,2.08 4.46,-0.29 3.63,-2.44 2.64,-1.79 4.27,0.65 3.32,3.02 0.97,1.33 2.7,2.42 0.16,3.24 -1.7,2.56 4.01,4.8 1.9,7.11 -0.78,1.84 -6.17,0.54 -3.47,3.57 1.68,1.38 4.39,3.16 1.43,4.85 -1.24,3.13 2.12,7 5.6,6.15 2.64,-0.69 -0.62,4.28 -2,4.64 -1.17,-0.72 -4.03,-3.03 -4.38,0.05 0.55,1.28 1.71,2.84 -0.72,3.26 -2.25,0.54 -0.87,3.61 -3.15,2.9 -1.62,1.27 -2.66,0.82 -4.12,0.04 -1.35,1.82 -1.33,-1.1 -3.38,-0.87 -2.84,0.75 -0.64,-3.44 -1.53,-2.84 -0.63,0.89 -3.09,1.3 -1.09,0.56 1.49,-2.74 -3.49,-2.8 -2.54,-0.31 -2.24,0.5 -1.46,-2.79 -1.57,-3.36 -1.08,1.05 -1.96,2.65 -0.52,3.91 -1.04,-0.28 -1.31,-2.83 -3.36,-2.08 -2.5,-1.7 -5.52,-1.71 -6.96,1.2 -2.68,0.79 -5.03,2.02 -5.69,4.77 0.13,1.89 -0.47,3.75 0.65,5.49 -1.42,-0.84 -3.32,-0.38 -4.33,0.88z","name":"France"},"li":{"path":"m296.51,373.48c1.45,1.4 -0.83,3.11 -0.11,0.58 0.04,-0.19 0.08,-0.38 0.11,-0.58z","name":"Liechtenstein"},"nl":{"path":"m269.04,328.72c-2.4,0.87 -0.84,-4.47 0.3,-2.01 0.8,0.23 0,1.75 -0.3,2.01z m-0.07,-3.78c0.6,-3.32 -5.02,-1.6 -5.27,-4.51 -0.12,-2.74 -3.14,1.24 -2.06,-1.29 -0.99,-0.79 -2.22,1.2 -3.22,-0.45 -0.9,0.27 -1.14,2.68 -1.08,0.81 0.68,-2.17 -1.32,-2.87 -3.53,-3.17 2.34,0.11 2.58,-2.07 3,-3.35 2.89,-2.17 4.59,-5.57 4.61,-9.18 -0.19,-3.29 4.06,-0.89 5.3,-3.43 1.14,-2.76 4.56,-2.87 7.04,-3.65 2.21,-0.91 4.28,0.51 5.07,2.25 2.56,1.19 -1.21,4.26 -0.45,6.54 -1.09,0.31 -2.87,-0.17 -2.83,1.81 -1.46,0.58 -1.58,0.91 0.09,0.93 3.35,-0.05 2.57,4.59 -0.38,4.58 -2.35,0.19 2.62,1.25 -0.12,2.19 -2.05,1.07 -3.43,-1.35 -5.33,0.59 -1.38,2.19 2.97,4.39 0.94,6.8 -0.8,0.77 -1.72,1.2 -0.27,1.66 -0.44,0.36 -0.82,1.02 -1.51,0.87z m-14.99,-3c-0.33,-1.2 -5.07,-0.99 -2.8,-1.87 1.14,1.13 2.85,1.22 3.93,0.81 -0.06,0.56 -0.57,1.04 -1.13,1.06z m0.03,-2.7c-1.37,-0.05 -4.02,-1.94 -1,-1.43 0.49,-0.33 2.23,1.73 1,1.43z","name":"Netherlands"},"ba":{"path":"m376.75,425.9c-1.98,-1.6 -4.83,-1.93 -6.41,-4.05 -1.67,0.65 -0.52,0.38 -0.54,-0.48 -1.09,-2.31 -4.84,-2.74 -4.68,-5.7 -3.06,-0.33 -4.09,-3.71 -6.36,-5.29 -1.63,-1.9 -4.06,-2.19 -3.82,-4.87 -1.04,-2.44 -3.06,-3.46 -4.21,-5.63 -0.7,-2.04 0.84,-4.87 2.73,-2.36 1.15,1.84 2.68,1.49 3.04,-0.59 0.75,-2.51 2.6,0.54 3.87,-1.57 1.61,1.11 3.76,0.32 5.58,0.98 1.67,0.69 2.8,0.63 3.98,-0.64 1.28,0.32 2.43,1.79 1.94,-0.33 2.34,0.41 3.8,0.76 5.26,2.77 1.51,0.59 4.58,-2.46 3.33,0.9 -1.48,2.62 -1.55,6.27 2.2,6.4 -0.16,1.48 3,1.5 0.7,2.04 -2.41,-1.63 -1.77,2 -0.04,2.77 1.22,1.2 1.32,2.1 -0.54,1.97 -0.8,1.43 -2.82,1.15 -3.55,0.9 0.15,1.26 1.77,2.85 -0.32,2.67 -1.22,1.98 -1.74,4.24 -3.03,5.92 0.2,1.48 1.25,2.79 0.88,4.2z","name":"Bosnia and Herzegovina"},"si":{"path":"m332.96,393.93c-2.25,0.07 3.69,-1.78 0.33,-3.25 -2.05,-0.05 -1.39,-3.19 -2.18,-3.5 2.21,-1.77 -0.2,-2.6 -1.36,-3.11 1.58,-3.35 4.85,-1.64 7.7,-1.58 3.3,1.9 3.73,-4.65 7.02,-2.86 2.43,0.1 4.45,-1.78 6.8,-1.33 -0.07,-1.25 0.26,-3.28 1.79,-1.82 0.58,1.34 2.29,2.96 -0.11,2.97 0.07,3.17 -6.44,2.43 -4.97,6.04 0.89,1.87 0.62,3.86 -1.85,3.13 -2.37,0.85 1.33,6.35 -2.15,4.17 -1.76,0.02 -2.78,0.57 -3.81,-1.48 -1.83,-1 -1.59,2.92 -3.88,1.76 -1.41,-0.46 -2.2,0.65 -3.34,0.85z","name":"Slovenia"},"mk":{"path":"m403.18,443.19c-1.28,-0.84 -1.77,-0.72 -3.14,-0.4 -2.27,-2.33 -2.73,-5.58 -2.85,-8.64 -1.26,-2.44 2.39,-0.6 1.33,-3.13 0.23,-2.42 3.43,-3.85 5.06,-1.8 1.38,1.18 -1.35,-3.28 1.33,-2.73 2.83,0.6 4.67,-2.89 7.49,-1.79 1.51,2.18 4.77,1.95 5.79,4.72 1.29,2.63 0.37,4.95 -1.12,7.01 -1.05,2.69 -5.33,0.11 -7.05,2.7 -0.97,2.88 -4.09,3.39 -6.84,4.04z","name":"Macedonia"},"hr":{"path":"m375.93,426.49c-1.17,-0.64 -1.03,-0.77 0,0z m-5.08,-2.9c-0.73,0.27 -1.25,-2.08 0,0z m-2.28,-1.81c-3.23,-1.04 -5.06,-4.7 -8.53,-5.08 -1.74,-1.23 -4.13,-1.36 -6.19,-0.38 -0.54,-3.7 -5.51,-3.9 -7.37,-6.92 -1.68,-2.86 2.16,-0.38 2.91,-1.43 -1.18,-2.05 -5.06,-2.05 -5.62,-5.05 0.07,-2.45 -0.12,-5.23 -2.77,-6.41 -1.46,-3.02 -5.35,-1.33 -4.75,1.8 -0.1,1.22 -1.81,1.15 -1.78,3.18 -0.42,-0.02 -2.43,-3.25 -2.8,-4.77 0.5,-1.41 -1.33,-2.59 0.97,-1.85 1.93,-0.05 3.32,-1.26 5.49,-0.87 1.75,-0.28 1.19,-2.99 2.55,-0.54 1.83,1.65 2.98,0.1 5.14,0.7 1.63,-0.59 0.6,-2.35 1.05,-3.41 -2.13,-1.84 3.84,-0.57 2.93,-3.42 -1.1,-1.62 -1.88,-3.53 0.82,-4.04 1.16,-1.26 3.54,-0.9 3.14,-3.3 3.59,0.79 6.21,3.61 8.62,6.19 2.91,-0.18 5.33,2.55 8.31,1.69 2.32,0.95 5.06,-5.2 5.33,-0.4 0.15,1.9 1.2,2.64 1.4,4.46 1.55,0.76 2.24,0.37 1.04,2.01 -0.17,1.69 1.08,1.86 -0.44,2.99 -1.42,0.96 -2.53,-3.66 -4.34,-2.06 -2.98,-1.4 -5.14,1.63 -8.13,0.38 -2.22,0.17 -4.52,-1.28 -6.44,-0.34 -1.8,-0.84 -3.54,0.72 -3.99,2.64 -1.51,-1.59 -4.97,-3.78 -5.35,0.02 -1.16,3.92 2.99,5.58 4.38,8.58 -0.13,1.41 -1.05,2.05 0.83,2.59 2.9,1.5 4.8,4.21 6.98,6.53 2.65,1.59 3.98,4.49 6.78,6.28l-0.16,0.23 0,0z","name":"Croatia"},"dk":{"path":"m311.37,281.37c-1.81,-0.13 -3.63,-2.95 -0.99,-2.75 0.71,0.89 2.21,0.72 1.2,1.27 0.93,0.68 0.95,1.07 -0.21,1.48z m2.12,-1.04c1.35,-0.18 -0.34,1.13 0,0z m0.84,-0.24c-0.07,-1 -2.35,-2.59 0.16,-1.62 2.08,0.28 -0.51,1.71 -0.16,1.62z m-17.99,-0.84c-2.31,-0.88 -6.15,-0.22 -4.5,-3.71 0.81,-2.84 -1.69,-4.3 -3.84,-4.7 -1.19,-2.12 0.77,-2.92 1.79,-2.7 1.1,-1.9 -0.71,-4.04 -1.69,-4.68 0.35,-1.37 0.2,-5.41 0.68,-4.97 1.59,3.78 6.34,-5.25 4.96,-0.56 0.24,2.86 4.45,-0.07 2.01,-1.61 0.04,-2.03 -0.06,-3.57 2.27,-2.05 0.18,-1.79 3.93,-0.45 2.6,-2.4 -2.36,-1.07 -4.97,1.4 -7.44,0.51 -0.9,0.41 -2.06,0.6 -1.03,-0.46 2.89,0.74 6.43,-0.56 7.07,-3.76 0.42,-1.7 4.2,-3.59 3.75,-0.9 2.01,1.66 -0.21,4.73 -1.55,6.01 0.4,0.87 0.32,2.52 0.39,3.1 -1.16,1.34 2.36,4.31 4.12,3.09 1.32,1.67 -1.85,5.56 -2.69,2.65 -3.21,0.21 -0.77,4.74 -2.69,6.35 -0.74,1.02 -5.24,-0.82 -2.77,1.37 1.61,1.85 3.89,1.32 5.37,0.39 1.04,1.32 2.66,0.54 1.88,1.61 2.2,1.44 0.71,6.32 -1.89,3.8 -0.99,-0.9 -2.97,-2.42 -3.55,-4.38 -0.8,-2.14 -4.39,1.02 -3.28,1.06 2.19,-0.86 -0.04,1.87 1.38,2.68 -1.87,1.01 -1.25,3.06 -0.58,3.35 -0.3,0.27 -0.55,0.59 -0.78,0.92z m18.96,-2.29c-1.92,-0.02 -1.04,-3.7 -3.92,-2.81 -3.51,-0.09 0.22,-3.64 -2.76,-5.02 -1.79,-1.21 3.2,0.15 3.13,-2.28 0.04,-2.46 4.91,0.23 1.92,1.9 1.06,2.45 3.33,-0.76 2,-2.36 -0.51,-1.34 -2.25,-2.02 0.21,-1.96 2.33,-0.37 1.21,1.23 1.29,2.13 2.22,2.03 -1.98,3.78 -1.88,4.86 2.05,0.87 2.04,2.76 -0.28,2.66 -0.97,0.83 0.11,2.08 0.29,2.88z m-25.23,-19.54c-1.89,-1.51 1.09,-5.6 1.21,-4.99 -1.52,1.21 -1.11,3.3 -1.21,4.99z","name":"Denmark"},"ru":{"path":"m558.98,364.3c-2.56,-0.91 -4.97,-2.14 -7.36,-3.43 -2.39,-1.15 -4.94,-2.06 -7.59,-2.35 -2.81,2.28 -5.5,-0.94 -8.06,-1.85 -1.23,0.3 0.78,2.15 -1.52,1.8 -2.42,-0.25 -3.69,-3.69 -6.4,-2.82 -1.31,0.16 -4.41,0.18 -1.55,-0.66 1.64,-0.7 0.81,-3.34 -0.75,-1.74 0.37,-1.63 2.93,0.94 3.87,-1 1.25,-0.31 2.74,-1.24 3.63,-1.06 1.16,-2.32 -3.44,-3.39 -1.08,-5.92 0.57,-0.81 -0.94,-4.08 0.12,-2.72 0.39,2.37 2.24,1.11 1.25,-0.78 -1.26,-3.41 3.86,0.53 3.04,-2.81 -1.97,-1.81 -4.99,-1.7 -7.55,-2.54 -2.06,-0.94 2.06,-1.24 1.86,-3.16 2.06,1.7 4.87,-1.76 1.32,-1.4 -0.21,-1.02 3.11,-2.69 3.56,-4.64 3.16,0.27 3.03,-5.1 -0.28,-4.48 -2.62,0.21 -2.08,3.91 -4.95,4.14 -2.31,1.85 -0.59,-0.97 -1.26,-1.15 -2.27,0.02 -1.28,-3.82 0.48,-4.34 1.4,-2.13 0.73,-5.08 4.3,-4.68 2.91,0.1 4.24,-2.66 2.99,-5.05 -0.44,-0.81 1.31,-4.54 -0.5,-3.12 -0.89,0.38 -1.08,-3.79 -3.06,-2.28 -2.61,-1.85 3.34,-2.5 1.03,-4.59 -1.03,0.14 -4.3,0.91 -2.02,-0.74 1.96,-2.14 1.02,-4.53 -0.68,-6.4 1.16,-2.59 -2.93,-0.35 -3.64,0.61 0.41,-2.95 -3.61,-0.32 -4.74,-2.01 -1.3,0.69 -2.17,2.73 -3.44,0.57 -1.62,0.46 -2.9,0.42 -4.52,-0.03 -1.18,0.97 0.35,3.57 -1.91,1.94 -2.66,-0.03 -3.84,-4.48 -6.19,-3.24 -2.12,0.99 -3.16,6.03 -6.01,3.79 -0.55,1.88 -3.23,-1.75 -4.12,0.93 -2.26,2.15 -4.17,-0.6 -4.14,-2.64 -1.31,-0.74 -1.67,-2.47 -1.76,-3.17 -1.84,0.68 -2.55,-1.54 -3.04,-1.81 -1.53,1.29 -5.9,2.64 -6.27,0.53 -0.46,-1.43 -3.35,-2.71 -0.58,-3.43 0.87,-2.91 -3.85,-2.55 -4.29,-5.27 -1.34,-1.28 -2.82,-2.7 -4.07,-0.62 -2.6,-1.29 -3.34,1.16 -4.86,2.57 -2.29,-0.64 -4.88,0.47 -3.99,3.28 -1.64,3.09 -5.33,-1.16 -5.28,-3.38 0.29,-1.54 -1.99,-0.85 -0.93,-2.73 -1.04,-1.23 -5.06,-2.53 -2.44,-4.58 2.85,1.31 6.86,-0.11 6.98,-3.34 2.36,-1.51 -0.16,-3.89 -1.6,-4.2 -0.58,-2.91 -4.71,-0.88 -5.61,-1.07 0.65,-2.69 -1.62,-3.41 -3.71,-3.4 -2.11,-1.16 -3.32,-2.8 -3.81,-4.83 -2.42,0.17 -3.41,-1.67 -2.18,-3.83 -0.02,-1.71 -2.9,-2.44 -1.99,-4.84 -0.01,-1.79 -0.45,-2.87 -2.15,-2.08 -2.12,-2.07 -5.85,-2.66 -7.51,0.31 -0.95,2.92 -2.17,-0.33 -1.92,-1.55 -1.94,-2.34 -4.43,2.65 -5.64,-0.22 -1.71,0.04 -3.09,1.26 -3.28,-1.31 -0.9,-2.65 -2.85,-5.01 -4.71,-6.53 -1.83,-1.02 1.04,-5.27 -2.45,-5.76 -1.67,-0.51 -0.04,-2.71 -2.19,-1.57 0.05,-1.42 0.26,-2.99 1.68,-3.72 -0.54,-0.99 -1.34,-2.16 -1.45,-2.96 -2.84,-0.69 -1.01,-4.26 -2.77,-5.86 -2.08,-2.24 0.85,-4.53 0.39,-6.92 -1.01,-2.41 3.22,-2.6 0.55,-4.16 -0.83,-1.3 -2.35,-4.31 0.18,-2.28 1.51,-0.56 0.02,-3.79 2.55,-2.16 2.03,-0.4 0.55,-4.34 3.6,-3.39 1.61,0.41 6.06,0.64 4.72,-1.87 -2.47,0.38 -3.46,-3.31 -5.66,-1.7 -1.73,1.59 -3.35,0.22 -4.28,-0.75 -2.83,1.04 -0.5,-5.97 -3.43,-3.33 -0.79,1.95 -3.72,3.09 -1.67,0.48 4.94,-7.07 7.08,-15.55 9.98,-23.55 0.44,-3.03 2.51,-7.51 -0.31,-9.8 -2.38,-1.89 -5.29,-2.93 -7.96,-4.32 -3.88,-1.06 2.38,-6.07 -1.12,-8.02 -2.45,-0.36 -4.96,-1.94 -3.33,-4.47 -1.48,-1.21 -6.02,-2.28 -3.05,-4.86 0.42,-0.7 -3.23,-0.64 -2.08,-2.79 0.39,-2.06 -0.85,-2.94 1.09,-3.89 -0.82,-2.4 -2.73,-4.51 -4.14,-6.68 -1.51,-2.32 -3.78,-4.06 -5.41,-6.21 -0.98,-3.34 2.21,-6.3 1.62,-9.59 -0.91,-2.31 -3.95,-2.73 -4.86,-5.04 -3.1,0.98 -6.11,-2.82 -4.58,-5.63 1.26,-2.13 -3.52,-2.39 -0.66,-3.49 1.51,-2.49 0.64,-5.59 3.12,-7.72 -0.6,-2.56 3.46,0.62 3.16,-2.41 -2.11,-2.17 1.85,-1.54 2.99,-1.35 2.03,1.63 4.11,1.29 6.52,0.08 0.37,0.23 -0.76,2.57 1.13,2.81 -1.22,0.77 -1.32,4.65 0.4,2.88 0.2,-1.73 1.36,-3.42 1.9,-5.04 3.21,0.08 6.07,-1.95 9.29,-1.34 2.75,0.76 5.58,1.26 8.28,2.2 2.14,0.82 4.03,2.32 6.18,3.01 2,-1.35 5.54,1.61 7.21,-0.07 2.23,0.7 3.31,3.46 5.54,1.69 1.16,1.01 0.65,2.43 2.18,2.82 1.01,2.1 3.8,2.21 3.29,5.21 -0.09,3.44 0.15,7.2 -2.11,10.07 -2.26,3.09 -6,5.79 -10.02,4.97 -2.84,-0.74 -5.34,0.99 -8.08,1.16 -2.01,0.97 -5.49,-2.15 -6.54,-0.13 -1.33,0.97 -2.24,-0.89 -2.89,-1.46 -1,2.57 -7.21,1.52 -6.06,-1.62 -0.53,-0.64 -4.07,0.19 -5.44,0.48 -1.33,1.22 -0,2.41 1.25,1.32 2.16,-0.38 0.62,2.19 3.06,2.74 1.23,1.53 6.57,0.25 5.42,2.51 -1.91,3.1 2.22,0.91 3.81,1.72 2.09,0.58 5.78,2.19 4.56,4.13 2.75,1.59 0.23,3.96 -0.48,5.25 2.3,-0.18 4.43,1.99 4.35,4.27 2,-0.84 0.78,1.8 1.68,2.47 0.1,3.23 4.49,3.53 6.69,2.22 2.28,0.22 3.06,3.83 6.02,2.68 3.14,0.7 6.51,-0.4 7.17,-3.81 0.24,-2.71 -4.02,-6.69 -5.49,-3.3 -2.65,0.34 -5.44,-2.93 -6.7,-4.13 2.45,-0.62 0.68,-2.65 0.87,-3.74 2.98,-0.53 5.18,2.7 8.25,1.24 2.42,-0.59 5.57,1.81 7.6,-0.26 0.47,-1.42 5.9,0.3 3.69,-2.76 -1.12,-2.61 -3.65,-4.39 -6.37,-5.3 -3.26,-1.55 -1.48,-4.68 -0.67,-7 0.13,-2.98 3,-4.72 3.48,-7.44 -0.29,-1.95 -0.01,-6.22 2.42,-3.58 1.94,-2.25 5.82,-1.29 7.83,0.68 1.2,2.1 3.32,0.53 1.22,-1.06 -2.48,-1.87 -1.81,-4.87 -2.24,-7.47 -1.88,-1.57 -2.53,-5.38 -5.87,-5.07 -3.66,0.72 -1.05,-5.18 -3.4,-6.67 -1.19,-0.92 0.46,-3.75 -1.48,-3.55 -1.01,-2.39 -5.64,-2.94 -6.17,-3.55 2.64,0.97 4.98,-0.76 6.95,-2.52 2.55,-2.21 4.69,1.32 7.17,1.82 2.66,0.14 2.98,2.58 0.58,3.55 -1.44,1.01 -3.37,2.5 -1.86,4.15 -2.05,2.82 1.45,5.04 4.18,4.46 2.24,0.66 3.9,4.74 5.89,0.83 -0.45,2.74 1.7,0.82 1.6,-0.76 0.67,-1.92 4.97,-2.44 2.12,-4.7 -0.88,-2.08 -0.93,-5.08 -2.83,-6.29 1.51,-0.41 1.74,-3.36 4.33,-3.14 0.74,-1.52 -4.26,-0.47 -1.65,-2.01 1.38,-2.03 1.95,-4.13 2.25,-6.48 -0.71,-3 2.32,-4.04 2.61,-6.78 0.79,-1.07 0.87,-3.3 2.02,-0.85 0.37,3.39 3.79,-1.54 1.28,-2.71 -2.87,-0.55 -1.44,-3.38 -0.47,-5.41 0.59,0.58 1.75,-1.54 1.49,0.66 0.07,2.26 4.9,2.03 2.07,4.51 -3.06,1.89 2.52,2.73 3.16,0.29 0.8,-0.58 2.28,-0.85 1.45,-2.12 2.18,1.11 3.08,-1.11 1.14,-2.24 -0.63,-3.15 1.27,-6.2 4.04,-7.12 3.15,-0.33 1.76,-4.5 2.46,-6.7 2.68,1.91 1.44,-1.23 0.17,-1.57 -0.24,-1.73 3.07,-1.64 3.49,-0.99 -0.52,3.68 4.93,5.45 5.98,1.6 -0.74,-2.19 -4.02,-2.52 -1.51,-4.94 1.37,-2.71 -0.97,-5.14 -3.64,-5.47 -2.06,-0.69 -6.98,-0.83 -4,-3.86 -2.84,-2.24 1.77,-2.66 3.14,-4.1 2.67,-3.27 6.84,-5.01 10.97,-5.41 2.08,0.66 3.04,-0.42 5.04,-0.78 3.26,-0.69 5.53,-2.7 8.88,-1.89 1.83,0.09 3.72,-0.92 5.18,-0.23 3.3,-0.51 -0.59,-3.78 0.31,-4.05 7.13,0.01 14.26,-0.01 21.38,0.01 2.09,0.14 -2,3.01 0.93,2.93 1.33,0.5 2.97,0.39 1.78,1.28 0.04,1.2 -0.09,5.95 -1.36,3.75 0.88,-1.97 -1.47,-3.03 -1.4,-0.65 -0.13,1.49 -3.77,0.21 -3.69,2.55 -3.37,1.5 0.23,4.73 2.72,4.05 3.82,-0.71 6.21,-3.84 8.09,-6.94 1.84,-0.32 4.98,-2.24 2.66,-4.31C557.34,3.94 555.66,1.55 558.62,2.18c40.17,0 80.35,0 120.52,0 0,32.42 0,64.83 0,97.25 -2.09,0.36 -2.95,2.3 -1.54,3.74 -2.44,-1.53 -2.16,1.82 -2.17,2.03 -1.83,-0.06 -0.41,-2.79 -2.86,-3.06 -0.55,-1.54 -1.56,-2.65 -3.54,-1.77 -1.52,-1.23 -4.42,-2.86 -6,-3.08 -2.3,1.54 0.4,6.71 -3.71,5.55 -1.63,0.21 -3.74,1.9 -3.4,2.86 -1.22,-0.25 -2.92,1.14 -1.43,2.07 -2.82,1.19 1.7,2.9 -0.94,4.55 -2.72,2.09 2.48,0.44 1.29,3.06 -2.53,0.4 -0.3,2.61 -2.09,4 -0.4,3.26 -2.41,5.93 -3.86,8.82 0.28,0.79 -3.1,0.12 -1.27,1.6 -1.02,2.01 -3.11,4.53 -0.2,6.39 -2.52,0.22 -3.43,3.38 -5,5.17 -0.91,1.5 1.12,2.54 -1.32,2.93 -1.23,2.37 -2.15,5.27 -3.97,7.32 1.46,1.7 -3.54,1.33 -2.2,4 0.89,0.84 -2.06,0.35 -2,1.51 -2.16,-0.19 -3.58,4.12 -1.57,4.8 2.75,-1.67 -0.46,5.07 2.92,2.57 1.47,-1.64 1.11,3.68 3.89,2.06 1.15,-1.3 4.64,-3.43 5.55,-1.97 -0.97,2.34 -5.83,2.91 -5.32,5.59 1.65,1.51 -1.67,5.32 2.05,4.87 0.58,1.25 3.67,-0.2 3.17,2.56 -0.46,2.07 -2.09,3.57 -1.96,5.92 -2.28,1.79 1.99,3.07 3.27,1.27 1.22,3.88 3.54,-2.53 5.73,-0.07 1.71,0.15 3.48,-3.04 4.82,-0.75 0.7,2.54 3.93,4.85 1.33,7.39 -0.96,2.05 -3.49,5.21 -5.83,2.98 -2.18,1.39 0.8,4.71 -0.35,6.74 -1.64,-3.35 -4.19,2.67 -7,1.13 -1.58,0.37 -1.77,-1.65 -2.62,-1.81 -0.7,0.72 -4.76,0.36 -3.34,1.66 -0.36,0.87 -3.77,2.22 -1.73,4.23 -0.31,2.89 -2.88,-1.51 -4.31,1.09 -1.46,1.61 -3.55,2.49 -3.46,4.75 -0.41,1.43 -0.54,3.48 -0.05,5.34 -0.27,1.74 -0.64,1.81 -2.46,1.7 -2.35,1.24 -5.67,-2 -7.94,0.36 -1.02,1.19 0.11,2.72 -2.11,2.54 -1.91,-2.74 -5.13,1.42 -6.94,-1.53 -3.68,-1.24 -4.83,6.16 -8.08,2.91 -0.68,-0.31 -3.05,-3.22 -2.23,-1.07 0.44,2 -3.21,4.32 -1.91,5.59 -1.58,-0.54 -1.24,3.52 -1.64,0.7 -1.39,-2.07 -3.9,0.94 -5.63,0.87 0.37,1.37 0.82,0.9 -0.34,1.77 -0.21,2.03 1.56,4.11 -0.43,6.09 -0.26,2.82 -3.85,3.15 -3.39,6.04 1.82,1.79 -0.1,4.43 -1.07,6.43 -3.76,0.87 1.99,2.12 2.03,4.1 0.89,1.78 3.76,2.19 1.71,4.57 -2.3,2.9 -5.15,-1.81 -7.83,-2.01 -3.78,-1.12 -4.32,3.77 -2.19,5.82 -2.31,2.78 -0.33,6.19 0.38,9.1 0.77,1.86 4.43,0.77 3.16,3.54 -0.62,2.49 -0.11,4.99 0.21,7.43 1.17,3.44 5.88,-1.22 6.9,2.2 0.63,0.39 -1.33,1.3 0.64,1.71 0.61,2 4.71,2.89 4.1,0.07 2.42,-0.19 4.16,-3.38 6.65,-1.26 2.61,1.3 4.67,3.68 7.51,4.49 2.44,-0.41 2.29,3.63 -0.15,2.17 -3.16,1.33 0.69,4.72 2.95,3.33 2.69,-1.74 4.67,2.16 2.98,3.28 -1.53,-1.48 -3.23,1.37 -1.51,2.46 -1.66,0.09 -1.17,4.59 -3.15,5.57 -2.16,-0.57 -0.01,3.21 -2.03,1.18 -1.51,-0.51 -1.63,0.74 -2.82,1.17 0.46,1.78 3.76,-0.82 2.44,1.78 0.45,1.46 -0.73,2.48 0.5,3.94 -0.91,1.42 1.06,4.29 -0.87,5.01 0.89,2.05 -1.39,4.46 -0.11,6.57 1.6,2.36 2.84,-1.08 4.63,0.84 2.19,0.61 6.36,2.5 5.42,5.48 1.51,1.9 3.6,2.8 3.89,5.79 1.08,1.98 3.28,1.24 4.3,3.24 2.25,0.68 4.45,1.39 6.37,2.79 1.16,1.48 3.78,2.23 4.69,2.86 -0.38,2.65 -2.37,5.25 -1.49,7.93 0.05,2.46 -6.1,4.34 -5.15,1.14 -2.52,-0.74 -5.24,-0.5 -7.55,-1.88 -1.49,0.54 -3.24,0.69 -4.5,0.55 -1.71,1.13 -6.19,1.11 -5.4,-1.84 -0.88,-3.94 -4.63,1.38 -6.95,-0.97 -1.81,-1.22 -2.73,1 -2.64,2.13 -3.4,-2.47 -4.1,3.12 -6.37,4.33 -1.56,1.14 -0.42,-3.07 -2.75,-1.69 -2.4,0.37 -5.28,1.01 -7,-0.66 -2.78,0.67 -5.63,0.98 -8.42,1.61 1.94,1.66 -2.76,2.56 -3.79,2.43 -2.67,-0.72 -5.06,0.99 -7.69,0.02 -2.34,1.37 -6.27,0.31 -6.05,4.11l-0.04,0.01 0,0z m57.81,-33.85c-0.89,-1.57 0.49,-2.17 0,0z m-241.23,-51.26c-1.5,-0.26 -4.88,0.4 -5.3,-0.46 2.59,-1.58 -0.9,-5.56 2.71,-5.44 2.09,-0.97 5.31,1.36 6.88,-1.15 -0.17,-1.75 -1.39,-4.59 1.04,-3 2.58,1.66 5.83,-0.05 8.09,1.03 2.4,1.17 -0.19,4.14 1.51,6.12 -0.91,2.05 -4.72,1.7 -6.85,2.38 -2.67,0.39 -5.38,0.53 -8.08,0.53z m245.17,-54.27c-0.96,-0.5 -1.79,-4.14 -0.7,-1.7 0.41,0.34 1.1,1.13 0.7,1.7z m15.47,-62.08c-0.5,-1.68 1.86,0.26 0,0z M392.43,81.96c-1.18,-1.24 -0.52,-3.74 1,-1.58 0.97,0.64 4.51,-0.85 3.11,1.22 -1.28,-0.1 -4.06,-2.2 -4.11,0.36z m69.72,-22.48c-3.13,-0.37 -5.18,-4.96 -3.51,-7.6 1.49,-0.95 5.9,-1.19 6.08,0.31 -0.75,2.23 0.93,5.01 -1.2,6.83 -0.37,0.32 -0.88,0.46 -1.36,0.46z m1.2,-32.66c0.64,-1.98 -0.94,-1.7 -1.81,-2.37 0.83,-0.97 3.57,-1.76 1.01,-2.23 -1.29,0.52 -2.78,0.7 -3.28,0.14 -1.2,0.89 -3.04,-4.18 -2.96,-0.9 1.94,3.97 -3.66,-2.01 -2.98,1.25 2.3,2.87 -2.86,2.37 -3.53,0.29 -1.84,-1.41 -2.9,-5.04 0.07,-4.98 -0.36,-1.21 -1.52,-2.86 -0.18,-4.45 -3.01,0.94 -0.61,-2.79 -2.49,-3.65 -1.26,2.21 -4.03,0.25 -1.58,-1.13 2.3,-1.91 -4.09,-1.91 -1.43,-4.6 0.66,-1.81 2.03,-2.29 3.79,-2.01 1.73,-0.33 3.25,0.66 4.85,0.17 2.53,-1.3 -3.03,3.08 0.48,2.2 3.11,-1.44 -1.22,5.41 2.65,3.83 2.34,0.52 1.33,4.72 3.21,4.64 2.81,0.65 4.59,3.49 7.55,3.98 2.95,1.5 6.52,1.02 9.42,1.43 -0.95,0.85 -5.31,2.46 -4.34,3.45 -1.86,0.24 -4.2,1.89 -2.01,3.36 -1.56,0.82 -3.63,-0.42 -4.9,1.06 -0.87,-0.61 -1.05,-0.3 -1.52,0.53z m23.35,-5.93c-1.68,-0.42 -4.33,-0.5 -2.76,-2.36 -1.89,0.07 -1.65,-3.14 0.36,-1.62 2.48,0.8 5.12,0.27 7.63,0.6 2.21,1.62 -2.46,4.83 -3.16,1.83 -0.45,0.12 -0.96,1.84 -2.07,1.55z","name":"Russian Federation"},"mt":{"path":"m343.65,509.08c-1.52,-0.23 -1.75,-0.24 0,0z m1.95,2.72c-1.32,-0.63 -1.5,-0.7 0,0z","name":"Malta"},"me":{"path":"m385.29,433.13c-1.98,-1.45 -3.12,-5.3 -6.16,-4.27 -0.68,-0.6 -0.46,-1.87 -1.44,-2.17 0.16,-1.66 0.06,-3.3 -0.89,-4.86 1.96,-1.05 1.28,-4.74 3.12,-5.09 1.81,3.01 2.14,-1.15 0.71,-2.43 2.24,-0.2 3.4,-2.11 5.57,-0.36 3.49,0.56 2.95,4.72 6.22,5.9 -2.5,0.45 -0.84,6.17 -3.72,4.67 0.19,-3.37 -2.81,0.5 -2.99,1.87 -0.8,1.83 -2.3,3.26 -0.46,4.87 0.08,0.47 0.4,1.59 0.03,1.87z","name":"Montenegro"},"rs":{"path":"m397.48,431.57c-0.16,-2.49 -1.05,-5.46 -3.99,-5.18 -0.83,-1.86 -3.16,-3.89 -0.74,-5.1 2.42,-2.35 -3,-3.15 -2.73,-5.8 -1.28,-2.34 -5.16,-1.7 -5.47,-5.07 -0.61,-1.48 -2.43,-2.36 0.08,-2.14 2.37,-1.69 -1.79,-3.25 -2.79,-4.49 -3.49,-0.35 0.76,-4.99 -0.07,-7.08 -1.54,-0.41 -2.38,-0.6 -2.22,-2.53 -0.29,-0.9 3.52,-0.03 1.84,-1.89 -1.99,-0.46 -4.18,-1.03 -2.61,-2.61 0.5,-1.92 -2.64,0.29 -1.69,-2.2 -0.12,-1.58 -1.93,-2.81 0.65,-3.27 2.64,-1.35 4.3,-3.64 7.52,-3.04 2.34,-0.11 4.56,2.67 6.11,3.82 1,0.92 0.22,4.94 3.24,4.94 1.65,0.3 5.5,0.5 3.47,2.78 1.27,1.27 0.97,1.07 -0.4,2.22 0.32,1.47 3.21,0.4 3.09,2.01 1.78,0.14 4.21,-0.13 4.93,1.74 2.85,0.45 1.17,-3.79 1.99,-3.56 1.66,0.7 3.37,1 1.04,1.99 -1.64,2.21 4.19,3.86 0.86,5.71 -2.2,2.75 0.34,6.72 2.98,8.19 2.92,0.51 3.82,2.98 1.52,5.06 -0.82,0.05 -2.7,-0.25 -2.65,1.85 -1.23,2.37 3.66,5.04 -0.48,5.54 -2.42,1.11 -4.61,2.18 -7.35,2.39 -1.32,2.74 -6.31,0.55 -6.16,5.74z","name":"Serbia"}}}); + +/** Add Germany Map Data Points */ +jQuery.fn.vectorMap('addMap', 'germany_en', {"width":592,"height":801,"paths":{"th":{"path":"m312.19,352.19c-2.73,0.22 -2.22,4.11 -3.64,5.97 -1.01,2.7 -4.71,2.26 -7.13,2.91 -2.52,0.84 -2.65,-2.93 -5,-3.11 -2.02,-1.67 -5.36,0.2 -4.98,2.55 -0.62,4.82 -6.22,6.91 -9.72,9.65 -2.98,3.28 -7.8,2.07 -11.1,4.73 -2.55,1.59 -5.81,3.14 -7.87,5.03 0.64,3.74 1.96,8.43 6.44,8.84 3.41,0.33 2.07,4.91 5.71,5.17 2.12,1.11 4.61,1.57 6.04,3.67 2.61,-0.18 1.95,2.83 0.13,3.41 -0.75,1.55 1.21,2.98 -0.06,4.88 -2.65,1.33 -1.59,-4.91 -4.58,-2.96 -2.15,1.14 2.24,4.28 1.18,6.62 -0.73,2.87 3.35,2.38 3.93,4.97 0.22,2.4 -1.82,4.2 -4.4,4.04 -1.89,0.05 -3.04,-2.14 -5.19,-1.69 -2.29,-1.13 -3.6,1.4 -2.29,3.19 0.92,3.27 2.06,6.86 1.64,10.24 -1.04,2.07 -1.35,6.09 -4.56,5.07 -2.5,-0.54 -3.05,2.78 -2.17,4.43 0.33,2.11 -1.94,1.58 -0.64,3.71 0.2,3.37 -2.96,5.74 -4.05,8.57 -1.46,3 3.1,3.73 4.61,2.61 -1.8,-1.67 -0.95,-4.04 1.83,-4.18 2.21,-0.46 5.52,-0.43 5.9,2.47 2.29,2.61 -2.68,2.96 -1.96,5.59 0.5,1.86 -0.79,8.31 0.95,7 1.72,-3.38 5.8,-2.18 8.88,-2.88 2.69,0.85 3.11,5.24 6.43,5.5 3.89,0.66 4.77,4.88 6.09,7.93 -0.55,3.14 2.45,3.82 4.54,1.98 0.31,5.02 5.89,6.45 10.06,7.19 -0.2,3.63 -1.27,7.43 0.53,10.84 2.35,0.1 5.18,2.71 7.07,1.85 0.03,-1.3 -1.32,-4.82 1.27,-4.26 2.07,-0.06 5.3,2.5 6.66,0.25 0.29,-2.71 -3.43,-1.58 -4.54,-3.52 -1.94,-1.64 -5.47,-2.54 -4.67,-5.79 -0.91,-3.55 3.89,-3.37 6.02,-4.77 2.87,-1.54 6.27,-0.65 9.38,-0.79 1.61,1.84 2.4,4.9 5.49,4.49 2.33,1.02 3.21,-1.38 4.71,-2.1 2.52,-0.39 4.79,2.85 4.64,5.17 -2.32,0.34 -2,2.87 -0.04,3.79 1.25,1.09 4.62,-1.62 5.78,-2.97 1.07,-2.95 1.98,-5.92 0.84,-9.01 0.33,-2.69 -1.49,-4.1 -2.06,-6.05 -0.35,-1.26 0.15,-3.52 1.89,-2.72 2.51,-0.54 3.16,-3.11 5.03,-4.31 2.41,-0.31 6.41,-0.25 6.75,2.81 -1.09,1.47 -1.71,2.75 -1.31,4.94 2.04,1.91 4.67,0.65 4.88,4.5 0.54,1.96 3.79,3.19 4.05,0.56 1.06,-1.74 3.34,-0.66 4.25,0.63 6.13,-1.07 12.67,-0.94 18.25,-3.97 -1.68,-0.65 -2.19,-2.46 -0.38,-3.31 1.4,-0.73 5.24,-2.7 2.32,-4.13 -1.1,-2.24 -4.24,-0.26 -4.55,-3.08 -1.3,-2.44 2.29,-4.28 3.11,-6.33 2.98,-0.71 2.97,-4.68 5.91,-5.31 1.95,1.54 1.58,4.54 1.16,6.72 1.66,-0.64 6.6,0.71 6.33,-0.74 -3.05,-0.17 -0.61,-3 1.2,-3.1 2.57,-1.22 5.33,-2.23 7.87,-3.14 1.72,-1.51 4.46,-4.54 0.25,-4.48 -1.74,-1.64 -3.31,-4.12 -3.69,-6.5 0.38,-2.82 0.28,-5.87 1.72,-8.41 0.89,2.58 5.82,0.77 5.81,-1.09 0.71,-1.83 4.18,-2.99 5.41,-0.97 2.56,-0.68 0.59,-4.69 3.44,-5.44 3.25,-1.87 7.85,-0.32 10.53,-2.97 -2.57,-1.55 -0.79,-6.34 -4.47,-6.16 -2.74,-0.84 -6.28,-2.6 -5.42,-6.03 0.8,-2.88 -3.5,-2.46 -5.15,-3.47 -2.87,-0.81 -6.3,-2.89 -8.61,0.02 -2.54,2.1 0.01,3.58 1.21,5.21 -0.17,3.21 -2.39,6.03 -3.68,8.9 -1.08,1.71 -2.42,1.35 -2.66,-0.64 -2.24,-4.02 -1.09,1.94 -3.66,-0.66 -2.71,-1.39 -5.95,-1.32 -8.59,0.19 -0.02,-4.6 -5.04,-6.77 -8.31,-9 -2.72,-0.06 -5.6,1.79 -8.33,0.1 -2.65,-0.52 -5.05,-1.27 -4.7,-4.45 -2.02,-1.11 -5.86,-2.21 -7.53,-1.16 -1.29,1.98 -3.84,1.06 -5.84,1.31 -1.81,-1.01 -2.04,-3.39 -2.5,-5.41 3.14,0.3 2.23,-3.59 0.51,-4.83 -1.37,-2.03 -4.15,0.89 -5.53,-1.6 -1.69,-0.96 1.02,-5.32 2.36,-2.94 1.62,-1.63 2.76,-3.73 4,-5.66 -0.78,-1.58 -4.12,-2.02 -3.47,-4.09 -2.15,-0.17 -2.01,-2.77 -1.75,-4.31 -4.91,-2.77 -10.54,-0.91 -15.84,-1.69 -2.69,-0.42 -5.41,-2.8 -8.03,-1.28 -1.99,0.45 -4.28,-1.52 -3.68,-3.5 0.86,-2.86 -0.76,-4.88 -2.35,-7.1 -1.55,-2.64 -4.98,-6.28 -2.16,-9.19 -2.47,-3.43 -7.17,-3.03 -10.89,-3.21 -0.41,0.09 -0.82,0.18 -1.23,0.27z m95.09,106.63c0.36,0.47 0.77,-0.65 0,0z","name":"Thüringen"},"sh":{"path":"m173.41,0.78c-1.96,2.02 -2.32,5.26 -3.72,7.72 0.61,-2.46 2.87,-3.44 4.94,-4.31 1.37,-2.31 1.87,-2.9 -1.22,-3.41z m-4.63,9.69c-1.37,3.14 -2.78,7.11 -2.63,10.16 1.42,-1.81 3.12,-2.33 4.66,-0.67 1.41,1.35 2.9,1.87 4.52,0.27 2.61,-1.53 -0.74,-0.41 -1.92,-1.16 -2.06,-1.81 -4.59,-3.55 -3.89,-6.71 -0.29,-0.68 0.25,-4.89 -0.73,-1.88z m16.78,8.5c-1.27,2.96 0.71,4.89 2.59,6.89 3.39,3 2.55,7.98 4.79,11.67 0.62,3.55 5.38,3.23 6.46,6.57 3.09,5.18 8.01,9.55 9.53,15.49 -0.32,3.65 -4.55,4.93 -6.72,7.41 -1.75,1.07 -3.73,2 -5.62,0.78 -2.44,0.59 -7.26,-0.45 -7.37,2.95 0.9,2.44 -1.97,3.88 -3.95,4.18 -1.94,-2.13 -2.52,-1.01 -2.77,1.45 -0.87,2.9 3.21,3.7 4.93,4.64 1.92,-3.3 6.38,-1.94 9.56,-2.06 2.21,2.21 1.18,5.9 0.57,8.61 -1.14,2.05 -2.44,4.23 -0.74,6.43 0.5,2.36 2.45,2.12 4.01,1.08 3.24,-0.45 3.19,4.26 4.78,6.16 2.07,2.16 -0.11,6.53 -3.11,5.16 -1.14,-1.75 -5.79,-1.46 -5.26,0.73 2.63,2.93 2.85,7.1 5.04,10.2 1.56,1.12 3.1,3.53 5.09,1.5 1.43,0.34 0.36,3.67 3.4,2.47 5.03,0.4 10.67,-0.76 14.8,2.92 4.21,3.5 4.64,9.55 8.23,13.45 3.79,1.81 5.25,6.01 5.59,9.84 1.82,3.22 5.7,4.78 8.7,6.74 2.98,1.76 2.45,-2.04 3.3,-3.87 0.32,-3.07 2.7,-3.68 2.95,-0.51 1.97,4.21 4.12,0.09 5.74,-1.98 1.13,-1.81 1.09,-3.61 3.84,-2.85 2.75,1.63 4.73,-1.94 6.94,-3.16 -0.04,-2.48 1.02,-3.47 3.73,-4.47 1.51,-1.18 4,-1.93 4.95,0.16 -0.92,3.02 -1.41,6.74 1.26,9.04 1.1,1.47 -0.59,3.76 -1.58,5.02 -3.72,1.55 -2.94,7.3 0.6,8.57 3.05,0.71 1.81,2.28 4.18,4.34 1.9,2.3 3.7,4.33 6.71,5.17 4.24,1.47 7.8,5.01 12.4,5.13 1.57,-2.96 0.71,-7.47 3.24,-9.94 1.76,-0.99 3.85,1.15 5.23,-1.34 4.78,-3.66 7.65,-9.11 11.5,-13.72 0.07,-2.89 2.79,-4.69 1.09,-7.69 -1.21,-2.36 -3.12,-1.39 -5.13,-1.38 -2.37,-1.11 -4.33,-3.37 -5.88,-5.25 0.57,-2.78 0.94,-5.55 -0.72,-8.01 -1.68,-4.33 3.4,-6.71 6.26,-8.75 2.76,0.39 4.62,-1.55 2.8,-4.28 -2.57,0.04 -0.18,-3.45 -2.47,-3.84 -2.6,1.03 -5.44,-0.16 -6.16,-2.94 -1.95,-2.52 -0.1,-5.31 2.05,-6.91 1.09,-2.74 3.32,0.44 5.2,-0.9 2.94,-4.13 6.93,-7.19 11.06,-10.05 2.63,-1.56 0.21,-5.06 0.5,-7.57 -0.21,-3.63 -1.2,-7.39 -0.01,-10.84 0.18,-2.96 -5.24,-0.47 -7.49,-1.07 -5.13,1.62 -7.3,9.04 -13.4,8.34 -3.13,0.69 -4.64,-2.86 -6.1,-4.84 -4.97,-2.87 -10.19,-5.54 -15.47,-7.76 -2.99,-1.52 -6.08,0.55 -8.5,2.13 -0.97,2.39 -2.38,4.59 -2.88,7.13 -1.56,-1.44 -3.01,-3.67 -0.84,-5.3 1.62,-1.77 -1.68,-4.84 0.9,-6.58 0.02,-1.27 -2.39,-3.21 -3.97,-2.94 -4.31,0.8 -8.65,1.68 -12.59,3.47 -2.43,1.23 -4.15,-0.86 -4.81,-2.94 1.24,-1.68 2.97,0.32 4.34,-1.22 3.92,-1.6 8.22,-4.79 7.48,-9.56 -0.08,-4.17 0.91,-8.43 -1.14,-12.32 -1.21,-3.12 -1.73,-8.59 -5.28,-9.18 -0.59,1.71 -1.3,5.52 -3.94,3.91 -3.94,-2.44 -5.62,-7.87 -10.62,-8.75 -2.4,-0.95 -5.92,-1.49 -2.94,-4.34 -2.83,-1.32 -4.46,2.91 -6.75,4.06 -1.81,0.77 -3.7,1.77 -5.55,1.1 -2.17,-0.1 -2.78,3.34 -5.32,2.53 -2.44,-0.17 -5.39,0.15 -5.47,-3.04 1.26,-2.25 -1.79,-2.35 -3.37,-3.29 -2.69,-1.82 -6.3,0.87 -8.88,-1.52 -3,-2.97 -8.01,-2.63 -12.09,-2.77 -2.73,-0.05 -5.94,1.35 -8.19,-0.63 -2.53,-0.79 -2.34,1.14 -3.28,2.91z M165.38,30.69c0.26,2.81 0.4,-8.09 0.17,-2.47 -0.06,0.82 -0.12,1.65 -0.17,2.47z m13.5,1.44c-2.38,0.11 -5.93,-0.19 -6.48,2.95 -0.84,2.31 2.84,2.19 4.01,3.33 2.08,0.12 5.59,1.6 6.02,-1.46 1.83,-2.49 -0.07,-5.86 -3.55,-4.82z m-11.97,6.41c-1.92,2.44 0.88,5.14 2.25,6.97 3.61,0.13 0.82,-1.45 -0.03,-3.16 -0.91,-0.75 -0.95,-5.89 -2.22,-3.81z M181.53,44c-3.16,2.07 3.2,-1.05 4.68,-0.94 3.57,-2.86 -4.04,0.86 -4.68,0.94z m-1.31,6.22c-3.19,-0.54 3.33,2.8 0.63,-0.13 -0.17,-0.12 -0.42,0.08 -0.63,0.13z m8.44,2.63c-1.5,0.95 -5.02,0.69 -5.3,2.69 0.04,2.05 2.12,3.65 4.01,2.44 0.45,-0.74 3.48,-5.42 1.28,-5.13z m142.28,2.25c-2.22,2.09 -3.42,5.93 -2.84,8.5 1.81,-1.93 6.45,-1.17 5.53,2.13 0.75,2.01 5.23,1.5 7.53,1.68 3.9,0.79 4.95,-0.34 2.64,-3.56 -1.78,-3.59 -4.09,-7.7 -8.61,-7.85 -1.38,-0.32 -3.03,-0.37 -4.25,-0.9z m-134.34,2.94c-1.42,2.56 1.08,4.09 3.5,3.69 1.95,-0.37 3.87,-2.9 3.63,-4.91 -2.37,-0.51 -4.91,-1.04 -6.76,0.98l-0.36,0.24z M140.06,88.88c-0.28,2.81 2.92,0.39 0,0z m48.13,13.38c-1.61,1.32 0.69,2.85 0.06,-0.03l-0.06,0.03z","name":"Schleswig-Holstein"},"st":{"path":"m367.5,207.72c-2.53,0.49 -2.68,6.11 -5.69,3.88 -1.54,-0.27 -2,4.74 -0.62,6.28 -1.83,0.03 -4.69,1.23 -5.84,3.45 -2.16,1.75 -5.06,2.95 -7.73,3.81 -1.55,-0.32 -3.98,0.25 -4.38,-1.66 -3.96,-2.32 -9.18,-1.22 -13.69,-1.78 -0.82,1.11 0.07,3.08 -1.73,3.89 -1.82,3.69 -6.1,1.61 -9.28,2.54 -2.64,-0.11 -4.45,1.7 -3.62,4.38 -0.45,3.07 1.59,5.83 2.38,8.76 4.58,2.95 6.91,8.32 9.22,13.03 -1.02,4.14 2.73,7.03 5,9.88 -2.35,-0.75 -6.67,0.93 -4.41,3.78 2.13,2.7 4,5.66 7.03,7.25 2.19,1.61 0.12,4.97 -2.22,4.59 -1.88,2.15 -0.66,5.73 1.52,7.3 1.12,1.37 4.12,3.9 1.64,5.39 -1.82,-0.07 -4.08,1.44 -3.31,3.44 0.85,1.22 3.42,-0.32 2.88,2 0.05,3.3 -3.89,4.53 -5.42,6.71 -0.9,2.3 0.67,6.76 -2.83,4.48 -2.5,-0.5 -4.36,0.86 -6.64,1.31 -3.5,0.14 -7.17,-0.75 -10.56,0.56 0.56,2.46 -2.44,4.29 -4.71,3.94 -2.29,1.2 4.79,4.03 4.2,5.21 -3.3,0.45 -2.03,3.05 0.01,3.98 1.13,2.32 -0.87,4.55 -2.86,5.36 -2.94,1.53 -1.17,5.3 -1.3,7.86 2.06,2.6 4.65,5.37 5.72,8.78 -0.64,2.04 0.85,6.26 3.56,4.75 3.65,0.5 8.21,-0.2 10.69,3.16 4.64,-2.48 0.38,1.08 -0.35,3.49 0.67,3.87 3.9,7.06 5.79,10.42 0.02,2.22 -1.14,5.56 1.78,6.09 2.2,-1.04 4.22,-0.48 6.44,0.45 5.84,2.46 12.54,-0.89 18.17,2.38 2.32,0.62 -0.45,4.34 2.28,4.54 1.79,0.31 -0.33,2.19 2.35,3 1.69,0.92 2.02,2.61 0.5,3.94 -1.45,1.35 -2.21,4.99 -4.56,4.59 -2.63,-0.91 0.09,3.99 2.28,1.66 2.83,0.66 5.62,4.8 3.25,7.41 -2.57,1.08 1.05,5.18 3.56,3.71 1.96,-0.79 2.91,-2.94 5.65,-1.43 2.6,0.08 6.05,0.91 5.78,4.15 1.33,1.52 4.58,2.03 6.72,2.37 2.49,-0.44 5.14,-1.91 7.2,0.43 2.77,1.74 6.17,3.82 6.94,7.21 2.79,-1.13 5.73,-0.73 8.41,0.53 1.23,-2 2.73,-1.49 3.69,0.66 0.59,3.07 2,-0.72 2.48,-1.83 0.83,-2.27 3.92,-5.75 0.2,-7.01 -1.99,-2.12 2.54,-4.35 -0.47,-5.52 -3.54,-1.32 0.06,-3.71 -3.77,-3.68 -1.13,-1.82 -0.14,-5.31 -0.45,-7.77 0.09,-3.62 -2.36,-6.17 -3.27,-9.5 -2.24,-2.8 3.78,-1.95 2.18,-4.77 -0.27,-3.83 -1.97,-7.24 -2.66,-10.91 1.12,-2.57 2.7,-5.07 2.75,-7.88 2.68,-2.78 6.09,-4.94 9.75,-6.06 4.81,0.08 9.58,-1.34 13.94,-3.25 0.29,-3.17 3.92,1.99 5.64,-1.8 0.58,-1.59 1.27,-4.54 3.8,-3.39 2.22,1.16 4.46,1.71 7.03,1.3 4.79,-0.31 9.85,0.27 14.45,-1.01 2.63,-2.16 7.03,-3.34 7.55,-7.13 -2.51,-3.21 -2.57,-7.84 -4.05,-11.66 -1.56,-2.32 0.46,-2.56 1.11,-3.49 -1.21,-1.69 -2.84,1.88 -4.93,0.87 -3.35,0.33 -4.21,-4.14 -7.34,-4.73 -1.95,-1.81 -4.21,-0.39 -6.46,-1.61 -1.95,-1.37 -5.09,-1.98 -5.86,-4.32 -2.25,-0.71 -4.5,-3.34 -6.75,-2.88 0.04,3.1 -4.02,3.62 -6.31,2.65 -6.29,-1.76 -13.04,-4.4 -16.59,-10.25 -1.82,-2.88 -4.27,-5.73 -5.88,-8.53 1.69,-2.65 1.92,-5.52 1.61,-8.56 0.08,-3.49 1.94,-6.54 3.57,-9.44 -0.44,-3.76 -2.35,-8 0.31,-11.34 1.69,-3.42 -2.77,-5.17 -4.84,-4.84 -0.77,1.84 -4.03,2.12 -4.73,-0.07 -3.16,-2.02 -0.66,-5.45 -0.28,-8.33 0.25,-2.72 1.68,-3.75 3.82,-4.6 0.52,-2.45 0.69,-5 -1.29,-6.86 -2,-2.13 -0.72,-5.29 -0.24,-7.76 2.19,-2.1 2.75,-4.3 1.28,-7.4 -0.37,-2.87 -3.52,-1.27 -5.2,-0.49 -2.2,0.23 -1.98,-4.35 -5.66,-2.08 -3.04,0.71 -6,0.64 -8.83,-0.79 -2.04,-1.1 -6.47,-1.05 -6.16,-4.18 0.48,-0.96 2.72,-2.17 0.45,-2.84 -2.36,-0.92 -4.97,-4.41 -7.35,-1.78 -2.26,0.12 -3.78,-2.34 -5.44,-3.56 -1.33,-1.14 2.25,-2.99 -0.03,-2.78z m-35.72,88.19c-0.1,0.03 0.04,0.06 0,0z","name":"Sachsen-Anhalt"},"sn":{"path":"m438.91,347.22c-0.71,1.7 -1.23,3.74 -3.22,4.5 -2.58,1.63 -3.52,-1.1 -5.94,1.53 -4.3,1.22 -8.55,2.77 -13.09,2.53 -3.01,1.74 -7.34,3.17 -8.45,6.62 0.03,3.26 -3.77,5.91 -1.75,9.19 1.33,3.2 1.78,6.8 2.19,10.31 -4.06,0.29 -2.18,3.87 -0.74,6.17 2.24,3.72 1.36,8.42 1.53,12.58 2.6,-0.28 2.73,2.06 3.18,3.2 1.51,2.44 3.44,1.13 5.41,0.39 3.7,1.5 8.18,1.88 11.41,4.16 0.74,1.94 -0.81,4.85 2,5.77 1.72,1.99 6.37,0.62 6.03,4.01 -0.35,2.66 3.75,3.98 1.22,5.97 -3.58,1.98 -8.34,0.37 -11.41,3.34 -0.07,2.05 -0.66,4.73 -3.19,4.69 -0.84,-2.38 -4.84,-0.74 -3.91,1.56 -2.16,0.55 -4.73,2.38 -6.75,1.41 -0.26,3.26 -1.99,6.93 0.66,9.67 0.13,3.51 6.2,1.64 4.46,5.11 -1.54,2.13 -3.26,4.42 -6.11,4.51 -2.19,1.15 -4.93,1.82 -6.85,3.17 1.14,0.4 3.92,-0.58 2.97,1.81 -1.3,0.56 -2.71,1.18 -4.15,1.04 -1.87,-0.95 -6.83,1.68 -5.71,-1.56 0.5,-1.28 0.39,-7.08 -1.74,-3.97 -0.56,2.99 -4.53,3.58 -5.56,6.44 -1.97,1.1 -1.24,4.78 1.19,3.64 1.33,1.03 5.21,3.22 2.79,5.13 -0.59,1.68 -5.69,2.39 -2.69,4 2.14,0.67 3.79,2.61 5.05,4.37 -0.72,2.68 -0.54,4.28 2.54,4.44 2.89,0.5 5.02,2.48 7.96,1.72 3.8,-1.14 4.85,3.42 6.85,5.61 1.23,2.16 4.76,5.08 2.59,7.58 -0.49,1.72 3.93,3.14 3.09,0.38 -2.48,-2.46 -0.08,-6.44 1.28,-8.97 2.86,-4.57 6.53,-8.74 9.94,-12.84 4.56,-2.02 9.99,-0.84 14.06,-4.03 2.14,-0.66 4.2,-3.73 6.38,-3.05 2.63,1.52 5.07,3.45 7.78,4.83 2.07,-1.12 5.11,-3.24 4.13,-5.91 0.2,-2.04 -0.2,-5.69 2.84,-5.24 2.59,-0.29 5.2,-0.72 7.63,0.55 2.91,-0.54 1.72,-4.96 3.88,-6.45 2.35,-2.97 5.63,-5.26 8.68,-7.26 2.67,-0.81 5.51,3.8 7.01,0.39 1.65,-1.64 3.72,-4.3 2.58,-6.74 3.93,-2.17 7.47,-5.47 12.25,-5.22 2.33,-0.49 4.94,-0.78 7,0.62 2.41,-0.15 5.15,-2.09 4.01,-4.81 -1.95,-3.53 3.27,-1.43 5.18,-3.05 2.77,-1.08 6.09,-1.25 7.96,-3.69 5.86,-2.9 11.49,-6.39 17.78,-8.32 1.88,-3.11 -0.76,-3.48 -3.2,-3.83 -2.51,-0.45 -4.28,-2.72 -5.9,-4.48 1.17,-2.33 1.01,-5.72 3,-7.44 2.01,-0.54 2.32,2.64 4.53,2.3 2.11,1.26 6.52,1.34 7.5,-0.58 -0.17,-3.74 3.64,0.67 5,1.7 3.7,2.16 4.3,6.67 5.45,10.42 1.49,2.62 -2.09,6.06 2.42,6.33 2.67,0.89 5.37,2.57 8.28,1.87 0.47,-3.78 1.26,-7.7 4.06,-10.39 2.84,-3.18 3.04,-7.91 3.71,-11.62 2.05,-4.17 1.85,-9.14 2.71,-13.74 0.26,-3.07 0.84,-6.1 1.99,-8.91 0.22,-5.15 -3.62,-9.39 -5.25,-14.09 -0.63,-2.47 0.48,-5.37 -1.69,-7.4 -2.96,-2 -6.81,-2.81 -10.16,-4.16 -2.63,0.45 -5.28,-0.92 -5.64,-3.77 -0.41,-2.32 0.72,-4.39 -0.77,-0.54 -0.78,2.23 -4.07,1.99 -5.91,1.44 -0.89,-2.72 -3.76,-2.22 -5.89,-1.05 -2.43,0.03 -4.2,1.93 -3.78,3.04 -2.98,-1.35 -5.85,1.55 -8.48,2.42 -3.55,-1.67 -7.51,-1.35 -11.28,-1.56 -3.58,3.73 -3.22,9.41 -5.54,13.67 -1.24,3.16 -4.34,3.42 -7.26,3.89 -3.26,1.02 -6.88,-0.1 -9.67,2.35 -1.59,0.79 -4,-0.13 -5.49,-0.56 -4.01,0.9 -8.8,0.36 -12.18,-2.44 -2.57,-1.34 -4.55,-3.47 -6.76,-5.28 -2.23,1.37 -5.63,2.37 -6.56,4.87 -0.02,1.86 -4.09,1.87 -5.44,1.29 -1.42,-2.13 -2.64,-3.94 -1.26,-6.61 0.56,-3.54 0.3,-7.09 -1.63,-10.2 -0.72,-1.89 -2.32,-5.98 -4.72,-4.31 -2.79,1.33 -2.48,-5.48 -5.68,-3.53 -5.59,0.15 -11.31,0.77 -16.84,0.31 -1.25,-0.57 -2.44,-1.63 -3.94,-1.22z","name":"Sachsen"},"sl":{"path":"m63.72,553.88c-2.9,2.18 -6.1,2.82 -9.5,4.44 -3.47,4.51 -10,4.1 -15.06,5.38 -4.6,0.18 -8.97,-1.26 -13.22,-2.78 -2.47,1.73 -0.51,5.04 -0.84,7.5 1.8,0.96 4.08,-1.32 5.97,0.4 2.44,1.62 5.28,3.2 6.78,5.81 -3.49,0.44 0.05,4.79 -0.09,6.94 1.05,3.41 4.13,4.95 6.56,7.16 1.79,1.94 0.3,5.34 3.04,6.13 2.43,1.92 -2.53,4.66 1.39,5.86 2.37,0.12 6.25,2.27 7.13,-1.09 -0.35,-2.25 -3.03,-3.71 0.38,-4.78 4.42,0.26 10.1,1.27 11.81,5.94 0.51,1.58 -0.22,5.5 1.56,5.84 2.33,-0.7 1.95,-7.32 3.65,-3.1 1.02,1.94 2.67,2.87 4.44,1.6 2.61,-0.08 5.35,0.47 7.44,1.84 0.63,-1.3 5.37,-2.76 3.56,-3.91 -1.62,-2.52 -4.36,-5.17 -3.81,-8.41 1.42,-2.72 5.03,-3.05 6.69,-5.31 0.32,-2.19 -0.19,-4.41 0.63,-6.91 -2.49,1.08 -4.55,-2.01 -6.84,-2.72 1.25,-2.57 -1.08,-3.33 -2.41,-4.88 -1.38,-2.57 3.05,-1.81 2.04,-4.46 0.15,-3.03 0.9,-7.08 -0.66,-9.48C81.13,563.37 78.01,559.23 75,558.25c-1.82,-1.1 -4.05,-5.12 -6.16,-3.76 -1.8,1.27 -2.93,1.15 -3.06,-0.42 -0.68,-0.01 -1.4,-0.33 -2.06,-0.19z","name":"Saarland"},"rp":{"path":"m124.22,422c-3.08,1.37 -2.76,4.11 -2.15,6.91 -0.74,2.27 -2.92,4.57 -5.35,5.28 1.82,2.98 -1.68,6.02 -4.55,6.28 -3.87,1.42 -8.15,2.76 -11.74,4.31 -2.53,-1.67 -5.28,-0.25 -4.24,2.84 0.38,2.78 -1.77,4.53 -4.33,4.8 -2.21,0.9 -4.57,1.03 -6.93,0.89 0.24,-3.01 0.16,-2.77 -0.66,-0.16 -2.61,2.5 -6.78,2.21 -10.16,3.14 -1.7,1.36 -3.59,4.13 -6.33,3.09 -1.84,0.93 -1.47,5.36 -2.5,7.61 -0.31,2 -3.88,3.46 -5.32,1.71 -2.49,-2.13 -5.07,1.92 -3.92,4.39 -1.32,2.14 3.87,6.32 1.33,6.03 -2.57,-0.38 -4.98,1.47 -7.53,-0.25 -1.87,-0.86 -4.14,-1.17 -5.28,-3.06 -3.07,1.11 -6.64,2.41 -9.75,2.06 -1.18,-2.88 -5.27,-3.74 -3.13,0.21 0.06,1.85 3.77,4.69 0.04,3.72 -2.34,1.34 -4.33,-0.2 -6.47,-0.11 -0.71,2.72 -2.48,4.43 -4.99,5.59 -1.73,1.37 -5.12,2.04 -4.14,4.93 1.73,3.46 -1.97,4.26 -2.68,6.98 -1.38,4.14 -2.64,8.53 -0.77,12.73 1.47,5.09 3.95,10.18 7.71,13.93 3.19,1.73 6.27,3.8 8.6,6.49 1.94,2.68 4.29,-1.39 6.06,0.93 1.74,1.25 1.47,4.34 1.36,6.37 -1,5.55 -4.71,9.97 -7.61,14.63 -1.1,1.62 -3.21,1.58 -3.81,3.7 1.32,3.4 5.62,2.86 8.44,4.25 6.02,0.99 12.25,-0.27 17.78,-2.55 1.84,-1.13 2.94,-3.18 5.35,-3.48 2.7,-0.62 4.85,-2.4 7.33,-3.4 2.47,-0.56 3.3,1.96 4.66,0.63 1.69,-1.87 4.4,2.01 6.06,3.12 2.19,1.85 4.96,3.22 7.6,4.23 2.08,-1.3 3.07,-1.77 3.74,1 0.63,3.7 0.2,7.6 -0.21,11.34 -3.62,0.15 -1.02,2.73 0.84,3.34 -0.88,3.1 1.79,3.86 4.18,5.17 2.7,-0.99 3.7,-0.04 2.19,2.5 -0.63,2.28 0.81,4.56 -1.1,6.61 -1.8,1.77 -5.4,2.25 -6.16,5.03 0.5,2.47 2.45,5.22 3.88,6.72 0.53,-2.07 4.25,-1.3 6.09,-2.06 2.18,0.88 4.73,2.02 3.59,4.81 0.57,4.16 4.15,6.47 7.58,8.3 4.06,2.82 9.28,1.81 13.75,1.03 5.57,0.87 11.49,1.89 16.04,5.46 1.5,1.92 4.34,2.91 6.75,3.03 1.44,0.1 3.88,-0.46 4.75,1.03 2.73,-1.42 4.25,-4.04 4.38,-7.03 0.97,-3.35 4.62,-5.13 4.47,-8.92 0.59,-3.28 2.22,-6.72 1.35,-9.86 0.74,-2.94 4.48,-3.42 5.84,-6.03 2.45,-0.61 0.47,-2.16 -0.81,-2.44 -2.02,-2.71 2.93,-3.58 2.9,-6.17 0.3,-2.2 -0.42,-4.5 0.69,-6.55 -1.31,-0.77 -4.55,0.38 -4.34,-2.22 1.3,-2.38 -0.67,-5.57 -0.94,-8.16 -1.05,-1.55 -0.56,-3.22 -0.06,-4.81 -2.06,-3.14 -3.58,-6.56 -4.31,-10.28 -0,-3.21 3.88,-3.16 5.84,-4.38 1.83,-1.95 0.9,-4.67 -1.26,-6.04 -2.48,-3.08 -4.3,-6.94 -4.99,-10.83 0.78,-1.71 1.4,-3.41 0.25,-5.25 -0.12,-3.38 -3.6,-5.04 -5.13,-7.75 -2.86,-3.27 -7.52,-1.08 -10.66,0.56 -4.69,1.79 -9.52,4.51 -14.68,3.47 -2.44,-2.49 -4.42,-5.7 -6.29,-8.66 -2.19,-2.94 2.65,-2.19 3.79,-4.33 1.44,-3.52 5.56,-1 5.95,-3.31 1.05,-2.62 -4.12,-2.88 -2.51,-5.79 1.38,-2.83 4.79,-3.85 7.44,-4.63 1.92,2.63 5.73,-0.22 2.09,-1.81 -1.3,-2.26 2.57,-3.89 4.23,-2.24 3.08,0.46 1.96,-3.71 0.96,-5.33 -1.37,-3.08 -3.17,-5.78 -6.33,-7.23 -3.79,-0.63 -1.12,-3.37 -0.49,-6.08 0.24,-1.88 -1.87,-3.91 -0.43,-6.13 1.19,-2.18 3.39,-6.07 6.28,-3.97 1.67,3.39 3.78,0.05 4.16,-2.21 1.81,-2.05 -0.69,-2.3 -1.07,-3.97 -0.17,-2.37 -1.93,-5.43 0.13,-7.42 -0.88,-3.78 -6.22,1.19 -5.36,-1.83 1.28,-4.22 -5.99,-5.38 -4.53,-9.85 1.32,-2 0.84,-5.3 -1.94,-5.86 -1.78,-2.03 -5.71,-1.54 -6.82,-3.48 -0.21,-1.96 2.71,-4.06 -0.25,-4.94C125.29,422.08 124.64,421.87 124.22,422z","name":"Rheinland-Pfalz"},"nw":{"path":"m177.25,263.34c-2.1,-1.63 -5.7,-1.31 -6.06,1.91 0.19,3.63 -4.48,4.11 -7,3.66 -1.11,-1.64 -4.06,-2.21 -2.35,0.66 0.52,3.14 4.56,4.05 6.57,6.26 1.92,1.46 2.52,4.49 2.62,6.8 0.18,2.64 0.19,5.1 -0.9,7.58 -1.32,1.99 0.48,3.83 2.46,3.92 3.25,0.58 0.3,2.71 -0.78,3.97 -1.55,0.88 -3.89,0.86 -4.75,2.84 1.66,2.95 -2.56,1.58 -4.29,1.1 -2.41,-0.95 -5.38,-1.98 -7.02,0.74 -2.16,1.92 -4.56,3.57 -7.26,4.5 -1.87,2.2 -2.96,-0.94 -5.46,-0.31 -2.18,0.39 -2.63,4.37 -4.84,2.75 -2.6,-0.41 -3.41,-2.28 -4.46,-4.35 -2.31,-1 2.21,-2.81 3.55,-2.98 3.51,0.2 5.07,-3.48 2.41,-5.69 -1.71,-1 -4.92,-1.05 -5.1,-3.81 -0.4,-2.56 2.07,-4.87 2.81,-7.19 0.91,-0.72 -1.83,-2.26 -0.5,-3.69 3.14,-1.64 1.45,-5.72 -1.26,-6.8 -2.05,-1.15 -4.05,1.71 -6.33,0.21 -2.51,-1.72 -6.07,-2.59 -6.27,-6.18 -0.22,-2.85 -2.57,-3.65 -4.96,-4.34 -1.35,-0.64 -3.78,3.65 -1.27,3.96 1.72,1.12 -0.74,4.19 -1.92,5.19 -4.58,2.06 -9.39,4.71 -12.83,8.28 -0.91,2.09 -3.91,0.71 -4.63,3.16 -3.68,0.16 -7.44,-1.07 -11.03,-0.19 -1.13,2.36 -3.53,1.5 -5.41,2.92 -3.3,2.56 -8.23,3.82 -10.15,7.67 -0.16,4.41 -5.85,3.29 -8.27,5.42 -1.07,1.95 -3.97,5.3 -0.36,6.02 2.12,2 6.43,3.97 4.59,7.5 -2.07,2.76 -4.18,5.76 -7.59,6.94 -1.43,-2.65 -3.58,-2.35 -5.97,-1.09 -2.93,0.68 -5.59,2.43 -8.37,3.24 -1.83,0.92 -6.4,-1.52 -6.2,0.14 1.25,2.44 1.32,5.11 -1.64,2.71 -2.84,-2.65 -6.23,-5.14 -10.34,-4.5 -2.26,1.13 -4.86,1.79 -7.57,1.91 -2.94,-0.3 -6.47,1.11 -7.66,3.97 0.91,4.49 1.78,9.09 3.5,13.31 3.65,0.48 3.87,3.28 3.59,6.38 -0.03,2.95 4.03,4.36 4.95,7.23 3.16,3.93 2.85,9.32 1.32,13.83 -1.07,2.64 2.37,5.59 -1.15,7.3 -2.71,3.53 -6.04,6.82 -8.16,10.71 -0.6,1.66 -1.81,5.57 0.42,6.15 1.79,-1.07 4.45,-3.48 6.03,-0.89 -1.83,0.74 -3.77,2.52 -4.63,4.79 -4.06,2.72 -7.88,5.86 -12.82,6.75 -2.54,0.57 -4.87,1.7 -3.17,4.63 0.65,3.73 2.86,3.68 5.9,3.34 1.73,-0.12 4.7,0.11 2.92,2.43 -1.62,2.73 0.97,3.7 3.18,4.3 2.89,0.68 -1.54,3.27 0.66,4.81 0.17,1.78 -1.03,5.56 -2.97,3.06 -2.7,0.41 -2.86,4.47 -3.11,6.49 1.25,3.17 3.86,4.98 6.86,6.32 1.73,2.64 2.03,6.34 4.88,8.31 -3.91,1.75 5.55,0.78 2.22,4.39 0.29,3.25 -5.37,3.94 -3.38,7.37 0.76,1.42 1.86,4.52 3.66,2.67 3.25,-0.44 6.22,1.26 7.36,4.35 2.36,2.77 -0.08,6.31 -0.45,9.15 2.56,4.82 -0.8,-1.03 2.06,-1.07 2.71,-1.06 3.44,4.11 6.19,2.53 2.75,0.37 5.82,-2.69 8.02,-1.5 1.92,2.23 5.39,3.01 8.14,3.37 3.72,-0.21 2.3,-1.41 1.51,-3.82 0.04,-2.95 -1.16,-6.55 2.63,-7.5 2,-1.69 3.89,3.12 6.16,0.31 1.15,-2.86 1.77,-6.3 2.41,-9.46 2.7,1.12 5.4,-0.08 6.75,-2.56 3.27,-1.13 7.52,-0.86 10.35,-2.91 0.37,-1.12 0.98,-4.32 2.62,-2.66 -0.82,3.1 2.33,2.44 4.39,1.84 2.3,-0.53 5.31,-1.22 4.81,-4.28 -0.51,-2.22 0.4,-5.33 3.3,-4.47 2.78,1.45 5.46,-1.31 8.27,-1.76 3.1,-1.68 7.91,-1.4 9.45,-5.05 -0.47,-2.98 -4.28,-3.7 0.44,-3.18 2.74,-1.08 5.31,-3.89 4.08,-6.99 -1.04,-2.52 1.87,-4.26 3.71,-5.24 2.21,0.36 5.37,2.16 3.03,4.28 -1.84,2.46 1.06,2.47 2.69,2.94 2.57,1.6 7.18,2.77 6.12,6.74 -0.22,1.83 -1.49,3.93 0.54,5.35 1.58,1.78 4.44,3.29 3.47,6.09 1.92,-1.91 4.28,0.75 5.25,0.78 1.15,-1.97 2.94,-4.17 0.84,-6.13 -1.97,-2.33 -1.27,-4.35 1.26,-5.9 2.67,-2.21 4.81,-5.42 7.75,-7.15 2.53,-0.53 5,4.12 6.81,1 1.81,-2.99 4.43,-5.63 4.94,-9.19 1.73,-1.11 2.77,-3.4 4.66,-4.63 0.39,-1.91 -1.57,-4.12 -1.75,-6.25 0.73,-3.23 4.88,-3.7 7.64,-2.9 1.98,0.85 4.51,0.77 5.94,-0.93 1.31,-3.2 3.81,-6.24 2.52,-9.88 -0.64,-1.84 0.53,-6.24 -2.48,-5.85 -2.48,0.46 -4.55,3.29 -7.13,2.53 -1.37,-1.68 -3.72,-3.65 -1.3,-5.48 2.34,-4.53 6.76,-7.46 11.73,-8.41 3.83,-1.47 7.94,-1.54 11.98,-1.11 1.92,-2.78 -0.9,-3.85 -1.9,-6.19 -1.82,-1.61 -1.41,-4.36 1.19,-4.68 3.14,-1.44 7.01,-2.83 10,-0.32 2.4,1.63 -0.27,3.86 1.25,5.59 1.92,0.62 4.04,0.65 4.63,-1.66 3.98,-3.61 9.19,-6.08 11.4,-11.26 1.23,-2.28 4.7,-5.14 4.82,-6.65 -1.68,0.55 -4.34,-0.05 -3.2,-2.36 0.05,-5.23 2.13,-10.09 3.74,-14.92 1,-2.69 -2.16,-5.66 -4.66,-4.72 -3.16,2.83 -0.64,-2.27 -0.81,-4.06 -0.05,-2.72 -2.54,-1.8 -3.99,-2.62 -2.61,-2.3 -7.4,-3.71 -6.62,-8.03 0.39,-2.34 -1.28,-5.79 0.83,-7.47 -2.23,-1.73 -1.62,-3.85 -2.5,-6.03 -2.65,-0.77 -5.5,-0.87 -7.39,-3.23 -1.18,-0.94 -5.31,-5.84 -2.07,-3.89 2.92,3.3 5.04,-1.41 4.58,-3.56 -1.6,-1.73 -4.39,-1.61 -6.02,-2.94 -1.48,-2.41 1.21,-4.72 1.94,-6.91 1.84,-2.01 5.4,-1.29 6.16,-4.38 1.42,-2.09 2.16,-4.3 0.81,-6.53 1.2,-2.26 2.95,-5.17 -0.91,-5.56 -3.17,-1.51 -3.6,3.21 -5.58,4.74 -1.93,2.12 -2.98,5.59 -6.39,5.38 -3.28,0.88 -6.88,0.85 -10.18,0.44 -3.79,-0.66 -2.03,-5.2 -2.58,-7.89 -0.63,-2.02 1.28,-4.76 -1.4,-5.81 -1.68,-1.96 -4.73,1.64 -6.71,2.05z m32.09,14.69c-0.04,0.06 0.1,0.03 0,0z","name":"Nordrhein-Westfalen"},"ni":{"path":"m186.44,120.91c-5.6,0.51 -6.88,7.11 -8.44,11.54 -1.55,4.84 -4.41,10.19 -1.33,15.08 0.62,2.76 4.51,0.93 6.62,1.66 3.74,-0.55 1.44,3.37 1.28,5.34 -0.09,2.27 2.07,5.17 -0.81,6.68 -0.57,2.01 -4.6,1.89 -4.47,0.01 0.2,-1.62 -2.19,-2.79 -1,-4.38 -2.39,-2.05 -5.8,-0.88 -8.29,-2.92 -3.19,-0.55 -3.1,-6.58 -7,-4.9 -3.25,1.5 -2.87,5.42 -3.31,8.39 1.73,1.09 4.31,-1.81 5,0.84 0.65,4.51 -0.3,10.35 -4.66,12.69 -2.05,0.33 -4.01,-0.7 -4.44,-2.75 -1.01,-1.99 -2.84,-4.1 -4.91,-2.06 -2.51,-1.99 -2.84,-5.26 -2.69,-8.25 1.7,2.41 4.86,0.82 6.63,-0.53 1,-2.85 -1.94,-5.58 -2.55,-8.38 -0.35,-2.68 -2.75,-3.1 -4.67,-3.53 -0.88,-2.07 -1.59,-4.78 -0.56,-6.72 -5.56,-1.98 -11.61,-0.89 -17.16,0.47 -4.67,-1.16 -9.01,2.41 -13.75,2.56 -2.64,-2.27 -6.36,-1.45 -9.63,-2 -6.44,-0.16 -11.29,4.48 -15.23,9 -2.96,1.82 0.86,2.65 1.75,4.06 2.29,2.26 -1.66,3.67 -2.74,5.44 -1.44,-2.96 -5.14,-3.8 -4.27,0.54 -0.65,3.9 -0.71,8.05 -1.52,11.83 -1.87,1.87 0.95,4.14 2.97,3.58 5.28,0.29 10.96,-0.24 15.72,2.42 -2.08,0.69 -5.45,-0.97 -5.28,2.53 -1.3,3.55 -0.88,7.6 -1.89,11.2 -1.02,2.31 -3.53,5.58 -0.77,7.39 -1.04,4.96 1.43,10.17 -1.09,14.86 -1.44,6.42 -8.35,10.37 -8.34,17.29 -0.73,5.37 -0.65,11.06 -2.02,16.22 -1.54,2.43 -4.12,-1.19 -6.18,-0.78 -4.31,-0.59 -8.85,-1.62 -13.15,-0.5 -3.28,1.5 -0.59,5.19 -1.65,7.89 0.05,2.71 -1.96,5.6 -1.13,7.99 3.96,3.35 9.48,3.72 14.25,5.18 1.32,-0.55 1.98,-4.64 3.66,-2.59 1.6,4.04 5.43,7.78 4.44,12.38 -1.84,2.71 -4.41,6.49 -1.89,9.57 1.86,2.89 3.08,-1.11 5.12,-1.16 3.32,-0.74 7.21,1.07 10.28,0.08 0.77,-2.08 3.82,-0.65 4.33,-3.02 3.95,-3.24 8.34,-6.11 13.06,-8 3.49,-2.99 -0.93,-3.55 0.23,-6.31 0.69,-1.71 1.95,-4.41 4.07,-2.55 2.19,0.59 4.44,1.49 4.69,4.05 0.24,3.46 3.25,4.66 5.87,6.2 2.49,1.33 5.1,-2.32 7.3,0.36 2.1,0.86 2.8,3.79 2.88,5.66 -2.14,1.36 -2.99,3.7 -0.25,5 -2.47,1.24 -2.71,4.41 -4.06,6.59 -0.13,3.3 3.86,2.19 5.28,4.24 1.61,1.34 2.29,6.23 -0.56,6.24 -2.12,1.03 -7.72,1.03 -4.44,4.18 0.32,1.52 3.77,3.35 4.41,1.19 1.64,-2.26 4.29,-2.15 6.63,-1.31 1.36,-0.07 3.99,-1.2 5.52,-2.37 2.72,-1.18 4.39,-5.59 7.79,-3.97 1.75,0 5.6,2.6 5.94,0.72 0.62,-2.2 3.26,-3.09 5.19,-3.63 2.15,-1.43 1.31,-2.65 -0.91,-2.81 -3.46,-2.11 -0.12,-6.05 -0.14,-8.9 -0.15,-3.52 0.05,-8 -3.58,-9.88 -2.14,-2.11 -6.14,-3.08 -5.9,-6.7 -1.51,-2.43 0.6,-3.29 2.77,-2.04 1.45,1.42 4.2,1.38 5.98,0.03 1.26,-1.81 0.54,-4.61 3.46,-5.43 2.32,-1.11 5.18,2.05 7.68,-1.07 2.13,-2.24 4.04,-0.2 5.66,1.43 0.57,2.57 -0.21,5.4 0.22,8.09 -0.93,3.21 1.85,4.85 4.75,4.17 3.21,-0.08 7.22,0.09 9.7,-1.99 2.54,-2.97 4.51,-6.31 6.89,-9.36 2.02,0.69 5.86,0.77 5.97,3.44 -1.73,2.35 -1.52,4.54 -0.97,7.06 -1.39,2.86 -2.39,6.91 -6.2,7.13 -2.4,1.05 -3.91,4.28 -3.71,6.63 1.97,1.04 4.71,1.6 6.53,3.33 0.07,1.63 -1.12,5.59 -2.84,6.05 -3.41,-0.73 1.6,2.55 2.84,3.1 2.26,0.15 6.09,0.95 5.15,4.09 -0.68,1.53 3.99,3.73 1.27,4.76 -0.76,2.74 -0.13,6 0.12,8.84 1.43,2.32 4.36,3.6 6.57,5.25 3.31,-0.99 4.48,3.42 3.35,5.85 0.3,0.17 2.48,-0.22 3.34,0.68 2.41,1.16 3.09,3.45 2.56,5.97 -2.13,4.96 -3.82,10.38 -3.75,15.72 2.51,0.18 4.77,-1.21 7.34,-1.06 0.61,1.51 -0.65,3.85 2.25,3.24 3.59,-0.55 6.83,1.47 9.03,4.14 1.86,0.23 1.58,3.6 -0.22,2.84 -1.35,2.17 -4.02,2.06 -5.22,4.59 1.78,2.73 3.46,5.34 3.51,8.74 1.02,2.35 -1.28,3.79 -3.38,3.42 -2.32,0.54 -3.56,5.32 -0.53,5.96 3.22,1.18 6.33,2.54 9.36,4.13 4.29,-2.82 0.47,-2.05 -1.06,-3.89 -2.77,-2.53 1.66,-4.59 3.28,-6.24 2.15,-2.54 5.98,-1.9 8.84,-2.34 2.08,1.35 1.61,5.72 4.21,2.64 3.91,-2.4 7.72,-5.21 12.48,-5.45 3.97,-2.72 8.84,-4.93 11.78,-8.85 1.12,-1.78 0.33,-3.88 2.39,-5.63 3.16,-1.67 6.79,0.6 8.47,3.25 2.88,-0.58 7.14,-0.26 7.76,-3.87 -0.05,-2.88 3.65,-4.47 1.75,-6.24 -1.57,-2.46 -0.32,-5.67 -2.8,-7.78 -1.09,-2.4 -4.13,-3.43 -3.79,-6.44 -0.16,-2.66 -0.99,-6.17 2.11,-7.49 1.53,-0.76 3.52,-2.56 1.95,-4.3 -2.69,0.07 -2.43,-3.84 -0.41,-4.53 -1.85,-1.14 -5.14,-4 -4.75,-5.49 2.09,-0.39 4.95,0.22 5.97,-2.13 -0.9,-2.87 3.5,-2.65 5.41,-2.71 2.87,-0.48 6.16,1.13 8.63,-0.98 1.86,-0.84 5.77,1.14 5.58,-1.56 -0.39,-2.88 1.81,-4.27 3.9,-5.7 0.91,-0.47 3.07,-3.7 1.17,-3.53 -3.44,0 -2.76,-5.19 0.13,-5.66 3.82,-0.08 0.19,-3.6 -1.09,-4.81 -2.24,-1.37 -1.88,-4.21 -1.94,-6.38 0.35,-2.73 4.31,-1.12 3.91,-4.03 -1.37,-1.84 -4.07,-2.33 -5.04,-4.76 -1.41,-2.15 -5.08,-4.85 -2.74,-7.55 3.42,-1.12 3.06,-1.7 0.77,-4.08 -1.69,-1.79 -1.55,-4.29 -1.69,-6.46 -2.28,-4.45 -4.68,-9.22 -8.86,-12.09 -1.05,-3.33 -3.02,-6.48 -2.57,-9.99 -0.32,-2.09 0.44,-4.42 2.92,-4.26 2.85,-1.12 6.27,-0.08 8.93,-1.09 1.55,-1.38 2.76,-2.68 2.6,-4.79 1.69,-2.11 5.13,-0.16 7.46,-0.64 2.96,0.35 7.54,-0.38 8.88,2.86 3.56,1.21 6.67,-1.39 9.63,-2.75 1.37,-1.79 3.07,-3.85 5.5,-3.97 -1.07,-2.07 -0.03,-4.66 0.75,-6.72 2.37,0.04 3.51,1.16 4.74,-2.15 -3.03,-0.57 -6.18,-1.13 -7.93,-4.01 -2.99,-1.28 -5.04,3.32 -7.81,2.09 -1.68,-2.2 -4.97,-3.78 -4.59,-6.94 -1.58,-2.26 -4.54,-2.52 -6.84,-3.72 3.01,-0.21 2.65,-3.1 -0.2,-2.77 -6.07,-2.31 -7.72,-9.29 -10.33,-14.6 -2.42,-1.1 -4.9,-1.16 -5.92,1.34 -1.84,1.96 -4.18,1.97 -6.29,0.43 -2.67,-1.78 -3.79,-6.4 -7.79,-5.36 -2.51,-0.77 -4.24,2.4 -6.66,0.76 -4.42,-0.95 -7.78,-4.07 -12.05,-5.47 -1.87,-1.32 -3.8,-1.77 -5.52,0.17 -0.27,2.44 -2.51,2.71 -4.5,2.22 -3.65,-0.29 -5.04,-4.84 -7.84,-6.5 -1.55,0.25 -1.89,4.05 -4.47,4.49 -2.08,0.15 -3.58,-2.52 -5.1,-3.8 -1.02,-1.09 -2.8,3.74 -4.07,0.89 -2.45,-1.59 -2.98,-4.24 -4.53,-6.41 -0.49,-1.9 1.56,-6.03 -2.15,-5.31 -4.45,-0.29 -7.84,-3.81 -11.28,-6.28 -1.97,-2.7 -0.94,-6.7 -3.64,-9.09 -3.37,-1.87 -5.18,-5.18 -6.46,-8.69 -1.64,-4.08 -4.33,-8.01 -8.9,-9 -3.99,-0.41 -8.13,-0.36 -12.15,-0.37 -3.37,0.14 1.11,4.61 0.44,4.78 -2.24,-0.97 -4.59,-0.85 -6.63,0.19 -3.12,0.32 -6.61,0.16 -9.54,-0.98 -2.08,-1.54 -4.86,-2.91 -5.69,-5.53l-0.44,0.03z m-49.34,8.94c-0.03,1.09 0.83,-0.73 0,0z m-9.69,0.88c-1.79,0.64 -2,2.84 -0.28,0.69 1.15,0.39 7.48,0.12 5.09,-0.5 -1.6,-0.1 -3.21,-0.36 -4.81,-0.19z m18.53,1.06c0.45,3.21 0.81,1.46 0,0z m-31.41,1c-2.03,0.59 -1.28,4.28 0.3,1.19 1.64,-1.6 4.48,-0.97 6.64,-1.09 -2.3,-0.17 -4.65,-0.31 -6.94,-0.09z M108.19,134.75c-2.3,1.14 5.75,0.85 0.38,-0.03 -0.12,0.04 -0.27,-0.05 -0.38,0.03z m-12.13,0.84c-3.52,0.44 -2.54,2.25 0.41,1.38 2.85,-0.48 5.82,-0.48 8.59,-1.28 -2.97,-0.23 -6.02,-0.18 -9,-0.09z m-32.28,11.06c-1.1,1.27 2.99,3.13 2.5,3.16 1.33,-1.35 0.17,-2.16 3.86,-2.62 3.23,0.07 0.14,-2.1 -1.3,-2.1 -1.69,0.52 -3.38,1.04 -5.06,1.56z M174.25,186.75c0.36,2.67 4.51,2.84 6.35,4.51 3.41,1.6 7.66,0.4 10.79,2.95 3.11,1.84 7.08,3.66 10.49,1.79 1.4,0.19 3.63,2.7 2.89,3.67 -2.99,0.4 -0.11,3.94 -0.78,6.22 0.86,2.85 -2.01,3.95 -3.7,5.61 -3.46,-0.92 -6.93,-3.62 -10.57,-2.86 -2.23,0.9 -3.13,-2.21 -2.65,-3.92 -0.64,-2.4 -4,-3.06 -3.74,-5.78 -0.67,-2.42 -1.42,-4.7 -4.2,-4.81 -3.28,-1.01 -7.24,-4.77 -5.34,-8.44 0.16,0.35 0.31,0.71 0.47,1.06z","name":"Niedersachsen"},"mv":{"path":"m468.38,35.5c-3.45,0.91 -7.31,1.41 -8.93,5.06 -0.26,1.49 -3.68,7.61 -2.06,6.34 1.83,-1.19 3.02,-3.21 2.21,-5.18 0.53,-1.31 3.04,-4.63 4,-2.16 0.98,2.93 -2.17,4.94 -1.91,7.78 2.5,-1.15 4.75,-3.34 7.37,-1.07 2.42,1.29 5.16,2.48 7.7,0.7 1.54,0.46 0.47,5.05 0.71,7.19 0.58,3.31 -4.03,1.68 -5.65,1 -1.59,-1.22 -4.83,-1.69 -5.19,-3.75 1.7,-4.11 -3.26,-1.94 -5.53,-2.31 -2.04,0.6 -6.23,0.55 -4.31,3.72 1.26,1.16 4.35,-0.42 5.38,2.04 2.76,1.44 -0.43,4.39 -2.54,4.37 -2.75,-0.56 -4.74,4.2 -0.71,3.48 2.64,0.57 6.65,0.82 2.18,2.56 -1.86,1.21 -4.55,1.66 -6,3.25 -1.1,2.82 0.47,5.48 1.28,8.13 5.01,1.69 10.02,3.38 15.03,5.06 2.12,-0.23 1.09,-3.14 0.16,-2.97 -0.76,1.88 -3.98,1.99 -3.25,-0.63 2.8,-3.12 5.65,-6.81 9.31,-9 3.6,-0.24 7.24,-1.3 10.81,-1.09 1.21,1.32 2.75,4.02 0.25,4.94 -1.68,2.68 3.83,-2.34 2.14,-4.14 -1.15,-2.6 -3.19,-5.78 -6.42,-4.67 -2.75,-1.52 -4.42,-5.28 -3.91,-8.38 1.26,-2.37 3.94,-3.83 5.78,-5.54 1.61,-2.97 -1.68,-6.36 -4.75,-5.02 -3.75,0.66 -8.71,3.63 -11.63,-0.19 -1.83,-1.92 -3.2,-6.71 0.31,-7.56 2.78,-1.63 0.58,-2.73 -1.84,-1.94z m-11.72,12.09c-0.08,-0.04 -0.09,0.18 0,0z m-4.56,2.28c1.4,-3.26 1.29,-4.92 0.11,-0.61l-0.09,0.49 -0.02,0.12z M457,55.72c-1,0.46 -3.54,5.14 -1.38,3.6 1.48,-0.87 6.21,-2.64 2.44,-3.69 -0.36,-0.17 -0.71,0.02 -1.06,0.09z m-41.09,7c-0.25,1.57 -4.9,6.97 -0.87,4.76 3.72,-1.22 7.4,-2.58 10.67,-4.69 2.93,-0.95 5.29,-0.58 1.12,-0.91 -3,-0.7 -6.71,0.09 -8.98,-2.44 -0.65,1.09 -1.29,2.19 -1.94,3.28z m31.25,-1.97c0.11,0.78 4.7,-2.13 0,0z m-5.81,0.66c-3.54,0.47 -7.66,0.41 -10.88,0.66 0.67,2.11 2.68,1.92 4.62,1.67 3.01,-0.17 6.3,-0.07 8.66,-2.29 -0.79,-0.19 -1.6,-0.03 -2.41,-0.03z m1.56,3.03c-2.88,1.13 -1.21,5.18 -4.19,6.34 -3.6,2.14 -6.72,-2.29 -10.47,-2.06 -3.01,-0.89 -5.76,1.74 -8.35,3.01 -2.71,2.18 -6.52,4.43 -7.27,7.96 0.18,1.51 4.13,0.67 2.84,2.66 -2.29,1.22 -5.24,-0.3 -6.59,-2.13 -0.64,-1.13 1.18,-6.54 -0.53,-3.19 -3.22,4.08 -9.79,4.87 -11.29,10.52 -1.07,2.64 -1.85,5.58 -5.3,3.89 -4.59,-1.7 -8.52,1.77 -12.84,2.72 -3.31,0.47 -6.17,-1.62 -9.5,-0.72 -2.97,1.63 -5.73,4.31 -8.33,6.62 -1.96,2.01 -2.68,5.33 -0.14,1.47 1.06,-1.2 2.41,-4.78 4.19,-3.41 2.37,2.62 -1.24,5.31 -2.34,7.63 -1.89,1.4 -5.07,1.98 -4.85,5.06 -0.11,3.13 -0.5,6.25 -2.62,8.72 -1.16,-0.88 -3.68,-1.23 -3.47,-3.09 -1.92,-1.17 -4.21,-1.95 -5.89,0 -2.35,1.65 -4.97,-1.81 -3.77,-4.13 -1.91,-1.96 -3.3,-5.2 -6.59,-3.87 -5.1,-0.35 -9.02,3.11 -13.04,5.78 1.53,2.15 0.81,6.74 -2.56,5.38 -2.64,1.41 -7.07,3.37 -6.72,7.09 1.31,2.5 2.06,5.12 1.15,7.92 0.24,2.24 3.08,3.96 4.95,5.27 1.49,-0.13 2.88,-0.94 4.38,0.28 1.77,1.48 2.91,4.8 1.54,6.72 -1.07,2.51 -1.74,5.18 -3.94,7.19 -3.45,4.41 -6.57,9.53 -11.63,12.13 -2.85,-1.67 -4.12,1.25 -4.21,3.8 -1.04,3.05 -1.35,4.72 2.28,3.81 4.38,-1.22 5.62,3.97 8.63,5.73 2.06,1.71 4.79,0.13 5.56,-2.03 1.66,-2.26 4.66,-0.28 6.53,0.28 2.66,5.4 4.35,13.11 11.13,14.56 1.97,-0.26 2.54,2.31 1.09,3.34 1.98,0.75 4.2,1.46 5.28,3.41 2.92,0.33 5.86,0.78 7.88,-1.84 2.53,-1.04 4.17,0.11 6.2,0.92 3.41,1.17 3.57,-3.72 2.91,-5.91 -1.19,-2.85 2.75,-4.04 4.19,-5.91 2.26,-0.57 6.06,-0.68 6.92,2.18 2.22,-0.82 7.58,-0.29 4.18,-3.52 1.89,-0.52 5.64,-0.7 8.01,-2.08 1.84,-1.16 5.37,-2.23 4.75,-4.82 0.89,-1.93 2.17,-4.64 4.7,-3.27 2.88,0.17 5.85,-1.68 8.79,-1.42 2.69,2.85 6.38,3.54 9.59,5.47 2.1,1.42 2.54,5.89 5.86,4.62 1.42,-1.54 4.52,-1.23 6.97,-0.84 2.64,0.11 5.42,0.12 6.99,2.65 1.76,1.23 2.9,3.74 4.81,4.36 3.51,-2.08 7.9,-1.79 11.85,-1.57 1.87,0.92 -0.02,2.26 -1.2,2.88 2.73,2.02 3.96,-3.02 6.01,-4.14 1.85,-2.5 5.05,-5.4 8.21,-4.51 0.4,1.63 2.6,4.73 2.69,1.53 -0.18,-4.03 4.85,-6.14 8.16,-4.72 0.92,1.02 1.13,4.66 2.78,2.25 1.94,-2.52 5.64,-4.66 5.83,-7.92 -0.98,-3.87 1.53,-7.87 4.55,-10.15 2.94,-2.19 5.03,-6.55 9.2,-6.14 3.13,-1.46 0.88,-2.47 0.94,-4.94 -0.47,-2.01 1.66,-5.18 3.04,-2.12 2.09,2.5 4.8,4.66 5.08,8.15 0.55,3.39 3.31,3.78 6.08,2.65 2.41,-0.3 6.44,1.78 7.55,-1.21 2.62,0.79 6.91,-0.99 8.25,2.06 1.49,6.11 -3.45,10.78 -7.19,14.78 -1.98,3.1 3.33,1.46 5.03,1.98 3.6,0.68 6.06,-2.53 6.41,-5.79 1,-1.79 6.72,-1.16 5.01,-3.95 -1.75,-4.35 -2.83,-9 -3.99,-13.46 -2.18,-2.83 -4,-6.6 -2.87,-10.22 -0.22,-5.43 -3.03,-10.29 -3.44,-15.72 -0.42,-2.28 -2.57,-2.04 -3.28,-0.22 -1.81,2.36 -5.39,1.17 -7.84,0.59 -3.37,-1.38 -7.23,-1.87 -9.74,-4.72 -2.44,-2.52 -7.36,-2.95 -8.1,-6.78 1.68,-2.2 3.24,-5.36 5.94,-6.13 0.44,-2.04 -2.63,-3.55 -3.67,-5.18 -2.27,-2.24 -3.02,-5.61 -4.55,-8.32 0.21,-2.8 0.27,-5.88 -2.37,-7.5 -1.78,-3.54 -4.86,-2.15 -7.78,-0.99 -2.53,1.08 -5.51,1.39 -7.79,2.9 0.14,1.21 2.98,3.43 0.56,3.84 -3.2,0.18 -3.78,-3.49 -4.59,-5.69 -0.99,-1.26 -3.18,1.08 -3.03,-1.66 3.36,-2.44 -2.45,-0.94 -3.09,-2.5 -1.56,-2.33 -1.97,-5.95 -5.39,-6.49 -2.15,-2.65 -4.68,-0.2 -6.44,-0.76 -2.83,-2.27 -3.42,-6.13 -4.17,-9.38 1.49,-2.52 -2.16,-5.5 -3.62,-7.17 -1.75,-0.48 -3.25,0.75 -4.88,1.21z m52.69,22.19c-3.16,0.36 -1.48,4.22 0.37,5.25 1.73,2.04 0.07,5.76 2.48,7.75 1.23,2.84 2.71,4.73 5.49,2.07 1.56,-1.43 -2.24,-3.39 -0.78,-5.26 2.84,0.22 4.58,0.55 1.09,-0.38 -3.78,-1.63 -6.46,-4.91 -7.63,-8.84 -0.21,-0.29 -0.58,-0.78 -1.03,-0.59z M508.81,98.25c2.29,2.13 4.59,4.76 3.68,8.19 1.29,3.82 -2.55,2.56 -4.59,1.72 -1.01,-1.74 -1.1,-5.02 -3.97,-3.22 -1.8,2.49 2.15,3.83 2.07,6.36 1.37,2.89 -1.67,5.12 -4.12,5.88 -2.51,0.31 -1.55,2.32 0.67,2.35 4.16,0.13 7.86,-2 11.53,-3.58 2.18,-0.69 5.82,0.22 7.3,-1.22 1.43,-3.32 1.05,-6.01 -2.4,-7.65 -4.01,-3.08 -7.07,-7.49 -11.49,-9.99 0.44,0.39 0.88,0.77 1.31,1.16z m-153.22,8.91c-2.07,0.65 -6.19,2.56 -3.84,5.09 3.14,1.72 4.9,-0.57 5.38,-3.56 0.63,-1.6 0.03,-1.86 -1.53,-1.53z","name":"Mecklenburg-Vorpommern"},"he":{"path":"m231.91,351.28c-2.52,4.22 -6.22,7.61 -8.38,12.09 -3.47,2.99 -7.81,5.31 -10.28,9.09 -2.28,0.4 -5.74,0.13 -5.5,-3 2,-3.26 -3.47,-5.21 -5.91,-3.76 -1.41,0.82 -5.95,0.93 -4.65,3.28 0.64,2.39 3.13,3.23 3.37,5.4 0.17,2.42 -1.34,4.44 -3.94,3.29 -5.15,-0.39 -10.41,1.05 -14.95,3.35 -3.17,1.4 -4.72,4.59 -6.61,7.28 0.84,1.05 2.01,4.06 3.59,2.09 2.37,-0.9 6.57,-4.19 7.88,-0.28 0.22,4.19 2.13,8.77 -0.72,12.51 -0.71,2.75 -2.31,4.62 -5.22,4.99 -3.14,-0.43 -7.52,-2.41 -9.63,1.09 0.39,2.15 1.85,4.24 2.13,6.19 -1,1.73 -3.4,2.91 -4,4.63 3.11,2.85 -2.97,-1.27 -1.76,3.31 -1.97,2.72 -3.4,6.11 -5.96,8.25 -2.51,0.68 -5.22,-4.25 -7.23,-1.05 -2.7,2.64 -5.41,5.28 -8.11,7.92 0.49,2.48 3.93,4.74 1.63,7.26 -0.76,2.71 -4.3,4.36 -2.78,7.49 -0.8,2.92 2.77,3.49 2.12,5.75 -1.13,1.85 -1.06,5.6 -3.44,5.9 -1.97,0.22 -2.63,-1.53 -4.06,-2.13 -2.8,1.41 -5.48,6.02 -2.56,8.66 -0.49,2.46 -3.67,5.82 0.27,6.82 3.67,1.53 5.25,5.3 6.61,8.75 0.92,2.04 1.08,4.85 -1.7,5.37 -1.07,-0.93 -5.7,-1.33 -3.5,1.11 2.47,0.99 0.89,3.49 -1,3.99 -2.32,-1.08 -4.25,-1.29 -6.55,0.33 -2.11,0.73 -3.8,3.88 -1.08,4.86 2.02,1.08 1.39,4.09 0.28,5.59 -2.84,-2.01 -4.64,0.94 -6.72,2.5 -3.14,0.7 -2.62,2.78 -0.67,4.69 1.7,1.7 2.49,4.75 4.7,5.72 7.32,0.54 13.26,-4.85 20.19,-5.97 3.41,-0.25 5.55,2.38 7.21,4.9 2.7,2.09 3.72,5.69 3.75,8.95 -2.21,2.91 0.93,6.19 1.75,9.06 1.22,3.02 5.3,4.54 4.69,8.16 -0.83,2.19 -2.69,3.5 -5.03,3.69 -3.67,1.29 -0.58,5.33 -0.19,7.78 1.19,1.23 1.73,4.58 3.56,3.47 2.87,-0.09 4.72,3.15 6.02,5.29 0.45,2.46 3.64,2.83 4.61,0.44 0.84,-1.91 -0.18,-4.52 -1.35,-5.64 -0.49,-3.07 3.89,-2.29 5.74,-3.3 2.12,-0.86 2.95,1.54 1.33,2.77 -0.13,1.19 0.36,6.2 2.44,7.44 3.73,1.71 7.96,2.48 12.06,2.41 0.3,2.37 -0.95,4.21 -3.22,5.14 -2.12,0.41 -4.13,4.05 -2.97,5.83 3.16,0.98 4.62,-3.02 6.97,-4.37 2.62,-1.23 -1.27,-2.95 1.23,-4.7 1.83,-3.04 5.68,-3.23 8.67,-4.31 2.07,1.28 4.67,2.3 1.65,-0.28 -2.77,-0.69 1.28,-2 0.17,-4.09 -1.83,-2.61 0.09,-5.95 0,-8.84 0.67,-3.72 4.45,-6.62 2.87,-10.6 0.27,-3.23 -3.17,-2.82 -4.5,-5.35 -1.88,-1.31 -2.94,-3.09 -2.59,-5.43 1.25,-0.49 -0.57,-3.68 -0.1,-5.19 -0.37,-2.39 0.26,-5.26 -1.15,-7.31 2.19,-0.29 2.3,-4.03 0.75,-4.91 -3.55,0.11 -2.06,-3.18 -1.51,-5.43 1.26,-3.72 6.02,-2.87 8.99,-4.29 3.44,-0.94 6.85,-2.48 10.38,-0.98 2.53,1.03 6.93,-0.17 7.36,3.51 0.22,3.77 3.72,2.22 6.1,1.81 3.18,-0.12 0.4,-3.63 0.68,-5.44 -0.84,-3.13 -0.37,-6.51 1.38,-9.24 2.02,0.57 4.63,1.89 6.47,0.94 0.86,-2.28 1.78,-5.61 4.88,-5.28 3,-1.1 4.77,-5.15 2.22,-7.63 2.46,-1.43 0.46,-5.9 4.2,-5.65 2.35,-1.65 4.24,2.19 6.72,0.64 3.67,-2.12 7.61,-4.88 9.17,-8.99 0.87,-4.15 -0.43,-8.59 0.34,-12.69 1.59,-1.67 2.87,-3.11 0.88,-5.25 -1.95,-0.3 -4.67,-0.51 -5.91,1.03 2.68,1.72 0.06,4.83 -2.4,3.41 -3.4,0.47 -3.73,-2.19 -3.1,-4.85 1.64,-2.54 4.97,-5.54 3.53,-8.77 -2.61,-1.88 3.02,-1.21 0.62,-3.76 -0.39,-2.4 1.7,-5.24 4.25,-4.19 2.32,-0.16 2.52,-3.78 3.13,-5.59 -0.42,-3.72 -1.44,-7.39 -2.41,-10.94 0.58,-3.37 4.7,-2.07 6.91,-1.42 1.33,1.43 3.54,1.27 4.93,0.14 1.65,-2.01 -0.8,-4 -2.88,-4.28 -0.73,-2.4 -0.28,-5.7 -2.15,-8.05 -1.81,-2.17 3.2,-3.84 4.13,-1.92 0.85,2.09 2.04,3.15 0.8,0.19 -0.79,-1.77 1.55,-2.57 1.81,-3.75 -2.16,-0.34 -3.1,-3.03 -5.47,-3.13 -2.41,-1.32 -5.66,-1.92 -5.69,-5.28 -2.73,-1.26 -6.43,-1.62 -7.14,-5.14 -0.93,-2.28 -2.35,-5.29 -0.96,-7.39 -0.41,-3.77 -4.2,-2.41 -6.91,-2.04 -2.44,0.91 -4.65,3.07 -6.27,5.16 0.26,3.75 3.81,-0.17 4,2.53 0.6,2.43 -1.31,3.7 -3.35,4.44 -2.57,-2.31 -6.46,-3.25 -9.7,-4.62 -2.11,-0.64 -2.73,-3.33 -1.64,-5.16 0.52,-2.33 2.7,-3.11 4.88,-2.75 1.13,-2.01 -0.13,-5.09 -0.97,-7.03 -0.84,-1.85 -3.71,-4.21 -0.9,-5.87 1.12,-2.04 3.33,-1.71 4.5,-3.66 2.57,-0.35 -1.93,-2.01 -2.09,-3.38 -2.42,-2.04 -5.4,-1.51 -8.28,-1.84 -2.56,-0.15 0.13,-3.78 -1.82,-2.9 -0.65,0.13 -1.3,0.26 -1.96,0.4z m48.47,53.75c-0.2,0.03 0.16,0.35 0,0z","name":"Hessen"},"hh":{"path":"m273.31,139.16c-1.5,1.09 -0.93,4.3 -3.67,5.06 -1.61,1.47 -3.71,3.26 -5.89,1.85 -2.33,-0.78 -1.81,2.21 -3.43,3.24 -1.3,1.52 -3.26,5.5 -5.37,2.78 -1.64,-2.73 -2.78,-2.89 -3.11,0.48 -1.95,3.52 3.88,1.56 2.16,5.63 -0.89,2.25 0.93,3.48 1.47,5.56 1.11,1.96 3.5,5.01 5.03,1.63 1.82,-0.66 3.1,2.78 4.87,3.63 1.74,1.19 3.59,-1.92 4.1,-3.57 1.25,-2.32 3.61,0.86 4.66,2.15 1.9,2.2 3.93,4.76 7.21,3.97 1.13,-0.62 1.01,-2.97 2.91,-3.07 2.93,-1.45 -2.65,-3.59 -2.97,-5.78 -1.42,-2.02 -5.31,-2.65 -5.35,-5.94 -0.83,-2.64 0.75,-4.88 3,-6.12 2.02,-2.17 0.93,-4.31 -0.94,-5.97 0.01,-2.33 -0.49,-4.73 0.53,-6.88 -1.59,-1.66 -3.52,1.07 -5.22,1.34z","name":"Hamburg"},"hb":{"path":"m177.13,149.91c-1.02,1.81 2,3.93 2.44,6 0.78,1.49 -1.36,2.66 0.47,3.7 0.36,2.05 1.77,2.73 3.27,0.5 2.31,-1.97 -1.15,-5.18 0.62,-7.7 1.79,-3.68 -3.69,-1.91 -5.73,-2.54 -0.36,-0.05 -0.71,0.02 -1.07,0.05z m-2.34,39.47c1.3,3.24 5.12,3.63 7.78,4.94 1.52,2.61 1.31,5.93 3.86,7.69 2.1,1.22 1.38,3.71 2.04,5.46 1.64,0.31 3.99,-0.68 5.77,0.73 2.5,0.16 5.45,3.63 7.38,0.87 2.63,-1.56 0.74,-5.04 0.98,-7.51 -2.78,-1.97 1.76,-2.01 0.87,-3.11 -1.26,-2.73 -3.93,0.26 -6.25,-0.86 -4.35,-0.36 -7.69,-4.63 -12.29,-4.36 -3.91,0.3 -6.92,-2.67 -10.15,-3.86z","name":"Bremen"},"bb":{"path":"m499.25,149.81c-0.84,1.88 -0.81,4.34 1.28,5.34 -1.74,2.06 -3.79,3.29 -6.37,3.46 -3.18,2.74 -6.61,5.55 -9.05,8.91 -1.36,2.25 -1.54,4.68 -0.87,7.16 -2.28,3.16 -4.83,6.45 -8.06,8.63 -2.41,-0.12 -1.19,-4.5 -3.97,-3.53 -3,-0.61 -5.44,2.28 -5,5.15 -0.4,2.7 -4.01,1.19 -3.97,-1.02 -0.57,-1.97 -3.52,0.03 -4.56,0.75 -2.74,2.49 -4.73,6.13 -7.88,8 -1.99,-0.23 -3.86,-2.04 -1.25,-3.16 1.45,-1.47 -4.76,-0.14 -6.18,-0.46 -2.13,-0.19 -5.04,3.22 -6.6,0.49 -2.73,-2.51 -5.01,-6.52 -9.27,-5.91 -2.13,0.04 -5.13,-1.3 -6.45,0.69 -2.87,1.21 -4.79,-0.3 -6.25,-2.72 -1.52,-3.98 -6.92,-3.25 -9.48,-6.32 -1.8,-2.15 -4.65,0.11 -6.93,0.1 -2.38,1.26 -5.39,-1.14 -6.32,2.55 0.99,3.09 -2.96,4.01 -4.77,5.61 -2.15,1.15 -6.11,1.77 -7.27,2.46 2,2.09 -1.36,2.73 -2.94,2.85 -3.43,2.16 -3.88,-1.29 -6.73,-1.81 -3.03,-0.86 -4.57,2.1 -6.63,3.69 0.64,2.72 1.23,7.08 -1.72,8.53 -1.68,-0.03 -3.77,-0.05 -4.75,-1.47 -3.21,-0.91 -4.58,3.15 -7.53,2.47 -2.88,-1 -5.03,0.48 -2.09,2.67 1.36,1.69 3.08,4 5.08,1.55 1.94,-1.5 5.34,-2.28 6.7,0.42 1.5,2.04 4.32,1.65 6.53,2.39 1.23,-1.43 4.73,-0.25 2.95,1.62 -1.67,1.72 2.21,2.59 2.91,3.81 1.43,1.12 2.93,-2.01 4.58,-0.33 1.76,1.64 5.48,1.89 6.03,4.47 0.12,1.23 -2.72,2.23 -0.94,3.16 4.27,1.68 8.68,4.08 13.38,2.66 2.5,1.2 6.82,-4.08 4.61,0.18 -0.35,3.68 2.96,0.6 4.61,0.47 3.29,0.55 2.92,4.31 3.72,6.78 0.37,2.84 -3.59,3.22 -2.84,6.46 -1.66,3.81 3.69,5.99 2.3,9.81 0.77,2.86 -2.32,3.27 -3.45,4.66 -0.54,2.65 -2.13,5.71 -1.65,8.26 0.83,2.24 4.39,3.7 4.36,0.28 2.12,1.42 6.84,0.74 6.61,4.02 1.02,3.09 -2.67,5.39 -1.23,8.53 0.24,2.83 1.88,6.06 -0.69,8.26 -2.05,3.4 -2.35,7.41 -1.88,11.28 -2.17,2.79 -1.48,5.22 1.03,7.44 3.11,5.22 7.1,10.36 13.17,12.16 3.29,1.01 7.58,3.94 10.7,1.22 -0.29,-3.23 3.4,-2.12 4.94,-0.75 2.81,1.03 3.99,2.78 6.11,4.39 2.08,1.33 4.66,2.82 7.04,1.98 3.14,1.39 6,3.2 8.16,5.88 3.11,1.39 3.63,-2.03 5.78,-1.38 1.85,0.64 2.36,3.88 -0.16,3.41 1.53,4.44 1.98,9.42 4.53,13.28 -0.28,4.36 -5.19,5.81 -8.13,8.16 1.38,4.17 2.89,2.17 5.54,3.45 2.71,1.73 3.05,5.69 4.55,8.42 0.92,3.28 0.16,6.97 -0.56,10.28 1.12,1.84 2.33,3.34 4.61,2.31 0.97,-1.14 2.38,-3.45 4.49,-4.31 2.22,-1.43 4.58,-3.03 6.29,-0.12 4.07,3.53 9.06,7.27 14.8,6.16 2.09,-1.58 2.79,0.71 5.58,0.52 2.7,-0.23 5.1,-3 8.17,-1.96 3.29,-1.1 7.81,-0.26 9.47,-3.95 2.24,-4.34 2.1,-9.97 5.65,-13.77 1.52,-0.92 3.97,-0 5.84,-0.31 2.67,-0.5 5.34,2.24 7.62,0.72 1.65,-1.85 4.86,-1.52 6.32,-2.54 1.7,-2.16 5.35,-2.05 7.75,-3.38 2.31,-0.33 2.58,2.04 4.09,2.56 2.19,0.22 4.28,-0.47 4.14,-3.06 1.18,-2.26 3.58,-0.39 3.55,-4.22 -0.1,-2.81 -0.47,-5.99 -3.36,-7.26 -3.75,-2.16 -4.56,-6.65 -6.42,-10.21 -2.9,-0.63 -3.35,-5.09 -0.55,-6.35 3.76,-2.93 5.89,-7.61 5.36,-12.4 -0.5,-2.47 -0,-3.76 1.5,-6 1.18,-2.51 -0.13,-5.99 -3.13,-5.94 -2.3,-1.74 -2.72,-5.61 -0.53,-7.63 -0.28,-2.81 1.52,-6.55 -1.09,-8.56 -2.6,-1.24 -6.3,-0.29 -7.81,-3.19 -1.11,-3.05 -1.39,-6.47 -2.42,-9.42 -1.68,-2.31 -0.63,-6.4 2.17,-7.48 1.98,-2.33 3.3,-5.1 2.57,-8.22 0.38,-2.83 -0.31,-5.28 -2.51,-7.19 -3.54,-2.79 -8.55,-3.73 -11.34,-7.59 -2.56,-5.3 -8.11,-8.18 -12.88,-11.28 -2.02,-1.42 -4.87,-0.97 -6.69,-2.38 -2.03,-2.63 3.01,-4.81 1.15,-7.48 -0.64,-2.66 -2.69,-6.39 0.67,-8.11 3.25,-1.9 6.37,-3.89 8.77,-6.91 3.06,-2.56 2.89,-6.96 3.39,-10.59 -1.83,-1.72 -1.71,-4.98 -0.47,-6.84 1.2,-1.67 4.41,-4.79 3.03,-6.69 -2.15,0.19 -2.35,-3.69 -2.22,-5.41 -2.44,1.01 -5.3,1.53 -5.5,4.63 -1.15,2.4 -3.02,3.91 -5.78,3.72 -2.22,-0.47 -6.15,0.62 -7.41,-0.9 0.47,-4.6 5.82,-6.58 7.23,-10.78 0.81,-2.01 1.54,-5.13 -0.2,-6.73 -3.16,-0.57 -5.69,-0.28 -7.87,1.03 -3.28,0.28 -6.64,-0.73 -9.75,0.5 -4.23,-1.06 -2.75,-6.98 -5.95,-9.24 -1.05,-1.15 -2.07,-2.54 -3.15,-3.54z M484.13,240.25c2.62,1.78 3.22,5.59 5.07,8.15 1.73,3.05 5.13,4.94 5.9,8.6 -0.13,3.15 2.96,3.88 5.31,4.97 3.02,1.16 1.5,3.96 0.62,6.15 -2.11,1.18 -0.3,2.41 -1.81,3.94 -3.37,1.44 -6.8,-1.31 -10.22,-1.72 -2.61,0.29 -4.02,-2.66 -5.44,-2.59 -3.39,0.13 0.93,5.86 -3.25,4.2 -2.15,-1.56 -3.93,-2.85 -6.03,-2.56 -2.2,-2.21 -6.14,-1.55 -8.26,0.46 3.07,1.05 -3.31,1.77 -4.27,0.08 -2.48,-1.03 -0.87,-2.57 0.43,-3.73 -0.55,-1.26 -1.2,-3.36 0.31,-4.63 3.03,-2.14 1.73,-3.7 -0.71,-3.56 0.04,-2.5 -0.02,-5.34 0.62,-7.66 1.31,-1.47 2.88,-1.58 4.41,-0.5 1.08,0.35 -1.33,-2.46 0.8,-3.32 1.36,-1.61 4.71,-0.61 6.85,-0.8 2.24,1.02 3.85,-0.76 4.63,-2.66 1.77,2.37 2.44,0.08 3.29,-1.66 0.36,-0.52 1.13,-1.47 1.74,-1.16z","name":"Brandenburg"},"be":{"path":"m483.38,241.69c-1,1.58 -1.61,5.27 -4.03,2.88 -0.91,2.64 -3.81,2.59 -6.06,2.05 -1.91,-0.31 -7.28,0.09 -4.84,2.79 1.38,2.14 -2.25,1.68 -3.34,0.78 -3.18,-0.15 -1.8,4.36 -2.36,6.45 -0.09,0.87 5.17,1.04 2.51,3.18 -1.16,1.75 -4.04,3.69 -1.89,5.83 0.53,1.82 -3.82,2.76 -0.54,3.7 2.29,1.61 3.52,-2 6.07,-2.2 2.07,-0.34 5.08,-0.28 6.25,1.69 2.29,-3.28 5.18,4.71 6.09,1.16 -1.15,-2.62 1.9,-3.14 3.66,-3.85 0.63,3.56 5.17,2.88 7.8,4.18 1.96,0.26 4.94,2.32 6.26,0.28 -2.5,-1.19 2.5,-2.95 2,-5.26 1.05,-2.66 -3.24,-2.9 -4.77,-4.37 -2.69,-0.38 -1.4,-4.38 -3.15,-6.05 -1.61,-3.03 -4.93,-4.88 -5.94,-8.38 -1.14,-0.99 -1.96,-6.07 -3.71,-4.88z","name":"Berlin"},"by":{"path":"m273.66,464.44c-1.31,1.91 -3.76,2.78 -3.5,5.34 -1.83,4.59 -6.12,7.95 -10.5,9.94 -2.67,1.02 -4.62,-2.49 -7.15,-0.61 -1.54,0.74 -0.64,3.49 -2.13,4.58 2.4,3.04 -0.04,7.53 -3.44,8.47 -3.38,-0.45 -3.01,4.07 -4.66,5.5 -2.16,0.47 -4.23,-0.33 -6.28,-0.91 -2.54,3.91 -0.46,8.53 0,12.63 -0.53,2.87 -4.66,1.74 -6.9,2.55 -3.16,0.27 -1.64,-5.68 -4.98,-5.22 -4.19,-0.72 -8.41,-2.46 -12.49,-0.42 -2.97,1.16 -6.84,1.23 -9.32,2.99 -0.59,1.48 -2.41,4.44 -0.69,5.28 3.02,-0.37 2.55,4.03 2.28,5.63 -2.37,0.86 0.17,4.18 -0.45,6.12 0.28,2.66 -0.27,5.78 1.89,7.78 -3.88,-0.85 0.14,3.73 1.52,4.58 0.84,1.94 3.96,0.92 3.59,3.64 1.27,2.88 0.6,5.62 -0.78,8.31 -2.26,2.93 -2.47,7.6 -2.42,11.23 1.24,2.27 4.6,0.89 6.75,1.12 2.16,0.04 4.75,-2.13 4.73,-4.03 -0.34,-2.04 2.18,-5.23 4.72,-3.63 1.87,0.74 5.34,1.32 4.23,-1.45 1.6,-1.24 -0.63,-7.5 -0.96,-4.79 0.79,2.49 -3.31,2.3 -3.52,0.13 -0.83,-1.56 -3.4,-4.82 -1.19,-6.09 3.07,-0.15 6.37,-1.05 9.34,-0.19 0.41,-2.46 4.94,-2.22 3.88,0.41 0.59,1.49 3.45,3.68 4.43,1.04 1.16,-1.1 4.96,-5.66 4.94,-1.88 -0.59,2.44 0.18,5.72 -1.59,7.45 0.33,2.92 3.79,0.57 5.16,-0.39 2.48,-0.32 5.61,-3.48 7.29,-0.3 2.99,3.39 2.07,8.94 5.01,12.52 2.18,0.31 2.43,3.58 2.41,5.6 0.45,1.81 -0.72,3.89 -0.34,5.16 2.77,0.82 6.24,0.65 7.69,-2.25 -0.15,-1.12 -1.91,-2.61 0.74,-3.68 2.83,-1.31 3.76,2.79 4.2,4.84 -1.95,1.56 1.87,3.4 1.31,5.57 0.26,2.1 4.02,5.65 0.6,6.68 -2.91,-0.9 -2.81,3.3 -1.87,5.04 0.96,2.51 3.11,4.68 1.16,7.27 0.44,2.52 -1.72,6.37 1.65,7.44 1.89,1.55 4.82,1.6 5.41,4.43 1.71,2.58 1.5,5.88 2.31,8.79 -2.03,1.94 3.23,2.14 4.31,3.59 2.13,2.06 5.86,2.95 6.29,6.28 3.84,2.87 1.91,8.3 2.08,12.46 0.25,2.64 -0.94,5.5 -2.07,7.44 -0.04,3.1 4.34,2.42 3.61,6.41 2.49,1.05 0.06,3.97 -1.86,4.33 -1.61,1.16 -4.23,0.12 -2.18,-1.56 2.29,-3.25 -3.46,-0.68 -4.81,-0.69 -2.23,0.84 -5.79,-3.18 -5.97,0.9 -0.14,3 3.91,4.63 3.42,7.93 0.53,2.67 0.99,5.81 0.27,8.32 -1.49,1.89 -3.93,-0.58 -5.06,1.19 0.32,2.29 -3.52,3.66 -4.94,5.41 -3.13,1.93 -4.28,-3.47 -7.13,-0.01 -2.35,0.12 -0.74,3.36 -2.58,4.82 -1.74,2.44 -2.43,5.75 -0.16,8.06 1.31,2.7 4.08,4.51 3.75,7.78 0.56,4.38 1.13,8.84 2.71,12.9 2.91,1.82 1.6,5.52 2,8.41 0.45,2.66 -1.86,4.17 -1.66,6.72 0.19,1.55 -3.47,0.81 -1.84,3.13 2.61,1.07 0.38,3.66 0.87,5.81 0.2,2.47 -0.14,5.78 2.07,7.38 0.5,2.56 -3.74,2.92 -1.81,6.18 1.02,3.01 3.86,6.55 1.16,9.46 -1.18,1.16 -3.19,0.63 -3.38,2.95 -1.52,3.81 -0.35,-4.27 -2.92,-3.81 -1.88,-0.93 -3.51,0.34 -4.08,2.09 -3.48,0.28 -7.46,-0.44 -10.66,0.7 -2.62,1.93 -4.17,6.22 -7.96,5.49 -1.72,0.26 -2.84,-2.34 -4.53,-0.51 -3.88,1.61 -1.7,3.37 1.37,4.04 3.22,2.32 4.79,-0.35 6.38,-2.97 2.19,-2.61 6.67,0.35 5.03,3.47 -1.46,1.59 3.12,2.56 4.5,2.46 2.2,0.75 5.22,-2.54 5.71,-2.37 -1.26,2.65 0.2,5.16 1.79,7.23 3.74,-0.93 5.96,3.27 7.63,5.97 -1.64,1.92 -2.48,3.42 -1,5.94 0.03,1.72 5.17,0.51 4.35,-1.56 0.81,-1.86 3.6,-1.1 5.09,-0.53 2.05,2.24 -1.68,3.98 -1.81,6.26 -0.21,1.48 -3.48,5.59 -1.04,5.45 5.9,-0.28 10.64,-4.27 13.65,-9.1 1.68,-2.49 4.2,-4.8 5.23,-7.51 -0.27,-1.73 0.37,-4.61 -1.96,-4.47 -1.78,-2.98 -0.76,-6.77 -1.03,-10.06 0.59,-1.59 4.6,-2.06 3.97,0.09 -1.67,2.23 -0.39,3.45 2.34,3.77 2.31,0.63 4.34,0.47 4.81,-2.09 1.65,-2.51 5.13,-0.08 7.59,-0.22 0.5,2.03 3.14,2.52 5.19,3.38 2.99,1.48 5.86,-2.19 8.72,-1.09 3.48,2.5 -1.05,3.09 -0.97,5.59 2.55,0.29 4.83,1.11 6.25,3.38 2.96,1.58 0.77,3.77 1.16,5.09 4.01,0.78 8.16,-0.05 11.5,-2.41 2.24,-1.08 5.28,-2.46 7.66,-1.16 -0.63,2.06 -2.84,4.65 1.39,2.92 0.99,-2.2 2.51,-4.2 4.63,-5.64 2.78,-1.69 3.97,-4.98 6.66,-6.66 2.2,2.25 6,0.82 8.75,0.25 1.72,-1.5 -0.11,-4.24 1.75,-6 1.27,-3.31 5.21,-1.69 7.87,-2.01 3.14,-0.06 6.26,-0.02 9.34,0.6 1.3,-3.59 5.97,-3.64 9.18,-3.87 2.61,1.43 5.36,-1.54 7.57,0.5 2.56,0.03 5.94,1.12 8.03,-0.19 -0.56,-3.08 -2.75,-5.66 -1.81,-8.97 1.68,-1.6 3.23,-4.06 5.5,-4.97 2.05,1.73 -0.97,3.82 0.9,5.81 0.74,1.55 6.18,-3.23 5.07,-0.41 2.78,1.55 7.13,-0.47 8.4,3.24 1.5,2.9 4.05,3.71 6.55,1.34 2.39,-0.55 1.97,-4.34 4.92,-3.93 3.45,-1.43 7.22,-0.35 10.38,1.04 0.63,2.57 4.26,5.4 1.53,7.59 -1.91,3.64 3.48,5.29 5.61,7.15 2.86,2.07 5.93,3.86 9.26,5.04 1.6,-1.29 3.65,-3.83 2,-5.66 -1.98,-1.39 0.16,-4.42 -0.13,-6.41 0.81,-2.05 3.05,-3.55 3.5,-5.53 -1.37,-2.88 -2.02,-7.29 -5.72,-7.94 -0.69,2.59 -4.42,1.51 -6.31,1.34 -1.86,-0.73 -2.16,-2.62 -0.73,-4.04 1.53,-3.69 4.03,-7.15 5.39,-10.77 -2.14,-3.41 -3.7,-7.7 -6.59,-10.34 -2.88,0.4 -3.64,-2.11 -3.9,-4.41 -1.24,-4.49 -8.32,-5.42 -8.04,-10.73 0.04,-2.8 4.04,-3.87 5.63,-5.89 1.81,-1.22 1.17,-3.89 2.78,-4.97 2.57,-0.91 6.07,0.24 7.47,-2.89 1.29,-1.84 2.29,-3.74 4.7,-4.4 2.08,-2 5.15,-0.22 7.17,-2.39 2.7,-1.73 6.58,0.63 8.88,-2.3 3.06,-1.95 5.85,-4.79 7.85,-7.65 0.43,-2.52 2.26,-5.13 0.38,-7.38 0.45,-3.1 3.3,-6.59 0.44,-9.38 -0.61,-1.41 4.07,-1.2 4.41,-3.5 -0.1,-4.04 4.08,-0.04 6.17,0.11 3.24,1.6 5.97,4.3 9.52,5.26 3.15,-4.15 7.21,-9.07 5.25,-14.64 0.5,-2.8 -3.41,-5.03 -1.06,-7.39 1.18,-2.53 1.51,-5.28 -0.56,-7.48 -1.75,-2.45 -3.35,-5.1 -5.19,-7.42 -2,1.56 -5.42,0.69 -5.99,-1.97 -0.86,-2.58 -2.84,-4.62 -4.76,-6.5 -2.32,-0.51 -5.25,-0.27 -4.06,2.66 -1.49,2 -4.02,-1.61 -5.78,-2.26 -3.51,-1.84 -1.34,-7.26 -4.67,-9.54 -1.77,-2.1 -3.92,-4.14 -6.4,-5.23 -2.11,1.09 -4.33,0.73 -6.1,-0.79 -2.35,-0.65 -1.29,-3.34 -2.28,-4.52 -5.62,-4.34 -8.22,-11.7 -13.85,-16.05 -0.96,-0.66 -5.12,-1.7 -4.56,-0.67 1,2.66 -3.26,0.86 -4.59,0.92 -2.67,0.16 -4.59,-1.69 -5.1,-4.2 0.33,-2.99 -3.95,-3.91 -5.58,-5.98 -1.3,-1.16 -4.06,-3.42 -2.45,-4.96 0.01,-2.41 0.31,-4 -2.29,-4.05 -2.07,-0.53 -1.46,-1.98 -2.8,-3.5 -2.08,-3.55 -3.13,-7.39 -3.48,-11.47 -1,-2.47 -5.61,-0.9 -6.56,-3.96 -1.46,-1.68 -3.4,-4.99 -0.08,-5.91 3.24,-0.92 2.39,-4.05 3.21,-6.53 0.88,-3.28 4.17,-5.56 3.4,-9.15 -1.69,-2.78 -3.02,-7.24 -7.16,-6.34 -2.89,-1.46 -5.43,-3.31 -7.5,-5.81 -4.37,0.47 -3.42,-1.95 -5.22,-4.41 -1.08,-0.95 -3.08,-0.2 -3.19,-2.3 -0.69,-1.94 -0.29,-3.97 0.91,-5.48 -1.13,-3.44 -4.24,-5.4 -7.25,-6.96 -2.59,-1.3 0.21,-3.74 1.9,-4.17 -1.15,-4.86 -6.38,-5.68 -10.5,-6.63 -1.66,-1.44 1.51,-4.7 -1.45,-5.85 -1.47,-2.96 -3.98,-0.6 -6.15,-0.03 -4.99,1.83 -10.54,1.94 -15.74,2.63 -0.77,-0.67 -2.77,-2.61 -3.03,-0.5 -0.96,2.08 -4.29,1.95 -5.15,-0.33 -1.46,-1.7 -1.05,-3.98 -3.62,-3.71 -2.87,-0.72 -2.28,-4.47 -1.51,-6.47 2.3,-1.83 -2.65,-2.89 -4.3,-2.43 -1.7,1.3 -2.92,3.72 -5.37,4.41 -1.61,-1.19 -1.85,2.9 -0.04,2.88 0.66,3.05 1.58,6.38 1.39,9.48 -1.36,2.21 -0.38,7.05 -3.72,7.01 -1.95,0.12 -2.86,4.45 -5,1.12 -2.19,-1.15 -2.98,-4.4 -0.24,-5.3 -0.32,-1.92 -3.58,-5.33 -4.44,-2.09 -2.92,1.68 -7.59,1.16 -8.96,-2.28 -0.97,-2.98 -4.83,-0.87 -7.1,-1.48 -2.57,0.83 -5.91,1.76 -7.83,3.43 -0.82,2.98 1.43,4.47 3.69,5.77 1.52,2.24 6.27,1.22 5.55,4.87 -1.22,3.47 -5.4,0.77 -7.88,0.59 -0.91,0.73 1.13,4.84 -1.63,4.69 -2.37,-0.99 -5.13,-1.74 -7.34,-2.66 -1.81,-3.33 -1.13,-7.07 -0.75,-10.66 -3.86,-0.79 -8.92,-2.08 -9.69,-6.56 -1.65,1.27 -4.99,0.71 -4.64,-1.87 -0.45,-2.76 -1.64,-5.72 -3.61,-7.69 -2.74,-0.99 -5.53,-1.93 -6.83,-4.79 -1.25,-3.09 -5.32,-0.4 -7.74,-0.8z m46.75,26.38c-0.1,0.03 0.04,0.06 0,0z","name":"Bayern"},"bw":{"path":"m233,542.31c-1,3.03 -3.8,0.55 -6.25,1.41 -1.85,0.3 -6.11,-0.67 -4.1,2.56 0.5,1.4 3.45,5.79 2.97,1.91 0.74,-2.88 3.54,0.29 3.5,2.12 -0.05,2.12 0.13,4.28 -0.67,5.91 -2.21,2.88 -6.93,-2.7 -8.36,1.34 0.26,1.89 -0.96,3.78 -2.66,5.38 -2.87,1.47 -6.48,1.36 -9.56,0.91 -0.14,1.71 -1.09,2.75 0.88,3.56 2.16,2.43 -1.84,4.61 -2.82,1.5 -2.24,-0.41 -4.9,0.87 -7.01,1.83 -1.86,1.31 -3.21,3.14 -1.07,4.79 -2.58,2.03 -4.76,4.93 -7.53,6.53 -2.28,0.77 -4.85,-1.67 -3.07,-3.7 0.44,-3.45 3.31,-3.76 5.49,-5.64 2.15,-2.77 -2.95,-1.33 -4.33,-2.33 -3.36,-0.68 -8.66,-1.27 -8.78,-5.66 -0.37,-2.27 -2.39,-6.18 0.16,-6.35 -1.56,0.22 -6.19,0.51 -5.66,2.03 1.02,1.01 1.63,3.91 1.34,5.81 -0.91,2.56 -4.61,4.01 -6.17,1.22 -1.23,-2.27 -2.8,-5.47 -5.58,-5.87 -1.35,0.5 -2.27,2.96 -1.13,4.34 0.64,2.82 1.72,5.99 1.41,8.75 -1.19,1.47 2.13,0.8 2.94,1.09 2.56,1.28 -0.68,4.01 0.44,6.03 0.58,2.78 -1.68,4.86 -3.44,6.5 -0.2,1.61 2.95,0.95 2.5,3.03 -0.5,1.7 -2.89,2.29 -3.8,3.97 -1.51,1 -4.09,2.21 -3,4.19 -0,4.19 -1.63,8.4 -2.57,12.44 -1.88,2.38 -4.07,4.74 -4.06,8 -0.94,3.32 -4.33,5.15 -7.25,6.25 -3.09,4.3 -5.58,9.02 -6.75,14.19 -2.02,2.94 -5.4,5.15 -8.91,5.69 -0.21,2.82 -1.4,5.14 -3.56,6.99 -1.36,2.17 -3.49,3.53 -5.66,4.61 -1.15,2.67 -3.64,5.13 -2.5,8.22 0.36,2.98 -0.28,5.69 -1.97,8.15 -1.95,4.34 -4.99,8.87 -3.01,13.76 0.98,2.33 -1.6,3.46 -3.29,4.06 -1.58,3.35 -1.03,7.85 -3.97,10.71 -3.45,3.81 -5.74,8.63 -5.57,13.85 -1.32,3.83 3.9,5.48 3.32,9.25 -1.3,3.08 -3.94,5.46 -4.57,8.93 -0.87,1.91 1.04,3.96 -0.54,5.81 -1.06,2.51 -2.87,5.19 -1.04,7.86 1.18,2.15 -0.92,4.15 -2.35,5.35 -0.31,3.89 3.1,6.22 5,9.16 2.34,1.03 6.63,0.35 6.5,3.84 -1.16,1.4 -4.38,2.08 -0.94,3.62 2.67,0.19 5.38,-1.24 7.85,-2.15 1.44,-1.71 2.81,-3.83 5.44,-3.09 2.67,-0.79 2.95,2.96 5.54,2.9 3.15,1.3 6.81,1.64 9.99,0.41 0.13,-3.3 4.53,-3.63 6.59,-5.48 2.38,-1.41 5.39,0.37 7.78,0.98 0.79,1.29 -0,3.08 2.19,3.78 3.61,0.25 7.37,1.32 10.72,-0.47 -3.18,-2.2 -0.41,-3.55 1.74,-5.09 1.44,-1.37 5.34,0.59 4.6,2.72 0.03,1.73 2.81,-2.43 2.91,-3.66 0.99,-2.17 -2.08,-3.31 -3.78,-2.38 -2.21,0.79 -3.16,2.58 -5.97,3.13 -1.88,-0.81 -4.32,-2.21 -5.31,-4.16 0.59,-3.61 2.99,-6.72 5.06,-9.63 1.63,-2.24 5.73,-0.38 6.44,-3.38 2.06,-2.35 5.55,0.44 4.49,3.47 2.07,0.67 0.21,-4.19 4.06,-1.25 1.57,1.2 4.32,3.45 2.25,5.23 0.1,2.76 1.41,4.58 4.22,5.01 1.74,-2.24 3.46,-0.92 5.76,1.59 2.1,2.97 5.8,0.78 7.96,-0.93 3.82,-2.7 8.65,-0.24 12.27,1.62 3.55,2.04 4.43,-1.99 2.13,-4.27 -0.59,-2.2 -2.12,-3.67 -4.12,-4.07 -2.4,-1.85 -6.01,-3.5 -6.96,-6.5 0.3,-2.1 3.03,-1.62 3.78,-0.16 3.5,2.46 7.48,4.47 10.66,7.31 -0.21,3.96 4.69,5.62 7.5,7.39 1.67,0.53 3.72,-1.14 5.59,-0.11 2.75,0.87 6.81,1.33 7.03,4.97 0.46,3.2 4.49,4.9 6.69,2.27 1.24,-1.5 4.61,-2.56 5.4,-0.7 4.17,1.33 6.15,-3.91 8.97,-5.72 3.32,-0.45 7.13,0.12 10.19,-0.66 1,-2.57 4.28,-2.37 6.22,-1.28 0.84,2.31 0.58,2.71 2.56,1.13 2.97,-0.39 2.03,-4.58 0.76,-6.39 -1.17,-2.02 -2,-5.8 -0.79,-7.3 3.32,-0.17 0.06,-2.21 -0,-3.93 -0.63,-3.04 -0.86,-6.31 0,-9.32 -2.23,-0.74 -2.32,-4.76 0.44,-4.66 -0.41,-2.68 2.08,-4.21 1.66,-6.88 -0.15,-2.82 0.59,-6.09 -1.94,-7.94 -2.26,-5.15 -1.96,-11.11 -3.49,-16.32 -1.93,-2.69 -4.53,-5.55 -4.67,-9 0.46,-2.92 3.93,-5.48 2.72,-8.47 0.1,-0.35 4.87,-3.47 6.42,-2.05 2,3.2 4.93,-0.95 6.82,-2.36 0.33,-1.38 1,-2.91 3.14,-2.96 3.03,1.76 2.98,-2.24 2.69,-4.25 -0.32,-3.5 -1.14,-6.78 -3.64,-9.37 -0.98,-1.42 0.15,-4.75 1.23,-5.16 3.02,1.48 6.11,1.47 9.25,0.41 2.37,-0.94 3.55,1.55 1.82,3.19 0.08,1.06 5.19,-1.87 2.3,-2.88 -0.25,-2.1 -0.85,-4.44 -3.47,-3.91 -1,-3.13 0.42,-4.65 1.54,-7.33 0.09,-4.38 1.32,-9.19 -0.13,-13.38 -2.03,-1.38 -1.82,-4.46 -4.4,-5.39 -2.47,-2.1 -5.26,-3.59 -8.29,-4.72 -0.45,-2.63 0.5,-4.11 -0.61,-6.97 -0.35,-3.23 -2.39,-5.85 -5.43,-6.81 -1.8,-1.05 -4.02,-2.25 -3.05,-4.75 -0.53,-2.57 0.99,-5.27 0.62,-7.5 -1.67,-2.84 -3.08,-6.33 -1.5,-9.56 2.72,0.17 4.05,-1.19 2,-3.69 -1.12,-2.08 -1.1,-4.65 -2.84,-6.37 -0.05,-1.52 1.05,-2.79 -0.28,-4.24 -1.33,-3.13 -3.46,0.38 -1.36,0.89 -1.36,2.26 -3.18,4.9 -6.23,4.2 -1.84,0.68 -5.99,-0.78 -4,-3.06 0.32,-2.43 0.8,-5.95 -0.91,-7.66 -1.91,-0.49 -2.69,-3.58 -3.13,-5.51 -1.12,-3.07 -1.07,-6.84 -4.03,-8.84 -3.37,0.71 -6.2,2.77 -9.34,3.81 -2.15,-0.26 -3.2,-3.12 -1.25,-4.19 -0.15,-1.71 1.98,-8.34 -1.11,-4.8 -1.56,1.02 -3.09,4.67 -5.17,2.44 -1.38,-0.64 -3.13,-1.84 -2.32,-3.58 -0.34,-0.5 -0.91,-0.09 -1.41,-0.13z m-57.69,212.03c0.26,4.67 5.28,-0.76 0,0z","name":"Baden-Württemberg"}}}); + +/** Add Russia Map Data Points */ +jQuery.fn.vectorMap('addMap','russia_en',{"width":959,"height":593,"paths":{"da":{"path":"m34.939,403.74,2.6516,1.2627,3.6618,0.50507,1.7678-2.0203,2.1466,2.0203,2.3991-1.6415,0.25254-1.7678,1.6415-2.1466,3.0305,0.50508,3.7881-2.9042-0.50508-1.894-4.7982-0.50508,0.75762-3.1567-1.0102-0.63134,0.63135-2.2728-3.1567-2.7779,1.5152-0.50508,3.9143,0.88388,0-1.389-1.0102-1.2627,8.3338-0.25254,4.9245,5.4296,1.2627,1.894-0.37881,2.2728-5.3033-0.3788,0.50508,2.5254,1.5152,3.0304-1.0102,3.5355-2.3991,2.7779-1.2627,0.25254,4.5457,0.75761-5.5558,2.1466-0.50508,2.0203-0.75762,0.50508-3.0305,0.50507-0.25254,4.7982-1.2627,0.88388-1.1364,13.132-9.0914-0.12627-3.6618-2.2728-1.389-0.88388,0-11.617-3.283-5.9346,0.37881-2.9042,1.2627-0.37881z","name":"Republic of Dagestan"},"sa":{"path":"M671.25,126.75l-1.44,1.06-1.25,1.63s1.44,0.87,2.16,0.87c0.71,0,2.69-1.97,2.69-1.97l-2.16-1.59zm18.47,12.09c-0.18-0.01-0.4,0.02-0.63,0.07-1.78,0.35-4.81,1.93-4.81,1.93s-1.41,1.1-2.12,1.1c-0.72,0-2.35-0.38-2.35-0.38-0.71,0-2.5,1.25-2.5,1.25l-1.4,1.78s-1.1-0.51-1.1,0.38-0.35,1.96,0.72,2.5c1.07,0.53,1.61,1.06,2.5,1.06s3.22-0.72,3.22-0.72l1.97-0.87,1.97,1.06s0.51-0.9,1.4-1.44c0.9-0.53,3.4-2.31,3.75-3.03,0.36-0.71,0.72-3.22,0.72-3.22s-0.11-1.36-1.34-1.47zm-19.81,7.1c-0.15,0.01-0.29,0.05-0.44,0.09-1.25,0.36-2.85,0.19-3.56,0.19-0.72,0-0.91,0.19-0.91,0.19s-0.88,1.58-1.59,1.93c-0.72,0.36-1.99,0.74-3.07,0.57-1.07-0.18-3.75-1.25-3.75-1.25s-1.93-0.02-1.93,1.59,3.03,3.41,3.03,3.41l1.06,1.4s-2.51,0.73-3.41,0.38c-0.89-0.36-2.65-2.16-2.65-2.16l-3.22-0.72s-2.88,0.2-2.88,1.1c0,0.89-0.68,2.67-0.68,3.56s-0.9,3.04,0.53,3.94c1.43,0.89,1.79,3.03,1.97,3.75,0.17,0.71,0.7,1.77,2.84,2.31,2.14,0.53,4.29,0.53,5,1.06,0.71,0.54,1.77,1.07,2.84,0.53,1.08-0.53,1.82-2.65,1.82-2.65l2.12-1.97s1.61-1.44,2.5-2.16c0.89-0.71,2.7-0.54,4.13-1.44,1.42-0.89,2.31-3.75,2.31-3.75v-5l-0.38-4.43s-0.68-0.58-1.68-0.47zm106.25,5.62c-0.45,0.09-0.75,4.1-0.75,4.1l-7.32,1.65-3.28,0.63-4.53-6.06-7.84-0.13-0.38,0.87-5.68,1.66-1.76,2.13-6.06,6.31v2.78l-2.15,1.91-3.29,5.03-4.93-2.38-3.41-0.37-1.75,2h-4.56l-3.41,1.78-1.75-1.53,4.28-2.91-2.28-1.62-3.03-0.13-8.84,4.03,1.9,5.44-0.87,4.78-2.66,2.91-1.65-2.13,3.03-7.47-1.75-0.37-2.66,4.03-3.03,2.03-1-0.75,1-3.16,2.28-0.74,2.91-2.66-7.1,1.75-9.22,5.31-6.68,0.25,3.65,3.66-3.65,3.4-0.5,3.03,0.37,1.16,3.91-1.78-1,4.03,4.81,2.91-0.91,2.9-2-1.37-3.68,1,1.28,3.41,2.4-0.26-1.03,2.66-3.9-0.5-4.28-1.66-3.53,0.26-2.41,3.15-0.63,4.06h-6.46l-1.76-1.53-2.4-2-0.5,4.41,0.87,0.87-0.12,1.41,1.65,0.87-0.9,2.54,1.66,6.18-3.29-1.4-1,1.15-9.87-5.31v-4.94l-2.25,0.13-1.78,2.41-2-3.41,3.65-0.63-0.5-2.9-4.43-1.66,0.75-0.87,0.12-2.53-5.28-4.04-5.31-2.53-1,3.66-7.35,0.65-2.37-1.65-4.19,2.15v2.13l4.19,4.69-10.94,5.31-10.28-1.16,0.44-4.4-12.07,0.19-3.96,3.78h-2.85l-1.09,1.09,2.66,2.87h-2.13l-2.91-2.06,1.19-2.09-0.87-1.38-1.54-1.78,0.07,2.28-1.5,1.07-3.85-1.32s-2.9,3.53-2.84,3.78c0.06,0.26,2.66,3.29,2.66,3.29l-1.41,3.34,1.59,2.09,0.19,2.78,7.38,5.82-0.32,5.47,2.53,1.9,1.63,2.53-2.53,2.72-4.41,3.03-0.69,2.63-4.81,2.78,0.25,6.12-2.25,1.1-2.97-1.28-5.65,4.75-4.44,0.09,0.06,1.97,5.38,6.59,1.78,20.1-6.35,1.97,4.19,3.4-1.78,4.19v1.25l7.16,8.84-4.57,6.69,0.97,1.6-2.4,1.87,0.09,2.25,5.63,0.34,0.71,0.72,9.1,0.19,3.31,3.31-0.53,1.6-3.31,0.34,0.19,3.94,4.03-1.06,5.06,6.59-0.53,5.53,3.84,5.19-1.97,3.4,0.53,2.13,7.69,6.53v4.37l-3.75,6.44,0.28,10.78,3.85,4.13,3.37-3.94,3.75,0.09,1.88-1.34,2.68-0.62,2.41-2.07,3.56,3.85,0.38,2.31,4-5.06,0.09-4.13,5.38-2.75-0.29-6.25,2.32-4.12,3.84-1.5,4.91,1.06,6.15,4.91,0.57,3.84,1.31,0.87,4.03-1.4,2.5-2.06,2.69,1.06,0.87,4.47,3.13,4.56,2.15,1.78v3.03l2.32,1.35,0.71,4.71,3.94,0.19,0.97,1.35,1.53,4.09,8.38-0.25,3.31-1.97,5.53,1.16,3.56,1.97,11-0.72,5.54,3.75,2.21,0.53,5.19-2.6h2.6l3.03,2.26,2.78-0.19,3.22-3.94,5.68-0.06,2.5-1.97h7.88l0.19-3.75,10.68-5.09,0.82-3.04-4.28-4.12,2.31-1.69,0.62-4.03-1.34-1.69-2.41,0.38-2.03-1.44,2.75-4.03-2.84-1.6,0.25-1.87,1.53-1.97-1.44-1.44-3.47-1.15-0.53-1.6,3.38-1.43-1.88-0.91-0.19-5.25-0.87-0.62-0.19-1.88,2.78-1.25-1.62-1.25v-2.94l5.47-1.97,3.12,0.16,0.25-1.78,6.53,0.09v-2.75l-1.25-1.53,1.16-1.25,3.47-0.62,3.31-2.22,1.34-6,5-0.44,0.1-2.06s-5.29-4.9-5.47-5.25c-0.18-0.36-0.88-3.94-0.88-3.94l-3.56-2.59v-5.97l2.94-7.16-1.69-9.19,0.78-3.12,13.5,0.72,0.25-5.28,5.19-1.16,3.47,1.87,0.81-2.31-2.41-3.69,1.69-0.62,0.19-2.75-7.16-8.5,0.1-4.37-3.13-1.5-0.09-4.04-1.78-1.15,1.09-2.13,3.81-0.47,1.35-1.78,4.28,0.38,0.09-2.44-3.37-1.5,0.15-3.31,5.47-0.53v-3.57l5.63,0.44,5.62-8.03,0.44-2.5-6.06-6.06-0.19-1.88,2.31-3.4-0.97-1.79-3.31,0.19-1.5-2.34,4.72-1.41-0.09-1.53-2.07-0.97-0.25-1.34,2.13-3.75,5.72-1.97-0.78-3.56,5.15,0.68-0.62-5.43,1.34,0.28,0.19-3.59-2.69-0.63-2.94-4.53-7.59-0.28-4.19-1.88,0.72-3.47h-3.12l-0.19-1.62,8.12-10.44,1.07-7.84s-9.81-5.72-10.25-5.63zm-135.1,8.56c-0.12,0.03-0.23,0.08-0.34,0.19-0.89,0.9-1.07,1.79-0.53,2.5,0.53,0.72,1.06,1.63,1.78,2.35,0.71,0.71,2.31,1.25,2.31,1.25s0.71-1.1,0.53-1.82c-0.18-0.71-1.97-2.84-1.97-2.84s-0.94-1.78-1.78-1.63zm28.94,7.35l-2.31,0.34s-1.07,0.91-1.25,1.63c-0.18,0.71-0.9,1.24,0,1.78,0.89,0.53,3.75,1.25,3.75,1.25s1.6-0.02,1.78,0.87c0.18,0.9,0.18,1.8,0,2.69s-0.53,1.78-0.53,1.78l0.72,0.72,1.93-0.53s0.74-0.72,1.82-0.72h2.65s1.44-0.53,1.97-1.25c0.54-0.71,1.97-1.25,1.97-1.25h2.69s1.41-0.52,0.87-1.59c-0.53-1.07-1.76-1.62-2.65-2.16-0.9-0.53-3.22-2.31-3.22-2.31h-2.5l-3.6,0.34-2.84,0.38-1.25-1.97zm-17,10.15c-0.12,0-0.22,0.01-0.31,0.04-0.72,0.17-1.44,1.4-1.44,1.4s0.37,1.78,2.16,1.78c1.78,0,2.3,0.55,2.65-0.34,0.36-0.89-0.87-2.31-0.87-2.31s-1.37-0.55-2.19-0.57z","name":"Sakha Republic"},"so":{"path":"m45.583,387.43-2.2728,2.6516-4.1669-2.6516-2.0203,1.1364-0.37881,5.8084-1.1364,1.389-2.2728-0.12627-5.9346-2.6516-3.0305-3.283,0.12627-4.9245,4.672,0.75761,0.37881-0.88388,2.5254-0.12627,3.283,1.5152,4.0406-1.894s-0.12627-3.5355,0.75761-2.7779c0.88388,0.75762,1.389,1.2627,1.389,1.2627l0.25254,3.5355z","name":"Republic of North Ossetia–Alania"},"kb":{"path":"m20.982,375.86c0.26786,0.35715,2.5893,4.7322,2.5893,4.7322l0.98214,3.9286,4.6429,1.1607,2.8571-1.0714,3.2143,1.5179,4.375-1.875,0.26786-3.125-5.9821-2.3214-1.875-5.0893-2.2321-1.1607-4.375,0.71429z","name":"Kabardino-Balkar Republic"},"kc":{"path":"m13.482,361.39,2.2321,8.4821,5.0893,6.25,4.375-2.6786,5.3571-0.89286,0.08929-3.3928,3.75-1.0714-6.6964-7.2321-2.2321,2.4107-2.8571,0.26786-1.6071-4.5536,0.44643-2.1429z","name":"Karachay–Cherkess Republic"},"st":{"path":"m33.929,367.73-3.4821,0.98215,0.17857,3.75,1.5179,1.25,1.7857,4.6428,6.5179,3.0357,1.3393,1.3393,0.08929,3.0357,3.8393,1.7857,1.6071,2.5893,3.2143,0.625,0.71429-1.4286-2.8571-3.125,1.5179-0.53572,3.5714,0.80357,0.17857-1.1607-0.98214-1.3393,7.7679-0.0893,1.6964-1.5179,0.26786-3.5714-5.2679-7.5-0.17857-9.4643-3.4821-6.0714-4.9107-0.98214-1.5179-2.7679-5.0893-5.7143-0.98214-0.625-1.5179,1.3393-2.7679-2.0536-1.4286,0.80357-0.80357,1.0714-0.08929,1.6071,0.35714,1.3393,0.35714,1.1607-0.71429,1.6071-0.98214,1.4286-1.9643,2.2322-1.875,1.0714-0.71428,0.98214-0.98214,2.3214z","name":"Stavropol Krai"},"ks":{"path":"m21.607,356.48-0.08929,2.0536,0.98214,3.8393,0.35714,0.80357,2.2321,0.0893,3.75-4.5536,1.4286-1.9643,1.9643-1.0714,2.6786-4.0178-0.26786-3.3929,0.17857-1.6964,0.89286-1.5179,1.3393,0,1.7857,1.5179,1.3393,0,2.5893-3.0357,0.08929-1.9643-0.89286-0.98214-2.2321-1.3393,0.17857-2.9464,2.8571-3.125,0.08929-1.4286-2.7679-2.9464-3.75-0.71428-0.80357-0.89286,1.6071-1.25,0.17857-2.4107-2.1429-1.6072-2.5893-0.80357-1.6071-1.6964-1.25-0.98214-0.89286-0.0893-1.3393,2.2322-0.625,0.98214,1.0714,1.4286-0.35714,1.5179-0.80357,0.625-2.7679-0.26786-0.89286-0.89286-1.9643,0.0893-1.875,0.71429-3.0357,1.7857-1.6964,0-1.3393-1.4286-1.6071-0.625-1.1607-1.4286,0-2.6786-2.2321-0.26786-1.25,0.625-0.35714,2.9464-0.089286,13.214,0.71429,5.8929,0.98214,3.6607-0.089286,2.3214-0.625,2.7679-0.089286,2.4107,0.17857,2.0536,1.5179,0.89285,0.71429,0.625,1.6071,1.5179,0.89286,1.0714,0.89286,0.89286l7.947-4.27-0.804-1.25-0.357-1.43-5.089,2.68h-1.875l-1.25-1.875,0.35714-3.5714,6.25-1.4286,2.7679-2.3214,0.71429-2.5893-1.3393-0.80357-1.9643,0.44642-1.1607-1.5178-0.71429-2.6786-1.3393-1.7857-0.17857-1.25,0.08929-1.1607,1.3393-0.80357,1.3393,0.625,1.0714,1.3393,1.0714,1.9643,1.3393,1.7857,2.3214,1.3393,1.6964,0.89285s0.625,0.26786,0.71429,0.625c0.08929,0.35715,0.89286,2.6786,0.89286,2.6786v4.0178l-0.08929,1.3393-1.0714,1.0714-1.875,1.5178-1.6071,1.4286z","name":"Krasnodar Krai"},"ro":{"path":"m37.5,323.45,2.0536,0.98214,1.4286-0.17857,0.625-0.89286-0.44643-1.1607-1.25-0.89286-1.9643-1.3393-0.89286-1.1607-0.35714-0.71428,1.0714-1.4286l2.231-1.08,1.6071-0.26786,1.0714,0.35714,1.4286,1.3393,1.5179,0.35714,1.6964-0.89286,0.89286,0.44643,1.072,1.06,1.339,1.79,0.268,1.33,1.607-0.08,1.3393-0.80358,1.6964-0.0893,1.3393-0.0893,0.35714-1.5178,0.53571-1.4286,1.25-1.6071,1.3393-1.0714,1.6964,1.0714,0.71429,0.35714,0.89286-1.875,0.44643-0.71428,2.6786-0.26786,1.875-1.6964,2.3214-0.17857,2.0536,1.1607,2.1429,1.25,0.98214,0.53571,3.9286,0.0893h2.2321l1.5179-0.98215h1.3393l0.71429,0.625,0.26786,1.6964-0.08929,1.9643v1.875l-0.08929,1.0714-0.981,1.34-1.25,0.98214-1.25,0.71429-0.80357,0.35714-0.35714,1.25-0.44643,1.6072-0.08929,1.4286-0.44643,1.1607-0.625,1.4286-1.4286,1.5179-1.6964,0.53571h-3.125l-1.608-0.36-1.518,0.53-0.625,1.97-0.982,0.62-0.80357,0.53572,0.17857,0.89285,1.3393,1.4286,0.71429,1.4286-1.1607,1.4286-1.3393,0.89285-0.80357,1.7857-0.08929,0.80357,0.98214,0.53571,1.1607,1.1607,0.625,1.0714,0.80357,0.80357,0.71429,1.3393v1.0714l-0.71429,0.80357,0.53572,0.625,1.4286,0.35715,0.625-0.53572,0.71429-0.0893,0.35714,0.98214v1.4286l-1.3393,1.3393-2.1429,1.0714-2.0536,1.1607-3.3929,0.0893-0.80357,0.80357-1.3393,0.80357-1.696,0.46-1.429-0.71-1.696-0.71-0.893-0.9-0.178-2.23-0.179-1.52-1.696-2.14-1.1607-0.80357-0.17857-1.25-0.80357-0.89286-1.7857-0.0893h-2.7679l-2.8571-0.0893-1.3393-0.17857-1.6071-1.7857-0.98214-0.71429v-0.89286l1.3393-1.5178v-1.5179l-0.625-1.25-1.875-1.4286-0.71429-0.625,0.26786-2.2322,2.7679-3.2143,0.08928-1.6071-1.9643-2.2322-1.3393-0.89285-2.411-0.55-1.0714-0.35714-0.08929-0.71429,1.0714-1.0714,0.26786-1.1607z","name":"Rostov Oblast"},"kk":{"path":"m44.554,348.71,0.98214,1.6071,1.1607,1.0714,1.1607,1.6964,0.80357,1.1607,1.1607,0.71429,2.5893,0.44643,1.3393,0.625,0.98214,1.6071s0.98214,1.7857,1.25,2.2321c0.26786,0.44643,0.98214,2.4107,0.98214,2.4107l0.17857,4.9107v3.2143l0.89286,2.2321,3.3036,4.1964,1.25,2.0536-0.17857,2.5893-1.4286,1.875,0.89286,1.3393,4.375,4.7321,0.53571,1.25,0.35714,0.98215,0.89286,0.53571,1.4286,0.0893,1.6071-0.26786,1.7857-0.53572,2.2321-0.89285,2.3214-0.26786,0.713-0.71,0.625-2.15-0.268-1.16-2.232-1.34-0.982-0.71,0.08928-1.3393,1.0714-0.625,1.7857,0.0893,1.4286-1.25-0.53572-0.71428-0.71428-2.0536-0.268-1.7-0.179-1.16h1.0714l1.6964,1.25,1.7857,0.80357,2.6786-0.17857h0.89286l0.53571-1.1607-0.17857-2.4107-0.08929-3.8393v-6.3393-0.98214l-0.08929-2.2321,2.9464-2.8572,0.17857-1.3393-1.4286-0.625v-3.2143l-1.0714-1.1607-1.1607-0.35715-2.5-0.17857-0.625-1.4286-0.17857-0.80357-1.25,0.26786-0.625,1.0714h-1.3393l-1.25-0.0893-1.071-0.98-0.804-0.71-2.321-0.27-0.98214,0.35715-0.71429,0.80357-0.71429,0.35714-0.26786,1.1607-0.35714,0.80357,0.35714,0.625,1.0714,0.35714,1.0714-0.44643,0.89286,0.35714,0.08929,0.98215-0.44643,1.5178-5,3.125-3.3929,0.26786-2.3214,1.3393-1.5179,0.53571-3.8393-1.7857-0.53571-0.35715-0.08929-3.3928-0.71429-1.4286-2.3214-2.2322-0.625-1.25-1.9643-0.80357h-3.5714z","name":"Republic of Kalmykia"},"as":{"path":"m86.873,350.94,1.6415-1.389,1.1364-0.63135,1.7678,1.2627,2.0203,0.63135,2.2728,0.50508,0.88388,1.0102,2.1466,0.88388,0.75761,1.1364,0.63134,1.1364,0,1.389,0,0.88389-1.5152,0.3788-1.1364,1.389-0.12627,1.0102,0.63134,1.389,1.0102,1.1364-0.37881,2.1466-0.75762,1.0102-1.7678,0.88389-0.25254,1.1364,0.50508,0.88388,1.7678,1.1364,2.2728,1.5152,1.389,1.6415,0.63134,1.0102,0,1.5152-1.0102,1.1364-0.25254,2.0203-1.0102,1.0102,0,2.2728,0,2.7779-0.75761,0.3788-1.7678-0.3788-1.894-0.75762-0.63134,0.37881-0.37881,2.1466,1.6415,2.1466,1.1364,1.2627,0.88388,1.0102,0.50508,0.63134,0.12627,1.2627-3.9143,0.25253-3.0305,0.63135-2.1466,0-1.894-1.2627-2.0203-1.5152-5.4296,0-1.0102-0.37881-1.1364-1.1364,0.37881-2.9042-0.88388-1.0102-2.2728-1.6415,0-1.6415,1.0102-0.3788,1.5152,0,1.389-1.0102-0.63134-1.389-0.75761-4.0406,0.63134-0.3788,1.2627,0.75761,2.9042,1.389,2.0203-0.25254,1.2627-0.12627,0.50508-1.6415-0.25254-5.4296,0.12627-5.0508-0.25254-4.2931,2.1466-2.2728,1.0102-1.1364,0.12627-1.389-1.2627-0.50508-0.25254-2.1466z","name":"Astrakhan Oblast"},"ad":{"path":"m21.786,356.21,2.4107-1.4286,2.5-2.6786,0.35714-2.1428-0.26786-3.9286-1.0714-2.7679-2.9464-0.98214l-2.412-1.78-2.232-3.75-1.5179-1.1607-1.3393,0.71428-0.17857,2.1429,1.6071,1.875,0.80357,2.5893,1.1607,1.6964,1.6071-0.35714,1.5179,0.44643-0.44643,2.9464-2.9464,2.3214-3.394,0.71-2.8571,0.35715-0.17857,3.8393,1.0714,1.7857h1.7857l5.3571-2.9464,0.35714,1.7857z","name":"Republic of Adygea"},"vl":{"path":"m85.893,313.18,1.5179-0.98214,1.875-0.0893,1.1607-1.0714,1.1607-1.6072,0-1.25,1.1607-0.98214,1.9643,1.25,2.5,1.9643,3.3036,2.1428,3.9286,1.5179,1.4286,1.5179,0.625,2.1428,0.44643,1.4286,2.8571,0.35714,0.44643,1.4286,2.5893,0.80357,1.7857,1.7857,1.6964,1.6964,0.17857,2.2322-1.5179,1.25-1.6071,2.2321-1.4286,1.3393-0.26786,1.25,0.89286,2.2321,2.9464,1.875,1.6964,1.875,1.7857,1.1607,1.25,3.3036,1.0714,1.875,0.0893,1.25-0.71428,0.53572-1.3393,0.44643-0.71429,0.53571-2.8571,0.26786-4.6429-0.0893-1.6964,0.26786-0.71429,1.6071,0,2.8572-0.17857,1.1607-1.6964,1.25-1.3393,0.98214-4.0178-0.0893-1.0714-0.0893-1.3393-3.0357-1.4286-1.0714-1.875-1.0714-1.0714-0.625l-2.256-0.46-2.054-1.25-1.071-0.18-1.1607,0.625-0.98214,0.71429-1.25,0.26785-2.1429-0.0893-0.89286-1.1607-0.35714-1.25-1.4286,0.26786-0.89286,1.1607h-1.25l-1.875-0.71428-1.25-0.80357-1.3393-0.35715-1.4286,0.17858-1.4286,1.25h-0.89286l-1.4286-2.5-1.25-1.4286-1.0714-0.71428,0.448-1.44,0.893-1.52,1.607-1.43,0.179-0.89-1.6964-2.1429-0.44643-1.0714,1.4286-0.80358,0.625-1.875,0.625-0.53571,1.25-0.35714,1.6071,0.0893h3.0357l1.7857-0.625,1.9643-2.5893,0.89286-4.0179,0.625-1.4286,2.8571-2.0536,1.1607-1.6964,0.35714-3.3036v-2.2322z","name":"Volgograd Oblast"},"vn":{"path":"m70.089,310.77,0-6.0714,0.08929-1.1607,3.75-3.2143,2.5-3.6607,1.3393-1.4286,0.35714-1.875,2.4107-0.71428,0.35714-2.5893,0.625-1.7857,1.0714-0.35714,0.625-2.0536,1.3393-1.7857,1.1607-1.0714,0.98214-0.53571,0.89286,1.1607,0.44643,0,0.71429-1.0714,0.53571-0.71428,1.1607-0.17857,0.89286,0.89285,1.25,1.1607,1.4286,1.4286,1.1607,1.5179,0.80357,0.89285-0.26786,2.1429,0,1.6071,1.875,1.0714,2.3214,1.3393,0.80357,1.3393-0.0893,1.7857-0.89285,1.5178-0.44643,0.98215,1.5179,1.25,1.875,1.7857,1.9643,2.2321,1.3393,1.6964,1.1607,1.9643-0.26786,2.3214,0,2.0536-2.1429,1.0714-0.71428,0.17857-4.2857-1.875-2.6786-1.7857-2.1429-1.4286-1.6964-1.1607-0.53571-0.17857-0.71429,0.80357-0.44643,1.25-1.4286,1.9643-1.6964,0.44643-2.8571,0.80357-3.5714,1.1607-3.2143,0.0893-2.5-0.17857-2.3214-1.25-2.3214-1.0714z","name":"Voronezh Oblast"},"bl":{"path":"m63.304,272.29-5.4464,3.3036,0.08928,2.6786,1.6964,1.875,0.08929,3.125,0.44643,1.6964,2.8571,1.6071,2.8571,0.44643l1.608,2.23-2.5,3.3036-0.35714,2.1429,1.0714,1.6071,2.3214,1.5179,0.17857,2.9464,1.1607,1.5179,0.71428,0.89285,4.7321-4.375,3.75-5.4464,2.0536-0.89285,0.80357-4.1072,1.0714-0.89285,0.53571-1.3393-2.5-2.8571-3.5714-4.1071-2.7679-0.26786-2.9464-1.1607-2.6786-1.6964-2.5893-1.6072-1.9643-1.6071z","name":"Belgorod Oblast"},"ky":{"path":"m63.482,271.84,0-4.6429l-0.357-1.61-1.786-1.97-0.714-1.07,1.3393-1.0714,3.75-1.3393,2.7679-1.3393,2.6786,0.0893,0.53571,1.0714,1.25-0.0893,1.7857-1.1607h0.80357l0.98214,0.44643,1.4286,1.6071,0.53571,0.80357,0.08929,1.6964,1.0714,0.89286,1.0714,0.71428h0.89286l1.0714,1.25,0.17857,3.2143v2.4107l-0.89286,0.98214v1.5179,1.1607l1.0714,1.25,1.1607,0.98214,0.89286,0.17857,1.5179,0.53571,1.0714,1.6072,1.6071,1.5178-0.71429,1.1607-0.80357,0.89286-0.89286-0.80358-1.9643,1.25-1.4286,1.1607-0.53571,0.80357-3.4821-4.1071-2.2321-2.3214-0.98214-0.53572-3.3036-0.625-2.8571-1.5178-3.6607-2.1429-2.4107-1.9643z","name":"Kursk Oblast"},"or":{"path":"m74.732,258.27,1.0714-1.875,2.2321-0.26786,0.89286-1.6071,0.89286-0.53572,1.9643,0.89286,1.6964-0.0893,1.6071-0.71429,1.0714-1.5179,0.89286-0.53571,0.98214,0.17857,1.3393,0.98214,1.9643,0.89286,1.1607,0.89286,0.35714,0.89285,0.71429,1.3393,0.17857,2.0536,0,3.6607,0.98214,1.7857,1.4286,1.875,0.80357,1.25,0.71429,1.7857-0.26786,1.5179-3.9286,1.875-1.9643,0.98214-1.0714,2.1429-1.875,1.0714-1.875,1.0714-2.4107-0.89286-1.9643-1.6071-0.44643-1.6964,0.44643-1.9643,0.44643-0.89285,0.08928-4.4643-0.89286-1.6964-1.7857-0.53571-1.7857-1.4286-0.08929-1.6072-1.3393-1.5178-1.6071-1.6964z","name":"Oryol Oblast"},"lp":{"path":"m86.875,278.45,1.5179,1.875,1.0714,0.89286,1.1607,0.71428,1.1607,1.0714,2.5,2.2321,1.25,1.5179,0.625,1.4286-0.44643,2.5893,0.53572,0.625,2.5,1.3393,1.875,1.7857,1.0714-0.17857,1.0714-0.625,0.44643-0.80357,0.0893-5.8036,0.35714-0.71428,1.4286-0.80357,2.3214-0.17857,2.0536-1.1607,1.3393-0.44643,0.17857-1.6964,0.625-1.3393,1.25-1.5179-0.80357-1.1607-2.6786-0.98215-0.53571-0.53571-0.17858-0.71429,1.0714-1.3393,0-1.6071-2.1428-0.35715-1.0714,0.44643-1.6072,0.80357-0.98214,0.89286-1.1607,0.625-1.4286,0.0893-1.3393-1.5179-1.6964-1.6964-0.80357-0.98214-2.4107,0.89285-3.125,1.6964-1.1607,1.6072-1.6071,1.4286z","name":"Lipetsk Oblast"},"tl":{"path":"m93.482,256.3,3.2143-2.0536,0.98214-0.17857,1.6071,0.80357,0.98215-0.80357,0.71428-1.0714,3.125,0,1.6072,0.625,2.0536,0.35714,1.4286,0.80358,2.4107,0.35714,1.4286,0.71428,0.53572,1.0714,0.98214,1.0714,1.25,1.4286,0.71429,1.6072-0.35715,1.6964-0.98214,1.1607-0.71428,1.6964-1.3393,1.9643-1.6964,2.0536-1.0714,1.875-0.71428,0.98215-0.53572,0.35714-1.7857,0-2.5,0.89286-1.5179,1.0714-1.3393,0.26785-2.0536-1.3393-2.0536-2.5893-0.26786-2.0536-0.53571-1.4286-1.6071-2.5l-1.413-2.14-0.179-2.23z","name":"Tula Oblast"},"bn":{"path":"m67.679,258.62,0.26786-1.7857,2.3214-1.5179,0.44643-1.1607,0-1.4286-1.6071-1.9643-1.7857-2.1429-1.6964-1.9643-2.3214-1.875-1.5179-0.89286-1.6964-0.26786-0.89286-1.1607,0.17857-2.3214,1.3393-1.6071,3.125-2.1429,2.6786-1.875,0.89286-1.7857,0.98214-0.71428,1.6964,0.26786,0.625,1.25,0.625,1.5178,1.0714,2.2322,1.1607,0.80357,5.8929,0.26785,2.1429-0.35714,1.4286,0.53572,3.125,0.89285,2.3214,0,0.71429,1.9643,0,2.2321-0.17857,1.1607-0.98214,1.5178-0.71429,0.53572-0.26786,1.4286,0.26786,1.5179,0,1.25-0.80357,1.4286-1.4286,1.5178-1.7857,0.71429-1.6964,0.17857-1.7857-0.71428-1.4286,0.71428-0.26786,0.89286-2.4107,0.80357-1.0714,1.4286-1.3393,1.25-1.4286,0.17857-1.4286-0.71428z","name":"Bryansk Oblast"},"kj":{"path":"m89.196,239.61,1.6071-1.25,1.6071-1.3393l1.161-0.27,1.429,0.63,0.80357,1.4286,1.0714,1.25,1.7857,0.80357,1.7857,0.35715,3.125,0.0893,1.875-0.0893,1.6071-1.0714,2.4107-0.0893,1.4286,0.44643,0.98214,2.0536,0.26786,1.4286,1.25,0.625,1.6071,0.98215,0.98214,0.80357,0.53572,1.25-0.53572,2.0536-1.0714,1.7857-1.4286,1.9643-1.1607,1.25-0.89286,0.44643-3.75-1.25-2.6786-1.0714-2.6786,0.0893-1.875,0.44642-1.0714,1.25-1.5179-0.44642-1.0714,0.0893-1.0714,0.80357-2.0536,1.0714-0.89286-0.89286-1.0714-0.80357-1.9643-1.25-1.5179-0.89285-0.89286-0.44643v-1.0714-2.4107l-0.08929-0.625,1.1607-1.6964,1.0714-1.875v-1.7857l-0.26786-1.6071z","name":"Kaluga Oblast"},"sm":{"path":"M79.375,237.55,80,235.95,80.179,234.52,79.732,233l-0.08928-1.4286,1.5179-1.3393,0.71429-1.6071,0.08929-3.125,0.35714-1.875,2.4107-2.5,2.5-1.9643,1.875-1.7857s1.875-1.3393,2.2321-1.5179c0.35714-0.17857,2.5-1.5178,2.5-1.5178l2.5,0.0893,3.0357,3.4822,1.875,3.4821,2.5,3.6607,1.4286,0.89286,2.7679,0.53571h2.0536l0.80357,0.71429,1.1607,1.875,1.1607,1.3393,1.25,1.6071,1.0714,1.4286,0.17857,1.3393-0.98214,1.25-1.875,0.89285-1.875,0.53572-0.89286,1.25-0.44643,0.89285-1.875,0.44643-1.7857,0.625-1.6072,0.35715h-3.0357l-3.75-0.80358-1.7857-1.7857-1.4286-1.3393-1.1607-0.26785-1.1607,0.71428-2.2321,1.5179-1.1607,0.44643-1.7857-0.44643-4.1071-0.98214-2.4107-0.35715z","name":"Smolensk Oblast"},"mc":{"path":"m116.07,234.16,3.5714,0.26785,2.3214-0.89285,1.4286-0.44643,0.53571,0.625,0.0893,1.7857,0,1.1607-0.17857,1.3393,1.5178,0.89286,2.9464,0.44643,1.7857,0.89285,2.0536,0.89286,2.7678,0.89286,1.7857,0.26786,1.25,0.53571,0.26786,1.6071-0.0893,1.5179-0.44643,1.6964-1.5179,0.625-2.1428,1.1607-1.6072,1.3393-0.0893,1.25-0.625,1.7857-1.1607,1.5179-0.35714,1.6071,0.17857,1.6072,0.0893,0.89285,1.1607,1.0714,1.0714,0.625,1.1607-1.0714,0.625,0.44643,0,1.5179-0.0893,3.2143-0.44643,1.1607-1.3393-0.44643-1.875-0.17857-1.6072,0.17857-0.80357,0.89286-2.0536,0.0893-1.6071-0.35714-1.25-0.71429-1.0714-1.1607-1.6071-0.625-1.6964,0-0.44643,0.80357-0.17857,1.1607-1.0714,0.53571-1.4286,0.0893-0.80357-0.80358-0.17858-0.625,1.1607-2.4107,0.26786-1.9643-0.53572-1.6964-1.1607-1.5179-1.1607-1.5179-1.0714-0.89286,0.625-1.25,2.5-2.9464,1.1607-2.6786-0.71429-1.7857-1.6071-1.6071-1.6071-0.98215-0.53572-0.35714-0.625-1.875-0.80357-1.25-0.80357-0.80357,0.625-1.5179,2.5893-1.3393z","name":"Moscow Oblast"},"rz":{"path":"m114.55,265.59-1.9643,2.6786-2.1429,3.125-0.625,2.7679-0.80357,1.7857,0.17857,0.80357,1.6964,0.71429,1.9643,1.3393,0.44643,1.5179-0.26786,0.89286,1.4286,1.1607,1.9643,0,1.1607,0.71429,0.0893,1.875,0.44643,1.1607,1.25,0.44643,1.5179-0.625,1.9643,0,1.5179,0.98214,0.625,1.7857,1.0714,1.1607,2.6786-0.17857,3.125,0,2.9464-2.0536,3.0357-2.9464,1.5179-2.2321,1.0714-1.7857-0.98214-2.2321-0.53572-3.125-2.0536-2.0536-1.25-1.6964-0.44643-2.8571-0.53571-1.6072-0.35715-0.98214-2.1428-0.35714-3.4822,0.26786-0.625,0.80357-2.1428-0.17857-1.875-0.71429-1.875-1.0714-1.9643-0.89286-1.0714,0.35715-0.80357,1.4286-1.4286,0.89286-1.6071-0.44643z","name":"Ryazan Oblast"},"tb":{"path":"m112.77,279.43-1.6964,2.1429-0.35714,1.7857-0.80358,0.89286-2.6786,0.98214-1.875,0.44643-1.5178,0.71429-0.71429,1.4286,0,2.1429,0.26786,2.3214-0.71429,1.875-1.5179,0.53571-0.44642,1.4286-0.44643,1.6964-0.625,1.1607,0.08928,0.625,2.3214,2.1429,2.2321,2.1429,1.6072,2.2321,1.4286,2.0536,0.98214,0,2.1429,0,1.9643-1.25,2.5-1.25,1.6964-1.0714,4.0179-0.26785,1.0714-0.98215v-3.6607c0-0.35714,0.0893-2.3214,0.0893-2.3214l1.5179-1.1607s0.71429-0.71429,0.80357-1.0714c0.0893-0.35714-0.26785-4.6429-0.26785-4.6429l1.4286-1.0714-0.80357-2.1428-1.7857-1.4286-2.3214,0.26786-0.89285,0.625-1.1607-0.80357-0.89286-1.3393v-1.3393l-1.875-0.80357h-1.3393l-0.89286-1.0714-0.26786-1.3393z","name":"Tambov Oblast"},"kn":{"path":"m44.107,152.55,0,2.2322,0.53571,2.5,2.0536,5.1786,1.4286,3.4821,1.9643,3.6607,2.5,1.0714,3.75-0.44642,1.9643-1.3393,0.625-1.7857-0.44643-4.2857-0.89286-2.8571-1.5179-1.6071-2.4107-0.53572-0.98214-0.71428,0-3.0357-0.80357-1.4286-1.6964-1.6071-1.6071-0.26786-0.35714,1.25-0.625,1.3393-0.625,0.89285-1.4286-0.35714z","name":"Kaliningrad Oblast"},"ps":{"path":"m95.268,213.98,0.35714-2.1428-0.26786-2.1429-1.4286-1.875-1.3393-1.4286-0.08929-1.6964,0.98214-0.71429,0.17857-1.6964-0.89286-0.98215-1.25-1.875,0-4.1964,1.5179-0.89285,3.75-2.2322,0.80357-2.4107,0.53572-1.7857,1.875-1.25,2.4107-0.0893,1.3393-1.6071,0.98214-1.6964s1.25-0.625,1.6072-0.80357c0.35714-0.17857,2.8571-0.71429,2.8571-0.71429l1.5179-0.0893,1.0714,0.53571-0.625,1.5179-0.71428,0.89285-0.17857,0.98215,1.6071,0.26785,1.25-1.7857,0.98214-2.0536,1.1607-1.5179,1.6071-0.71428h1.6071l1.5179-1.5179,1.1607-0.625h1.4286l0.98214,0.98214,0.625,1.5179,0.98214,1.6071-0.26786,1.6964-0.89285,0.98214-0.35715,1.3393-0.80357,1.6071-0.17857,1.1607h-1.4286-0.80357l-0.71429-0.53572-0.80357,0.53572-0.625,0.80357-0.53571,1.5178-0.53572,2.1429-0.0893,2.5-0.35715,1.875-1.1607,1.25-1.3393,0.98214h-1.7857l-1.5179,1.3393-0.53571,1.7857-1.3393,0.53572-0.44643,1.0714-0.17857,1.4286-1.7857,0.89286-1.7857,0.80357-0.625,1.6964,0.625,1.5178,0.625,0.625-0.26785,1.4286s-0.0893,0.44643-0.44643,0.80358c-0.35714,0.35714-1.1607,1.3393-1.1607,1.3393l-1.4286,0.80357-2.3214,0.89286-1.0714,0.0893-1.1607-0.89286-0.89286-0.89286z","name":"Pskov Oblast"},"no":{"path":"m123.12,188.27,1.5179,1.25,2.1428,0.35714,2.1429,0.17857,1.25,1.1607,2.5,0.53571,2.3214-0.0893,1.0714-0.89286,0.44643,0.625,0.0893,1.7857,2.1429-0.53571,2.3214,0.0893,0.80357,0.80358,0.17857,2.5,0.17857,2.5,0.53572,1.0714,1.3393,0.17858,1.3393,0.44642,0.26785,2.1429,0.71429,1.6964,0.98214,0.80357,0.44643,2.9464,0.0893,2.2321,0.89285,1.4286-0.53571,0.98215-0.71429,0.53571,0,1.6071,0.17858,1.5179,1.4286,1.3393,0.625,0.53571,0.0893,1.9643,0,1.9643-0.17857,1.3393-1.25,0.53571-0.71428-0.26785-0.625-0.80358-0.71429-0.80357-0.17857-1.1607-0.98214-0.80357-0.80358-0.625-2.0536,0-1.5178-0.53572-0.53572-0.35714-1.5178-0.53571-0.71429-0.26786,0-0.44643s-0.26786-1.25-0.26786-1.6964c0-0.44643-0.0893-2.0536-0.0893-2.0536l-0.625-0.98214h-1.7857l-0.89285-0.44643-0.44643-0.98214-0.98215-0.625-0.53571,0.625-0.89286,1.0714-1.6964,1.4286h-2.1428c-0.35715,0-1.5179,0.0893-1.5179,0.0893l-0.71429-1.0714-1.0714-0.71428-2.3214-0.17857-2.6786-0.0893-1.5179-0.44643-1.3393-0.98214-2.3214-0.44643h-2.1428l-0.89286-1.1607-1.25-1.0714-0.53571-0.71429-1.1607-0.71428,0.98214-2.7679,0.71429-0.44643,1.1607-1.5179,1.0714-1.0714,2.0536-0.625,2.5-1.9643,0.625-1.9643,0.0893-3.5714,0.98214-2.5893,1.0714-1.25,1.1607,0.26786z","name":"Novgorod Oblast"},"tr":{"path":"m98.661,216.66,3.2143-0.625,2.2321-1.6072,1.3393-1.6071,0.17857-1.4286-0.80357-1.4286-0.26786-1.3393,0.35714-0.89286,1.4286-0.89285,1.6964-0.625,1.1607,0.44643,1.5179,1.5178,1.0714,0.98215,0.98215,0.53571,1.6964,0.17857,2.4107,0.35714,1.3393,0.98215,1.3393,0.26785,3.2143,0.44643,1.5178,0,1.25,0.71429,0.80358,0.71428,1.875,0.35715,1.7857-0.17857,1.875-1.6072,1.25-1.25,0.71429,0.44643,0.625,0.80357,1.4286,0.44643,1.4286,0.17857,0.53571,1.5179,0.17857,2.4107,0.35715,0.80358,1.1607,0.71428,1.4286,0.80357,1.0714,0.26786,1.875,0.35714,0.98214,0.26786,1.25,1.0714,0.44643,1.3393,0.98214,1.0714,0.80358,0.53572,1.7857-0.35715,1.3393,0.0893,1.25,0.71429,1.6071,0.89285,0,1.5179-0.625,1.6964-1.25,1.6071-1.6071,0.44643-1.25,0.98214-1.5179,1.3393-0.89286,1.0714-0.44643,0.71428-0.26785,1.5179-0.44643,1.0714-1.25,1.4286-0.53572,1.4286-0.35714,2.0536-2.0536,1.9643-2.0536,1.3393-1.0714,0.17858-0.53571-0.71429-0.26786-1.7857-1.6964-0.71429-3.8393-0.89286-3.8393-1.6071-3.0357-0.80357-1.5178-1.0714-0.0893-3.0357-0.35714-1.6964-3.3036,0.80357-3.4822,0.26786-1.3393-0.89286-3.4821-4.4643-1.5179-2.0536-3.3036-0.625-2.7679-0.53571-1.4286-1.7857z","name":"Tver Oblast"},"vm":{"path":"m137.41,247.73,1.6072,1.7857,2.0536,1.25,1.1607,1.0714,1.3393,0.35714,0.80357,0.89286,0.0893,1.5178-0.89285,1.7857-0.35715,1.0714,1.25,0.625,1.7857,0.26785,1.0714,1.1607,0.17857,1.9643,0.98214,1.875,1.0714,1.25,1.3393,1.25,1.3393,1.3393,1.3393,1.1607,1.7857,1.875,0.89286,1.3393-0.17857,0.98214-0.89286,0.71429l-0.18,0.98,0.53571,0.71429,0.44643,0.71428,0.0893,1.6072-1.7857,0.53571-2.2321-0.0893-1.1607-1.0714-4.4643-0.0893h-5.1786l-1.7857,0.53571-0.71429-1.6964-1.6964-1.9643-1.6071-2.6786-0.80357-4.1964-0.0893-4.1071-0.17857-2.0536-0.44643-0.44643-0.71428,0.44643-1.1607,0.26785-1.4286-1.25-0.26786-2.5893,0.71429-2.0536,1.1607-2.0536,0.44643-1.7857,1.3393-1.0714z","name":"Vladimir Oblast"},"pz":{"path":"m127.05,289.96,1.6964,1.7857,2.0536,1.5179,1.25,0.98214,1.6964,0.625,1.25,1.875,0.71429,1.6071,0.26785,1.9643,0.98215,0.98214,1.0714,1.0714,2.6786,0.17857,1.6964,0.0893,0.625,2.1429,0.89286,1.7857,1.6964,0.71429,2.1429,0.26785,1.4286,1.0714,0.625,1.0714-1.5179,0.89286-0.89286,0.98214,0.0893,4.1071-0.26786,3.4822-2.7679,1.25-1.0714-0.0893-0.89286,1.6071-1.9643,0.98215-1.1607-1.7857-0.98214-0.98214-5.9822-0.0893-1.1607-1.875-0.89286-0.89285-3.125-0.71429-0.98214-1.6071-1.25-1.6964-2.1429-0.71429-2.4107-1.3393-1.6071-1.0714-2.5,0.0893-0.71429-1.875,0.26786-2.5,1.1607-0.89285,3.8393-0.80357,0.89285-2.4107,0-3.4821,1.3393-1.6964,1.3393-1.6071-0.26786-2.5893,0-1.9643,1.1607-0.89286z","name":"Penza Oblast"},"sr":{"path":"m107.23,308.27-0.17857,3.0357-0.26786,1.25-2.2321,1.1607,1.4286,1.6964,1.0714,3.2143,2.2321,0.71429,0.98215,0.80357,0.89285,1.0714,1.7857,0.625,2.5893,2.5,0.89286,1.0714,0,1.875-1.5179,2.0536-2.4107,2.8571-0.44643,1.25,0.44643,1.6964,0.71429,0.89286,2.1428,1.1607,4.0179,3.9286,1.7857,4.5536,1.25,1.4286,1.25,1.3393,0.26786,1.9643-0.71428,2.5-0.53572,2.4107,0.26786,1.7857,0.89286,1.0714,1.6071,0.44643,1.6964,0,1.6964-1.1607,1.25-1.0714,0.44642-2.6786,0.0893-1.875,2.2321-0.625,3.3036,1.25,1.6964,0.35714,1.6072,0,1.3393-1.5179,0.44643-0.53571,1.6071,0.35714,1.3393,1.0714,1.5178,0.89286,4.6429,0,1.1607-1.1607,1.3393,0.17857,0.89286,0.80358,1.6071-0.53572,0-1.7857-0.89286-1.9643-0.35714-1.3393-0.17857-3.9286-0.0893-2.0536-0.71428-1.25,0.0893-2.8571-0.35714-1.6071,0-2.5-0.80357-1.3393-1.1607-1.6071-2.5-1.0714-1.6072-2.0536-2.5893-0.0893-1.0714-0.35714-1.7857-1.6964-0.625-1.25-0.44642-0.89286-1.7857-2.4107-5.625-0.26786-0.53571-0.17857-1.9643-2.5893-3.125-0.89286-2.2321-2.9464-6.1607-3.3036-2.3214,0-1.0714-1.6964,0.44643-2.5-0.80357-0.35714-3.8393,2.1428-1.5179,0.35715z","name":"Saratov Oblast"},"mr":{"path":"m127.59,290.05,1.875,2.1429,2.6786,1.7857,1.7857,1.1607,1.7857,2.7679,0.44642,2.4107,2.0536,2.1429,2.5893,0.0893,1.6071,0.26786,0.89286,2.2321,0.71429,1.4286,2.0536,0.89286,1.7857,0.35714,1.25,0.625,0.53572,0.80358,5.8928,0.17857,2.6786-3.5714,0.35715-0.53572,0.71428-1.3393,0.0893-2.1429-0.0893-1.9643-1.7857-0.98215-0.35714-2.5-0.0893-0.80357-1.6964,0,0,0.17857-0.80357,0.89286-1.3393,0.80357-5.2678,0-2.5893-2.3214,0.17857-3.5714-1.1607-1.0714-0.17857-0.80358,1.0714-1.0714,0-1.6072-2.5893-0.53571-1.7857-0.0893-0.80357-1.25-0.71429-1.6964-1.25,1.1607-2.1429,2.3214-2.4107,1.5178-1.5179,0.98215-2.9464,0.26785z","name":"Republic of Mordovia"},"cu":{"path":"m159.11,299.07,1.3393-0.89286,2.9464,0.44643,1.3393,0.44643,1.0714-1.3393,0.26786-1.7857,2.2321-1.1607,2.2321-2.2322,3.125,0.0893,2.6786,0,1.25,1.5179,0.35715,2.9464-0.17857,1.5179,0.35714,1.25,0.71428,1.1607-0.0893,0.71428-1.3393,0.625-4.1071-0.0893-1.3393,0.53571-0.80357,0.80357,0,0.89286,1.1607,0.71428-0.17857,0.89286-1.3393,1.1607-1.7857,1.25-2.1429,0.98214-1.3393,0.44643-1.3393-1.3393-2.5-0.44643-0.98215-0.625-0.98214-1.3393-0.80357-0.80357,0.80357-3.5714z","name":"Chuvash Republic"},"ul":{"path":"m158.57,305.32-1.875,2.6786-0.98215,1.4286-4.8214-0.26785-0.80358,0.26785-1.7857,1.4286-0.80357,1.1607,0,2.3214,0,2.5893,0,1.6964-1.7857,1.4286-1.0714,0.26786-0.89286,0-1.25,1.25-1.25,1.0714-0.625,0.26786,0.89286,1.9643,1.6071,1.6071,2.3214,0.44643,1.5178,0.17857,1.25,1.6072,1.5179,0.80357,2.1429,0.17857,0.89286-0.625,0.0893-1.875,0.17857-1.6964,1.0714-1.6964,0.35714-1.3393,1.3393-0.26786,0.80357,0.53571,1.3393,0.625,1.875-0.17857,1.3393-0.98214,1.0714,0.17857,1.6964,1.4286,2.0536,1.875,1.5179,1.6072,0.80357,1.4286,2.3214,0.17857,1.1607-1.5179,2.8572-2.0536,2.0536-1.1607,0.26785-2.3214,0-3.5714-1.875-1.1607-3.6607-0.0893-2.0536-1.4286-0.98214-1.1607-2.5-0.26785-0.98215-1.5179-3.0357-1.5179-0.80357-1.5179-0.625-2.0536z","name":"Ulyanovsk Oblast"},"ss":{"path":"m150.98,329.96,1.3393,2.1428,0.71428,2.8572,0.44643,2.8571,0,2.1429,0.625,2.3214-0.0893,2.8571,0.35714,2.4107,0.53571,2.1429,0.625,1.9643,0.71429,0.98214,5.8929,0.0893,3.0357-1.6071,1.25-1.9643,1.9643-0.35715,1.6964-0.0893,2.1429-1.4286,1.4286-0.89286,1.25-0.17857,1.6072,0.625,1.7857-0.17857,0.80357-1.875,1.0714-2.3214,4.375-2.5893,1.7857-1.4286,1.1607-2.0536-0.625-1.5179-0.80357-1.7857-0.35715-2.5-1.1607-1.25-0.71429-2.4107-3.6607-0.26785-2.3214-1.6964-1.4286-0.80357-3.5714,2.3214-1.9643,2.2322-2.4107,0.0893-0.98214-0.98214-2.2321-2.4107-2.4107-1.875-1.0714-1.0714-0.89285,0.26785-1.6072,0.71429-1.6964-0.0893-1.5178-0.80357-1.0714,0-0.625,0.98215-0.53572,1.0714-0.80357,1.5179-0.17857,1.3393,0,0.98214-0.0893,0.71429z","name":"Samara Oblast"},"ob":{"path":"m155.89,352.82,0.53571,1.4286,0.71429,1.6071-1.0714,1.6072,1.0714,1.4286,3.0357,0.17857,1.9643-0.35714,2.5,0,0.17857,2.3214-0.89286,2.6786,0.35714,1.0714,3.5714,1.6071,2.1429,1.4286,0.17857,3.5714,0,4.1071,0,1.4286-1.25,0.89286,0,1.9643,0,0.71428,0.71429,1.0714,1.0714,0.89286,1.7857-2.5,0-1.4286,0.89286-0.89286,1.4286,0,1.0714,2.3214-0.17858,1.4286-0.71428,1.25-0.35714,1.4286l0.36,1.43,1.25,0.89286,2.3214,1.25,1.7857,0.89286h1.9643,2.5l1.4286-1.0714,1.6071,0.17857,1.9643,1.0714,0.89285,1.6071,0.35715,1.7857,1.0714,1.25h1.7857l0.89286-0.89285h1.25l1.6071,0.53571,1.25,1.4286,0.53571,2.6786-0.17857,3.5714,1.7857,1.6072,1.4286,0.89285,1.0714,1.6072,1.0714,0.53571,1.6071-0.71429,1.4286-0.17857,1.6071,1.4286v1.25l1.9643,1.7857,1.25,0.71428,2.1429,0.35715h2.6786l1.4286-0.17857,1.25-0.89286,1.25-1.0714,0.89286-0.89286-0.17858-1.25-2.3214-3.2143-1.0714-1.25v-3.75l-0.71429-2.1429-0.17857-2.1429,1.0714-2.3214,1.9643-1.4286-1.4286-1.7857-3.0357-2.8571-1.9643,0.35714-1.4286-0.17857-0.89286-1.25h-2.3214l-1.4286,1.25-1.0714,1.25-0.53572,1.0714h-2.5l-1.0714-2.5-3.2143-0.17858-2.8572-0.35714-0.89285-2.5-1.08,0.33-1.79,0.89h-1.4286l-0.17857-1.0714,1.4286-1.7857,2.5-2.5-0.53-1.78-0.71-0.36v-0.89286l2.5-1.9643,0.35715-1.0714v-2.1429h-1.7857l-2.1429,0.71429-1.6071,0.17857-1.4286-1.9643-0.53571-2.3214,1.25-1.7857,1.0714-0.89286v-1.6071l-0.35714-2.3214,1.0714-0.89285,0.17857-3.0357-1.25-1.9643-1.7857-1.7857-0.17857-1.6071,1.0714-2.8571,1.6072-2.5,0.89285-1.7857-0.53571-1.25-2.1429-1.6071-1.4286-2.1429-1.25-1.4286-1.6071,1.7857-1.4286,1.4286-4.1072,2.5-1.4286,1.9643-0.35714,1.9643-0.53571,0.35714-1.9643,0.17857-2.1429-0.35714-1.9643,0.53571-1.9643,1.4286-2.8571,0.53572-1.0714,0.71428-1.4286,1.7857-2.1429,1.25h-2.5z","name":"Orenburg Oblast"},"nn":{"path":"m156.25,271.57,4.2857-0.53571,2.5-1.4286,3.5714-0.71428,2.6786-1.0714,1.25-0.17857,2.3214,1.25,1.7857,1.0714,2.6786-0.17857,1.4286,0,2.6786-1.0714,1.25,0.17857,1.4286,1.9643,1.0714,2.1429,2.5,0.17857,2.5,1.7857,1.0714,1.25,0.89286,2.5,1.25,1.4286-0.17858,1.6071-1.25,0.89286-1.7857,0.17857-0.71429,0.89286-1.6071,0-0.71428-0.89286-1.7857-1.0714-1.6071,0.71429,0,1.6071-1.25,1.4286-1.25,0.53572-2.1429-0.89286-2.1429-1.6071-3.0357-0.89286-1.7857,0-1.0714,0.89286-0.71429,1.7857,0,2.8571-0.17857,2.8572,0.53571,1.0714-1.0714,1.4286-2.3214,1.4286-1.4286,0.89285,0,1.4286-0.35715,0.89285-0.89285,0.71429-2.8572-0.35714-1.0714-0.17858-0.89285,0-0.71429,0.53572-0.38692,0.34215-0.69448-0.12626-0.44194-0.50508-0.50508-3.0936-1.5784-0.12627-1.5784,1.4521-2.2097,0.44194-3.9775-0.25253-2.0834-2.0203,0.1894-3.3461-1.2627-1.389-0.0631-0.75761,1.0102-1.4521-0.0631-1.0733-3.7249-0.63135-1.1996-0.75761-1.0733-2.7148,1.1364-2.336-1.1996-3.3461,2.0203-0.50507,3.283-0.12627,5.9978,0.12627,1.2627,0.88388,2.0203,0.1894,2.0203-0.75761,0.12627-1.5152-0.94702-1.4521,0.63135-1.0733z","name":"Nizhny Novgorod Oblast"},"ml":{"path":"m181.51,286.29,2.2728,2.336,2.4622,2.0834,2.7779,1.1364,2.9673,0.0631,2.4622,2.0834,1.5784,1.6415,0.44194,1.3258,0.63134,0.94702-0.3788,1.6415-0.56821,1.1364-0.0631,1.8309-1.5152,1.389-0.88388,0.56821-1.4521-0.12627-1.1996-1.5152-1.1996-0.44194-1.389-0.82075-1.7046-0.12627-0.50508,0.88389-1.7046,0.88388-2.5885,0.12627-1.9572-0.82075-1.1364-0.69448-0.88388-3.0305-0.37881-4.7351-1.1996-1.4521-4.0406-0.0631-1.3258-0.1894-0.63134-1.0733,0-2.0834,0.0631-3.0936,0.37881-1.8309,1.0102-1.0733,0.82075-0.63134,2.5885,0.3788,2.2728,0.88389,2.9673,1.7678z","name":"Mari El Republic"},"ta":{"path":"m160.93,308.14,0.0631,1.1364,0.44194,1.0733,0.88389,1.0102,1.5152,0.63134,1.8309,1.4521,1.5152,0.75762,1.389,0.44194,1.4521,1.0733,1.389,1.0102,2.4622,0.44194,1.4521,0.0631,1.7046,0.88388,0.12627,2.2097-0.37881,2.9042,0.44195,1.4521,2.0834,1.1996,1.0733,0.75761,2.9042,0.18941,0.82075,0.69448,0.56821,1.7046,1.3258,2.1466,0.63134,2.5885,0.88389,1.7678,1.6415,1.894,1.389,2.2728,1.6415,1.1364,0.88388,0.88388,1.1996,0.0631,2.9042-1.8309,2.9042-2.7148,0.44194-0.63135,0-1.894-1.0102-1.0102-0.0631-0.88388,1.8309-0.25254,1.2627,0.31567,0.75762,0.56822,1.3258,0.3788,1.6415-0.31567,1.1996-0.69448,2.9042-0.12627,1.5152-0.37881,0-0.94701-0.37881-1.2627-1.1996-1.5784-0.63134-1.2627-1.5152-0.44194-0.88389-1.2627s1.2627-1.0102,1.5784-1.1364c0.31567-0.12627,2.2728-0.75762,2.2728-0.75762l0.0631-1.4521s-1.1364-0.18941-1.389-0.50508c-0.25254-0.31567-0.69448-0.94702-0.69448-0.94702l2.0203-1.3258,2.0203-1.389,0.12626-1.1364-0.69447-0.82075h-1.5152l-0.69448,0.0631-1.1364,1.3258-0.56821,0.69448h-1.894l-0.12627,0.88388-0.12627,1.3258-0.82075,1.1364-1.5152-0.12627-0.75761-1.4521-1.1364-0.94702-0.82075,1.0102-1.7678-0.31567-0.56821-2.2728-1.4521-0.88388-0.63135-1.2627,0.12627-1.3258-1.1364-1.3258,0.0631-2.6516,0.12627-3.0936,0.63135-0.94702-0.25254-1.0102-0.69448-1.0733-0.56821-0.56821-1.0102,0.44194-0.88388,0.37881-1.0102-0.12627-1.0733-0.88389-0.88388-0.82074-1.8309-0.69448-1.4521-0.44195-0.94702,0.94702-1.8309,0.75762-1.8309,0.1894-1.6415-0.31567-1.9572-1.0733-1.389,0.50508h-2.7148l-2.0834,0.0631-1.389,1.1364-0.0631,0.88389,0.69448,0.50507,0.12627,0.82075-0.82075,1.0733-1.5152,1.2627-2.6516,1.0733-1.5784,0.69448-1.1364-0.75762-2.0834-0.82075z","name":"Republic of Tatarstan"},"iv":{"path":"m144.26,252.7,2.0203-1.1364s0.94702-0.50507,1.1996-0.50507c0.25254,0,2.5885,0.31567,2.5885,0.31567l2.7148,1.1364,2.3991,1.1364,1.2627,1.1996s1.4521,1.0102,1.7046,1.1996c0.25254,0.18941,1.4521,1.2627,1.4521,1.2627l1.7046,0.63135,1.1364-0.88388h0.88388l0.50508,0.82074,0.1894,1.1996,1.0102,0.75762,1.5152,0.82074,1.0102,0.63135,0.44194,1.0102-0.69448,1.0733-0.12626,0.88388,0.75761,0.37881,0.88388-0.56821,1.389,0.63134,0.69448,0.94702,0.25254,1.2627-0.25254,0.50508-1.894,0.69448-2.9673,0.82075-3.0936,0.50507-2.3991,1.5152-3.4724,0.50508-0.94702-0.12627-1.7678-2.3991-3.5987-3.4724-2.7148-3.3461-0.82075-2.7779-0.88388-1.0102-2.1466-0.44195-0.69448-0.56821,0.50507-1.4521,0.56821-1.3258z","name":"Ivanovo Oblast"},"yr":{"path":"m154.11,228.33,1.7678,1.5784,1.9572,0.50507,1.7678,0.50508,1.3258,1.6415,1.9572,1.5784,1.5784,0.0631,1.0733-0.69448,0.82075,0.31568,0.3788,1.4521,0.12627,3.4093-0.0631,2.6516,0.25254,1.5152,0.88388,1.0102,0.56821,0.94702-0.37881,1.0733-1.7046,1.1364-2.7148,1.3258-3.283,2.2097-1.6415,1.0733-3.3461,0.88388-2.4622-0.1894-2.1466-0.63135-2.6516-0.69448-2.1466,0.63135-1.8309,1.0733-1.7046-0.88388-1.4521-1.0102-1.894-1.1364-1.1364-1.1996-0.25254-1.3258,0.56821-1.4521,2.0203-0.88388,2.2097-1.1996,1.6415-2.7779,1.0102-2.9673,1.1996-1.2627,0.75762-2.4622,1.6415-1.8309,1.9572-1.8309,2.7148-1.5152z","name":"Yaroslavl Oblast"},"kt":{"path":"m168.7,245,1.389,0.12627,1.2627-0.75762,1.5152-1.389,1.894-0.75762,1.894,1.1364,1.894,1.5152,2.5254,0.12627,0.63135-0.75761,0.75761,0.50507,1.2627,2.1466,2.2728,2.2728,1.5152,1.5152,1.1364,1.894,0.3788,2.2728,1.2627,1.7678,1.5152,1.6415,2.5254,1.389,1.7678,1.5152,1.7678,1.894,2.0203,0.88388,1.894,0.12627,2.0203-2.0203,1.6415-0.3788,0.63135,1.894,1.1364,1.0102-0.12627,1.6415-1.6415,1.5152-0.12627,1.894-0.3788,2.5254s-1.7678,0.75761-2.3991,0.75761c-0.63134,0-6.3134-0.12626-6.3134-0.12626l-3.1567,0.12626-1.1364,1.1364-1.2627,0.50507-2.0203-0.75761-1.5152-0.75762-2.0203-0.3788-1.0102-1.5152-0.88388-1.6415-0.75762-0.63135-1.1364-0.12627-0.88388,0.50508-2.1466,0.75762-3.283-0.25254-1.7678-0.50508-2.0203-1.2627-0.50508-0.50508,0.25254-0.63134v-1.1364l-1.389-1.2627-0.88389-0.50508-0.63134,0.37881-0.38556,0.10695-0.53571-0.35714,0.0893-0.89286,0.71429-0.625,0.0893-0.98214-0.89285-0.71429-1.7857-1.0714-0.98214-0.98215-0.26786-0.98214-0.71428-0.89286h-0.98215l-0.89285,0.625-0.625,0.0893-1.25-0.71429-1.4286-0.80357-1.3393-1.25-1.7857-1.3393-0.69-0.57,1.07-0.71,2.05-0.54,2.3214-0.71428,2.8571-2.0536,3.3036-1.6964z","name":"Kostroma Oblast"},"le":{"path":"m123.49,177.57,1.7678-1.6415,1.5152,0,2.2728-1.894,2.5254-0.50507,2.2728,0.63134,2.9042,2.1466,2.7779,1.5152,0.75761,2.5254,0.12627,1.389,1.0102,1.1364,1.1364-0.37881,0.75761-2.0203-0.12627-2.3991-0.88388-1.6415-0.88388-1.894,0.12626-2.0203,1.1364-1.2627-0.25254-1.894-0.75762-1.0102,0-0.37881,1.2627-0.25254,3.283,0.25254,3.5355,1.2627,2.2728,0.12627,1.894,0.12627,1.2627,1.1364,0.63135,1.2627,0,1.7678-0.37881,1.6415-0.25254,2.1466-0.63134,1.7678-2.1466,1.2627-0.75761,1.0102-1.0102,1.894-1.0102,1.1364-1.7678,1.1364-0.63135,1.2627,0.25254,1.1364,1.389,0.75762,2.1466,0.25253,1.0102,0.88389,0.25254,1.6415,1.0102,0.75762,2.1466,0.12627,1.1364-0.50508,3.4093-0.25254,1.7678-0.63134,2.0203-0.25254,1.5152,0.75761,1.0102,1.6415,1.1364-1.2627,1.389-1.7678,0.75762,0.88388,0.50507,2.0203,0.63135,2.2728,2.1466,0.50507,1.2627,0.75762,1.1364,1.0102,0.12626,1.2627,0.12627,1.6415-0.12627,1.7678-1.2627,0.75761-2.2728-0.25254-1.389-0.88388-1.389-0.25254-0.75761,0.88388-1.5152,1.0102-3.0305,0-1.5152,0.3788-2.7779,3.0305-1.0102,1.389-0.37881,2.1466-1.6415,1.0102-1.1364,0.12627-0.3788,1.2627-1.2627,0.63134-0.63135-1.0102-1.1364-1.1364-2.2728-0.12627-0.75761,0-1.1364-3.0305,0-2.9042-1.0102-1.5152-0.88389-1.894-0.12627-1.6415-2.2728-0.88388-0.88388-0.63135s-0.37881-1.0102-0.37881-1.5152c0-0.50507-0.25254-3.4093-0.25254-3.4093l-0.75761-1.1364-2.3991-0.25254-1.389,0.75761-0.75762-0.50507-0.12627-1.2627-0.63134-0.88389-1.0102,0.63135-2.1466,0.3788-2.7779-0.88388-1.5152-0.88388-3.283-0.37881-1.2627-0.88388-1.0102-0.75762,0.63135-1.2627,0.88388-2.1466,0.88388-1.389,0.12627-1.2627z","name":"Leningrad Oblast"},"ki":{"path":"m207.59,265.33,1.2627-0.88388,0.12627-2.0203,0-2.0203-1.0102-1.389-0.12627-1.6415,1.5152-0.37881,3.9143,0.25254,2.5254-0.88388,2.6516-1.1364,0.63134-1.389,1.1364-0.63134,2.7779,0.25254,1.389,1.7678,0.12627,2.7779-0.63134,3.0305-1.0102,1.389-0.75761,2.7779-1.894,0.75762-2.0203,0.12626-1.6415,1.7678-0.63134,1.6415-1.0102,0.63134-0.75761,0.88389,0.75761,1.389,1.6415,0.88388,1.0102,1.389-1.6415,1.894,0.12626,1.894,1.1364,0.88389,1.2627,0.50507,0.88388-1.389,0.88388-1.894,2.7779,0,3.1567,0.3788,4.2932,1.2627,1.7678,2.2728,2.1466-0.12627,2.1466-1.6415,1.6415,0.37881,1.2627,1.0102,0.75762,1.894s1.0102,1.5152,1.389,1.7678c0.3788,0.25254,2.5254,1.894,2.5254,1.894l0.25254,1.5152-0.88389,2.0203-2.0203,1.1364-3.5355,0.25253-1.2627,0.63135-1.2627,1.5152-0.25254,1.389,1.0102,1.389,0.12627,1.1364-1.5152,1.1364-0.75762,1.389-0.12627,2.1466-1.2627,1.0102-2.7779,0.12627-1.1364-1.2627-1.0102-2.5254-2.0203-0.12627-1.389-0.3788v-1.894l-2.0203-1.1364-3.1567,0.75761-1.7678,1.389s-1.2627,1.0102-1.2627,1.5152c0,0.50508-0.3788,2.2728-0.50507,2.7779-0.12627,0.50508-1.6415,1.5152-1.6415,1.5152l-2.5254,1.1364-1.894-0.50507-1.2627-1.389-1.5152,0.25253s-0.75761,0.50508-1.0102,1.389c-0.25254,0.88389-0.12627,2.7779-0.12627,2.7779l0.12627,1.894-2.0203,0.63135-3.4093,0.3788-0.25254,1.1364v1.389l-0.3788,1.389-1.7678,0.88389h-0.63135l-0.63134-1.5152-0.50508-0.37881,0.12627-2.5254,0.25254-2.5254,0.50508-1.5152-0.88389-1.6415-0.25254-1.2627,0.75762-2.9042,0.63134-2.5254-1.0102-1.5152-1.6415-2.5254-2.1466-1.5152-0.88388-0.63134-3.9144-0.12627-1.7678-1.2627-1.6415-1.5152-1.6415-1.5152-0.50507-0.50508,0.50507-1.0102,1.2627-1.6415,0.25254-1.0102,1.1364-0.75761,1.5152,0.50507,1.894,1.389,1.389-0.75761,2.1466-0.63135,1.389-1.2627v-1.5152l-1.2627-1.894-0.63135-1.5152s-0.78918-1.1049-0.85231-1.2627c-0.0631-0.15784,0.56821-0.69448,0.56821-0.69448l0.97858-0.63135,0.75762-0.75761s2.2728-0.0316,2.8095-0.0316c0.53664,0,3.1567,0.0631,3.8828,0.0631,0.72605,0,3.7881-0.44194,3.7881-0.44194l1.4521-0.59978s0.12626-1.5784,0.15783-1.7993c0.0316-0.22097,0.47351-2.4938,0.47351-2.4938l2.0203-2.3991z","name":"Kirov Oblast"},"bs":{"path":"m211.5,329.86,2.3991-1.6415,2.5254-1.6415,1.5152-0.25254,1.894,2.6516,2.2728,2.2728,2.9042,0,2.6516,2.5254,1.7678,2.5254,1.1364,1.7678,1.7678,0,1.2627,2.1466,2.6517,2.3991,2.2728,1.6415,2.0203,1.7678,1.2627,1.1364,0.88389,1.389-0.37881,1.1364-1.6415,0.63134-0.88388,1.2627,0.25254,1.389,1.389,0.63135-0.63135,1.2627-1.5152,0.50508-1.2627-0.75762-2.3991,0.37881,0,1.0102-1.5152-0.25254-0.50508-0.88388-1.5152-1.0102-4.5457,0-1.1364-0.37881,0-1.2627,1.7678-1.2627,0.12627-1.389-1.0102-0.88389-1.6415-1.1364-2.5254,0.25254-1.0102,2.1466-1.7678,2.6516-0.88388,2.0203,0.50508,3.0305,1.894,1.0102,2.0203-0.75761,1.6415,0.75761,1.0102,2.0203,2.5254,0.12627,2.0203,0.75761,2.7779,0,1.7678-0.50508,1.5152,1.1364-0.63135,1.389-1.894,1.5152-1.2627,1.1364-1.0102,1.389-1.2627,0-1.2627-0.63134-2.1466-0.75762-1.6415-0.3788-1.6415,1.2627-0.3788,1.5152-0.63135,1.389-2.3991,2.6516-1.6415,2.3991-3.9143,3.6618-1.894,1.5152-0.25254,2.0203-0.63134,1.5152-2.9042-0.25254-1.6415,1.7678-1.2627,1.389-0.50507,0.63135-2.0203,0-1.1364-2.0203-0.50508-0.63134-5.4296-0.63135-1.389-2.1466-2.7779,0.88388-1.2627-0.12627,0-0.50507,3.4093-4.4194,0-1.6415-0.88389-0.63134,0-1.1364,1.7678-1.1364,1.0102-1.389,0-2.0203-0.25253-0.50508-1.894-0.12627-2.2728,1.2627-1.7678-1.1364-1.1364-2.3991,1.2627-2.3991,1.0102-1.894-0.25254-2.5254,0-0.75761,0.88389-1.5152,0-3.1567-2.5254-2.9042-0.12627-2.0203,1.0102-2.6516,2.0203-4.1669,2.9042-2.1466,3.9143-3.1567,1.0102-2.1466-0.88389-1.389-0.12627-0.12627,0-0.75761,1.389-0.25254,2.3991,0.75762,1.389,0.12626,1.7678-0.63134,2.6516-0.25254,1.7678-0.12627,0.88388-0.63134,0-1.7678z","name":"Republic of Bashkortostan"},"cl":{"path":"m242.18,347.66,1.7678-0.88388,2.7779,0.50507,2.3991,2.1466,2.3991,1.7678,3.0305,1.894,2.9042,0,1.5152,1.6415,1.6415,2.3991,0.75761,1.894-0.63135,3.1567,0,2.7779-0.88388,1.389-1.7678,0.63135-1.6415,1.1364-0.75762,1.2627-2.0203,0.63135-1.894,1.5152,0,1.1364,1.5152,1.5152,2.0203,2.0203,1.1364,2.3991-0.37881,2.7779-0.75762,1.7678-2.3991-0.63135-2.6516-0.50507-3.283-0.37881-2.0203-0.50508-1.5152-1.7678-2.0203-1.7678-1.1364-1.1364-1.1364,0.50508-1.5152,1.1364-0.88388,1.0102,0,1.894,1.6415,1.2627-0.37881,0.75761-2.2728,0.63135v1.0102c0,0.50508,0.75761,2.0203,0.75761,2.0203l2.0203,1.7678,0.12627,1.894-1.5152,0.63134-1.5152-1.5152-1.389-1.2627-2.2728-0.63134-3.283,0.12627-1.5152,0.25253-0.63134,1.2627,1.0102,1.389-0.37881,1.894-1.0102,1.6415-4.5457,0.25254-1.6415-0.88389-1.6415-0.63134,0.50507-2.0203,1.6415-0.88388-0.75761-1.7678-2.0203-2.3991-1.6415-1.0102-1.894,0.12627-1.389-0.63135,0.63134-2.7779,1.7678-2.6516,4.4194-4.1669,3.7881-4.672,1.2627-2.9042,1.389-0.88389,2.5254,0.25254,2.0203,1.0102h2.0203l1.894-2.2728,2.2728-1.894,0.50508-1.389-1.5152-1.2627-2.1466,0.50507h-3.0304l-2.7779-0.88388h-1.5152l-0.88388-1.894-1.389-0.50507-1.7678,0.63134-1.0102-0.37881-0.88389-0.63134-0.63134-1.894-0.12627-1.6415,3.6618-5.6821,0.75762-0.63135,1.7678,0.37881,1.7678,0.88388,0.63134,1.1364-0.3788,0.75762-1.2627,1.1364v1.1364l-0.12627,0.12627,0.75761,0.63135,2.6516,0.12627h2.2728l1.5152,1.0102,1.2627,1.1364,1.1364-0.63135,0.50507-0.75761,2.0203,0.12627,1.7678,0.37881,1.1364-1.2627-0.37881-1.0102-0.75761-0.88388,0.25253-1.5152,1.5152-1.0102,0.63135-1.1364z","name":"Chelyabinsk Oblast"},"ud":{"path":"m231.7,302.33-0.12627,1.389-2.0203,2.7779-1.5152,1.389,0.12626,1.389-1.6415,1.0102-1.1364,1.5152-1.5152,2.3991-0.50508,1.894-0.50508,3.1567-2.0203,1.0102-2.2728,0.12627-0.63135,1.1364-0.37881,3.0304-0.12627,1.389-3.0304,2.0203-2.2728,1.389-1.0102,0-1.2627-1.5152-1.7678-0.75762-0.63134-1.2627,1.389-1.1364,2.0203-0.75761,0.50508-1.1364-0.37881-0.50508-1.5152-0.88388,0.25254-0.88389,2.7779-1.7678,1.0102-1.1364-0.50507-1.0102-0.75762-0.63134-2.0203,0.63134-1.1364,1.389-1.5152,0.63135-1.0102,0.25253-0.3788,1.5152-0.63135,0.75762-0.88388,0.25254-0.75762-1.0102-1.389-1.2627-0.75761,0.37881-1.2627,0.37881-0.88388-0.88389-0.63135-1.1364-1.0102-1.0102-0.63135-1.0102,0-1.1364,1.6415-0.88389,1.1364-1.1364,0.25254-2.0203,0.25254-1.0102,3.1567-0.50507,1.6415-0.50508,0.37881-4.4194s0-1.2627,0.63135-1.5152c0.63134-0.25253,1.2627-0.3788,1.2627-0.3788l1.2627,0.63134s1.6415,1.894,2.3991,1.389c0.75761-0.50507,1.894-0.88388,1.894-0.88388s2.3991-1.0102,2.2728-1.6415c-0.12627-0.63134,0.25254-1.6415,0.25254-1.6415l0.3788-1.389,2.1466-2.2728,1.2627-0.75761,2.2728-0.50508,1.6415,0.37881,0.88388,1.1364v0.75761l0.25254,0.63135,1.0102,0.12627,1.6415,0.3788,0.63135,0.50508,0.63134,1.6415,0.75762,0.75761z","name":"Udmurt Republic"},"pe":{"path":"M242.06,274.03l-2.28,1.16,0.5,1.5-0.5,3.53,0.5,1.28,1.41,2.41,2.25,1.62,0.65,1.66-1.4,2.12-2.41,1.03-2.87,0.63-1.66,0.87-1.13,1.54,0.5,1.24,0.63,1.38-0.13,1.03-1.9,1.63-0.38,2.4-0.87,1.6-0.13-0.19-1,0.12-1.28,2.5-2,2.29-0.15,1.53-0.88,0.87-2,2.03-1.91,3.41-0.62,3.9-1.28,0.88-2.25,0.38-1.28,0.78-0.63,4.9,2.53,2.66,2.13,2.28,2.53,0.25,2.28,1.5,3.41,4.94,1,0.37,1.28-0.12,1.12-1.25,0.88-1.28,1.03-1.75,1.25-1.66,1.28,0.88,1.5,1.28h2.41l2.03-0.91,0.5-1.75,0.25-1.91,0.87-0.75,0.88-1,0.78-0.5,2.5,2.75h3.69l0.87-1,0.5-1.5,0.25-1.65,0.88-1.25,4.69-0.38,2.15-0.78,0.63-1.5-0.63-0.62-0.12-1.41,1.12-1.38,0.75-1.03v-1.37l-0.5-0.88-0.62-1.03,0.25-1.75,1-1.53,2.03-1.5,3.15-0.5,1.88-1.91,2.28-1.62,2.28-1.66,2.28-1.65,0.88-0.75,0.5-1.25,1-1.78s0.9-1.12,1.53-1.75c0.63-0.64,1.62-1.91,1.62-1.91l1.16-1.37,0.25-1.66-2.41-0.38-2.65-0.75-2.66-1.65-2.75-1.38-2.66-1.28-2.53,0.66-3.15,0.12-3.66-0.9-2.9-1.63-1.63,0.85-0.41-0.22-1.9-1.25-1.38-2.03-1.12-1.13-2.28-0.78-0.13-1.63-1.12-1.28-1.41-1.5-1.91-0.5-2.62-0.25-2.41-0.78z","name":"Perm Krai"},"sv":{"path":"m286.13,291.72,1.7678-1.1364,1.1364,1.389,0.88388,2.3991,2.6516,1.5152,2.9042,2.1466,1.2627,2.3991,2.2728,2.7779,0.12627,1.7678,0.63135,2.0203,0.75761,1.5152-0.63134,1.7678-1.894,1.894-0.63135,1.7678-0.25253,4.7982,0.3788,2.7779,0.63135,1.0102-1.0102,2.9042-1.5152,1.7678-0.37881,2.3991,2.0203,1.2627,2.3991,2.0203,0.75761,2.0203,0.12627,2.6516-0.63134,1.6415,0,2.9042,0.75761,2.3991-0.25254,1.894s-0.88388,0.88388-0.88388,1.389c0,0.50508-0.50508,2.7779-0.50508,2.7779l-1.2627,1.2627-2.0203,0.12627-1.1364,0.88388h-3.0304l-1.5152-0.88388-2.1466,0.25254-1.389,1.1364-0.88388,1.389-0.25254,2.9042-0.75761,1.1364-1.1364,1.0102-1.7678,0.50508-3.0305,0.25254-2.0203,0.25254-1.0102,0.88388-1.894-0.37881-1.389-1.1364-1.894-1.894-2.5254-1.6415-1.5152-0.63135-2.2728,0.37881-1.894,0.3788-1.389-0.12626-1.6415-1.389-1.894-2.2728h-2.2728c-0.50508,0-1.6415-0.75761-1.6415-0.75761l-4.672-3.1567-1.6415-1.7678-2.9042-0.3788-1.389,0.12627-0.88389,0.12627-1.2627-1.2627-3.9143-3.283-3.1567-3.0305-0.50507-1.389,2.0203-2.9042,1.389-2.7779,0.75762-0.25253,1.6415,1.1364,1.1364,0.75761h2.7779l1.5152-1.389,0.50507-1.7678,0.12627-1.7678,2.5254-1.7678,1.7678,2.0203,1.2627,0.63134h2.3991l1.6415-1.1364,0.75761-2.0203,0.50508-1.894,3.7881-0.75762,2.5254-0.3788,1.389-1.2627v-1.0102l-0.88388-1.389,1.7678-2.1466,0.25254-1.1364v-1.389l-1.0102-1.6415,1.0102-2.5254,2.1466-1.6415,3.283-0.88388,1.1364-0.75762,8.0812-6.1872,0.88388-1.6415,1.6415-2.7779,2.1466-2.5254z","name":"Sverdlovsk Oblast"},"ku":{"path":"m255.69,383.01,2.3991,1.894,3.283,0.88388,4.2932,1.2627,3.1567,0.75762,4.1669-0.50508,2.5254,0.25254,2.9042,1.0102,3.5355,1.1364,3.5355,0.88388,3.283,1.0102,3.4093-0.12627,2.3991-1.2627,3.6618,0,1.0102-1.5152,0-1.894-1.5152-2.1466-1.389-2.7779s-1.5152-0.12627-2.1466-0.37881c-0.63135-0.25254-2.2728-1.6415-2.2728-1.6415l-0.75761-3.1567-1.389-1.7678-2.6516-1.2627-1.5152-1.6415-1.2627-2.2728-1.6415-1.5152-1.389-1.2627-1.0102-1.389,0.50508-2.3991,1.389-1.2627,1.1364-1.894-2.5254,0.37881-3.0305,0.12627-1.389,0.50507-0.75762,0.50508-1.2627-0.37881-2.0203-1.0102-1.7678-1.7678-2.0203-1.389-1.7678-0.75761h-1.2627l-3.0305,0.63134-1.7678-0.12627v1.1364l0.63135,0.88388-0.50508,2.2728v2.2728l-0.25253,2.1466-0.88389,1.1364-2.5254,1.1364-1.389,1.1364-1.5152,1.2627-1.7678,0.88388-0.50507,1.2627,0.63134,1.1364,1.894,1.894,1.389,1.389,0.63134,1.7678v1.894l-0.50507,1.7678z","name":"Kurgan Oblast"},"ko":{"path":"m224.63,259.27,2.1466-0.63134,0.63134-0.88388,1.894,0.12627,1.6415,1.894,2.1466,0.25254,2.1466-0.50508,1.5152-1.894,0.50508-1.5152-0.63135-0.88389,0.63135-1.5152,2.1466-1.2627,4.5457-1.894,2.6516-1.1364,0.25254-1.5152-0.50508-2.5254-2.1466-0.88389-3.283,0.12627-2.3991,1.6415-2.3991-0.75761s-0.50508-1.0102-1.2627-1.0102-1.5152-0.25253-1.5152-0.25253l0.50507-3.0305,1.7678-0.37881,1.389-1.5152,0.50508-1.894,2.1466-0.50508,2.2728,0.12627,0.63135-1.7678-0.63135-0.63134-0.63134-2.1466,0.63134-1.389,4.5457-2.0203v-1.2627l-1.0102-2.5254-0.63135-1.6415-1.6415-1.7678-0.63134-1.1364,0.25254-1.6415,1.2627-0.63134,1.7678,0.75761,1.5152,2.1466,1.6415,1.5152,2.2728,1.894,2.6516,1.2627,1.7678,1.1364,0.50508,1.7678,1.5152,1.5152,3.1567,0.3788,1.894,1.2627,2.9042,0.50507,0.88388,1.2627h2.0203l1.0102-0.63134-0.25254-1.5152-0.75761-1.5152,0.50507-1.0102,0.88389-1.5152s0.25253-1.1364-0.12627-1.6415c-0.37881-0.50508-1.1364-1.1364-1.1364-1.1364v-0.88388l2.7779-3.283,3.1567-2.1466,1.894-2.0203,1.0102-0.88388,2.3991,0.63134,3.4093,0.12627,2.5254,0.75762,4.2932,0.50507,2.1466,0.63135,3.283,0.12627,2.3991-0.50508,1.5152,0.12627,0.12627,1.894,1.2627,1.0102,2.1466,2.1466,5.3033,4.672,7.4499,4.672,6.4397,3.7881,5.177,3.0305,5.5558,3.283,2.7779,1.894,2.2728,0.25254h3.283l2.1466-1.0102,2.5254-2.3991,1.6415-1.2627,2.7779,0.25253,2.3991-0.12626,2.0203-0.63135,1.5152-0.88388,1.6415-0.37881,3.1567,0.12627,1.6415,0.25254-0.50508,1.5152-0.88388,1.1364-1.1364,0.63134-0.50508,1.894,1.2627,1.7678,1.2627,1.389,0.12627,1.894-1.1364,1.389-0.88388,0.25254-0.75762,1.389-2.0203,0.25254-2.3991-0.12627-2.1466,0.88388-2.5254,1.389-1.389,1.1364-3.0305-0.12627-2.1466-0.50507h-3.1567-2.0203l-1.0102,0.3788-1.389,1.5152-0.75762,0.88389-2.1466,1.6415-1.5152,0.50508h-2.3991l-2.3991-0.25254-1.5152,0.50508-2.9042,2.0203-2.2728,1.2627-1.5152,1.0102-1.5152,0.3788-1.2627-0.12626-1.2627-1.0102-0.12626-1.894-0.63135-1.389-1.6415,0.88388-1.5152,1.389-1.0102,1.2627-0.88388,0.50508-1.2627,0.50507-0.75762,0.37881-0.12627,1.7678-0.3788,1.7678-0.63135,1.389-0.88388,1.1364-1.0102,1.6415-1.894,1.6415-1.6415,1.389-1.2627,0.75762-2.7779,3.283-1.894,2.6516-1.1364,3.0305-0.50507,1.6415-1.5152,1.6415-2.0203,0.88388-1.5152,0.63134-1.7678,1.0102h-2.2728l-3.1567-1.0102-3.1567-1.6415-4.4194-2.1466-0.75761-0.3788-2.5254,0.50507h-3.283l-3.0305-0.88388-2.9042-1.389-1.0102,0.25254-1.6415-0.12627-1.5152-1.2627-2.2728-2.3991-1.894-0.88388-0.63135-1.5152-2.2728-3.0305-5.8084-1.1364-1.389-0.63134-1.7678,0.63134-0.75761,0.75762v0.75761l0.37881,0.88389v1.6415,1.0102l-0.50508,0.3788-1.389-0.63134-0.88388-0.37881-1.1364,0.25254-1.5152,0.88388-1.5152,0.50508-1.1364-0.25254-0.88389-1.389-0.88388-0.63135-2.2728-0.88388-6.0609-1.1364-1.2627,0.25254-1.1364,1.1364-0.63135,1.5152-1.1364,0.37881-1.6415-1.389v-1.1364l1.0102-1.389,0.50507-0.75761-0.50507-1.0102-1.1364-1.0102-1.1364-1.0102-0.3788-0.75761,1.5152-1.2627,1.1364-2.5254,1.6415-1.0102,1.6415-0.3788,1.894-1.2627,0.88388-2.3991,1.2627-1.2627z","name":"Komi Republic"},"mu":{"path":"m217.31,136.92,1.1364-1.5152,1.5152-0.75761,2.9042,0,4.2932,0.12626,2.1466-0.50507,2.5254-1.6415,0.88388-2.0203,0.12627-3.5355,1.5152-3.4093,1.0102-1.0102,4.7982,0,2.3991-0.63134,1.0102-1.2627,1.7678-0.12627,2.3991,1.0102,3.0305,1.894,2.2728,1.894,2.6516,0,2.2728-0.25253,0.25254,2.3991,1.894,0.3788,1.7678,1.0102,0,2.2728,0,1.7678-1.0102,0.63134-1.5152-0.3788-0.75761-1.1364-0.25254-0.63134-0.88388,1.0102-0.25254,0.63135,0.50508,1.1364,1.1364,0.88388,0.50507,0.75762-0.3788,1.0102-1.0102,0.63134,0,0.75762,1.1364,1.2627,0.88388,1.5152,0.88388,1.7678,2.0203,2.1466,0.75761,1.7678,0,1.7678,0,1.1364-0.50507,1.1364-0.25254,2.0203-0.12627,5.5558,0,5.5558-0.75762,1.389-0.25253,1.894,0.63134,0.88389,0.63135,1.0102-0.12627,4.0406,0,3.5355-0.63135,1.389-1.7678,1.1364-0.88389,0.88388,0,1.0102-0.25254,0.88389-1.1364,0.88388-2.7779,0.75761-3.6618,0.12627-3.1567,0.50508-1.6415,0.37881-2.5254-0.50508-2.0203-0.75761-1.894-1.389-1.894-2.2728-1.7678-2.2728-1.1364-1.894-0.63135-2.2728-0.3788-2.3991-1.2627-2.6516-1.1364-2.0203-0.3788-1.6415-0.37881-3.9143,0-1.7678,0-1.389-0.88388-0.88389-0.12627-2.9042,0-2.1466,0.75761-1.5152,0.12627-1.1364,0-1.5152-0.88388,0-0.63135,0.88388-0.88388,1.389-0.75762,1.894-0.25253,0.63135-3.5355,0-2.6516-0.25254-0.75761-1.5152,1.389-2.0203,1.1364-0.75761,0.25254-1.0102-1.7678-2.2728-1.5152-1.7678-1.2627-2.7779-1.2627-1.2627z","name":"Murmansk Oblast"},"kl":{"path":"M216.94,136.91l-2.28,1.53,0.12,1.62-1,2.28-1.9,2.04-1.88,0.87-4.31-0.13-0.88,1-2.28,2.16h-2.91l-2.4,0.38-0.13,4.03-0.62,1.9-2.91,0.38-1.87,0.25,0.12,1.4,0.88,1.5-1.78,1.29-1.25,0.5-3.41-0.91-1.66,1.16-0.37,2.9-0.13,4.16-1.25,2.28-2.65,1.62-3.41,1.16-8.72-0.12-3.53-0.91-5.19-0.75-4.28-0.75,0.88,1.87-0.13,1.54,0.07,0.53-0.94,5.65-2.53,1.5-2.03,3.32-2.91,1.87-0.13,1.66,2.66,1.25,1.91,0.75,1,2.4,2.9,0.25,5.07-0.75,1.65-0.9,2.25,0.53,1.78,1.37,1.38-1.62,1.12-0.78,1.78,4.69,1.5,0.62,2.91,1.53,0.06,0.69-0.12,2.69,0.06,1.78-1.63,1.53,1,1.12,2.29,0.5,1.75-0.62,2.53-1,0.62-0.5,1.91,1.5,1,1.9,1.03,1.88,3.16,0.25,3.28-3.03,0.75-1.5,1.25-1.38,2.4-1.28,2.03-1.75,0.5-1.15-0.37-1.25-1.91-0.63-1-1.03,0.13-1.63,1.37-2.4,1.78-1.91,1.66-1.87,1.25-2.16,1.38,0.25,1.78,1.53h1.9l0.88-0.53,0.12-2,1.5-2.03,0.25-1.75-0.25-3.16-0.5-1.53,0.63-1.78,1.4-0.87,1.38-0.63,3.03-2.53,0.5-1.13,0.53-1.28h1.38l3.4-0.62,2.16-1,1.5-1.28v-1.88-3.4l0.25-2.54,1.03-0.87v-1.16l-0.12-2-0.78-1.15-2-0.38-1.41-0.37-0.63-0.88v-0.75l0.63-1.15,1.28-1,0.75-0.63-0.38-1.03-1.65-2.37-1.88-2.29-1.4-2.15-1.75-2.53z","name":"Republic of Karelia"},"vo":{"path":"m185.36,208.76c0.12627,2.5254-1.389,5.0508-1.389,5.0508l-1.5152,1.894s-0.3788,1.0102-0.3788,1.7678c0,0.75762,0.12626,1.389,0.12626,1.389s0.63135,1.389,1.894,2.1466c1.2627,0.75761,2.0203,2.7779,2.0203,2.7779l1.0102,1.894,1.5152,1.2627,1.2627,1.0102,1.1364,1.894,1.2627,0.37881,3.1567,0.50508,1.5152,2.2728,1.0102,1.894,1.7678,0.63135,0.25254,0.63135,1.0102,2.2728,1.2627,0.75761,2.6516,0.25254,1.5152,0.12627,0.50507,2.7779,1.2627,2.0203,2.7779,1.389,1.389,0.12627,1.0102-0.63134,1.389,0.12627,1.0102,0.50507,0.75761,1.0102-0.63134,1.5152-0.75762,1.389,0.25254,0.75762,1.2627,1.1364,0.75761,0.50508,1.0102,0.50507,0.3788,0.63135v1.0102l-1.5152,1.5152-2.0203,0.63135-2.0203,0.75761-4.2931-0.25254-1.2627,0.88389,0.25253,1.1364,0.88389,1.2627v2.6516,1.1364l-1.0102,1.1364-0.75761-0.63134-1.1364-1.0102-0.37881-1.5152-1.0102-0.12626-1.6415,1.0102-1.0102,1.0102h-1.7678l-3.0305-1.5152-2.1466-2.1466-2.0203-1.1364-1.894-1.6415-2.0203-2.7779v-1.894l-1.894-2.7779-2.5254-2.2728-1.5152-2.0203-1.2627-1.7678-0.63135,0.75761-1.6415,0.12627-1.6415-0.25254-2.2728-1.894-0.88388-0.50508-1.2627,0.63135-2.7779,1.7678-0.63135,0.37881-1.2627,0.12627-0.88388-0.50508-0.50508-1.2627-0.63134-1.894,0.25254-4.0406-0.50508-2.5254-0.50508-1.2627-1.2627,0.12627-1.2627,0.37881-0.88388-0.25254-1.389-1.2627-1.6415-1.7678-4.0406-1.0102-1.2627-1.1364-0.50508-1.0102,0.63135-2.0203-0.50508-0.88388-1.0102-0.75761-1.1364-0.63135-1.894-0.37881-0.25254-0.12627,0.50508-2.7779-0.50508-1.6415-0.63134-1.2627-0.88388-0.88389-0.37881-0.50507-0.12627-1.0102-0.25254-1.5152,0.63135-0.88388,0.75761-0.88388,1.389-0.25254h1.6415l0.88388,1.2627,1.0102,0.88388,1.1364-0.50507,0.25253-1.1364,1.2627-0.25254,1.1364-0.63135,0.75761-1.1364,0.12627-1.5152,3.283-3.6618,1.2627-0.88388h1.7678l2.0203-0.37881,1.389-0.75762,0.88388-0.63134h1.1364l1.5152,0.88388h1.2627l0.88389,0.75762,0.50507,0.88388,1.389,0.63134h1.1364l1.389-0.3788,1.5152-0.50508,1.1364-0.37881,0.63135-0.25253,0.88388,0.12627,1.0102,0.88388,1.2627,1.6415,0.50507,1.2627z","name":"Vologda Oblast"},"ar":{"path":"M391.06,151.03l-3.56,1.06-2.16,0.91-3.56,0.19-1.59,0.87s-1.26-1.07-1.97-1.25c-0.72-0.18-0.91,1.1-0.91,1.1l-1.78,2.65-2.69,1.63-3.03,0.87-2.31,1.78s-2.15,0.37-3.22,0.72c-1.07,0.36-2.5,0.19-2.5,0.19l-1.59,0.72,1.06,1.78-2.16,1.25,0.38,0.72,1.25,1.44,1.78,1.59,1.78,1.78,0.91,1.63,1.4-0.72,0.91-1.97,2.16-0.72,1.25-0.53,1.93-0.19,0.91-1.59h1.97l1.25,0.87,1.59-1.25,1.1-1.25,2.65-0.15,0.72-0.57,3.41,0.72,1.78-1.06,0.34-1.44,2.69-0.34s1.07-0.01,2.5-1.44l0.72,1.06,2.84-0.68s1.98-0.19,2.69-0.19,3.03-0.38,3.03-0.38h2.31l2.35,1.25,1.78,0.91,1.25-0.72,0.72-0.87,4.28,1.06,1.97-1.44,3.22,0.19,4.09-0.72,1.25-1.59,1.97-2.88s-1.26-0.89-1.97-1.25-2.69-1.44-2.69-1.44l-3.22,0.57-4.43,1.59-4.32-0.91-2.5-0.15-3.18-0.72-1.63-0.91-1.59-1.78-1.44,0.72-1.97,1.06-2.5-0.15-3.22-0.91-2.5-0.72zm-35.53,14.47l-2.5,0.53-1.78,1.63-2.5-0.38s-1.44-1.06-1.44-0.34v1.78l0.72,1.59-2.12,1.25-2.88,1.1-1.06,1.25h-2.16l-0.72-1.1-1.59-0.87-2.69,2.12-0.15,3.03,1.93,2.69,1.44,2.16s1.26,2.14,0.91,3.03c-0.36,0.89-4.28,2.5-4.28,2.5l1.06,2.5,1.25,1.59v1.97l2.31,0.53,2.88,1.97,2.12,2.31,1.97,0.38s1.06-1.07,1.06-1.78c0-0.72-0.15-4.48-0.15-5.38,0-0.89,1.59-8.37,1.59-8.37l0.34-1.44,4.13-2.69s0.88-1.07,2.31-1.97c1.43-0.89,4.66-3.03,4.66-3.03l1.78-1.4s0.71-1.64,0-1.82c-0.72-0.17-1.62-0.53-2.16-1.25-0.53-0.71-3.03-2.65-3.03-2.65l-1.25-1.44zm-132.28,14.34l-0.63,0.63-2.28,0.25-0.87-0.13-1.78,0.91v1.38l-0.63,1.65-1.15,0.75-0.13,1.38,0.91,0.78,0.87,0.87-0.12,1.25-1.25,1.28-1.66,1.5-1.65,0.13-1.38-1-0.62-1.53-1.41-2-1.25-1.03-2.03,0.53h-1l-2.41-1.66-1,0.38-1.66,2.15-1.37,2-1.66,1.78-1.25,2.66,0.38,1,1,1.28,1.78,0.25,0.12,1-0.12,1-2.78,2.41-2.16,0.87-1.87,3.03-2.53,2.53-2.91,0.5-1.13,0.13-0.5,0.91-0.28,1.87-0.87,2.16-1.75,2.03-0.13,1.87,1.25,2.79,1.5,1.28,2.04,3.53,3.78,4.15,1.28,0.75,3.15,0.38,0.38,0.65,1.37,1.38,1.66,2.53,1.38,0.5,0.5,1.66,0.9,1.5,3.28,0.5,1.63,0.25,0.78,1.4,0.37,2.13,0.75,1.15,2.41,0.88,1.5,0.75,1.28-0.5,1.13-0.25,1.37,0.75,0.91,1.66-1.03,1.25-0.13,1.53,0.66,1,1.25,0.75,1,1.03,1.03,0.62,0.75-0.37,1.25-0.25,1.41,0.5,1,1.37,0.5,0.91,0.24,2,0.26,1.03h0.65l0.88-0.16,0.87-0.5,0.63-0.37h1.03l0.75,0.75,0.62,0.91,0.88,0.25,1.4,0.25,1.88-0.5,1.41-0.5,1.37-1.79v-0.87l-0.37-0.66-0.26-0.5,0.26-1,0.5-0.5,2.78-1.28,2.4-1,1.66-1.12,1.87-0.78,0.5-0.75,0.13-1.38-0.75-1.53-1.13-0.87-2.15-0.13h-1.5l-1.53,0.5-1,0.75h-1.28l-0.63-0.12-1-1.13-1.53-0.37-0.75-0.38,0.25-1.53v-1.13l1.66-0.5,0.74-0.78,0.76-0.87,0.62-1.63,0.53-0.37,1.5-0.53,1.78,0.25,1-0.5-0.12-1.38-0.5-0.87-0.5-1.66,0.25-0.88,0.87-0.62,1-0.53,1.41-0.63,1.37-0.75,0.38-0.75v-0.5l-0.88-1.9-0.75-1.41-0.9-1.62-1-0.75-0.63-1.28,0.38-1.88,0.62-0.5h1.28l0.88,0.38,1,0.87,1.41,2.16,2.65,2.37,1,0.91s1.65,0.49,2.28,0.75c0.63,0.25,1.38,1,1.38,1l0.5,0.62,0.37,1.03,0.53,1,1,0.63,1.38,0.37h1.41l1.12,0.53,0.88,0.88,2.03,0.5h1.37l0.28,0.88,1,0.53,1,0.25,0.88-0.54,0.78-0.74-0.13-1.26-1.03-1.03,0.38-0.87,0.78-1,0.37-1.53-0.25-1-1.15-0.75-0.13-1.28,0.91-0.88,3.15-3.28,1.88-1.12,1.91-1.79,0.25-1.25-0.63-0.5-1.65-0.9-1.63-1-2.16-0.25-1.25,0.62h-1.4l-1.5-1.12-1.03-1.78-0.75-1.75-1.5-3.16-1.41-2.28-0.75-1.41-0.88-2.25-0.12-1.15-2.41,0.25-0.75-0.63-1.53-1.12s0.25-0.5,0.88-0.5,1.02-0.41,1.53-0.66c0.5-0.25,0.25-0.87,0.25-0.87s-0.37-1-0.88-1.76c-0.5-0.75-0.77-0.77-1.28-1.15-0.5-0.38-0.75-1.75-0.75-1.75l-1.25-0.41-2.03-0.5-1.66,0.13-1.5,0.53-1.9,0.12-0.88-0.65-1.62-1-2.03-0.13h-2.78-2.53l-1.63,0.75-0.91,0.75-0.37,1.66-1.13,1.37-1.12,2.04-1.28,0.87h-2.41c-0.63,0-1.75-1-1.75-1l-1.03-1c-0.51-0.51,0-2.03,0-2.03s0.13-1.53,0-2.16-1.5-1-1.5-1l-2.03-0.87s1.65-0.78,2.16-1.16c0.5-0.38,0.37-1,0.37-1v-2.28c0-0.63-0.25-2-0.25-2l-0.75-1.91zm110.16,1l-0.19,1.1,0.53,1.78,1.44,0.72,0.53-0.72v-1.63l-0.38-1.25h-1.93zm-28.22,6.19l-2.35,0.78-1.4,2.07-2.88,1.43-0.25,1.07,1.78,1.43,2.13,0.97,3.22-0.44,3.5-0.9,0.25-1.6-0.78-1.96-1.1-1.88-2.12-0.97z","name":"Arkhangelsk Oblast"},"tu":{"path":"m299.02,389.7,2.0536,0.80357,2.1428,1.1607,1.6072,1.3393,1.6071,1.5179,1.7857,0.71428,2.3214,0.17858,0.89286-1.0714,1.6071-1.875,0.53572-2.3214,0.625-2.1429,2.2321-1.7857,1.875-0.44643,1.25-2.5,1.6964-1.0714,2.9464,0.26786,1.6071-1.6072s0.625-2.3214,0.53571-2.6786c-0.0893-0.35714-0.80357-2.5893-0.80357-2.5893l-0.89285-1.875-0.625-3.3036-0.71429-2.2322v-1.7857l1.5179-1.9643,2.2321-2.5,1.4286-1.4286,3.125-0.26786,0.35714,1.4286-0.89285,1.6071-1.6964,1.6964-0.17857,1.25,2.5,0.35714,4.0178,0.35714,1.9643,1.6072,3.0357,1.7857,1.5179-1.25,2.9464-0.17857,2.1429,1.4286,3.3928,1.0714s2.5-0.98214,2.9464-1.1607c0.44643-0.17857,3.5714-0.44642,3.5714-0.44642l0.89286-0.98215-0.53572-1.0714-1.6964-1.25-2.9464-2.2321-1.0714-1.4286s-1.6964-0.44643-2.3214-0.44643-2.6786-0.80357-2.6786-0.80357l-0.17857-2.6786-0.26786-2.4107-1.3393-1.3393-0.44642-2.2321-0.53572-3.5714-0.35714-0.89286-2.4107-2.7679-1.1607-0.71428s-2.6786-0.26786-2.9464-0.26786h-5.0893l-0.98215-0.26786s-0.625-1.5178-0.625-1.875c0-0.35714-0.98214-1.5178-0.98214-1.5178l-1.875-0.35715-1.25,1.25-2.4107,1.875-2.1429,0.89286h-3.0357l-4.6428,0.0893-2.9464,0.26785s-1.4286,0.53572-1.7857,0.625c-0.35714,0.0893-4.375,0.0893-4.375,0.0893l-3.0357-0.0893-1.4286,0.35715-0.89286,1.5178-0.53571,2.3214-0.89286,1.3393-2.3214,0.71428-1.6071,0.53572-1.5179,0.35714-1.7857-0.17857-1.3393-0.625-1.4286,0.17857c-0.35714,0.17857-1.6964,1.0714-1.6964,1.0714l-1.1607,2.1429-0.35715,2.4107-1.6071,2.3214-2.1429,2.5893-0.98214,1.5179,0.26786,1.25,0.71428,1.3393,1.5179,1.25,1.25,1.6071,1.6964,1.875,1.0714,1.6964s3.0357,0.98214,3.0357,1.5179c0,0.53571,1.6964,2.9464,1.6964,2.9464l0.625,1.875,1.6071,1.4286,1.875,0.71428,1.0714,0.80357,1.4286,2.3214,1.0714,1.4286v1.6072z","name":"Tyumen Oblast"},"ne":{"path":"m260.27,198.54,1.6071-0.89286,1.4286-1.1607,2.0536-1.0714,1.1607-1.25,0.625-3.3929,1.1607-1.6071s1.4286-0.80358,2.4107-1.0714c0.98215-0.26786,2.3214-0.26786,2.6786-0.26786,0.35714,0,1.5178-0.98214,2.0536-1.5179,0.53571-0.53571,3.0357-2.5,3.0357-2.5l0.71429-1.0714v-2.2321l1.25-1.9643s0.89285,0.17857,0.98214,0.625c0.0893,0.44642,0.26786,1.5178,0.625,1.6964,0.35714,0.17858,1.875,1.4286,1.875,1.4286l1.6964,1.1607,0.98214,0.89286-0.0893,1.3393-0.625,1.4286-0.44643,1.7857v1.6964l-0.26786,1.0714-0.44643,0.80357-0.26786,1.25-1.25,0.71428-1.3393-0.625-1.25-0.98214-0.625-0.80357-2.3214-0.53572h-3.0357c-0.44643,0-2.1429,1.1607-2.1429,1.1607l-0.80357,1.4286,0.17857,1.0714s0.53571,0.89286,0.625,1.25c0.0893,0.35714-0.71429,1.1607-0.71429,1.1607l-0.89285,1.6072s-0.26786,1.1607-0.0893,1.4286c0.17857,0.26785,0.625,0.80357,1.1607,1.25,0.53572,0.44643,1.875,1.5178,2.1429,1.6964,0.26786,0.17857,1.875,0.89285,1.875,0.89285s2.3214,0.17857,2.8571,0.17857c0.53572,0,1.9643-0.26785,1.9643-0.26785s1.5179-0.98215,1.875-1.1607c0.35714-0.17857,1.9643-1.1607,1.9643-1.1607s1.0714-0.44643,1.4286-0.35714c0.35714,0.0893,1.3393,0.98214,1.3393,0.98214l2.3214,0.17857s0.35714-0.44643,0.71429-0.80357c0.35714-0.35714,0.53571-0.71429,0.98214-0.35714,0.44643,0.35714,1.875,1.3393,1.875,1.3393l1.7857,0.44643h5.0893l2.5893,0.0893s0.80357,0.80357,1.25,0.89285c0.44642,0.0893,3.3928,0.53572,3.3928,0.53572l1.5179,1.4286,0.71429,1.9643,1.1607,0.17858,0.71429-1.5179,0.89285-1.0714,1.875-0.17857,0.89286,0.53571,2.1429,0.17857,2.5893,0.44643-0.44643,0.80357-0.98214,0.80358-1.6964,0.625-0.80357,0.98214-0.71428,0.98214-1.6964,0.71429-0.26786,1.0714,1.3393,0.98214,1.25,0.53571,0.625,2.0536,0.71428,0.35715,1.6964-0.80357s1.3393-0.89286,1.6071-0.89286c0.26786,0,3.3036,0.53571,3.3036,0.53571l2.6786,1.3393,1.5178,1.3393,1.4286,0.89286,4.4643,0.17857,0.71429,0.71429,1.5178-0.26786,2.5893-0.35714,1.7857-1.3393,0.625-1.7857s0.53572,0.625,0.53572,1.1607c0,0.53572-1.6964,2.7679-1.6964,2.7679l-0.71429,1.7857v1.0714l-1.1607,1.1607-0.89286,0.625-0.44643,0.98214,0.44643,0.80357h1.4286l0.80357-1.6071,0.17858-0.53572,1.5178-0.0893,1.5179,1.25,2.3214,0.35714,1.1607-0.89286,1.3393-1.1607,0.53571-0.89286-0.71428-1.0714-0.35715-1.4286,1.5179-1.1607,0.71429-1.875-0.53572-1.6964-1.25-0.80357-0.71428-3.3929-0.26786-3.125s-0.26786-0.89286,0.0893-1.25c0.35714-0.35714,2.2321-1.6964,2.2321-1.6964l1.3393,0.17857,1.1607,1.4286,1.0714,1.9643,0.35714,2.1429-0.89286,3.3036,0.89286,1.0714,2.8571,2.4107,2.7679,2.8572,3.3929,2.5893,2.1428,3.3036,1.6964,3.3929,0.80357,1.875,0.17858,1.6071-1.0714,1.1607-0.98215,2.0536-0.98214,1.5179h-2.5c-0.44643,0-3.6607-0.17858-3.6607-0.17858l-2.1429,0.98215-2.7679,0.71428h-3.0357l-1.7857-0.17857-2.4107,1.875-3.0357,2.4107-1.6072,0.53571-2.7678-0.0893-2.0536-0.53571-4.2857-2.4107-23.036-13.929-7.6786-6.875-1.25-1.1607v-1.3393l-0.98214-0.625-2.4107,0.625-5.0893-0.44642-5.625-0.98215-5.1786-0.80357-3.125-0.26786-4.1071-2.3214-2.0536-0.44643-1.7857,0.625-1.7857-0.26786-1.5179-1.7857-4.2857-8.4822-0.98215-2.4107z","name":"Nenets Autonomous Okrug"},"om":{"path":"m358.39,368.89,0.71428,2.5-1.25,1.6071-1.25,1.9643,0.53572,1.6071,0.71428,1.9643-1.25,1.9643s-1.0714,1.25-1.0714,2.1429c0,0.89286,0.17857,3.0357,0.17857,3.0357l1.7857,1.6072,0.35714,2.3214-0.53571,3.3929-1.9643,0.89286-1.25,1.6071,0.71429,2.3214-0.35715,1.9643-3.9286,0.17857s-1.4286-0.89286-2.3214-1.0714c-0.89285-0.17857-3.3928,2.8571-3.3928,2.8571l-2.5,2.1429-0.89286,4.2857,0.53571,0.89286,1.9643,2.1429,0.35714,2.6786-1.6071,2.6786-1.0714,1.7857-0.17857,3.0357-2.5,2.1429s-2.3214,1.0714-3.0357,1.0714h-4.8214l-1.6072-0.71428c-2.1428,1.4286-3.75,0-3.75,0l-1.6071-0.71429-1.9643-0.35714h-1.0714l0.35714-1.7857,1.7857-1.0714,0.71429-1.4286-2.3214-1.25-2.1429-2.3214-1.9643,0.89285-0.89286-0.71428v-3.75l-1.4286-0.89286-2.8571,0.35714-2.8572-0.89285-0.89285-0.53572-0.17857-2.1428,2.1428-2.6786,0.71429-2.3214,0.35714-2.6786v-4.1071l0.71429-2.1429,1.4286-3.9286,1.6071-2.5,2.3214-0.53571,1.0714-1.25,1.0714-1.7857,1.6071-0.89285h2.6786l1.6071-1.4286,0.89286-3.9286-1.4286-3.2143-0.71429-3.0357-1.25-3.3928,0.35715-1.6072,4.4643-4.6428,1.0714-0.89286h2.6786l0.17857,1.6071-1.25,1.6072-1.7857,1.25-0.17857,1.4286,1.4286,0.35714,3.2143,0.35714,2.3214,0.17857,2.1429,1.4286,1.9643,1.4286,1.0714,0.35714,1.0714-0.71429,1.9643-0.35714,2.3214,0.35714,3.5714,1.6072h2.5l2.1428-1.0714h2.1429z","name":"Omsk Oblast"},"ht":{"path":"m329.64,260.32,0,3.75-0.53572,3.2143-1.6071,2.3214-2.3214,2.3214-0.89286,1.25,1.9643,1.9643,1.7857,2.3214,5,1.9643,4.8214,0.17857,3.5714,1.4286,2.3214,2.6786,0,1.4286-2.1429,1.7857,1.4286,1.4286,2.3214,2.8572,1.9643,1.0714,2.1428-1.0714,1.7857-0.89286s1.6071,0.71429,1.9643,0c0.35715-0.71429,0.89286-2.1429,0.89286-2.1429l1.6071,2.1429,1.4286,2.8571,1.9643,1.6072s0.35714,2.1428,0.35714,2.8571v4.6429l1.9643,3.3928s0.35714,0.17857,0.71429,0.89286c0.35714,0.71429,0,2.1429,0,2.1429l1.0714,1.25,2.5,0.53571,3.75,0.71429,1.4286,0.89285s2.8571,2.1429,3.5714,2.6786c0.71429,0.53571,1.25,1.6071,2.1429,1.9643,0.89286,0.35714,3.5714,0.53572,3.5714,0.53572l2.8571,0.35714,0.89286,1.0714s0.35714,1.6071,0.71428,2.6786c0.35715,1.0714,1.4286,1.7857,1.4286,1.7857l3.0357,0.17857,1.7857,0.53572,0.35715,1.9643,0.35714,1.4286,1.0714,2.5c1.9643,0.17857,2.5,0.17857,3.5714,0.17857s3.3928,1.0714,3.3928,1.0714l1.9643,0.71428,2.8571,0.35714,2.8572-1.0714,3.2143-1.9643,3.0357,0.53571,1.9643,2.6786s0.35714,1.7857,1.0714,2.1428c0.71429,0.35715,2.8571,0.53572,2.8571,0.53572l2.3214,1.6071,0.71429,2.3214,1.9643,0.71428,2.6786-0.89285,1.9643,1.6071,1.0714,3.0357v2.3214l-0.35714,1.6072-0.53572,1.9643,3.0357,1.9643,2.5,1.7857,0.35714,2.3214v1.0714l-3.75,1.7857-2.6786,0.53572-3.2143,0.17857-3,0.15-1.61-1.07-1.7857-0.71428-2.3214,0.35714-2.3214,1.6071-2.6786,1.0714-2.1429-1.9643s-2.8571-0.35714-3.5714-0.35714c-0.71429,0-2.3214-1.7857-2.3214-1.7857l-0.89286-1.25-3.9286,0.17857h-3.5714l-1.6071-2.5s-1.25-0.89286-2.1429-0.89286c-0.89286,0-4.4643-1.25-4.4643-1.25l-2.5-2.3214h-1.25c-0.71428,0-2.3214,1.25-2.3214,1.25l-2.5,2.1429-1.7857,2.6786-2.8571,2.5-1.6071,3.3929-4.4643,1.6071-3.5714,0.89286-0.35714,2.1429-0.71429,2.1428-2.6786,1.25h-2.8571l-5.8929-5.5357-3.9286-0.89286-1.0714-1.4286-0.53571-4.1071-1.0714-1.25-1.0714-5.3572-0.53571-1.7857-3.5714-3.2143h-5.5357l-3.0357-0.35714-1.9643-2.8571-1.6071-0.53572-4.4643,3.0357-3.3929,0.71428h-5.1786l-5,0.71429-4.2857,0.53571h-3.5714l-1.4286-0.17857-0.53571-2.8571-0.35714-3.2143,0.89285-3.2143-0.89285-3.2143-2.3214-2.1428-1.0714-0.89286-1.0714-1.0714,1.25-2.6786,1.4286-2.3214-0.17857-2.1429-0.71429-3.2143,0.71429-5.5357,1.4286-1.7857,1.4286-2.1429-0.71428-2.3214-1.0714-3.5714-1.9643-2.6786-2.3214-3.3928-3.3928-2.1429-1.7857-1.9643-1.0714-2.6786,3.3929-2.1429,1.6071-2.6786,2.3214-4.8214,2.1429-2.6786,2.5-1.9643,3.5714-3.3929,1.6071-1.7857,1.7857-3.3929-0.17858-1.7857,0.89286-1.0714,2.1429-1.0714,1.4286-1.9643,1.6071-1.0714,1.25,0.17857,0.89286,2.3214,0.35714,1.0714,1.4286,0.35714,2.5-0.71428,3.0357-1.6071,1.4286-1.25,1.25-1.0714,2.5-0.53572z","name":"Khanty–Mansi Autonomous Okrug"},"ya":{"path":"m366.25,234.25,1.4286,2.6786,1.6071,1.7857,1.6072,2.6786,1.0714,3.0357,0.89286,2.8572,3.0357,0.17857,1.7857-1.6072,1.4286-1.25-0.53571-3.2143s-0.89286-1.4286-0.53572-2.3214c0.35715-0.89286,1.7857-2.5,1.7857-2.5v-2.3214l-2.1429-1.6071-1.25-2.5s0.71429-1.6071,1.4286-1.9643c0.71429-0.35714,3.75-2.3214,3.75-2.3214s1.6071-3.75,1.9643-4.4643c0.35714-0.71429,0.35714-4.8214,0.35714-4.8214l0.89286-1.4286,7.5-2.1429,4.8214-3.5714,5.7143-6.0714,3.2143-2.1429,2.1428-0.71429,1.7857,2.3214,3.3928,0.35714,1.7857,1.25,1.0714,2.6786,0.17857,1.7857-0.89286,3.75-2.1429,2.6786-2.3214,2.8571-3.0357,1.6072-1.25,1.0714-0.35714,1.9643,1.0714,2.1429,0.17857,2.8571-0.89286,2.8571-2.1429,2.6786-1.7857,3.2143-2.6786,4.4643-1.25,3.5714-0.89286,2.1429-0.17857,2.5,0.35714,2.6786,0.71429,2.3214-0.71429,1.4286-3.0357,2.1429-1.0714,3.2143-0.89286,3.2143h-3.2143l-2.3214,1.25-2.1429,3.3929-3.5714,0.53571-2.3214,1.25-1.4286,1.4286h-3.5714l-1.4286-1.0714-1.0714-2.6786-0.71429,0.53572v1.6071l-1.9643-1.4286-0.71428-1.9643-1.0714,0.71429-0.17857,1.9643,1.7857,2.1428,2.5,2.1429,2.5,1.25,3.2143,1.0714,2.1429,1.25,2.1428-0.89286,3.5714-1.7857,3.0357-0.71429,3.75-1.0714,2.3214-3.0357,3.2143-2.6786,3.3929-1.6072,2.1428-1.7857-0.17857-2.1429-0.89286-2.3214-0.17857-1.7857,2.1429-2.1429,4.2857-0.89285h3.3929l1.4286,1.4286,1.25,3.0357v2.8571,3.0357l-1.6071,1.4286-1.25,2.5,0.17857,3.5714,1.7857,1.25,3.2143,0.71428,2.1429,2.8572,1.9643,3.2143,0.53572-0.71428-0.53572-4.1072-2.5-3.2143-3.75-1.0714v-2.8571l2.3214-3.0357s1.7857-0.35714,1.9643-1.0714c0.17857-0.71428,0.17857-3.5714,0.17857-3.5714l-0.89286-3.9286-2.6786-2.6786-2.6786-3.2143-0.89286-1.4286h-2.1428s-0.53572,1.25-1.4286,1.25c-0.89285,0-2.6786-1.25-2.6786-1.25l-1.6071-1.0714-0.53571-2.5,1.4286-3.75,2.3214-3.2143,2.1428-2.6786,3.0357-1.25,0.17857-4.4643-0.17857-3.0357v-3.0357l0.17857-2.3214,1.7857-2.3214,1.4286-1.4286,2.1429-0.35715,3.2143-0.53571,2.3214-2.5,1.7857-1.0714,1.25,2.1429-1.9643,2.3214-0.89285,1.4286-1.0714,4.4643-1.25,2.5,1.25,1.7857,2.6786,2.1429h2.8571l1.4286,2.1428,2.3214,2.5,1.7857,0.35715-1.4286-2.1429v-2.5s-1.25-1.25-1.9643-1.6071c-0.71429-0.35715-3.5714-2.8572-3.5714-2.8572l-1.25-3.5714-0.17857-1.4286s1.9643-0.71428,2.6786-0.71428c0.71429,0,3.2143,0.89285,3.2143,0.89285l0.89285,1.7857,1.6072,0.17857,1.25-0.71429-0.35715-1.9643,0.17858-1.9643,1.4286-0.35714,1.6071,0.71429,1.7857,1.4286,1.25,1.0714,0.89286,1.7857-0.35714,1.7857-2.3214,2.5-3.0357,1.25,1.0714,1.4286,2.6786,2.1428,0.35714,2.8572,0.17857,3.3928-0.71429,2.6786-2.5,1.4286-2.6786,1.4286-3.5714,1.7857-2.1428,2.1429,0.35714,2.6786,1.4286,2.5,1.25,2.5,1.6071,1.0714h3.3929,2.5l1.7857,1.6071,0.53571,3.0357,0.17857,3.3928v2.8572l-1.9643,3.2143-1.7857,2.5h-2.6786l-0.71429,0.53572,0.53572,1.9643,0.71428,1.7857-0.53571,2.5-0.89286,1.25,2.3214,3.3928,0.53572,1.7857,0.35714,1.7857-1.25,1.7857-1.0714,1.25,0.89286,2.1428-0.17857,2.5-1.6072,1.6072,1.6072,1.7857,2.1428,1.9643,1.6072,1.4286-0.17858,3.3928-1.4286,2.3214-0.17857,2.6786,2.3214,2.1429,4.6429,0.89286,0.89285,1.4286-1.4286,2.1429-0.53571,3.3928-0.89286,2.3214-2.6786,1.4286s-0.89286,0.53572-1.6071,1.0714c-0.71429,0.53572-1.7857,2.8572-1.7857,2.8572l1.9643,1.7857,0.17857,2.3214-1.4286,2.1429-1.25,2.5-2.6786,2.3214-2.8572,2.8572-0.89285-1.7857-1.6072-2.1428-1.7857-1.0714-1.9643,0.71428-1.9643-0.71428-0.71429-1.6072-1.25-1.25-2.5-0.89285-2.1428-0.89286-0.71429-1.6071-0.89286-1.7857-1.4286-1.4286-2.8571-0.17857-2.5,1.4286-2.5,1.0714-2.6786,0.17857-4.1072-1.6071-3.5714-0.35714-2.1429-0.17858-0.89286-1.9643-1.0714-2.3214v-1.4286l-3.3928-0.71429-2.3214-0.53571-0.89286-2.5-0.71429-2.3214s1.4286-0.17857-1.0714-0.35714-5.5357-1.0714-5.5357-1.0714l-1.4286-0.53572-3.2143-2.5-2.5-1.6071-2.8572-1.0714-3.2143-1.25-1.25-0.89285-0.17857-2.1429-2.8572-3.9286,0.17857-6.7857-1.25-1.7857-2.3214-2.8571-1.0714-2.1429-0.53572-0.53572-1.0714,1.25-0.53571,0.71429h-1.4286l-2.6786,0.89286-1.25,0.35714-1.6072-0.35714-2.1428-2.3214-1.7857-1.6071,0.53572-0.89286,1.4286-1.6071-0.35714-1.7857-2.5-2.3214-3.0357-1.4286-4.2857,0.35714-3.0357-1.25-2.6786-0.89285-3.3929-4.2857,2.3214-2.5,2.5-3.75,0.17857-5.3571,0.35715-1.4286,3.75-1.0714,2.6786-2.5,1.4286-1.4286h3.75,3.3929l3.9286,0.53571,1.7857-1.25,3.5714-1.6071,3.3929-0.53571,2.5-1.25,2.3214-1.25,0.35714-2.8572-2.1429-2.3214-0.71428-1.25,0.53571-1.6071,2.3214-1.4286,0.35714-1.25,1.92-2.87z","name":"Yamalo-Nenets Autonomous Okrug"},"kr":{"path":"M501.66,122.41c-0.45,0.04-1,0.37-1,0.37-0.9,0.72-1.25,0.77-0.94,1.13,0.31,0.35,0.19,0.55,0.9,0.78,0.72,0.22,0.91,0.49,1.44,0,0.54-0.49,0.77-1.24,0.41-1.69s-0.37-0.64-0.81-0.59zm11.56,0.65c-0.22,0.02-0.44,0.11-0.6,0.38-0.31,0.53-0.49,1.57-0.62,1.84s-0.2,0.74-0.78,0.88c-0.58,0.13-1.39,0.54-1.75,0.09s-1.03-1.51-1.25-1.69-1.04-0.74-1.13-0.03c-0.09,0.72,0.19,1.51,0.19,1.91s-0.18,0.99-0.4,1.12c-0.23,0.14-1.06,0.25-1.29,0.56-0.22,0.32-0.62,0.49-0.62,1.16s-0.27,1.67-0.31,1.94c-0.05,0.27-0.32,0.26-0.63,0.75s-1.09,1.87-1.09,1.87,0.89,0.62,1.15,0.85c0.27,0.22,0.42,0.77,0.38,1-0.05,0.22-0.13,1.05-0.53,1.19-0.4,0.13-1.43,0-1.78-0.13-0.36-0.13-1.01-0.48-1.5-0.44-0.49,0.05-1.01,0.23-1.19,0.63s-0.71,0.38-0.13,1.18c0.58,0.81,0.87,1.53,1,1.76,0.14,0.22,0.29,1.51,0.07,1.87-0.23,0.36-1,1.13-1.22,1.53-0.23,0.4-0.44,0.71-0.22,1.16,0.22,0.44,0.66,0.8,1.15,0.94,0.5,0.13,3.66,0.71,3.66,0.71s0.28-0.36,0.81-0.71c0.54-0.36,1.36-0.77,1.85-0.41s0.52,0.8,0.65,1.25c0.14,0.45,0.41,2.02,0.5,2.37,0.09,0.36,0.49,0.58,0.94,1.16s1.59,1.37,2.22,1.59c0.63,0.23,1.05,0.55,1.72,0.6,0.67,0.04,2.85,0.82,2.94,1.09s0.31,1,0.31,1,0.54,0.52,0.81,0.56c0.27,0.05,2.22,0.19,2.22,0.19,1.38-0.76,2.23-0.8,2.5-0.94,0.27-0.13,0.84-0.03,1.37-1.06,0.54-1.03,0.76-1.35,0.63-2.06-0.13-0.72-0.34-0.93-0.87-1.6-0.54-0.66-1.5-1.24-1.1-1.56,0.4-0.31,1.56-0.8,1.88-1.15,0.31-0.36,0.54-1.32,0.4-2.35-0.13-1.02-0.15-2.5-0.47-2.9-0.31-0.41-0.73-0.92-1.4-1.19s-1.23-0.67-1.81-0.53c-0.59,0.13-1.92,0.25-2.19,0.03s-0.62-0.83-0.85-1.5c-0.22-0.67-0.5-1.13-0.5-1.53s1.16-3.63,1.16-3.63,0.71-0.29,0.84-0.56c0.14-0.27,0.36-0.76,0.22-1.66-0.13-0.89-0.39-1.55-1.28-2.09s-2.09-1.72-2.09-1.72v-0.97c0-0.35-0.15-1.73-0.28-2-0.14-0.27-0.48-0.72-0.97-0.72-0.25,0-0.5-0.05-0.72-0.03zm17.72,22.91c-0.13,0.02-0.25,0.07-0.35,0.19-0.4,0.44-0.72,1.12-0.9,1.34s-0.51,0.09-0.91,0-0.89-0.43-1.16-0.03c-0.26,0.4-0.67,0.74-0.71,1.19-0.05,0.44,0.09,1.75,0.09,2.46,0,0.72,0.09,1.8,0,2.6s-0.2,1.3-0.78,1.66c-0.58,0.35-0.91,0.4-1.31,0.93-0.41,0.54-1.13,1.25-1.13,1.88,0,0.62,0.06,1.45-0.66,2.03-0.71,0.58-1.14,0.56-0.96,1.4,0.17,0.85,0.22,0.93,0.84,1.38s2.79,0.63,3.28,0.5,1.26-0.77,1.66-1.22,1.61-0.99,2.28-1.12c0.67-0.14,1.17-0.08,2.16-0.13,0.98-0.04,1.54-0.39,2.03-0.65,0.49-0.27,0.54-0.54,1.43-0.54,0.9,0,1.74,0,2.1-0.31,0.35-0.31,1.35-1.19,1.62-1.5s0.88-1.05,0.97-1.5,0.18-1.3,0-1.75,0.15-1.15-1.19-1.28-1.57,0.07-1.84-0.38c-0.27-0.44-1.03-0.88-1.03-1.37s0.08-1.02-0.19-1.37c-0.27-0.36-0.79-0.81-1.28-0.72s-1.31,0.58-1.53,0.62c-0.22,0.05-0.71-0.09-0.85-0.4-0.13-0.32-0.21-1.11-0.21-1.91s-0.25-1.63-0.25-1.63c-0.34-0.13-0.83-0.43-1.22-0.37zm5.22,20.03c-0.62,0.05-1.16,0.75-1.16,0.75s-1.62,1.95-2.16,2.84c-0.53,0.9-0.86,1.08-1.93,1.25-1.08,0.18-1.82,1.63-1.82,1.63s-0.51,1.23-0.68,2.12c-0.18,0.9-1.25,3.07-1.25,3.07v1.93l0.87,1.63s1.6,1.05,1.78,2.12c0.18,1.08-2.12-0.68-2.12-0.68s-2.14-0.73-3.03-0.91c-0.9-0.18-1.64,0.01-3.07,0.19-1.42,0.18-1.25,0.34-1.25,0.34l0.72,1.63s1.61,1.4,1.25,2.65c-0.35,1.25-1.4-0.53-1.4-0.53l-1.97-0.87s-1.98,0.16-2.88,0.87c-0.89,0.72-1.25,0.91-1.97,0.91-0.71,0-1.59-0.71-2.12-1.78-0.54-1.08-0.91-0.91-1.63-1.44-0.71-0.54-3.2,0-4.09,0s-2.32,1.79-3.75,1.97-1.78,0.53-1.78,0.53l0.34,2.12-1.97,1.1-2.12,0.53-2.16,0.53c-0.71,0.18-2.12-0.19-2.12-0.19l-1.97-0.34-1.44,0.87-0.53,0.57-2.84,0.15-2.16,0.91s-2.49,2.13-4.09,2.31c-1.61,0.18-0.19,0.53-0.19,0.53s1.06,0.91,1.06,1.63c0,0.71-0.7,0.87-0.87,1.4-0.18,0.54-1.45-0.33-2.35-0.68-0.89-0.36-1.25,0-1.25,0s0.2,1.04,0.38,1.93c0.18,0.9,1.06,1.28,1.06,2.35s-0.19,2.12-0.19,2.12,0.53,2.69,0.53,3.41v2.69c0,0.89-0.87,1.59-0.87,1.59s-1.25,0.72-3.03,0.72c-1.79,0-0.91-0.72-0.91-0.72l0.72-0.91-0.53-1.4-1.97-0.38-2.31,1.25-1.78-0.53h-3.22-3.94c-1.43,0-1.95-1.07-2.84-1.25-0.9-0.18-2.88-0.34-2.88-0.34s-2.14-0.02-3.03,0.34-1.97,1.06-1.97,1.06v3.07,3.03s-1.6,0.69-1.78,1.4c-0.18,0.72,0.01,2.68,0.19,3.75,0.18,1.08,1.05,0.72,2.12,1.25,1.07,0.54,2.16,1.25,2.16,1.25l0.53,0.57,0.34,1.78s0.57,1.94,0.57,2.65c0,0.72,1.25,1.97,1.25,1.97s0.68,1.63,0.68,2.35c0,0.71-0.51,1.22-0.87,1.93-0.36,0.72-0.73,1.61-0.91,2.5-0.18,0.9,0,2.16,0,2.16l0.38,2.84s-0.2,2.88-0.38,3.6c-0.18,0.71-0.89,1.42-1.78,1.78s-1.25,2.12-1.25,2.12,0.01,2.7,0.19,3.6c0.18,0.89,0.88,1.42,1.59,1.78,0.72,0.36,1.25,1.78,1.25,1.78l-0.87,1.78-1.78-0.34-1.44-1.78-0.91-1.82v-2.5s-0.54-1.76-1.97-2.65c-1.42-0.9,0.19-1.63,0.19-1.63s1.08-1.25,1.44-1.97c0.36-0.71,1.06-1.78,1.06-1.78s1.8-1.6,2.16-2.5c0.35-0.89-0.38-1.4-0.38-1.4l-1.06,0.68-1.78,1.82-1.78-0.91s0.69-1.25,0.87-1.78c0.18-0.54,0.54-1.79,0.72-2.5,0.18-0.72,0.35-1.6,1.06-2.31,0.72-0.72,2.35-0.19,2.35-0.19l1.25-1.25v-1.63l-1.1-1.59s-1.4-0.17-3.9-0.34c-2.5-0.18-0.72-1.25-0.72-1.25l-0.72-1.82s-0.72-1.76-1.44-2.12c-0.71-0.36-1.94-3.04-2.65-3.75-0.72-0.72-1.1-1.44-1.82-2.16-0.71-0.71-2.11-1.78-3.18-2.5-1.08-0.71-1.97-1.4-1.97-1.4l-1.63,0.34s-1.05,1.07-0.15,2.5c0.89,1.43,1.06,1.44,1.06,1.44l1.25-0.28,0.97,0.18,1.22,0.5,1.15,1.07,1.06,0.71,0.91,1.07,0.53,0.9,0.1,0.94-0.6,1.63-1.68,1.84-1.29,0.81-1.93,0.88,0.81,1.15s2.04,1.71,2.22,1.85c0.18,0.13,0.69,0.9,0.69,0.9l0.31,2.85,0.09,2.59s-0.33,2.1-0.37,2.28c-0.05,0.18-0.63,0.88-0.63,0.88l-7.09,3.97-1.44,0.9-1.25,0.94-0.66,0.81s0.3,2.37,0.35,2.6c0.04,0.22,0.64,1.18,0.69,1.4,0.04,0.23,1.28,2.69,1.28,2.69s1.15,1.2,1.46,1.69c0.32,0.49,2.16,0.31,2.16,0.31h3.44c0.4,0,1.34,0.5,1.34,0.5s1.3,0.98,1.35,1.16c0.04,0.17,0.37,1.31,0.37,1.31l0.38,3.34s0.09,3.42,0.09,3.69-0.5,1.56-0.5,1.56l-0.34,1.22c-0.04-0.01-0.07-0.03-0.1-0.06l-1.15,2.06-1.82,1.69-1.68,0.28-1.6,0.28,0.16,1.41s1,1.98,1,2.34-0.01,1.68-0.19,2.13c-0.18,0.44-0.81,1.68-0.81,1.68l0.47,1.19,1.15,1.69,0.88,2.41,0.47,1.68-1.16,1.97-1,1.63,0.72,1.93s0.08,1.53-0.09,1.97c-0.18,0.45-1.07,1.16-1.07,1.16l-0.43,1.19s4.1,3.63,5,4.53c0.89,0.89,0.15,1.52,0.15,2.06s-0.72,2.5-0.72,2.5l-1.25,2.22,0.1,1.87s1.54,1.46,1.72,1.82c0.17,0.35,1.68,0.78,2.22,0.87,0.53,0.09,2.78,0.38,2.78,0.38l1.25,1.31-0.19,0.81-1.16,1.63-0.72,3.28s-0.8,2.07-1.15,2.34c-0.36,0.27-1.44,1.16-1.44,1.16l-2.22,1.15-1.72,2.41,0.38,0.97,1.34,1,0.25,1.78-0.81,1.78-1.25,2.78-1.5,1.41-2.31,2.34-1.72,1.6-1.5,2.25s-0.9,2.92-0.81,4c0.08,1.07,0.96,0.72,0.96,0.72s1.62,1.07,2.16,1.34,1.51,0.99,1.78,1.34c0.27,0.36,1,1.24,1,1.69v1.53l-0.81,0.88-1.25,0.81-3.41,1.25-1.69,0.34-2.4-0.25s-1,0.43-0.91,0.78c0.09,0.36,0.72,1.63,0.72,1.63s0.45,1.24,0.63,1.69c0.17,0.44,0.27,0.88,0.72,1.06,0.44,0.18,0.09,2.97,0.09,2.97s-0.89,2.3-1.16,2.75c-0.27,0.44-0.46,1.25-0.37,1.87,0.09,0.63,0.72,1,0.72,1s1.7,0.69,2.06,0.78,2.94,1.1,2.94,1.1,3.13,0.72,3.84,0.72,2.58,0.06,3.56,0.15,2.5,1,2.5,1,1,0.87,1.53,1.41c0.54,0.53,0.25,4.64,0.25,5s2.88,0.19,3.5,0.28c0.63,0.09,2.32,0.81,2.32,0.81s0.43,1.33,0.43,1.69-0.43,1.88-0.43,1.88l-1.78,0.9-3.47,1.5-0.57,1.06s-1.13,4.74-1.4,5.19,0.53,1.88,0.53,1.88l1.5,0.62,2.25,1.06s3.47,2.25,4.09,2.79c0.63,0.53-0.09,0.96-0.09,0.96l-0.97,1.82-5.44,4.72-0.72,1.96-0.18,1.5s-0.44,3.58-0.44,3.94,0.34,1.53,0.34,1.53,1.81,1.15,2.25,1.5c0.45,0.36,1.88,1,1.88,1l0.72,1.41s0.79,1.54,1.06,2.34c0.27,0.81-0.72,0.97-0.72,0.97l-3.56,2.94-1.97,0.91s-1.35,1.33-1.44,1.87,0.81,0.97,0.81,0.97l0.97,1.44,1,1.34s1.95,0.73,2.75,0.91c0.81,0.17,1.63-0.57,1.63-0.57s1.42-1.95,2.4-2.22c0.99-0.26,0.53,0.46,1.07,0.72,0.53,0.27,1.96,0.61,2.59,0.88s2.22,1.34,2.22,1.34l0.81,2.06,1.78,7.41,0.82,2.5-1.26,4.13s0.1,2.05,0.19,2.4c0.09,0.36,0.8,1.24,1.07,1.6,0.26,0.35,0.43,2.15,0.43,2.15l-0.97,1.35-2.4,1.5-1.1,1.78s-2.3,3.32-2.65,3.59c-0.36,0.27-2.06,1.14-2.6,1.41-0.53,0.27-2.06,1.44-2.06,1.44s0.27,1.06,0.63,1.15c0.35,0.09,0.53,2.16,0.53,2.16l0.81,1.06,1.88-0.44,3.21,0.78,2.5,0.91s1.25,0.88,1.79,1.06c0.53,0.18,3.4-0.44,3.4-0.44s5.87-2.32,6.31-2.59c0.45-0.27,1.72-1.06,1.72-1.06s2.5-1.89,3.03-2.25c0.54-0.36,3.74-2.14,4.1-2.41,0.35-0.27,1.44-1.78,1.44-1.78l0.9-2.12s0.16-1.99,0.25-2.44,0.53-1.5,0.53-1.5l0.72-1.25,2.16-0.19,3.12,0.44,2.32,0.19s3.57,0.1,4.37-0.35c0.8-0.44,0.45-0.72,0.63-1.34,0.17-0.63-0.27-0.9-0.63-1.35-0.36-0.44-1-1.33-1.53-1.78-0.54-0.44-1.25-1.15-1.25-1.15s-2.31-4.22-2.31-4.75c0-0.54,0.81-1.15,2.15-1.69s3.91-0.97,3.91-0.97l2.06-1.19-0.09-2.65,0.47-1.78s1.16-2.8,1.25-3.07c0.09-0.26,1.51-2.93,1.68-3.56,0.18-0.62,0.62-1.79,1.07-2.59,0.44-0.81,1.62-1.68,2.15-2.03,0.54-0.36,1.68-1.91,2.13-2.44,0.44-0.54,1.09-2.22,1.09-2.22l-0.19-4.09s-2.13-2.42-2.4-3.22c-0.27-0.81,0.07-1.43,0.34-1.78,0.27-0.36,1.61-1.88,1.97-2.5,0.36-0.63,0.81-2.53,0.81-2.97,0-0.45,0.98-1.5,1.88-2.13,0.89-0.62,2.83-0.18,3.28,0s1.09,0.81,1.72,1.35c0.62,0.53,3.28,0.68,3.28,0.68s1.07-1.42,1.25-1.87,0.98-1.77,1.25-2.22,1.53-1.07,2.25-1.16c0.71-0.09,1.69,0.63,1.69,0.63s0.97,1.78,1.15,2.31c0.18,0.54,1.18,1.61,1.53,1.97,0.36,0.36,1.26,1.8,1.35,2.16,0.09,0.35,1.06,0.33,2.22,0.15s0.09-1.4,0.09-1.4v-2.16s-0.62-2.16-0.62-2.78c0-0.63,0.71-1.78,0.71-1.78s2.5-0.8,3.03-1.06c0.54-0.27-0.08-1.17,0.1-1.97,0.18-0.81,1.33-1.7,1.69-1.88,0.35-0.18,2.96-0.61,3.4-0.87,0.45-0.27,1.41-1.25,1.41-1.25l0.62-2.69,0.28-2.88s-0.02-0.11-0.03-0.12c0.09-0.06,0.32-0.22,0.32-0.22l1.31,0.19s0.6-0.58,1.31-0.94c0.72-0.36,0.79,0.03,0.97,0.03s0.68,1.11,0.81,1.47c0.14,0.36,0.36,1.26,0.41,1.53,0.04,0.27,1.38,0.68,1.56,0.72s1.55,0.47,1.81,0.56c0.27,0.09,1.66,1.08,1.97,1.44,0.32,0.36,1.04,0.45,2.38,0.94s1.53-0.28,1.53-0.28l0.65-0.63s0.23-1.4,0.32-1.94c0.09-0.53,0.72-0.87,0.72-0.87s1.51-1.22,1.87-1.63c0.36-0.4,0.5-0.87,0.5-0.87s0.34-2.99,0.16-3.13c-0.18-0.13-1.38-0.71-1.78-0.84-0.41-0.13-1.6-1.46-2-2.13-0.41-0.66,0.3-1.16,0.43-1.43,0.14-0.27,1.41-1.06,1.63-1.28,0.22-0.23,1.06-0.78,1.59-1,0.54-0.23,0.27-2.9,0.22-3.35-0.04-0.44-0.7-0.44-1.81-0.62-1.12-0.18-1.97-0.85-1.97-0.85s-1.52-1.52-2.19-2.28-0.22-2.76-0.22-3.03,0.17-4.1,0.13-4.9c-0.05-0.81,0.54-1.63,0.72-1.85s2.37-0.49,2.59-0.53,1.9-0.99,2.35-1.34c0.44-0.36,0.59-1.19,0.59-1.19s-0.37-1.3-0.5-1.75c-0.14-0.45,0.72-1.65,1.03-1.88,0.31-0.22,1.91-1.37,1.91-1.37s1.07-6.86,1.25-7.13c0.17-0.26-0.32-1.59-0.32-1.59s-1.19-3.62-1.28-3.84c-0.09-0.23-0.68-1.65-0.5-2.32s1.27-1.02,1.41-1.25c0.13-0.22,0.07-0.97-0.16-1.15-0.22-0.18-1.03-1.16-1.03-1.16s0.58-3.41,0.63-3.81c0.04-0.4,0.28-1.69,0.28-1.69l1.22-0.84s3.79-0.07,4.06-0.07,2.03-0.79,2.44-1.06c0.4-0.27,0.13-1.66,0-1.84-0.14-0.18-1.19-1.94-1.19-1.94h-2.28l-2.5,0.06-2.1-0.43-1.03-0.41s-2.49-0.25-2.72-0.25c-0.22,0-1.5-0.16-1.5-0.16l-0.65-0.25s-0.13-1.6-0.13-1.87,0.48-0.55,1.07-0.91c0.58-0.35,0.93-0.94,0.93-0.94s-0.17-0.98-0.43-1.34c-0.27-0.36-0.1-0.97-0.1-0.97s2.29-2.76,2.38-2.93c0.09-0.18,0.62-1.04,0.62-1.04s0.89-1.56,1.06-2.18c0.18-0.63-0.59-1.16-0.59-1.16s-3.42-4.04-3.78-4.44-1.14-1.64-1.31-1.9c-0.18-0.27-0.91-1.24-1-1.69s0.31-1.41,0.31-1.41l1.09-3.47-0.56-1.06s-1.07-0.96-1.16-1.09c-0.09-0.14-1-0.75-1-0.75s-0.63-0.55-0.5-0.91c0.14-0.36,1.36-0.56,1.63-0.56s2.31-0.69,2.31-0.69,1.39-0.56,1.56-0.78c0.18-0.22-0.03-1.16-0.03-1.16s-1.56-17.7-1.56-18.06-0.65-1.56-0.78-1.78c-0.14-0.22-2.19-2.34-2.19-2.34l-0.72-5.16h0.06s1.85,0.06,2.47,0.06c0.63,0,0.97-0.84,0.97-0.84l2.5-2.06,1.53-1.38s0.57-0.52,0.88-0.56c0.31-0.05,1.26,0.58,1.44,0.62,0.17,0.05,1.47,0.6,1.47,0.6s0.99-0.52,1.43-0.66c0.45-0.13,0.75-0.62,0.75-0.62l-0.31-5.94,4.16-2.16s0.93-1.1,0.93-1.28,0.57-1.87,0.57-1.87l4.47-3.1s1.78-2.23,2.18-2.5-0.03-0.62-0.03-0.62l-1.25-1.85s-1.07-1.29-1.78-1.47c-0.71-0.17-0.91-1.09-0.91-1.09l0.29-5-0.6-0.47-2.84-2.31-3.41-2.69-0.72-1.97-0.34-1.4-1.06-1.78,0.15-0.91,1.25-2.69-1.4-1.4-1.63-1.97-0.72,1.59s-1.43-0.53-2.5-0.53-1.06,1.44-1.06,1.44-1.95,0.71-2.84,1.25c-0.9,0.53-1.25,1.78-1.25,1.78s-1.45,1.25-2.16,1.25-2.14,0.01-3.03,0.19c-0.89,0.17-1.43,1.41-1.97,2.12-0.54,0.72-1.44,2.33-2.16,2.69-0.71,0.36-0.71,0.34-1.78,0.34s-0.16-0.7,0.38-2.31c0.53-1.61,1.95-1.79,2.31-2.5s0.72-1.78,0.72-1.78l2.5-0.91s0.54-3.02,1.44-3.37c0.89-0.36,3.75-0.53,3.75-0.53s1.22-1.63,1.4-2.35c0.18-0.71,1.44-1.58,1.97-2.65,0.54-1.08,0.72-1.79,0.72-2.5,0-0.72,0.91-1.82,0.91-1.82l2.5-2.12s1.58-1.6,1.93-2.31c0.36-0.72,2.16-1.97,2.16-1.97l2.16-1.97,2.31-2.5s0.19-1.44,0.19-2.16c0-0.71-0.72-1.78-0.72-1.78s-1.26-0.9-1.97-1.44c-0.72-0.53-1.78-0.7-1.78-1.59s0.16-0.72,0.34-1.44c0.18-0.71,0.72,0,0.72,0l1.44,1.1,0.15-1.25-0.15-2.35-0.53-1.97-2.69-0.68-1.78-1.1h-2.16c-0.71,0-0.52-0.69-0.87-1.4-0.36-0.72-0.37-1.62-0.91-2.69s-2.31-0.19-2.31-0.19l-1.78,0.91c-0.72,0.35-0.73,0.52-1.44,1.06-0.72,0.54-1.61-0.37-3.22-0.91-1.61-0.53-1.77,0.02-2.84,0.38-1.08,0.36,0.17,0.88,0.53,1.59,0.35,0.72,0,1.44,0,1.44l-2.35-0.19s-1.06-0.35-1.78-1.25c-0.71-0.89,0.19-1.06,0.19-1.06s1.25-1.43,1.25-2.5-0.72-1.25-0.72-1.25h-2.69c-1.25,0-1.96-0.17-3.03-0.34-1.07-0.18-1.25-0.37-1.97-1.44-0.71-1.07,0.57-0.53,0.57-0.53l1.4-1.25,1.25-0.72,2.69,0.34s0.9,0.56,1.97,0.38,0.19-0.72,0.19-0.72l-1.63-1.06s-1.77,0.34-2.84,0.34-2.16-0.72-2.16-0.72l-1.97-0.87s-1.41-1.45-2.12-1.63c-0.09-0.02-0.2-0.04-0.28-0.03zm-45.94,3.34c-0.85,0.32-1.23-0.03-1.5,0.82-0.27,0.84-0.34,0.96,0.16,1.18,0.49,0.23,0.87,0.53,1.4,0.44,0.54-0.09,1.24-0.47,1.06-1.09-0.17-0.63-1.12-1.35-1.12-1.35zm20.84,3.82c-0.33,0-0.47,0.12-0.94,0.56-0.62,0.58-1.62,1.37-1.71,1.9-0.09,0.54,0.12,0.96-0.19,1.54s-1.55,1.81-2,2.12-2.51,0.16-2.6,0.47c-0.08,0.31-0.37,0.52,0.04,0.87,0.4,0.36,2.91,0.63,3.72,0.54,0.8-0.09,3.3-0.3,3.74-0.35,0.45-0.04,0.71,0.28,0.66-0.43-0.04-0.72-0.72-1.36-0.4-1.85,0.31-0.49,0.6-0.65,0.78-0.97,0.17-0.31,0.49-1.06,0.31-1.47-0.18-0.4-0.72-0.95-0.72-1.53s-0.28-1.37-0.28-1.37c-0.18-0.01-0.3-0.04-0.41-0.03zm-45.53,6.62c-0.49,0-2.1,0.86-2.19,1.13-0.09,0.26-0.56,0.38,0.07,0.97,0.62,0.58,0.39,0.88,1.15,0.84,0.76-0.05,1.55-0.67,2.22-0.63,0.67,0.05,1,0.79,1.31,0.79,0.32,0,0.62-0.23,0.66-0.72s-0.42-0.89-0.59-1.07c-0.18-0.17-0.54-0.18-0.54-0.18-0.31-0.45-1.6-1.13-2.09-1.13zm-2.06,6.25c-0.54,0.18-1.01,0.45-1.5,0.63-0.49,0.17-0.81,0.17-1.13,0.43-0.31,0.27-0.72,0.46-0.72,0.82,0,0.35,0.15,0.5,0.6,0.81s0.52,0.62,1.19,0.62,1.89-0.5,2.03-0.81c0.13-0.31,0.48-0.94,0.53-1.25,0.04-0.31-1-1.25-1-1.25zm-51.31,9.13l-2.35,2.12-0.34,1.78,1.97,0.38,1.25,0.87h2.5l1.25-0.87v-1.78l-1.63-2.16-2.65-0.34zm59.09,4.4c-0.49,0.14-1.47,0.59-1.25,1.03,0.22,0.45,0.5,0.8,0.91,0.75,0.4-0.04,0.74-0.01,0.87-0.5,0.14-0.49-0.22-1.25-0.22-1.25l-0.31-0.03zm97.34,1.78c-0.09,0.01-0.18,0.07-0.28,0.22-0.38,0.6-0.53,1.69-0.4,2.1,0.12,0.41-0.42,0.87,0.12,1.31s0.62,1.22,1.53,1.25c0.92,0.03,1.9,0.47,2.63-0.06,0.72-0.54,1.43-1.69,1.65-2.19,0.22-0.51,0.32-1.22,0.07-1.53-0.26-0.32-0.62-0.81-1.13-0.88-0.5-0.06-1.19,0.16-1.19,0.16-1.07,0.31-0.99,0.66-1.78,0.31-0.59-0.26-0.92-0.72-1.22-0.69zm-135.37,0.22l-1.97,0.19-1.44,1.44,0.53,1.06,1.63-0.91,1.44,0.57,0.34,1.59,1.25,0.34,0.72-0.87-0.53-1.06-1.97-2.35zm27.09,1.13c-0.49,0.01-1.04,0.1-0.9,0.5,0.17,0.53,1.09,0.75,2.03,0.75s2.97,0.08,3.06,0.44c0.09,0.35,0.68,1.56,0.91,1.65,0.22,0.09,0.92,0.13,0.97-0.41,0.04-0.53-0.44-1.13-0.76-1.4-0.31-0.27-2.09-1.25-2.09-1.25-0.45-0.09-2.24-0.28-2.78-0.28-0.13,0-0.27-0.01-0.44,0zm10.31,1.12c-0.71,0.23-0.93,0.25-0.93,0.88,0,0.62-0.1,1.06,0.43,1.15,0.54,0.09,0.85,0.33,1.26,0.07,0.4-0.27,0.59-0.91,0.37-1.22s-1.13-0.88-1.13-0.88zm-44.71,1.16l-1.44,1.25,0.72,0.87,1.78-1.06-1.06-1.06zm6.4,2.31v1.78l2.35-0.53v-1.25h-2.35zm133.35,1.5c-1.05,0.29-1.25,0.28-2.07,0.6-0.82,0.31-1.49,0.24-1.87,0.74-0.38,0.51-0.44,0.28-0.66,1.29s-0.69,0.99,0.1,1.31c0.79,0.31,1.39,0.29,2.31-0.41,0.91-0.69,1.71-1.09,2.19-1.65,0.47-0.57,0.84-1.19,0.84-1.35s-0.84-0.53-0.84-0.53zm-122.41,0.5c-0.4,0.63-0.65,1.16-0.87,1.56-0.23,0.41-0.68,0.77-1.13,1.66s-0.81,1.32-0.81,2.03c0,0.72,0.24,1.18,0.68,1.41,0.45,0.22,0.34,0.5,0.57,0.5,0.22,0,0.82,0.09,1.31,0s1.03-0.19,1.03-0.5v-1.88c0-0.53-0.31-3.37-0.31-3.59s-0.47-1.19-0.47-1.19zm-16.47,0.69l-1.06,0.87v1.25l1.44,0.57,0.87-1.25-1.25-1.44z","name":"Krasnoyarsk Krai"},"tm":{"path":"m424.64,359.43,1.25,3.2143,1.25,2.3214s-0.53571,2.3214-0.71428,3.0357c-0.17857,0.71429-1.6071,3.0357-1.6071,3.0357s0.53571,1.25,1.6071,1.9643c1.0714,0.71429,5.8929,1.7857,5.8929,1.7857l5.3571,0.17857s3.75,0.89285,4.1071,1.6071c0.35714,0.71429,0.89286,1.0714,0.89286,2.1429,0,1.0714,0.35714,4.2857,0.35714,4.2857s1.25,0.35714,2.6786,0.35714,3.0357,0.35715,3.0357,0.35715,0.35714,2.1428,0.35714,2.6786c0,0.53571-0.89286,1.7857-1.9643,1.7857s-3.75,1.6072-3.75,1.6072-1.25,2.6786-1.25,3.75-0.89285,3.5714-0.53571,4.2857c0.35714,0.71429,4.4643,1.7857,5.1786,2.1429,0.71429,0.35714,3.2143,2.6786,3.2143,2.6786s-0.71429,1.6071-1.6072,2.6786c-0.89285,1.0714-4.1071,3.0357-5.3571,4.6429-1.25,1.6071-0.35714,2.8571-0.35714,2.8571l-0.71429,1.6071-3.2143,0.53572-3.2143,0.35714-1.4286-1.6071-1.9643-0.17857-4.66-0.57h-2.3214l-1.25,1.0714s-2.1429,1.0714-3.2143,1.25c-1.0714,0.17857-5.3571,1.25-6.0714,1.25-0.71428,0-6.4286,0.71429-6.4286,0.71429l-3.3928,1.4286h-2.3214l-0.35715-1.9643,0.71429-2.1429-0.35714-2.3214,1.7857-2.3214-0.53571-1.4286s-1.0714-0.17858-1.9643,0.53571c-0.89286,0.71429-4.4643,1.0714-4.4643,1.0714l-4.2857-0.17857-1.9643-2.3214-0.89286-3.0357s-1.25-1.0714-2.6786-0.71428c-1.4286,0.35714-1.6072,1.25-2.6786,1.25s-2.5,0-3.0357-0.89286c-0.53571-0.89286-0.89285-3.0357-0.89285-3.0357l-0.9-2.33s-1.6071-0.89286-2.5-1.6071c-0.89286-0.71429-3.2143-2.3214-3.2143-2.3214l-5.1786-2.3214-4.2857-1.9643-4.6429-1.7857-2.6786-1.0714-1.7857-2.5v-3.0357l1.6072-2.8572,0.35714-1.7857-0.53571-2.3214,1.25-3.0357,0.71428-3.3929,1.9643-1.0714,3.3928-2.8571s0-2.1429,0.71429-2.3214c0.71429-0.17857,5.7143-1.6071,5.7143-1.6071l1.9643-1.7857,1.25-2.6786,2.5-1.6071,1.6071-3.2143s1.0714-1.0714,1.7857-1.7857c0.71428-0.71429,2.1428-1.4286,2.1428-1.4286l1.9643-0.35715,2.1429,1.7857,2.1428,1.0714,2.5,0.35714,2.8572,1.4286,1.0714,1.6071,3.0357,0.89286h3.3929l2.1428,0.35714,1.25,1.6072,2.6786,0.71428,2.3214,0.71429,2.1429,1.7857,1.25-0.89286,1.7857-0.53571,2.1428-1.4286,2.1429-0.17857,1.6071,0.71428,1.7857,0.89286z","name":"Tomsk Oblast"},"nv":{"path":"m341.43,421.57,4.1071,0.71429l4.4643-0.17858c1.25-0.17857,2.1429-0.71428,2.1429-0.71428l-2.14,3.4h-3.0357l-0.89285,2.1428s1.0714,1.9643,1.7857,2.5c0.71429,0.53572,2.6786,3.0357,2.6786,3.0357l0.53572,2.1428,2.3214,0.35715h1.4286s2.6786,0.35714,3.3928,0.35714c0.71429,0,0.89286,0,1.9643-0.35714,1.0714-0.35715,3.2143-0.71429,4.6429-0.71429h3.5714s2.6786,0.17857,3.5714-0.35714c0.89286-0.53572,0.89286-1.0714,2.3214-1.25,1.4286-0.17857,3.0357-0.17857,3.9286-0.17857,0.89286,0,1.9643-0.17857,1.9643-0.17857s0,1.6071,0.89286,2.1428c0.89285,0.53572,4.1071,2.6786,4.1071,2.6786l0.71428,0.71429c0.17858,0.71429-0.17857,2.5-0.17857,3.2143,0,0.71428-1.0714,0.71428-0.17857,1.6071,0.89286,0.89286,1.9643,1.4286,1.9643,1.4286l2.3214-1.9643,2.3214-2.3214s2.1429-0.53572,2.8572-0.53572c0.71428,0,3.0357,0,3.75-0.17857,0.71428-0.17857,1.4286-0.71429,2.6786-0.17857,1.25,0.53571,2.3214,0.71428,3.3929,0.71428,1.0714,0,3.5714-1.25,3.5714-1.25s1.7857-2.1428,1.9643-2.8571c0.21-0.7-0.33-4.45-0.33-4.45v-3.75c0-0.71429,0.71428-2.3214,1.25-2.6786,0.53571-0.35714,1.7857-0.89285,1.7857-1.7857,0-0.89286-0.89286-1.6071-0.89286-1.6071s-0.89285-0.53572-0.89285-1.4286c0-0.89286,0.35714-3.2143-0.53572-3.0357-0.89285,0.17857-4.1071,1.7857-4.1071,1.7857s0,0.17857-1.4286,0.17857-2.5,0-2.6786-0.71429c-0.17857-0.71428,0.35714-5,0.35714-5l0.53571-2.6786,0.17858-2.1429-2.8572,1.4286s-1.6071,0.53572-2.5,0.71429c-0.9,0.18-4.47-0.71-4.47-0.71l-2.1429-0.71428-1.4286-2.1429-1.4286-2.8571s-2.5,0.53571-3.2143,0.71428c-0.71428,0.17858-1.9643,0.53572-1.9643,0.53572l-2.3214-1.25-1.0714-3.3929v-1.25l-3.0357-1.7857s-1.9643-1.6072-2.6786-2.1429c-0.71428-0.53571-3.3928-1.7857-3.3928-1.7857s-3.3929-1.25-4.1072-1.6072c-0.71428-0.35714-1.9643-1.25-2.6786-1.6071-0.71428-0.35714-3.9286-1.4286-3.9286-1.4286l-1.9643,0.17857s-0.35715,1.0714-0.53572,1.9643c-0.17857,0.89285-1.0714,2.3214-1.0714,2.3214l-1.4286,1.0714-0.89286,1.6072,0.17858,2.1428-0.71429,1.4286h-3.2143l-2.5-0.35714-2.1428,0.89286-2.1429,2.3214-1.4286,1.9643-0.71429,2.6786,0.71429,1.9643,1.7857,2.6786v1.7857l-2.1428,3.5714z","name":"Novosibirsk Oblast"},"al":{"path":"m351.25,435.14,1.7857,5,1.7857,5.1786,1.6071,6.7857,0.89286,8.5714,0.35714,8.2143,0.35714,2.8571,2.3214-0.53571,1.7857-0.53572,0.89285-0.53571,0.17857-1.9643,1.25-1.6071,1.25-0.35714,1.7857,0.53571,0.89286,1.9643,0.89285,2.8571,2.3214,2.8571,1.9643,1.6071,4.6428,0,3.3929-0.35714,2.5-0.89286,2.3214,0,3.3929,1.4286,1.0714,1.9643,2.3214,0.53572,2.3214-0.53572-0.17857-1.4286-1.6071-1.0714-1.0714-0.89286,0.35714-1.6071,0.71429-0.35714,2.5-0.35714,4.4643-0.71429,3.75-0.17857,2.6786-0.71429,2.3214-1.9643,1.0714-1.9643s0.53572-0.71428,1.25-0.71428c0.71429,0,3.3929-0.17858,3.3929-0.17858l1.9643-0.17857,1.0714-1.7857s0.53572-2.1429,1.25-2.5c0.71429-0.35714,0.89286-2.3214,0.89286-2.3214l0.71429-2.1429-0.35715-1.0714-0.71428-1.0714,0.71428-0.89286,1.25-0.53571-0.17857-1.0714-1.4286-1.6072-1.0714-1.0714c-0.17857-0.71429-0.89286-2.8572-0.89286-2.8572l-1.7857-1.7857-0.17857-0.89286-0.53572-2.1429-1.6071-1.4286-2.5-1.9643-1.74-1.79s-1.6072,1.0714-2.3214,1.4286c-0.71429,0.35715-1.7857,0.71429-1.7857,0.71429l-2.5,0.17857-2.5-0.35714-3.0357-0.17857-4.8214,0.71428-2.5,1.6072-1.6071,1.7857-1.0714,0.71429-0.89286,0.35714-1.4286-1.25-0.35714-0.89286,0.35714-0.89286,0.17857-1.7857-0.17857-1.4286-2.3214-1.6071-1.9643-1.25-1.0714-1.25-0.17857-0.89286-1.9643-0.17857-4.2857,0.17857-1.25,1.25-2.1429,0.53571-3.75-0.53571-4.2857,0.17857-2.6786,1.25h-2.5l-3.3929-0.17857z","name":"Altai Krai"},"km":{"path":"m442.14,414.79-0.71428,2.3214,0.89286,1.6072,2.5,1.4286,1.7857,1.6071,1.25,2.5,0.17857,0.89286s-0.89286,1.4286-1.6071,2.1429c-0.71429,0.71428-4.2857,2.3214-4.2857,2.3214l-1.7857,1.7857-1.7857,1.7857v1.6072l1.0714,1.7857,0.17858,1.7857-1.9643,2.5s-1.25,1.0714-1.0714,1.7857c0.17857,0.71428,1.0714,1.4286,1.7857,1.6071,0.71428,0.17857,2.8571,0.89286,2.8571,0.89286l-0.71429,1.4286-1.25,1.7857-0.53571,1.6072-1.7857,0.71428-1.4286,1.6072,0.71429,1.25,1.25,1.25-0.89286,2.5-1.25,1.6071,0.53572,1.25,1.7857,1.7857-0.35714,1.6072-1.6072,1.9643-2.5,2.1429h-1.9643l-0.71429-1.7857-1.9643-1.25-2.6786-0.35714-1.4286,1.0714-2.1428-1.4286-0.71429-2.3214-1.0714-0.71429,0.17857-2.5-0.53571-2.5,0.89286-1.9643,0.71428-1.6071-2.1428-2.6786-1.6072-2.6786-1.25-1.4286-0.71428-2.3214-0.89286-1.7857-2.3214-2.1429-1.7857-1.6071-0.71429-1.25v-1.7857l-0.35714-4.6428,0.17857-2.5,0.71429-2.3214,1.25-1.4286,0.71428-1.25-1.4286-1.9643v-0.89286l-0.35714-2.5,1.6071-0.35714,4.4643-0.53571,2.5-0.89286,3.0357-0.89286,1.0714-0.35714,0.71428-0.89286h1.6072,1.9643,2.5l1.7857,0.35715,1.4286,0.35714,0.89286,0.89286,1.9643,0.53571,1.6071-0.17857,2.5-0.71429z","name":"Kemerovo Oblast"},"lt":{"path":"m392.32,478.89-0.44643,2.1428s-0.17857,1.875,0,2.5893c0.17857,0.71429,1.1607,2.3214,1.1607,2.3214l3.3036,0.89286s0.98215,1.1607,1.0714,1.6071c0.0893,0.44643,0.0893,3.3036,0.0893,3.3036s0.17857,0.89286,0.53571,1.6071c0.35715,0.71429,1.25,1.875,1.7857,2.2322,0.53571,0.35714,1.6071,1.25,2.4107,1.3393,0.80357,0.0893,3.125,0.0893,3.5714,0.0893,0.44643,0,4.0179,0.0893,4.0179,0.0893s1.0714,0.53572,1.6071,0.89286c0.53571,0.35714,1.4286,1.25,1.7857,1.875,0.35715,0.625,1.5179,1.6964,2.0536,1.9643,0.53571,0.26785,1.1607,0.80357,1.7857,1.1607,0.625,0.35714,1.6964,0.71429,2.4107,0.80357,0.71429,0.0893,2.9464-0.44643,3.3929-0.71428,0.44643-0.26786,2.3214-0.89286,3.4821-0.89286s4.7322-0.35714,5-0.44643c0.26786-0.0893,3.5714-1.3393,4.1964-1.3393s1.4286-0.89285,1.6071-1.25c0.17858-0.35714,0.625-1.9643,0.17858-2.7678-0.44643-0.80357-0.80358-1.0714-1.4286-1.4286-0.625-0.35715-1.4286-1.25-1.25-1.7857,0.17858-0.53571,1.9643-1.1607,2.4107-1.1607,0.44643,0,2.5,1.0714,2.5,0.26785,0-0.80357-1.6964-2.2321-1.6964-2.2321s-0.98214-1.3393-1.25-1.7857c-0.26786-0.44643-1.875-1.9643-1.875-1.9643s-2.2321-2.7679-2.0536-4.1071c0.17857-1.3393-0.0893-3.3929-0.0893-3.3929s-0.625-1.3393-0.71428-1.6964c-0.0893-0.35714-1.3393-0.17857-1.3393-0.17857l-1.5179,1.5179s-1.4286-0.26786-1.5178-0.80357c-0.0893-0.53572-0.71429-2.5893-0.71429-2.5893s-0.35714-1.7857-0.44643-2.1429c-0.0893-0.35714-0.17857-1.9643-0.17857-1.9643l1.6964-1.3393,2.8571-1.3393,0.35715-1.1607-1.3393-1.6071-0.80357-0.625-2.1429-0.53571-1.9643,0.98214s-1.0714-0.625-1.4286-0.80357c-0.35714-0.17857-1.0714-0.89286-1.0714-0.89286l-0.89286-1.7857s0-1.0714-0.71429-0.89286c-0.71428,0.17857-0.89285,0.71428-0.89285,0.71428s-1.1607,1.1607-1.1607,1.5179c0,0.35714-0.625,1.4286-0.625,1.4286l-0.98214,1.0714s-1.6071,0.44643-1.9643,0.44643h-3.0357c-0.35714,0-1.1607,0.71429-1.5179,1.0714-0.35714,0.35714-1.1607,1.9643-1.1607,1.9643l-1.5179,1.0714-0.98214,0.625-2.3214,0.71429h-2.3214l-4.1071,0.71428-4.1071,0.625-1.0714,0.625-0.0893,0.98215s0.0893,0.89285,0.53572,0.98214c0.44642,0.0893,1.6071,0.80357,1.6071,0.80357l0.44643,0.89286-0.0893,0.89286-1.875,0.625z","name":"Altai Republic"},"tv":{"path":"m431.96,477.02,0.26786-1.6964s0.89286-0.625,1.6071-0.625c0.71429,0,1.6964,0.71428,2.4107,0.89286,0.71428,0.17857,2.7678,0.71428,3.0357,0.71428,0.26786,0,1.0714-0.80357,1.3393-1.25,0.26785-0.44643,1.9643-2.6786,1.9643-2.6786s0-1.25,0.625-1.6071c0.625-0.35715,1.875-0.35715,2.3214-0.35715,0.44643,0,1.6071-0.17857,2.3214,0.26786,0.71429,0.44643,1.1607,3.0357,1.1607,3.0357s0.89286,0.89285,1.1607,0.89285c0.26786,0,2.1429-0.80357,2.1429-0.80357s1.4286,0.17857,1.7857,0.44643c0.35714,0.26786,3.0357,0.89286,3.0357,0.89286s1.6964,1.6071,2.2322,1.6071c0.53571,0,1.6964,0.26786,2.6786-0.0893,0.98214-0.35714,2.8571-0.80357,3.3929-1.25,0.53571-0.44642,5.5357-1.9643,5.9821-2.5,0.44643-0.53571,7.0536-5.9821,7.0536-5.9821l2.1429-2.8571s-0.17857-1.875-0.17857-2.9464,1.0714-2.3214,1.4286-2.5893c0.35714-0.26785,2.8571,0.0893,3.3036,0.17858,0.44643,0.0893,4.375,0.89285,4.7321,0.80357,0.35714-0.0893,4.2857-0.44643,4.2857-0.44643l2.4107-2.2321s1.5179-0.35715,2.4107,0.0893c0.89286,0.44643,3.6607,2.5,4.1964,2.7679,0.53572,0.26786,3.75,2.3214,3.75,2.3214l1.6072,1.5178s1.25,0.71429,1.7857,0.44643c0.53571-0.26785,2.3214-0.89285,2.3214-0.89285l1.6071,0.53571,0.35714,1.25s0.53572,0.89286,0.53572,1.25-0.89286,1.6071-0.89286,1.6071-0.71428,0.53572-0.80357,1.1607c-0.0893,0.625-0.26786,4.1071-0.26786,4.1071s-0.0893,2.3214-0.0893,2.7679c0,0.44643-0.71429,2.1428-0.71429,2.1428l-1.4286,2.4107s-1.5179,1.3393-1.875,1.875c-0.35714,0.53571-2.2321,1.3393-2.4107,1.6964-0.17858,0.35714-0.71429,1.875-0.71429,1.875s-0.71429,1.875-0.71429,2.4107c0,0.53572-0.0893,3.3929-0.0893,3.9286,0,0.53572,0.53571,2.5,1.0714,3.2143,0.53571,0.71428,1.25,1.6071,1.25,2.0536,0,0.44643-0.80357,2.3214-1.1607,2.7679-0.35714,0.44643-4.8214,4.1964-4.8214,4.1964l-2.0536,1.25-2.1428,0.17857s-1.7857-0.98215-2.1429-0.89286c-0.35714,0.0893-2.3214,0.17857-2.6786,0.17857-0.35715,0-1.7857-0.89286-1.7857-0.89286s-1.6964-0.35714-2.1428-0.625c-0.44643-0.26785-1.7857-1.1607-1.7857-1.1607s-2.7679-0.26786-3.2143-0.26786c-0.44643,0-2.8572-0.17857-3.2143-0.53571l-2.0536-2.0536s-0.71429-1.4286-0.80357-1.9643c-0.0893-0.53571-0.17857-2.5-0.17857-2.5s-0.80358-0.80357-1.3393-1.25c-0.53571-0.44643-2.1429-0.89286-2.9464-0.89286-0.80357,0-3.9286,0.17858-3.9286,0.17858s-1.9643,0.53571-2.2321,0.625c-0.26786,0.0893-1.25,0.71428-1.875,0.80357-0.625,0.0893-2.0536,0.0893-1.9643-0.80357,0.0893-0.89286,1.25-1.6964,1.3393-2.0536,0.0893-0.35714-0.0893-1.0714-0.71429-1.3393-0.625-0.26786-2.1429-0.17857-3.0357,0.0893-0.89286,0.26786-2.3214,0.80358-2.8572,0.89286-0.53571,0.0893-3.3928,0.71429-3.3928,0.71429s-2.1429,0.89285-2.6786,1.0714c-0.53572,0.17857-3.8393,1.1607-3.8393,1.1607l-3.0357,1.5179-2.4107,1.1607-2.5893-0.26786-2.1429-0.98214-1.5179-0.71428-1.25-1.25c0-0.44643,0.35714-0.98215,0.35714-0.98215l2.4107-0.44643,1.7857,0.53572s1.25-0.35714,0.17857-1.0714c-1.0714-0.71429-4.4643-5.0893-4.4643-5.0893l-1.48-2.44s-1.0714-1.4286-1.0714-1.7857v-2.5893z","name":"Tuva Republic"},"hk":{"path":"m440.27,432.11c0.53572,0.35715,1.9643,1.875,1.9643,1.875l1.3393,1.6072s0.26785,0.625,1.1607,0.80357c0.89286,0.17857,2.0536,0.17857,2.0536,0.17857s0.35714-0.35714,0.80357-0.80357,0.625-0.98214,0.98215-1.25c0.35714-0.26786,0.89285-0.89286,1.3393-0.80357,0.44643,0.0893,0.71429,0.26785,1.3393,0.71428,0.625,0.44643,1.3393,1.25,2.2321,1.25,0.89286,0,2.5,0.80357,2.5,0.80357s0.44643,1.875,0.625,2.3214c0.17857,0.44643,0.53571,2.9464,0.53571,2.9464s0.35715,1.5179,0.71429,2.4107c0.35714,0.89285,0.98214,2.0536,1.0714,2.4107,0.0893,0.35714-0.0893,3.125-0.17857,3.3929-0.0893,0.26785-0.80357,1.875-0.89286,2.2321-0.0893,0.35714,0,2.5893,0,2.5893l1.5179,1.5179,0.625,1.875s-1.25,1.4286-1.4286,1.6964c-0.17858,0.26786-2.2322,1.3393-2.5893,1.875-0.35714,0.53571-1.4286,3.0357-1.4286,3.0357s-1.6071,1.9643-2.1429,2.2322c-0.53571,0.26785-2.8571,1.0714-3.125,1.5178-0.26786,0.44643-1.6964,1.6964-1.6964,1.6964l-2.7678,0.0893s-1.3393,0.17857-1.6072,0.625c-0.26785,0.44643-0.53571,1.4286-1.0714,1.875-0.53571,0.44643-1.0714,1.25-1.1607,1.6071-0.0893,0.35714-0.89286,1.0714-0.89286,1.0714s0.0893,0.71429-1.0714,0.625c-1.1607-0.0893-2.9464-0.35714-2.9464-0.35714l-1.7857-1.1607-1.6071,0.44643-0.625,0.80357-0.26786,0.89286-2.5,1.0714s-0.625,0.89286-1.1607,0.35714c-0.53572-0.53571-1.25-2.3214-1.25-2.3214l-0.625-2.5893v-1.5179s0.17857-1.0714,0.53571-1.25c0.35714-0.17857,2.5-1.6071,2.5-1.6071s1.3393-0.98215,1.6964-1.0714c0.35714-0.0893,2.1429-0.44643,2.1429-0.44643l1.9643-1.0714,1.5179-2.0536,1.3393-1.0714-0.44643-1.6071s-1.25-1.25-1.4286-1.6071c-0.17858-0.35715-0.44643-1.25-0.44643-1.25l1.6071-2.2322,0.0893-1.875s-1.0714-1.1607-1.1607-1.5178c-0.0893-0.35715-0.0893-1.25-0.0893-1.25l2.5893-1.5179,1.0714-1.875,1.1607-1.9643,0.53572-1.6964-3.5714-1.1607s-0.89286-1.25-0.71429-1.7857c0.17858-0.53572,1.7857-2.4107,1.7857-2.4107s0.89286-1.875,0.89286-2.3214c0-0.44642-1.0714-2.8571-1.0714-2.8571s0-0.71428,0.26785-1.1607c0.26786-0.44643,1.25-0.98215,1.25-0.98215z","name":"Republic of Khakassia"},"ir":{"path":"M569.41,325.78c-0.12,0.03-0.22,0.12-0.22,0.34,0,0.45,0.53,1.54,0.53,1.54l0.37,1.06s-0.26,0.88-0.62,1.06-1.78,0.63-1.78,0.63l-2.69,0.09s-1.61,0.26-1.88,0.44c-0.26,0.18-0.9,0.73-0.9,1.09s-0.44,1.96-0.53,2.31c-0.09,0.36-0.16,1.97-0.16,1.97s0.18,0.78,0.63,1.41c0.44,0.62,0.43,1.81,0.43,1.81l-1.25,1.16s0.26,1.67,0.35,2.03,1,3.4,1,3.4l0.43,2.5s-0.28,1.42-0.28,1.69-0.96,4.57-0.96,4.57-0.09,0.98-0.54,1.24c-0.44,0.27-2.06,1.88-2.06,1.88s-0.19,0.99-0.19,1.34c0,0.36,0.37,1.06,0.19,1.5-0.18,0.45-1.97,1.72-1.97,1.72l-2.59,0.72-1.31,0.88-0.29,3.84-0.09,2.22v1.81c0,0.36,0.27,1.34,0.72,1.78,0.45,0.45,2.16,1.97,2.16,1.97l2.21,0.53,1.16,0.78,0.1,2.25s-0.37,1.33-0.82,1.5c-0.44,0.18-2.75,1.82-2.75,1.82l-0.53,1.15,0.97,1.16,1.97,1.59s0.78,0.1,0.87,0.72c0.09,0.63-0.15,2.6-0.15,2.6l-0.47,1.43-1.25,1.07-1.41,1.43-0.19,1.6-1.24,0.81-2.79-0.28-1.59-1.35-1.78-0.68-2.25-0.63s-0.45-0.74-0.63-1.19c-0.17-0.44-0.34-1.68-0.34-1.68l-1.25-0.72-1.87,1-1.26,0.09-0.18,1.69-0.35,2.41-0.53,1.53-0.9,0.97-1.6,0.53s-1.89,0.28-2.25,0.37c-0.35,0.09-1.34,1.41-1.34,1.41s-0.53,0.8-0.44,1.15c0.09,0.36,0.19,1.25,0.19,1.25l-1.16,0.91-2.06,0.81s-0.44,0.9-0.44,1.25c0,0.36,0.16,1.97,0.16,1.97l0.37,1.5,0.1,1.63s0.7,0.7,0.43,1.06c-0.26,0.36-2.78,0.62-2.78,0.62l-1.93-2.78-1-1.5-1.07-2.34-1.06-0.69h-1.72l-1.59,1.69s-0.89,0.81-1.16,1.44c-0.27,0.62,0.01,1.78-1.15,1.78s-3.22-0.38-3.22-0.38l-1.25-1.15-1.97-0.44-1.34-0.19s-0.62,0.64-0.97,0.91c-0.36,0.27-1.35,1.25-1.35,1.25v0.62l-0.72,1.88-1.15,2.22-0.81,0.9-0.29,1.35,0.63,1.68s0.45,0.9,0.81,1.25c0.36,0.36,0.63,0.35,0.72,0.97,0.09,0.63,0.19,2.6,0.19,2.6l-0.38,2.4-0.97,1.88s-1.88,1.79-2.15,2.06-2.13,1.61-2.13,1.97-1.62,4.19-1.62,4.19l-1.25,2.25s-0.69,2.11-0.78,2.56-0.63,3.59-0.63,3.59-0.09,1.33-0.62,1.6c-0.54,0.26-3.69,0.81-3.69,0.81s-2.12,1.07-2.56,1.34c-0.45,0.27-0.72,0.63-0.72,0.63s-0.19,0.52-0.1,0.87c0.09,0.36,1.16,2.25,1.16,2.25l1.44,2.66,1.06,0.56,0.97,1.06,1.09,1.69v0.81l1.25-0.43s0.9-0.91,1.25-1c0.36-0.09,1.78,0.28,1.78,0.28l1.44,0.87s1.43,0.91,1.78,1c0.36,0.09,2.03,1.41,2.03,1.41l4.32,2.87s0.34,0.82,1.06,0.82c0.71,0,2.41-0.38,2.41-0.38l1.78-0.34,1.06,1.15,0.28,1.16,0.28,1.53,2.56-0.81,2.44-2.41s2.14-2.16,3.13-2.34c0.98-0.18,2.12,1.19,2.12,1.19s0.72,1.58,1.25,2.03c0.54,0.44,2.43,2.32,2.78,2.59,0.36,0.27,3.03,1.53,3.03,1.53l2.22,2.66c0.45,0.53,2.52,3.22,2.97,3.22s2.84,0.18,3.38,0.09c0.53-0.09,1.96,0.63,2.5,1.25,0.53,0.63,1.78,2.69,1.78,2.69s1.27,1.69,1.62,1.78c0.36,0.09,1.16,1.88,1.16,1.88s0.89,1.62,1.25,1.53,2.31-0.63,2.31-0.63,0.73,0.15,0.91,0.69c0.18,0.53,0.87,2.59,0.87,2.59s1.18,0.62,1.53,0.53c0.36-0.09,1.88-1.25,1.88-1.25s1.77-0.26,2.12-0.43c0.36-0.18,1.44-0.82,0.82-1.44-0.05-0.04-0.11-0.06-0.16-0.09,0.05-0.01,0.34-0.07,0.34-0.07l1.69-0.62,8.75-2.88s1-1.76,1-2.03,0.63-2.06,0.63-2.06l0.06-2.06,0.81-0.82,1.78-0.96,2.25-0.82,1.16-1.68,1.06-0.82,5.44-2.59,1.62-1.31,0.82-1.1,0.62-2.5,1.94-1.15s1.27-0.9,1.62-1.35c0.36-0.44,0.35-0.97,0.35-0.97l-0.63-0.81-1.25-1.25-0.34-0.81s0.18-0.96,0.62-1.41c0.45-0.44,0.71-0.63,1.07-0.72,0.35-0.09,1.25,0.35,1.25,0.35l1,1.09,0.87-0.47,0.63-1.78s0.81-2.14,0.9-2.5,0.25-1.69,0.25-1.69-0.25-3.05-0.25-3.5v-2.5s0.44-4.01,0.53-4.37,0.35-2.13,0.35-2.13l-0.1-1.87s-0.44-1.17-0.62-1.44-0.16-0.81-0.16-0.81,0.63-1.05,0.72-1.41c0.09-0.35-0.37-0.81-0.37-0.81s-0.54-0.71-0.72-1.06c-0.18-0.36-0.88,0.15-0.88,0.15l-1.44,0.91s-0.79,1.26-1.15,1.53-0.44,1.31-0.44,1.31l-0.28,4.38-0.81,1.34-1.53-0.09c-0.34-0.63-0.73-1.32-0.79-1.6-0.08-0.44-0.43-2.67-0.34-3.65s0.97-4.38,0.97-4.38l1.25-1.25s0.09-1.52-0.53-2.06c-0.63-0.53-1.87-1.07-2.41-1.34-0.53-0.27-1.72-1.35-1.72-1.97,0-0.63,0.92-1.77,1.19-2.13,0.27-0.35,3.93-1.51,4.28-1.78,0.36-0.27,3.57-2.15,3.57-2.15l3.65-1.07,2.78,0.25,2.13-0.34,1.34-2.5,2.88-0.81s1.87,1.25,2.4,1.25c0.54,0,2.22-0.72,2.22-0.72s1.07,0.64,1.25,1,1.63,1.34,1.63,1.34l1.93-0.37s1.35-0.44,2.07-0.35c0.71,0.09,1.7,0.98,2.06,1.07s2.75-0.72,2.75-0.72l1.09-1.5,2.5-1.16s1.35-1.08,1.35-1.53,0.15-3.22,0.15-3.22,1.25-0.61,1.88-0.97c0.62-0.35,2.15-0.18,2.15-0.18s0.17-1.34,0.35-1.79c0.18-0.44,1.33-1.34,1.78-1.43s2.44,0.37,2.44,0.37l1.15,0.97-1.34,1.44-0.72,1.15,0.72,0.72s2.31-0.45,2.94-0.72c0.62-0.26,2.24-0.44,2.78-0.53,0.53-0.09,2.84-1.15,2.84-1.15s0.91-1.08,0.91-1.44-0.2-1.71-0.38-2.16c-0.18-0.44-2.21-1.14-2.65-1.59-0.45-0.45-0.54-2.58-0.72-2.94s-0.9-1.9-0.63-2.44c0.27-0.53,1.06-1.78,1.06-1.78l-0.62-2.5s-0.01-2.48,0.34-2.84c0.36-0.36,2.07-1,2.07-1l2.93,0.81s0.9,1.15,1.35,1.06c0.44-0.09,2.15-0.53,2.15-0.53l0.25-3.56-0.87-1.16s-1.27-1.42-1.63-1.68c-0.35-0.27-1.25-1.25-1.25-1.25l-1.68-2.97-0.25-2.6-0.72-1.68-2.25-0.54-1.78,0.97-3.13,1.53-1.97,0.44-0.72-0.72-0.78-2.84-1-1.59-2.75-2.35-2.34-1.68-2.66-0.91-2.78-0.06s-2.49,0.8-2.84,1.15c-0.36,0.36-1.45,1.52-1.72,1.88-0.27,0.35-0.88,2.5-0.88,2.5l-0.28,2.12v2.5s-0.17,1.36-0.43,1.72c-0.27,0.36-3.94,2.03-3.94,2.03l-1.16,1.72-0.19,2.66-0.97,2.25-2.15,2.22s-0.6,0.63-0.69,0.09-0.62-2.22-0.62-2.22l-2.16-2.34s-0.44-1.23-1.06-0.78c-0.63,0.44-1.63,1.31-1.63,1.31l-3.28,1s-0.89,0.43-1.25,0.87c-0.36,0.45-2.97,0.72-2.97,0.72l-2.03,0.28-2.16,2.5s-0.62,1.26-1.24,0.82c-0.63-0.45-2.22-2.35-2.22-2.35l-0.82-1.59-0.53-2.94,0.16-5.56-0.06-2.56,1.5-2.6,1.87-3.03s0.44-1.61,0.44-2.06-0.53-3.03-0.53-3.03l-2.03-2.25-4.94-3.66s-0.63-0.71-0.63-1.25c0-0.53,0.1-2.31,0.1-2.31l1.15-1.97s0.63-0.35,0-1.06c-0.62-0.72-3.18-4.57-3.18-4.57l0.15-5.34s0.02-0.65-0.34-1.09c-0.36-0.45-2.59-3.28-2.59-3.28l-1.54-1.88s-0.24-0.62-0.68-0.62c-0.45,0-2.16,0.68-2.16,0.68s-1.17,0.82-1.44,0.29c-0.27-0.54-0.25-2.6-0.25-2.6s-0.29-1.16,0.16-1.25,1.62-0.44,1.62-0.44h1.5l0.29-1.43-1.79-1.97-1.53-1.35-1.4-0.06s-0.14-0.03-0.25,0z","name":"Irkutsk Oblast"},"br":{"path":"m513.39,476.39s1.6072,0.98214,2.3214,1.1607c0.71429,0.17857,2.8572,1.25,3.3929,1.3393,0.53571,0.0893,1.7857,0.71428,2.5,0.98214,0.71429,0.26786,1.875,0.98214,2.5893,1.3393,0.71428,0.35714,2.2321,0.53571,3.2143,0.625,0.98214,0.0893,2.8571,0.89285,3.4821,1.0714,0.625,0.17858,2.1429,1.0714,2.9464,1.1607,0.80357,0.0893,1.5179,0,2.7679,0.625s2.7679,1.3393,3.125,1.5179c0.35714,0.17857,0.71429,0.26785,0.80357,0.98214,0.0893,0.71428,0,2.6786,0.0893,3.0357,0.0893,0.35715,0.26785,1.6964,0.625,2.0536,0.35714,0.35715,1.6071,1.9643,2.5893,2.5893,0.98215,0.625,1.4286,1.6964,1.9643,2.1429,0.53571,0.44643,2.3214,1.875,2.8571,1.9643,0.53572,0.0893,2.3214,0.625,2.7679,0.625,0.44643,0,5.0893,0.44643,5.0893,0.44643s1.7857-0.80357,2.7679-1.25c0.98214-0.44643,4.0179-1.25,4.4643-1.5179,0.44643-0.26785,1.5178-0.98214,2.6786-1.0714,1.1607-0.0893,4.1964-0.0893,5.0893-0.0893,0.89286,0,4.1072,0.0893,4.1072,0.0893s2.3214-0.0893,3.125,0.44642c0.80357,0.53572,1.6071,1.6072,1.9643,2.1429,0.35715,0.53572,0.625,1.4286,1.0714,1.6071,0.44643,0.17858,1.4286,0.35715,1.875,0.35715,0.44643,0,2.1429-0.26786,2.5-0.35715,0.35714-0.0893,2.2321-0.44642,2.2321-0.44642l0.0893-2.6786s-0.0893-1.7857,0.53571-2.0536c0.625-0.26785,4.4643-1.5178,4.8214-1.6964,0.35715-0.17857,1.25-1.6071,1.25-1.6071s-2.5-0.625-3.3036-0.625c-0.80357,0-1.25-1.4286-1.25-1.4286l1.0714-1.5179,0.17857-1.9643,0.98214-1.0714,0.80358-1.3393s-0.625-0.98214-0.80358-1.3393c-0.17857-0.35715-0.0893-1.4286-0.0893-1.4286l2.2321-1.1607,3.125-0.35714,2.4107-1.1607,3.4821-2.4107,1.7857-0.625s1.4286,0.0893,1.875,0.26786c0.44643,0.17857,2.4107,0.53571,2.5893,0.17857,0.17857-0.35714,1.6071-1.9643,2.0536-2.3214,0.44643-0.35714,2.6786-2.1429,2.6786-2.1429l1.4286-1.1607s0.98215-1.25,1.4286-1.5179c0.44643-0.26786,1.875-1.0714,2.4107-1.0714,0.53571,0,0.98214,0,1.3393-0.26785,0.35715-0.26786,1.1607-1.25,1.3393-1.6072,0.17857-0.35714,1.0714-0.80357,1.6071-0.89285,0.53572-0.0893,5-1.3393,5-1.3393l2.6786-1.5179s1.875-1.5178,2.0536-1.875c0.17857-0.35714,1.6071-2.8571,1.6071-2.8571l0.98214-1.875s-0.26786-1.4286-0.71428-1.7857c-0.44643-0.35715-2.1429-1.6072-2.1429-1.6072l-2.5-1.25s-1.25-0.80357-1.1607-1.6071c0.0893-0.80357,7.5-5.625,7.5-5.625s0.98215-1.6964,1.0714-2.0536c0.0893-0.35714,0.89286-1.9643,1.25-2.3214,0.35715-0.35714,2.5-2.0536,2.5-2.0536s1.4286-0.625,1.875-0.71429c0.44643-0.0893,3.5714-1.5178,3.5714-1.5178l1.25-0.98215s0.44643-2.0536,0.44643-2.5893c0-0.53572-0.80357-3.8393-0.80357-3.8393s-1.0714-0.53571-1.4286-0.89285c-0.35715-0.35715-1.25-0.80358-2.1429-0.80358-0.89286,0-2.6786,0-3.125-0.625-0.44643-0.625-1.3393-1.25-1.6964-1.875-0.35714-0.625-1.1607-1.7857-1.25-2.2321-0.0893-0.44643-0.80357-2.4107-0.98214-2.7679-0.17857-0.35714-1.0714-2.3214-1.0714-2.3214l-2.0536-3.5714-1.0714-2.7679,0.26786-2.0536,1.0714-0.625,0.80357-1.25,1.4286-1.875,0.625-0.98214-2.3214-1.25s-1.875,0.44642-2.2321,0.71428c-0.35715,0.26786-0.98215,1.3393-0.98215,1.3393s0.35715,0.625,0,0.80357c-0.35714,0.17857-2.3214,0.44643-2.3214,0.44643l-1.25,0.89285-0.71429,1.9643v1.6071l-0.98214,0.98215-2.0536,1.0714-1.3393,0.98215-1.1607,1.3393s-1.6964,0.0893-2.0536,0.0893c-0.35714,0-2.0536-0.625-2.0536-0.625l-2.6786,0.17857-2.3214-0.0893-1.9643-1.4286-1.4286,0.26786-2.0536-0.35714s-0.80357-0.71429-1.1607-0.71429c-0.35714,0-2.1429,0.625-2.1429,0.625l-1.5178,1.3393-0.98215,1.0714-2.6786,0.26785-1.9643-0.0893-2.3214,0.44643-2.2322,1.1607-3.3928,1.7857-2.3214,0.98215-1.3393,0.89285-0.89285,1.1607s-0.0893,0.35714,0.0893,0.71428c0.17857,0.35715,0.98214,1.4286,0.98214,1.4286l1.6072,0.80357,0.98214,0.89285,0.83,0.91,0.0893,1.1607-1.6071,2.1428-0.35714,2.2322-0.35715,1.875v2.6786l0.80358,1.6071,1.1607,1.4286s0.26786-0.44643,0.71429-0.80357c0.44642-0.35714,1.1607-2.3214,1.1607-2.3214v-2.0536l0.0893-2.0536,0.98214-1.875,1.6964-1.25,1.1607-0.17857,0.89286,1.1607s-0.0893,1.25-0.26786,1.6964c-0.17857,0.44643-0.53571,0.98214-0.35714,1.3393,0.17857,0.35714,0.89286,1.4286,0.89286,1.4286l-0.17858,2.7678s-0.35714,2.3214-0.35714,2.6786c0,0.35714-0.26786,2.5893-0.26786,3.0357v2.5893c0,0.89285,0,1.5178,0.0893,2.1428s0.0893,1.6964-0.0893,2.1429c-0.17857,0.44643-0.44642,1.25-0.71428,1.9643-0.26786,0.71428-0.35714,1.25-0.44643,1.9643-0.0893,0.71429-1.0714,1.6964-1.0714,1.6964s-0.71428,0.26786-0.98214-0.625-1.6071-0.98214-1.6071-0.98214-0.71429,0.44642-1.0714,0.98214c-0.35715,0.53571-0.89286,1.25-0.35715,1.6964,0.53572,0.44643,1.5179,1.6071,1.5179,1.6071s0.625,0.35714,0.26786,1.1607c-0.35714,0.80358-1.1607,1.0714-1.6964,1.4286-0.53571,0.35714-1.5179,0.89285-1.6964,1.25-0.17857,0.35714-0.71428,1.4286-0.71428,1.7857,0,0.35714-0.44643,2.0536-0.44643,2.0536l-1.3393,0.98214-1.875,1.3393s-2.2321,0.71429-2.6786,0.98214c-0.44643,0.26786-2.5,1.4286-2.8571,1.7857-0.35715,0.35714-0.53572,1.25-1.4286,1.6071-0.89286,0.35714-3.125,1.3393-3.125,1.3393l-0.98215,0.26785s-0.35714,0.80357-0.35714,1.1607c0,0.35714-0.26786,2.2321-0.26786,2.7678,0,0.53572-0.26785,0.98215-0.625,1.6964-0.35714,0.71429-0.98214,1.6964-1.6071,1.7857-0.625,0.0893-2.7679,0.71428-3.2143,0.89285-0.44642,0.17858-2.5,0.89286-3.0357,0.98215-0.53571,0.0893-2.8571,1.0714-2.8571,1.0714l-0.71429,0.80357-1.5179,1.1607-2.0536,0.71429-1.4286,0.80357-1.6964-1.0714-0.35714-0.98214-0.44643-1.25s-0.35714-0.35715-1.25-0.26786c-0.89286,0.0893-2.0536,0.44643-2.0536,0.44643s-1.3393-1.4286-1.6071-1.875c-0.26786-0.44643-1.875-3.125-1.875-3.125l-1.54-1.99-1.34-1.61s-1.1607-0.71429-1.6964-0.71429c-0.53571,0-2.6786-0.17857-3.0357-0.17857-0.35715,0-1.6072-0.89285-1.7857-1.1607-0.17857-0.26786-3.4821-4.2857-3.4821-4.2857l-1.875-0.89285-2.8571-1.9643-1.9643-2.2321-1.0714-1.6964-0.89286-0.625s-0.89285-0.26786-1.25,0.0893c-0.35714,0.35714-0.80357,0.53571-1.3393,0.89285-0.53572,0.35715-1.875,1.4286-1.875,1.4286l-1.3393,1.25-1.9643,1.1607-1.4286,0.89286s-0.89286,1.0714-0.98215,1.6071c-0.0893,0.53571-0.26785,1.1607-0.26785,2.0536,0,0.89286-0.35715,3.3036-0.35715,3.3036z","name":"Buryat Republic"},"zb":{"path":"m588.41,500.07s1.1364,1.1364,1.6415,1.5152c0.50508,0.3788,1.6415,1.6415,2.2728,1.894,0.63134,0.25254,2.6516,1.6415,2.6516,1.6415s2.9042,1.0102,3.4093,1.0102h5.5558c1.1364,0,3.283,0.75762,3.283,0.75762s0.88388,0.63134,2.0203-0.25254c1.1364-0.88389,2.3991-1.6415,2.3991-1.6415s0.75762,0.25254,1.6415,0.63135c0.88388,0.3788,1.5152,1.2627,2.1466,1.2627,0.63135,0,3.4093-1.7678,3.4093-1.7678s2.6516-2.2728,3.1567-2.7779c0.50507-0.50508,2.5254-0.88388,3.5355-1.2627,1.0102-0.37881,5.4296-0.50508,5.4296-0.50508s1.894-1.2627,2.2728-1.894c0.37881-0.63135,1.7678-3.4093,1.894-3.9143,0.12627-0.50508,2.7779-2.3991,3.4093-2.9042,0.63135-0.50508,4.9245-2.5254,5.177-3.0305,0.25253-0.50508,2.0203-1.5152,2.0203-1.5152l3.1567,1.2627,2.9042,1.2627s2.2728,0.25254,2.9042,0.25254c0.63135,0,2.2728-0.50508,2.7779-0.88388,0.50508-0.37881,3.1567-1.7678,3.1567-1.7678s3.283,0.25254,3.7881,0.50508c0.50508,0.25253,1.7678,0.88388,2.3991,1.1364,0.63135,0.25254,3.9144,1.389,3.9144,1.389s3.6618,0.3788,4.4194,0.25254c0.75762-0.12627,2.5254-1.7678,2.7779-2.3991,0.25254-0.63134,0.75762-2.3991,1.6415-2.9042,0.88388-0.50507,4.2932-1.5152,4.2932-1.5152s1.389-0.12627,1.5152-1.6415c0.12627-1.5152,0.37881-2.9042-0.25254-3.5355-0.63135-0.63134-1.389-0.88388-1.7678-1.7678-0.3788-0.88389,0.88389-8.9651,0.88389-8.9651l1.6415-3.7881,1.2627-4.2932s1.389-2.2728,1.2627-2.9042c-0.12627-0.63134-0.37881-3.9143-0.37881-3.9143l-1-2.41s-1.1364-0.88388-1.5152-1.389c-0.37881-0.50507-1.0102-0.37881-1.5152-1.0102-0.50508-0.63135-1.7678-1.1364-1.7678-1.7678,0-0.63134-0.25254-1.5152,0.37881-2.0203,0.63134-0.50508,3.0305-3.0305,3.7881-3.4093,0.75761-0.37881,4.5457-2.5254,4.9245-3.0305,0.37881-0.50507,1.389-1.6415,1.7678-2.1466,0.37881-0.50508,0.88388-0.50508,0.63135-1.6415-0.25254-1.1364-2.6516-3.5355-2.6516-3.5355s-0.63135-0.88389-1.5152-0.88389c-0.88389,0-3.1567-0.3788-3.1567-1.0102,0-0.63134-0.37881-1.2627-0.12627-2.0203,0.25254-0.75762,2.0203-2.2728,2.2728-2.9042,0.25254-0.63135,0.37881-1.894,0.37881-1.894l-2.3991-1.6415-2.6516,0.12627s-0.25254-0.25253-0.25254-0.88388c0-0.63134,0.63135-2.7779,0.88388-3.283,0.25254-0.50507,0.50508-1.5152,0.63135-2.1466,0.12627-0.63134-0.25254-1.7678-0.75761-2.3991-0.50508-0.63135-1.5152-1.389-1.5152-1.389s-1.1364-0.50508-1.6415,0.12627c-0.50508,0.63134-1.1364,1.5152-1.1364,1.5152s-1.1364,0.12627-1.6415-0.25254c-0.50508-0.37881-0.88388-4.1669-0.88388-4.1669s-0.88389-1.2627-1.6415-1.389c-0.75762-0.12627-1.6415-0.12627-2.1466,0.50508-0.50507,0.63134-1.0102,1.0102-1.7678,1.5152-0.75762,0.50508-1.2627,1.1364-1.894,0.75762-0.63134-0.37881-1.389-0.75762-1.2627-1.389,0.12627-0.63135,0.75761-1.6415,0.88388-2.1466,0.12627-0.50507-1.7678-2.1466-1.7678-2.1466l-3.283-0.12627-1.1364-1.1364c-0.12627-0.75761,0.25254-2.5254,0.25254-2.5254l-1.389-1.5152-2.7779-4.0406-1.2627-1.894-3.1567-0.3788-1.1364-2.0203-0.25254-2.9042-1.2627-0.3788h-1.2627l-1.6415,0.63134-1.6415-1.0102-3.0304-0.63135-1.894,0.75762-0.37881,1.0102-0.12627,1.894,0.37881,1.894-0.25254,1.5152-0.50507,2.0203,0.75761,2.0203,0.50508,1.389,1.7678,1.5152,0.88389,0.88388,0.25254,1.894s-0.25254,1.0102-0.75762,1.389c-0.50507,0.37881-3.0305,1.2627-3.0305,1.2627s-2.3991,0.63134-2.9042,0.75761c-0.50508,0.12627-3.4093,0.75762-3.4093,0.75762l-1.389,1.5152-0.25254,1.6415,0.75762,2.5254,1.7678,3.283,1.6415,3.7881,0.75762,2.9042,2.0203,2.2728,1.2627,1.1364,2.1466,0.25254,2.2728,0.50507,1.7678,1.389,0.50507,1.6415,0.12627,1.894v2.3991l-1.894,1.6415-3.0305,1.2627-2.5254,1.2627-2.1466,2.0203-1.0102,1.7678-0.75761,2.1466-2.6516,1.6415-1.894,1.389-2.0203,1.5152-0.88388,0.88388v0.75762l0.88388,0.88388c0.50508,0.12627,2.1466,1.2627,2.1466,1.2627l1.894,1.0102s0.75762,0.88389,0.88389,1.389c0.12627,0.50508,0,1.5152-0.12627,2.1466-0.12627,0.63134-2.0203,3.6618-2.0203,3.6618l-1.894,1.6415-3.6618,2.0203-3.1567,0.63135-2.1466,1.0102s-0.75761,0.37881-1.1364,1.0102c-0.3788,0.63135-1.6415,1.2627-1.6415,1.2627l-2.2728,0.50507-1.0102,0.88388s-1.2627,0.88389-1.6415,1.389c-0.37881,0.50508-3.5355,2.9042-3.5355,2.9042l-0.88389,1.389s-0.75761,1.1364-1.389,1.2627c-0.63134,0.12627-2.2728,0.12627-2.2728,0.12627l-2.3991-0.88388-1.6415,1.389s-1.6415,0.37881-2.1466,0.88388c-0.50508,0.50508-2.7779,1.7678-2.7779,1.7678l-2.3991,0.63134s-1.894-0.25253-2.5254,0.12627c-0.63134,0.37881-1.2627,1.5152-1.2627,1.5152l0.63135,1.5152,0.25254,0.88388-0.88389,1.894s-1.0102,0.75762-1.0102,1.2627-0.88388,2.0203-0.88388,2.0203-0.50508,0.88388,0.25253,1.389c0.75762,0.50507,2.5254,0.88388,2.5254,0.88388s1.389-0.12627,1.5152,0.50508c0.12627,0.63134-1.1364,1.6415-1.1364,1.6415l-2.6516,0.75762-2.0203,1.2627-0.88389,1.6415z","name":"Zabaykalsky Krai"},"am":{"path":"m662.32,397.46,4.6429-0.17857,2.3214-0.17858,3.5714-1.7857,2.6786,0.35714,3.5714,1.0714,2.1429,1.0714,2.6786,0.53571,4.4643-0.53571,3.0357,0,2.3214,0.53571,2.8571,2.1429,2.1429,0.89286,2.8571,0.35714,2.3214-1.7857,2.3214-0.71429,1.9643,0,2.1429,1.4286,2.1429,0.71429,2.5-0.71429,1.7857-1.9643,1.7857-1.25,4.1072,0,2.5-1.4286,2.1428-0.89286,3.75,0,1.4286,0,1.25-0.71429,0.53571-2.5,1.6071-1.0714,4.2857-2.3214,2.3214-0.89286,3.5714-1.9643,2.8572-1.4286,5-0.89286,3.0357,0,1.6071,1.4286l-0.37,3.2s-1.25,1.6071-1.9643,2.6786c-0.71429,1.0714-1.6072,2.6786-1.9643,3.3929-0.35714,0.71429-1.25,2.1429-1.25,2.1429s-0.53571,2.8571-0.71429,3.5714c-0.17857,0.71428-1.0714,2.8571-1.0714,2.8571s-1.25,1.7857-1.0714,2.5c0.17857,0.71428,1.25,1.25,1.25,1.25l0.89285,0.71428,3.2143-0.71428s1.7857-0.17857,2.6786-0.17857c0.89286,0,2.5,0.89285,2.5,0.89285l0.53572,1.9643,0.89285,2.6786s0.17857,0.53572,1.6072,0.53572,2.6786-1.4286,2.6786-1.4286l0.17857-2.3214s1.0714-0.89286,1.9643-0.89286c0.89286,0,2.5-0.53572,2.5-0.53572l1.25-2.1428,0.35715-2.5,1.9643-1.7857,2.3214,0.17857c0.71,0.19,3.03-1.6,3.03-1.6l1.4286-1.4286s0.89285-1.0714,1.9643-0.35714c1.0714,0.71428,2.3214,2.5,2.3214,2.5v2.8571l0.53572,1.6071,1.9643,1.7857s1.6071,0.71428,1.25,1.6071c-0.35714,0.89286-2.8571,1.9643-3.5714,1.9643-0.71428,0-3.5714,0.89285-3.5714,0.89285l-1.6071,0.17857-1.96,0.89s-0.71429,0.17857-0.17858,1.0714c0.53572,0.89286,1.9643,1.7857,1.9643,1.7857l1.25,0.89286,0.35714,1.9643-3.2143,2.3214-1.6072,3.0357-0.17857,2.1429-1.6071,2.3214-2.6786,0.89285-1.6071,1.4286,1.9643,1.9643,0.35714,1.7857-2.3214,2.3214-1.25,3.5714,1.6071,2.8571s3.5714,1.4286,4.2857,1.6072c0.71429,0.17857,4.8214,0.71428,4.8214,0.71428s1.4286,0.71429,1.9643,1.25c0.53571,0.53572,0.71428,3.2143,0.71428,3.2143l0.35715,2.5s0,0.53571,0.71428,1.0714c0.71429,0.53571,0,3.5714,0,3.5714l-0.71428,2.8571-0.53572,1.7857-1.25,1.7857-3.2143,0.35714-4.1072-0.17857-2.8571-1.4286-1.77-0.53-3.04,1.07h-3.3929-2.5l-3.2143,0.89286s-2.6786-0.35714-3.5714-0.53572c-0.89286-0.17857-3.5714-2.1428-3.5714-2.1428l-3.22-2.67-1.07-2.15-1.43-2.14-1.7857-1.0714-1.0714-1.9643s0-1.0714-0.71428-1.6072c-0.71429-0.53571-2.6786-0.71428-2.6786-0.71428l-0.89286-1.25-1.7857-2.8571-1.9643-2.5s-1.25-1.4286-1.9643-1.6072c-0.72-0.18-1.79-0.36-2.15-1.43-0.35715-1.0714-2.3214-2.6786-2.3214-2.6786l-2.8572-1.4286-2.6786-1.4286-3.0357-0.17857-2.6786-0.17858s-0.71429,0.89286-1.6072,1.0714c-0.89285,0.17857-4.4643-0.35714-4.4643-0.35714l-3.5714-1.25-2.3214,0.35714-1.9643,0.89286-1.6072,1.4286-3.75,0.71429s-3.2143,0.71428-3.3928,0c-0.17858-0.71429-2.8572-4.1072-2.8572-4.1072l-1.7857-1.4286h-1.6071l-1.0714-1.0714v-2.1428l2.1428-2.1429,0.17858-1.4286-0.89286-1.4286-1.25-0.89286-2.1429-0.17857s-0.71428,1.0714-0.71428,0,0.71428-3.3929,0.71428-3.3929l0.89286-2.3214-0.35714-1.9643-1.25-1.7857-1.7857-0.71428-1.25,0.71428-1.25,0.71429-1.25-0.17857s-0.35714-0.71429-0.35714-1.4286c0-0.71429-1.25-2.6786-1.25-2.6786l-0.71429-0.71428-1.7857-0.17857-0.89286,0.89285-1.4286,0.89286-2.5,0.53572s-0.35714-0.35715-0.17857-1.0714c0.17857-0.71429,0.71428-2.5,0.71428-2.5l-1.25-1.4286-0.51-0.52-1.79-0.18h-2.1429l-0.35714-1.0714v-2.1429z","name":"Amur Oblast"},"ch":{"path":"M876.72,53.094c-0.34,0-0.66,0.094-0.66,0.094l-1.78,2.124-4.47,1.969s-6.05,2.853-7.12,3.031c-1.07,0.179-1.44,1.969-1.44,1.969s0.37,2.514,0.19,3.407c-0.18,0.892-1.44,1.406-1.44,1.406s-2.32,1.428-2.5,2.5c-0.18,1.071,0.91,2.156,0.91,2.156s2.66,0.906,3.37,0.906c0.72,0,2.85-0.375,3.56-0.375,0.72,0-0.34,1.625-0.34,1.625l-0.91,1.782-2.31-0.907-3.03-0.719s-2.14,0.554-3.03,0.376c-0.89-0.179-2.31-1.438-2.31-1.438l-2.69,0.531-2.88,0.375h-1.06s-0.53,2.656-1.25,2.656c-0.71,0-2.12,1.782-2.12,1.782l-3.41,0.187-2.84,2.875s-2.86,2.496-3.75,3.032c-0.9,0.535-1.61,0.531-2.5,0.531-0.9,0-2.5,1.062-2.5,1.062l-4.85,3.219-5.15,1.062-3.07,0.907s-1.04,2.861-1.93,3.219c-0.9,0.357-2.88,1.968-2.88,1.968l-3.22,1.938-2.12,1.966-2.16,3.03-1.25,1.97-1.06,2.5v3.22s-0.91,0.72-1.63,0.72c-0.71,0-2.84,1.25-2.84,1.25s-0.9,2.51-1.44,3.41c-0.53,0.89-2.85,1.76-3.56,2.12s0.34,1.25,0.34,1.25l2.35,0.53,0.53,2.16,2.69,0.53h2.65,3.75s1.44,1.07,1.97,1.78c0.54,0.72,1.63,1.78,1.63,1.78l-1.82,2.5-2.5,1.1-2.31-0.72s-1.6,1.25-2.31,1.25c-0.72,0-2.16,1.59-2.16,1.59s-1.42-0.71-2.31-1.25c-0.89-0.53-1.96,0-3.03,0s-1.26,1.26-1.44,1.97-0.87,2.84-0.87,2.84-1.09,1.79-1.63,2.5c-0.53,0.72-2.66,2.69-3.37,3.22-0.72,0.54-1.81,0.54-4.13,0.72s-1.07,1.26-1.25,2.16c-0.18,0.89-1.06,3.03-1.06,3.03s-2.15,1.24-2.69,2.31c-0.53,1.07-0.53,2.67-0.53,3.56,0,0.9,0.53,1.82,0.53,1.82h1.06l0.19-0.72,0.19-1.97,0.72-1.06,0.72,0.53,3.9,1.59,5,3.41,0.38,0.87-0.38,5.19-1.06,2.84-4.09,4.47-2.88,3.94-0.34,2.5,1.25,0.19h1.59s-0.17,1.42-0.53,2.31,0.34,1.59,0.34,1.59l2.88,1.25,3.75,0.38,4.62-0.19,2.69,3.41,2.16,1.78h4.47c1.25,0,1.06,2.5,1.06,2.5l1.06,1.59,3.94-0.34s5.36-1.44,6.25-1.44,3.2-0.53,3.56-1.25c0.36-0.71,2.69-1.59,2.69-1.59l1.97-0.91h3.75s2.66-1.24,3.37-1.59c0.72-0.36,0.74-1.98,1.1-2.69,0.35-0.71,0.87-3.03,0.87-3.03l1.25-2.5h1.63l1.78-1.06,1.06-1.63,1.44-0.34,2.31-1.44,1.06-1.25s0.91-0.89,1.63-1.78c0.71-0.89,0.87-1.6,1.4-2.31,0.54-0.72,2.51-1.44,3.22-1.97,0.72-0.54,2.15-2.14,2.5-3.03,0.36-0.9,1.63,0,1.63,0l4.09,0.68s3.22-1.04,5.72-1.93c2.5-0.9,1.08,1.06,0.91,1.78-0.18,0.71,0,3.2,0,4.09s0.88,3.22,1.78,4.47c0.89,1.25,3.9-1.44,3.9-1.44s3.05-1.78,3.94-2.5c0.89-0.71,3.94,0,3.94,0h6.06v-2.84c0-0.72,1.43-3.23,1.97-4.13,0.54-0.89,1.25-3.56,1.25-3.56l0.72-2.5-0.19-4.81s1.79-1.97,3.22-1.97,2.69,1.59,2.69,1.59l4.28,0.91,1.44-0.53s-0.19-3.22-0.19-3.94c0-0.71-0.19-2.84-0.19-2.84l-0.53-3.22s-0.54-2.51-0.72-3.41c-0.18-0.89-0.87-2.12-0.87-2.12l-2.5-1.63,1.25-0.87,4.09-0.38s1.96-2.66,2.5-3.37c0.54-0.72,2.84-2.35,2.84-2.35v-2.5s-1.04-2.13-1.93-3.03c-0.9-0.89-2.35,0.18-3.07,0.53-0.71,0.36-3.03-0.34-3.03-0.34s-1.41-0.88-2.12-0.34c-0.72,0.53-1.63,1.06-1.63,1.06l-1.4-1.06-1.97,1.78-1.44-0.72s-2.84-1.79-4.09-1.25c-1.25,0.53-1.97-0.72-1.97-0.72h-2.5s-0.56,1.25-1.1,1.97c-0.53,0.71-3.03,0.87-3.03,0.87l-2.84,0.91-2.69,3.75-2.69,0.53,1.25-2.5,0.19-1.59-3.03-0.38s2.13-0.88,2.84-1.06c0.72-0.18,3.41-1.06,3.41-1.06l1.97-0.91,0.34-1.59s1.78-3.41,1.78-4.13c0-0.71-0.68-3.22-0.68-3.22l-0.91-2.31s-2.5-4.63-3.22-5.34c-0.71-0.72-1.05-1.78-2.12-1.78-1.08,0-3.07,0.68-3.07,0.68l-1.4,0.91-1.25-1.06s-2.17-1.98-3.6-2.159c-1.42-0.178,0.38-0.719,0.38-0.719l0.87-1.593s-0.16-1.973,0.38-2.688c0.53-0.714,1.97,1.25,1.97,1.25s2.67,1.438,3.56,1.438,1.78,0.531,1.78,0.531,3.41-0.371,4.13-0.906c0.71-0.536,0.68-2.313,0.68-2.313l0.19-2.687,0.72-1.25,1.25-1.782s0.36-1.964,1.25-2.5c0.89-0.535,1.79,0,2.69,0,0.89,0,2.31,1.626,2.31,1.626l1.59,0.718,2.5-1.437s1.28-2.139,1.82-3.031c0.53-0.893,2.84-1.782,2.84-1.782l2.84-2.156,1.44-3.219s2.14-1.973,2.5-2.687c0.36-0.715-0.34-1.782-1.59-1.782h-1.78l-1.82-1.062-1.93-0.188-3.07-1.781-3.18-0.187h-3.75c-0.9,0,0-0.875,0-0.875l2.5-1.625,0.68-2.5-1.06-1.25-2.5-0.532,1.78-1.25,0.53-1.25-2.31-0.531v-2.5s-0.35-1.785-0.53-2.5c-0.09-0.357-0.45-0.437-0.78-0.437zm-77.19,16.062c-0.22-0.01-0.48,0.081-0.78,0.282-1.61,1.071-3.94,2.312-3.94,2.312-1.07,0.357-1.79,1.42-1.97,2.312-0.17,0.893-0.53,2.88-0.53,3.594,0,0.715,0.2,2.496,1.1,3.032,0.89,0.535,3.03,1.598,3.03,2.312s-0.56,2.321,0.15,2.5c0.72,0.179,1.44-0.522,1.97-1.594,0.54-1.071,0.36-3.419,0.72-4.312s1.45-2.491,1.63-3.563c0.17-1.071-0.19-5.187-0.19-5.187s-0.24-1.644-1.19-1.688z","name":"Chukotka Autonomous Okrug"},"ha":{"path":"m779.82,276.93c0.53572-0.71428,1.4286-1.4286,1.9643-2.3214,0.53571-0.89285,1.7857-2.5,1.7857-2.5s1.7857-0.17857,4.1072,0.17858c2.3214,0.35714,4.4643,1.4286,5.7143,2.1428,1.25,0.71429,2.6786,1.25,3.0357,2.3214,0.35714,1.0714,1.6071,2.1429,1.6071,3.3929s-1.4286,3.5714-1.4286,4.2857c0,0.71429-0.17857,2.5,0.71428,3.3929,0.89286,0.89286,0.71429,1.6071,1.7857,1.4286,1.0714-0.17857,3.9286-1.0714,5-1.25,1.0714-0.17857,3.3929,0,5,0.53572,1.6071,0.53571,2.8571,0.89285,3.2143,1.6071,0.35715,0.71428,1.0714,1.4286,0.89286,2.5-0.17857,1.0714-2.5,2.8571-2.5,2.8571l0.17857,1.4286,0.89286,1.6072s1.6071,0.71428-0.35714,0.89285c-1.9643,0.17857-3.0357-0.71428-3.0357-0.71428s0.17857-0.17857,0-1.0714c-0.17857-0.89286-0.71428-1.7857-1.7857-1.4286-1.0714,0.35714-2.3214,1.9643-3.0357,2.5-0.71428,0.53571-2.8571,3.0357-2.8571,3.0357s-1.9643,0.71429-2.8571,1.7857c-0.89286,1.0714-4.1071,4.6428-4.1071,4.6428s-0.17858,1.25-1.0714,2.5c-0.89286,1.25-2.3214,2.3214-2.5,3.5714-0.17857,1.25,0,4.1071,0,4.1071s1.4286,1.0714,1.6071,2.3214c0.17857,1.25-0.89286,1.9643-1.25,2.8572-0.35714,0.89285-1.4286,0.53571-1.4286,1.7857s0.17857,5.7143,0.17857,5.7143l-0.35714,4.8214-0.35715,4.1072s-1.0714,1.9643-1.25,3.2143c-0.17857,1.25-0.35714,2.6786-0.35714,3.3929,0,0.71429-0.17857,3.0357-0.17857,3.75,0,0.71429-0.71429,1.9643-0.89286,2.6786-0.17857,0.71429-1.0714,1.25-0.17857,1.9643,0.89286,0.71428,1.9643,1.9643,1.9643,1.9643l-1.7857,3.3929-0.17857,1.9643-1.7857,3.3928-1.25,3.75-0.35715,4.1072-0.71428,1.6071-3.2143,4.1071,0.35715,2.6786s2.1428,1.0714,2.8571,1.0714c0.71428,0,3.3929,0.53572,4.4643-0.17857s2.5-1.4286,3.2143-1.7857c0.71429-0.35715,1.6071-0.89286,2.8571,0.35714s2.5,4.4643,2.5,4.4643,0.17857,1.4286,1.4286,1.0714c1.25-0.35714,1.9643-2.1428,1.9643-2.1428l-1.0714-2.1429,0.53572-2.6786-0.53572-1.7857-1.6071-2.5s-1.7857-1.4286-2.5-1.4286c-0.71429,0-3.75,1.4286-3.75,1.4286s-1.9643,2.3214-1.6071,1.4286c0.35714-0.89285,1.9643-3.3928,1.9643-3.3928l1.6071-0.35715,1.25-1.7857s0.89286-0.71429,1.9643-0.71429,3.2143-1.25,3.2143-1.25,1.25-2.6786,1.0714-0.89285c-0.12,1.78-1.72,4.28-1.72,4.28l1.0714,2.1429,1.9643,2.1429,0.53572,1.7857-0.17857,2.6786,2.3214,1.4286v1.6072,2.8571l1.7857-0.71429c0.71429-0.71428,2.1429-4.2857,2.1429-4.2857l0.89285-3.2143v-2.1428s-1.6071-1.7857-0.89285-1.9643c0.71428-0.17857,4.6428-2.1429,4.6428-2.1429s2.1429-0.53571,3.0357-0.53571c0.89286,0,4.1071,0.17857,4.8214,0.35714,0.71428,0.17857,4.4643,1.6071,4.4643,1.6071s4.4643,1.25,5.1786,1.25c0.71429,0,1.9643,1.7857,1.9643,1.7857s-0.89286,1.9643,0.53571,2.8571c1.4286,0.89286,4.8214,3.0357,4.8214,3.0357l3.75,2.1428s1.4286,3.3929,1.4286,4.2857c0,0.89285-0.17857,4.6428-0.17857,5.7143,0,1.0714,0,5,0.53572,5.7143,0.53571,0.71428,1.0714,2.3214,2.1428,3.2143,1.0714,0.89286,3.2143,4.2857,3.2143,4.2857l2.5,1.25,3.0357,6.9643s1.4286,1.4286,1.6072,2.3214c0.17857,0.89286,1.6071,3.0357,1.7857,3.75,0.17857,0.71429,1.6071,5,1.7857,5.7143,0.17857,0.71428-0.53572,8.5714-0.53572,8.5714l0.53572,3.3928s0,1.25-0.89286,1.9643c-0.89286,0.71429-3.5714,1.6071-3.5714,1.6071l-1.4286,0.17857-1.4286-1.7857-0.53572-2.6786-3.0357-3.0357s-1.9643-1.25-2.6786-0.71428c-0.71429,0.53571-2.3214,1.9643-2.3214,1.9643s-0.89286,1.7857-1.25,2.5c-0.35714,0.71429-1.4286,1.25-0.89286,2.3214,0.53572,1.0714,1.9643,2.6786,1.9643,2.6786s0.35714-0.71428,2.1428-0.53571c1.79,0.18,2.14,2.68,2.14,2.68l-0.89286,3.2143s-1.9643,1.25-2.6786,1.6071c-0.71428,0.35714-2.8571,1.25-1.7857,2.1429,1.0714,0.89285,2.3214,1.25,2.3214,1.25s0.71428,1.25,0,1.9643c-0.71429,0.71429-2.3214,2.1429-2.3214,2.1429s-1.7857,0.35714-3.0357,1.25-3.2143,1.4286-4.2857,1.6071c-1.0714,0.17857-2.8571,1.25-4.1071,0s-2.1429-0.89285-2.5,0.17857c-0.35715,1.0714-1.6072,0.89286-1.7857,1.9643-0.17857,1.0714,0,2.8571,0.35715,3.5714,0.35714,0.71428,0,3.0357,0,3.0357s-2.3214,1.9643-2.5,1.25c-0.17858-0.71428,0.17857-2.3214-0.35715-3.2143-0.53571-0.89286-2.3214-2.5-2.3214-2.5s-2.8571-1.4286-1.7857-2.3214c1.0714-0.89286,2.8571-2.6786,3.2143-3.2143,0.35714-0.53571,0.35714-3.0357,0.35714-3.0357s-2.1429-0.89286-2.6786-1.7857c-0.53572-0.89285-1.0714-3.3928-1.0714-4.1071,0-0.71428-0.71429-3.3929,0.17857-3.75,0.89286-0.35714,2.8571-1.9643,2.8571-1.9643l0.53572-1.9643s-0.53572-0.35714-2.1429-0.35714c-1.6071,0-2.5-0.17857-3.9286,0.89285s-1.4286,1.0714-2.5,2.5-2.1429,2.6786-3.2143,3.2143c-1.0714,0.53571-2.6786,0.71429-2.6786,0.71429s-4.1071-0.71429-4.2857-1.4286c-0.17857-0.71428-1.6072-1.9643-2.5-1.9643-0.89286,0-2.1429,0.35714-3.2143,0.89286-1.06,0.55-1.95,0.73-2.84,0.73-0.89286,0-4.2857,1.0714-4.2857,1.0714s-2.1428,1.7857-3.2143,1.7857c-1.0714,0-2.1014,0.40945-2.28-0.66198-0.17857-1.0714-1.0823-3.4216-1.0823-3.4216l-1.5332-4.3507s-2.6677-0.69261-3.7392-0.87119c-1.0714-0.17857-3.8221-0.85138-3.8221-0.85138l-2.4892-1.1525s-2.1249-2.2078-1.7678-2.9221c0.35714-0.71428,1.7028-4.0044,2.4171-4.5401,0.71428-0.53572,1.2608-1.4069,1.2608-1.4069l-1.25-2.3214s-1.7965-1.2085-0.90368-1.7442c0.89286-0.53571,3.7608-2.0058,3.7608-2.0058l2.0906-4.0892,1.5025-3.2341,3.5498-2.6767-0.89285-1.9643-2.4171-1.7118-0.11357-1.6288,2.5306-1.1237,4.1071-0.71428,2.6786-0.89286,1.0714-1.25-0.53571-1.6071-1.986-1.47-1.0083-2.5108-0.0631-2.4477-1.47-2.0058-1.7226-0.67282-2.2583,1.7442s-1.6703,1.0823-2.3846,1.4394c-0.73,0.34-2.87,0.19-2.87,0.19l-2.3214,1.25-0.44008,2.5-0.80992,2.3214-2.5,1.0714-2.1429,0.53571-0.53571,2.4585-1.4809,1.4286-2.3431-0.17857-0.99746-2.4585-1.0714-2.5s-1.2608-0.51404-1.9751-0.69262c-0.71428-0.17857-4.4534,0.51405-4.4534,0.51405l-1.7857-0.17857-1.7857-1.25,1.9643-5.5357,0.89286-4.1072s1.25-2.3214,1.9643-3.0357c0.71428-0.71429,3.0357-5,3.0357-5l0.35714-2.6786s-0.53571-1.25-1.6071-1.6072c-1.0714-0.35714-5.3571,0.17858-5.3571,0.17858l-2.6786,0.53571s-3.3424,2.5325-4.0567,1.8182c-0.71428-0.71429-1.1219-3.9611-1.1219-3.9611s-3.0376-1.6288-3.0376-2.5217c0-0.89286,1.9662-1.5855,1.9662-1.5855s0.53571-1.0714,0.71428-2.1429c0.17857-1.0714-0.20024-2.8138-0.20024-2.8138l-2.6281-0.77741s-1.4069-0.89472-2.1212-1.0733c-0.71428-0.17857,1.1996-2.2998,1.1996-2.2998l0.89286-1.6072-0.35714-1.0714s-2.2493-0.54655-2.2493-1.2608c0-0.71429,1.6505-3.3604,1.6505-3.3604l-1.5873-1.6703-2.5415-0.82971-0.80806-1.618s0.69262-0.73594,1.5855-1.0931c0.89286-0.35714,1.0498-0.61866,1.0498-0.61866l-1.3852-0.89286v-2.4062c0-0.71429-0.074-2.3304-0.074-2.3304s-1.2718-1.1078-1.4502-2.345c-0.1894-1.3131,2.6371-1.7532,2.6371-1.7532l-0.93619-0.82972-0.49238-1.4917,0.2417-2.1339,2.7525-0.86037,2.9094-0.89285,2.4477,0.1371,0.70345-1.8922,3.2034,0.21106,2.9203,0.0108s0.35715-1.7749,0.35715-2.4892c0-0.71428-1.8705-1.618-1.4286-2.2691,0.40112-0.59101,1.5657-0.89285,2.4585-1.0714,0.89286-0.17858,3.9286-0.71429,4.1072-1.4286,0.17857-0.71428,2.5829-6.1562,2.5829-6.1562s0.96683-1.0083,1.6811-1.1869c0.71429-0.17857,3.9286-0.93432,3.9286-0.93432l-1.764-2.794-3.0051-2.8246-1.6378-4.8539-2.3214-2.1428-1.4286-1.7857v-5.3571l3.0357-6.7857-1.0714-3.2143-0.72512-5.8585,0.81889-2.85s3.5498,0.11543,4.264,0.29401c0.71428,0.17857,7.7634,0.22004,7.7634,0.22004s0.95599-4.0152,1.3131-4.7295c0.35714-0.71428,1.3871-0.826,2.28-1.0046,0.89286-0.17857,3.3495-0.62051,3.3495-0.62051l2.5433,1.1562,1.6071-1.0714z","name":"Khabarovsk Krai"},"eu":{"path":"m781.96,462.82c0.98214,1.875,1.1607,1.875,1.875,2.5893l2.6786,2.6786s0.80357,1.1607,1.0714,1.7857c0.26786,0.625-0.0893,1.6964,0.625,1.9643,0.71429,0.26785,2.3214,0.53571,2.7679,0.625,0.44643,0.0893,1.4286,1.0714,2.3214,1.1607,0.89285,0.0893,1.6071,0.0893,2.1428-0.35714,0.53572-0.44643,1.0714-1.25,1.6964-1.7857,0.625-0.53571,2.5893-1.4286,3.125-1.6964,0.53572-0.26785,1.875-0.625,2.3214-1.0714,0.44643-0.44643,1.1607-0.98215,1.1607-2.0536s0.26785-2.7678,0.71428-3.125c0.44643-0.35714,2.9464-1.9643,3.5714-2.5,0.625-0.53571,1.6964-2.2321,2.1429-2.8571,0.44643-0.625,1.875-2.6786,2.2321-3.2143,0.35714-0.53572,2.1429-2.0536,2.1429-2.0536l2.0536-2.3214,0.98214-1.0714,2.6786-1.875,0.71429-0.80357,0.17857-1.1607,0.0893-0.35714-1.5179-0.17857-1.875-0.0893-1.6964,0.44643-1.6964,1.1607-1.3393,1.25-0.80358,1.0714-1.25,1.6072-1.4286,0.98214-1.7857,0.625s-1.25,0.17857-1.7857,0c-0.53571-0.17857-2.1428-0.71429-2.1428-0.71429l-1.4286-0.625-0.80358-0.98214-0.89285-0.625s-0.80357-0.26786-1.1607-0.17857c-0.35714,0.0893-1.7857,0.625-1.7857,0.625l-2.0536,0.71429-2.4107,0.17857s-1.0714,0.44643-1.7857,0.625c-0.71429,0.17857-2.4107,0.80357-2.4107,0.80357l-1.4286,0.89285-1.875,0.26786-0.80357,0.17857-0.35714,0.98215-0.0893,1.4286s-0.44643,1.1607-0.44643,1.5178c0,0.35715-0.53571,1.875-0.53571,1.875l-0.53571,1.1607-0.71429,1.4286z","name":"Jewish Autonomous Oblast"},"pr":{"path":"m822.68,473.71c0,0.53571,0.53571,1.25,0.53571,1.25l1.4286,1.4286s0.35715,1.0714,0.44643,1.4286c0.0893,0.35714-0.625,2.0536-0.625,2.0536l-1.1607,2.7679s-0.0893,2.2321,0,2.5893c0.0893,0.35715,0.625,1.0714,0.89285,1.5179,0.26786,0.44643,0.80358,1.1607,0.80358,1.5179,0,0.35714-0.80358,1.9643-0.80358,1.9643v1.9643c0,0.44643-0.44642,1.9643-0.44642,1.9643s-0.17858,0.0893-0.17858,1.0714v2.7679c0,0.71429-0.26785,3.0357-0.35714,3.3929-0.0893,0.35714-1.9643,0.53571-2.3214,0.53571-0.35714,0-1.3393-0.98214-1.3393-0.98214s-0.98215-1.6071-1.1607-2.0536c-0.17857-0.44643-1.3393-1.5179-1.3393-1.875,0-0.35715-0.26786-1.6072-0.89286-1.7857-0.625-0.17857-1.5179,0.26786-1.5179,0.26786s-0.53571,0.89286-0.625,1.25c-0.0893,0.35714,0,0.98214-0.0893,1.4286-0.0893,0.44643-0.71429,2.5-0.71429,2.5s-0.625,0.625-1.1607,0.89286c-0.53572,0.26786-2.2322,1.0714-2.2322,1.6071,0,0.53572,1.0714,0.71429,2.1429,2.0536,1.0714,1.3393,3.125,4.6429,3.125,4.6429l2.5,4.2857,1.4286,4.9107s0.44643,1.6071,0.625,2.1429c0.17857,0.53571,0.89286,1.1607,0.98215,1.9643,0.0893,0.80357,0.53571,2.5-0.35715,2.8571-0.89285,0.35715-4.0178,1.0714-4.0178,1.0714l-0.71429,0.625,1.1607,0.71429s0.625,0.44643,1.0714,0.53571c0.44643,0.0893,0.53572,1.4286,0.98215,1.4286,0.44642,0,1.875-0.35714,2.4107-0.71428,0.53571-0.35714,1.3393-0.625,2.1429-0.625,0.80357,0,1.4286-0.44643,1.4286-1.0714,0-0.625-0.625-3.3929-0.625-3.8393,0-0.44642,1.5179-2.5893,1.5179-2.5893v-2.1429c0-0.35714-0.17858-1.4286,0.35714-1.5179,0.53571-0.0893,2.9464-0.71428,2.9464-0.71428s0-1.1607,1.0714-0.26786c1.0714,0.89286,1.5178,2.9464,1.5178,2.9464s1.875,0.35714,2.2322,0.17857c0.35714-0.17857,0.98214-0.625,1.5178-0.98214,0.53572-0.35714,2.5893-0.53572,3.3929-0.53572,0.80357,0,2.1429-0.44642,2.1429-0.44642l-0.26786-1.1607s2.0536-1.25,2.5-1.5179c0.44643-0.26785,2.2321-1.1607,2.8571-1.7857s1.5179-1.4286,1.9643-2.4107c0.44643-0.98215,1.3393-3.125,1.5179-3.4822,0.17857-0.35714,1.1607-2.5,1.4286-3.2143,0.26785-0.71429,0.89285-2.3214,1.3393-3.125,0.44643-0.80357,1.5179-2.8572,1.5179-2.8572s-0.0893-2.3214-0.0893-2.8571c0-0.53571-0.26785-1.875-0.625-2.8571-0.35714-0.98214-0.53571-1.1607-0.44642-2.1429,0.0893-0.98214,0.98214-1.6071,1.6071-2.0536,0.625-0.44643,1.0714-1.4286,1.0714-1.9643,0-0.53571-1.25-2.9464-1.25-2.9464s0.0893-1.1607,0.35714-1.6964c0.26786-0.53572,1.5179-1.7857,1.5179-1.7857l0.17857-2.9464s0.80357-2.2321,0.80357-2.6786c0-0.44643,0.26786-3.9286,0.26786-3.9286l0.89285-2.1429s0.26786-3.3928,0.26786-3.9286c0-0.53571-0.53571-5-0.53571-5.5357,0-0.53572-0.17857-4.1071-0.17857-4.7321s-0.71429-2.1429-0.71429-2.5893c0-0.44643,0.0893-2.1429,0.26786-2.5893,0.17857-0.44643,0.98214-1.9643,0.98214-1.9643s-0.0893-2.0536-0.0893-2.5893c0-0.53571,0.17858-1.6964-0.44642-1.7857s-2.3214,0.80357-2.3214,0.80357l-1.7857,0.71429-1.5178,0.17857-0.71429-0.44643-1.0714-1.4286s-0.26786-1.4286-0.26786-1.7857c0-0.35714-0.53571-1.1607-0.53571-1.1607l-1.25-1.3393-1.3393-1.3393-1.4286-0.71429-1.0714,0.17857s-0.98214,0.17858-1.0714,0.53572c-0.0893,0.35714-0.53572,0.44643-0.80358,0.80357-0.26785,0.35714-1.1607,1.3393-1.1607,1.3393l-0.53571,1.0714-0.44643,1.0714-0.80357,0.80357-0.17858,0.71429,0.35715,0.80357,0.89285,0.98214s0,0.71429,0.53572,0.80358c0.53571,0.0893,1.0714,0.0893,1.0714,0.0893h1.3393l1.25,0.625,0.71429,0.80357,0.0893,1.3393-0.26785,1.4286-0.44643,1.25-0.53572,0.71429-1.5178,0.89285-1.7857,0.89286-0.89285,0.89286,0.26785,0.80357,1.9643,0.80357,0.80357,0.98214-0.0893,0.71429-0.80357,1.0714-1.0714,1.0714-1.875,0.89286-1.7857,0.98214-3.64,1.44-1.6964,0.44643-1.9643,0.26786-0.89286-0.44643-1.25-0.71429s-0.53571-0.26786-0.89285,0c-0.35715,0.26786-0.625,0.98214-0.625,0.98214l-1.5179,1.0714-0.53571,1.6964,0.0893,1.3393s0.35714,0.71428,0.44643,1.1607c0.08,0.44,0.08,1.33,0.08,1.33l-0.0893,1.6071-0.98214,1.0714z","name":"Primorsky Krai"},"ma":{"path":"m829.64,182.46s1.0714,0.71428,2.1429,1.25c1.0714,0.53571,3.0357,2.1429,3.2143,2.8571,0.17857,0.71429,0.17857,2.3214,1.0714,2.8571,0.89286,0.53572,3.5714,1.0714,3.5714,1.0714l1.9643,0.89286,1.0714,1.7857,3.0357,1.6072s0.71429,1.0714,0.17857,1.9643c-0.53571,0.89286,0,2.6786,0,2.6786l2.5-0.35714,2.8572,0.35714,1.6071,2.3214,1.9643,2.6786,2.1429,1.0714,1.9643,2.1429,1.0714,1.9643,0.17857,2.5s-0.35715,2.5,0,3.2143c0.35714,0.71429,1.0714,3.75,1.0714,3.75l1.0714,1.7857s0.53572,1.0714,0.53572,1.7857c0,0.71428-0.89286,2.1429-0.89286,2.1429l0.17857,1.7857-1.9643-0.53571-0.35715-1.9643s0.35715-0.71429-0.53571-0.35714c-0.89286,0.35714-1.7857,1.4286-1.7857,1.4286s-0.35715,0.89286-1.0714-0.53572c-0.71429-1.4286-1.7857-1.9643-1.7857-1.9643s-1.6071-0.71429-1.6071-1.9643-1.7857-2.3214-1.7857-2.3214l-1.6072-1.4286s-0.35714,1.7857-0.35714,2.5c0,0.71429,1.4286,1.4286-0.35714,1.4286s-4.1072,0.71429-4.1072,0.71429l-0.89285,1.0714-0.35715,2.6786-1.25,1.25-2.6786,2.8571-0.35714,2.3214-1.0714,1.9643,0.53572,2.3214,1.4286,1.4286s0.53571,0.71428,0.53571,1.4286v2.6786l0.17857,1.6071,1.6072,1.4286,0.17857,4.4643v4.4643l0.17857,3.0357,1.7857,2.6786,1.0714,3.0357,0.35714,0.89285,1.9643,0.35715,1.0714-1.25,1.9643-1.0714s1.6072-0.17857,2.3214-0.17857c0.71429,0,1.6072,0.89285,1.6072,0.89285l0.17857,0.89286-1.7857,1.4286-1.7857,0.71429v1.0714l-0.71429,0.89285-1.7857,0.89286-1.25,0.53571-0.53572,0.71429-0.17857,2.6786v2.3214l-0.89285,0.71429-1.7857-0.89286-0.71428,1.4286-0.53572,2.5-1.0714,1.25-3.2143,0.71429-1.25-0.17858-0.53572-1.6071,2.5-1.6071,1.25-1.9643s1.9643-1.7857,0.53572-1.7857-2.6786,1.0714-2.6786,1.0714l-0.89286,1.25-0.89286,0.53571s-0.89286,0.35714-1.7857-0.17857c-0.89286-0.53571-2.3214-0.71429-2.3214-0.71429s-1.25,0.89286-1.25,1.4286c0,0.53571,0.35714,1.4286-0.53572,1.4286-0.89285,0-3.2143,0.17857-3.2143,0.17857l-2.5,1.6071-2.5,0.89286-1.0714,2.1429,0.35714,1.7857,0.53572,1.9643,0.35714,0.89285,1.6071,1.0714s0.17857,0.89286-1.7857,0.89286h-4.4643l-1.0714,2.1429-1.0714,1.25-2.5,0.35714-2.1429-2.8571-2.6786-1.25s-1.9643-0.71429-2.6786-0.71429c-0.71429,0-3.3929,0.17857-3.3929,0.17857l-2.1429,0.89286-1.7857,0.17857-1.25-0.89286-1.0714-1.7857-0.17857-2.3214,1.25-1.9643,0.17857-2.5-2.5-3.9286-2.3214-1.4286-2.3214-1.25-2.6786-0.71428-2.6786-0.71429-2.1429,0.71429-1.0714,1.4286-1.0714,1.9643-0.89285,1.25h-1.25l-1.25-1.9643-0.17857-0.89286,1.25-0.71429,0.35714-1.4286v-1.25l-1.25-1.25-5.7143-6.7857s-0.35714-1.0714-0.35714-1.7857v-3.2143l-1.78-0.88-0.89286-0.35714-0.17857-3.0357-0.53572-1.4286-1.0714-0.35714-0.35714-1.25,1.6071-1.4286,2.1429-0.17857,1.0714-0.53572,1.0714-1.0714,2.1429-0.17857,1.9643,0.17857,0.53572-1.0714-1.25-1.9643-1.4286-1.25-0.35714-2.1429s1.25-0.53571,1.9643-0.53571c0.71428,0,3.5714-1.0714,3.5714-1.0714l-0.17858-2.6786s0.53572-0.35714,1.25-0.35714c0.71429,0,3.9286,0.35714,3.9286,0.35714l2.1428-1.7857,4.1072-6.4286-0.17858-3.0357-1.4286-1.4286-2.6786-2.8572s-1.25-0.89285-1.4286-1.6071c-0.17857-0.71428-0.35714-1.7857-0.35714-1.7857l2.1428-2.3214,0.17858-1.6071-1.25-1.25-2.5,0.17857-0.71429-0.53572-1.0714-1.0714v-0.71429l3.06-0.86,1.25-1.0714-0.53572-1.4286-1.25-0.89285-0.17857-1.6072,2.1429-3.0357,3.75-1.25,2.1428-1.25-1.25-2.5s0.17858-0.35714,0.89286-0.35714c0.71429,0,3.3929,0.71428,3.3929,0.71428l1.0714-0.17857-0.53572-3.5714v-1.6071l1.4286-0.53572,0.2-2.66-0.17858-0.53571h2.5l1.6072,0.53571,0.53571,1.9643,1.0714,1.0714s0.53571,0.53571,1.25,0.53571,3.75-0.71428,3.75-0.71428l3.5714-0.71429,2.3214-0.35714,2.6786-1.0714,2.3214-1.4286,2.3214-0.89286,1.9643-0.17857,2.8571-0.35714,2.5-1.6072z","name":"Magadan Oblast"},"sh":{"path":"M943.16,321.59c-0.45,0.19-0.81,0.37-1.19,0.94s-0.31,1.53-0.5,1.85c-0.19,0.31-1.53,1.12-1.53,1.12-0.51,0.51-0.87,1.06-2,1.25-1.14,0.19-2.59-0.23-2.85,0.66-0.25,0.88,0.06,2.12,0.69,2.25,0.63,0.12,1.53,0.44,2.1,0.25,0.56-0.19,1.56-1.25,1.56-1.25s0.62,0.3,1,0.93c0.38,0.64,0.97,1.78,0.97,2.03,0,0.26,0.19,1.06-0.07,1.57-0.25,0.5-0.81,2.78-0.56,3.03s1.24,0.9,1.94,0.9c0.69,0,1.09,0.17,1.78-0.78,0.69-0.94,0.93-1.74,1.25-2.56s0.78-1.9,1.09-2.16c0.32-0.25,0.48-1.02-0.22-1.65-0.69-0.63-0.93-1.75-1-2.06-0.06-0.32-0.56-1.09-0.24-1.53,0.31-0.45,1.12-1.31,1-1.69-0.13-0.38-1.38-1.09-1.82-1.47s-0.96-1.82-1.4-1.63zm2.15,20.44s-0.43,0.15-0.69,0.85c-0.25,0.69-0.5,1.74-0.31,2.31s0.56,1.4,0.81,1.78c0.26,0.38,0.75,1.31,0.88,1.62,0.13,0.32,0.53,0.72,1.03,0.91,0.51,0.19,1.12,0.07,1.25-0.44,0.13-0.5,0.19-1.4,0.19-2.03s-0.19-2.15-0.19-2.53,0.07-0.87-0.31-1.31-2.66-1.16-2.66-1.16zm2.53,9.22c-0.56,0.19-1.9,0.5-2.15,0.69-0.26,0.19-0.63,0.52-0.5,1.03,0.12,0.5-0.2,1.24,0.5,1.69,0.69,0.44,2.15,0.96,2.53,1.09s0.55,0.44,1.19,0.13c0.63-0.32,1.09-0.59,1.03-1.41-0.07-0.82-0.59-1.62-0.78-1.88-0.19-0.25-1.5-1.34-1.5-1.34h-0.32zm-117,4.5l-1.87,1.25s0.5,1.12,0,1.12h-1.78s-1.26,0.78-0.5,1.29c0.76,0.5,2.4,0.87,3.03,1,0.63,0.12,1.52,0.65,2.16,1.15,0.63,0.51,1.49,0.87,1.74,1.63,0.26,0.76,0.63,2.28,0.63,2.28l0.91,1.62-0.54,2.16-1.74,0.13s-0.91-1.14-1.41-0.13c-0.51,1.01-0.5,1.77-0.5,2.41,0,0.63,0.27,1.24,0.91,1.37,0.63,0.13,1.48,0.4,2.74,1.41,1.27,1.01,2.03,2.9,2.29,3.53,0.25,0.63,0.24,2.65,0.5,3.41,0.25,0.75,1.4,2.02,2.03,2.53,0.63,0.5,2.03,2.52,2.28,3.03,0.25,0.5,1.25,2.4,1.5,2.9,0.25,0.51,1.78,1.75,1.78,1.75s1.24,1.15,2,1.66,3.8,1.37,4.56,1.37,3.03,0.66,3.28,1.16c0.26,0.51,2.78,5.66,2.78,5.66l5.57,8.34s2.52,2.15,3.15,2.66c0.64,0.5,2.4,3.9,2.91,4.65,0.51,0.76,2.12,4.44,2.5,4.94,0.38,0.51,3.69,5.06,3.69,5.06s2.77,1.88,3.4,2c0.64,0.13,3.41,1.91,3.41,1.91s2.65,2.9,2.78,3.41c0.13,0.5,0.75,3.53,0.75,3.53l2.16,3.4,3.15,2.66,2.5,5.19,0.53,2.25s0,2.15,0.5,2.53c0.51,0.38,5.29,4.06,5.29,4.06l1.65,0.88,1.78,0.25v-2.54s-0.9-1.65-1.15-2.15c-0.26-0.51-0.88-3.03-0.88-3.03s-0.5-0.74-0.5-1.63c0-0.88,0.75-2.4,0.75-2.4s1.53-0.25,2.16-0.25,1.24-0.12,2.25-0.63c1.01-0.5,2.41-0.37,2.41-0.37l2.28,2,1.37,0.78s0.5-1.4,0.5-2.03c0-0.64,0.01-1.53-0.62-2.41-0.64-0.88-1.63-1.88-1.63-1.88l-2.03-1.65s-0.99-1.38-1.75-1.25-1.15,0.24-1.41,0.75c-0.25,0.5,1.52,2.66,0,2.28-1.51-0.38-2.4-0.9-2.78-1.41-0.38-0.5-1.62-1.87-1.62-1.87s-2.4-1.28-3.03-1.53c-0.64-0.26-2.4-0.88-3.04-0.88-0.63,0-4.06-1.15-4.06-1.15l-2.12-2.38-2.41-6.31s-1.12-1.65-1.25-2.41-1.03-3.15-1.16-3.65c-0.12-0.51-0.37-2.28-0.62-2.78-0.25-0.51-1-2.29-1-2.29l-0.53-3.28,1.78-1.62s2.77-1.03,3.41-1.03c0.63,0,5.06-0.13,5.06-0.13l2.4,0.63s2,0.25,2.5,0.25c0.51,0,1.03,0.51,1.16-0.5s-1.53-2-1.53-2l-3.53-0.53-3.66-1.26-2.4-1.78-18.57-15.25-1.5-1.28-1.78-0.12s-0.87,0.13-1.25-0.63-0.4-1.27-1.15-1.9c-0.76-0.64-2.5-1.88-2.5-1.88s-1.52-0.25-2.66-0.5-3.66-1.4-3.66-1.4l-0.4-2.79-1.38-1.25-0.62-1.28,1.25-1.62-0.25-1.91-2.53-2.12-3.54-0.79s-2.4-0.99-2.65-1.5c-0.25-0.5,0.12-2.15,0.12-2.15s-0.62-1.12-1.12-1.5c-0.51-0.38-4.28-1.91-4.28-1.91l-2.91-1.9-1.03-2.63s0.01-1.91-0.63-1.91c-0.63,0-2.78-0.87-2.78-0.87zm119.16,7.94c-0.88,0.25-1.53,0.4-1.72,0.97-0.19,0.56,0.06,1.24,0.31,1.43,0.26,0.19,0.84,0.69,1.47,0.57,0.63-0.13,1.56-0.19,1.82-0.57,0.25-0.38-1.13-1.46-1.32-1.78-0.19-0.31-0.56-0.62-0.56-0.62zm1.75,4.06c-0.51,0.25-1.19,0.56-1.37,1.06-0.19,0.51,0.36,1.37,1,1.75,0.63,0.38,1.05,0.63,1.56,0.06,0.5-0.56,1.09-1.62,1.03-1.93-0.06-0.32-2.22-0.94-2.22-0.94zm0.19,6.97c-0.18,0.01-0.34,0.06-0.5,0.16-0.63,0.37-0.82,1.18-0.82,1.56s0.88,3.09,0.88,3.47-0.87,2.4-1,2.9c-0.13,0.51-0.01,1.33,0.62,2.6,0,0,1.13-0.25,1.38-0.25s1.72-0.94,1.84-1.19c0.13-0.25,0.44-2.28,0.44-2.91s-0.06-2.02-0.12-2.47c-0.07-0.44-0.63-1.4-0.63-1.78s-0.31-1.43-0.69-1.69c-0.28-0.18-0.87-0.44-1.4-0.4zm-4.41,14.53s-1.28,0.03-1.53,0.16c-0.25,0.12-0.69,0.49-0.81,0.75-0.13,0.25-0.57-0.07,0.06,0.62,0.63,0.7,1.02,1.38,1.66,1.38,0.63,0,2.06,0.65,2.31,0.65s1.03-0.21,1.22-0.47c0.19-0.25,0.75-0.49,0.31-1.18-0.44-0.7-0.97-1.06-1.22-1.19s-2-0.72-2-0.72zm1.81,6.47c-0.19,0.31-1.37,1.18-1.43,1.44-0.07,0.25-0.32,0.74-0.38,1.25-0.06,0.5-0.31,1.77-0.31,2.09s-0.53,1.59-0.78,2.16c-0.26,0.56-0.5,1.49-0.44,2.12s-0.07,1.09,0.19,1.66c0.25,0.57,0.24,1.18,0.56,1.37s-0.04,1.29,1.09,0.6c1.14-0.7,1.63-1.34,1.82-1.79,0.19-0.44,0.53-2.09,0.72-2.34,0.18-0.25,0.56-1.43,0.68-1.81,0.13-0.38,0.63-1.9,0.63-2.22s0.06-1.59-0.25-2.22c-0.32-0.63-1.19-1.31-1.19-1.31l-0.91-1zm-4.9,15.4c-0.26,0.07-0.97,0.19-1.28,0.44-0.32,0.26-0.63,0.56-0.69,0.75s-0.5,0.94-0.5,1.19,0.06,1.15,0,1.41c-0.06,0.25,0,0.56-0.56,0.81-0.57,0.25-1.22,0.43-1.6,0.56s-0.81,0.44-1.06,0.69-0.94,0.72-0.94,0.72-0.53,0.18-0.53,0.5c0,0.31,0.41,0.99,0.53,1.25,0.13,0.25,0.75,1.22,0.75,1.22l-0.18,0.75s-1.04,0.74-1.1,1.06c-0.06,0.31-0.12,1.59-0.12,1.97s0.06,1.74,0.06,2c0,0.25,0.19,1.84,0.19,2.09s0.15,1.34,0.28,1.97c0.12,0.63,0.12,1.06,0.43,1.44,0.32,0.38,0.56,1.03,0.88,1.22s0.5,0.68,0.88,0.62c0.37-0.06,1.71-1.03,1.71-1.03s0.63-0.62,0.75-1.06c0.13-0.44,0.44-2.16,0.44-2.16s0.19-1.37,0.13-1.69c-0.07-0.31-0.69-0.65-0.75-1.22-0.07-0.56-0.07-0.8,0-1.68,0.06-0.89,0.87-2.09,1.06-2.35,0.19-0.25,0.84-1.18,0.97-1.93,0.12-0.76-0.07-1.84,0.19-2.16,0.25-0.32,0.8-0.75,1.06-1.06,0.25-0.32,1.06-1.65,1.18-2.03,0.13-0.38,0.13-1.4,0.13-1.91s-0.31-1.37-0.56-1.56c-0.26-0.19-1.75-0.82-1.75-0.82zm-8.35,23.69c-0.31-0.01-0.62,0-0.75,0.03-0.25,0.07-0.56,0-0.81,0.32-0.25,0.31-0.78,0.71-1.22,0.84s-0.87,0-0.93,0.31c-0.07,0.32-0.26,0.87-0.26,1.13,0,0.25,0.06,0.74,0.32,1,0.25,0.25,0.62,0.21,0.75,0.78,0.12,0.57,0.19,1.18,0.12,1.44-0.06,0.25-0.31,1.12-0.37,1.43-0.07,0.32-0.19,0.4-0.38,1.03-0.19,0.64-0.31,1.38-0.31,1.76v1.15c0,0.38-0.06,1.19,0.13,1.44,0.18,0.25,0.62,0.56,0.87,0.81s1.47,0.47,1.72,0.47,0.5-0.28,0.75-0.66,0.56-0.99,0.56-1.56-0.12-2.96-0.06-3.28,1.12-0.84,1.19-1.41c0.06-0.56,0.03-1.74,0.09-2,0.06-0.25,0.31-1.15,0.31-1.15s0.75-0.44,0.88-0.81c0.12-0.38,0.25-1.13,0.25-1.5,0-0.38-0.19-1.54-0.19-1.54h-1.84c-0.19,0-0.5-0.02-0.82-0.03zm7.85,1.88c-0.57,1.01-0.72,0.99-0.78,1.75-0.07,0.76-0.88,1.53-0.88,1.53s-0.31,0.31-0.44,0.62c-0.12,0.32-0.69,0.81-0.06,1s1.72,0.19,1.97,0.07c0.25-0.13,0.75-0.69,1-0.82,0.25-0.12,0.44-0.49,0.44-1.37,0-0.89-0.19-1.9-0.31-2.16-0.13-0.25-0.94-0.62-0.94-0.62z","name":"Sakhalin Oblast"},"ka":{"path":"M888.56,146.75l-1.65,0.84c-0.26,0.13-1.25,0.88-1.25,0.88l-0.13,1,0.13,2.78,0.25,1.16-0.88,2.43-1.72,4.69-0.93,1.56-0.44,1.41-0.06,1.81s-0.22,1.03-0.47,1.22c-0.26,0.19-0.82,0.13-0.82,0.13h-1.81-2.59l-1.6-0.19-1.68-0.31s-0.53,0.25-0.85,0.25c-0.31,0-0.68,0.56-1,0.75-0.31,0.19-1.37,0.74-1.56,1-0.19,0.25-1.28,0.78-1.59,0.9-0.32,0.13-1.38,1-1.63,1.19s-0.78,0.56-1.22,0.63c-0.44,0.06-0.94-0.32-0.94-0.32s-0.62-0.99-0.74-1.25c-0.13-0.25-0.97-1.72-0.97-1.72s-0.07-1.31-0.13-1.62c-0.06-0.32-0.06-1.47-0.12-1.72-0.07-0.25-0.13-1.06-0.13-1.06s0.25-1.22,0.31-1.66c0.07-0.44,0.38-0.75,0.38-0.75s0-0.56-0.19-0.87c-0.19-0.32-0.81,0.06-0.81,0.06l-1.75,0.44-1.97,0.81-1.66,0.5-1.18,0.19-2.04-0.25s-1.62-0.38-1.87-0.57-1.03-0.12-1.03-0.12l-0.63,0.56-0.87,1.16-0.63,0.81-0.84,0.88s-1.31,0.74-1.56,0.87c-0.26,0.13-0.94,0.59-0.94,0.59l-1.22,1.32-1.44,2.28s-2.27,2.28-2.59,2.47-1.18,0.87-1.44,1.12c-0.25,0.25-1.34,0.38-1.72,0.44s-0.74,0.62-1,0.94c-0.25,0.31-1.15,1.28-1.15,1.28l-0.81,0.56s-0.75-0.31-1.13-0.31-0.44,0.31-0.44,0.31l-0.97,1.91-1,2.18s-0.5,1.59-0.5,1.91,0.63,0.44,0.88,0.63c0.25,0.18,1.65,0.8,2.03,1.06,0.38,0.25,1,0.84,1.31,1.15,0.32,0.32,1.41,1.32,1.41,1.32s-0.13,0.43-0.06,0.68c0.06,0.26,0.37,1.15,0.68,1.66,0.32,0.51,0.94,0.81,0.94,0.81s4.09,1.16,4.35,1.28c0.25,0.13,1.09,1.32,1.09,1.32l0.37,0.68s1.13,0.85,1.44,1.04c0.32,0.18,1.22,0.31,1.22,0.31l0.62,0.62,0.44,1.19s-0.31,1.59-0.37,1.97c-0.07,0.38-0.07,0.99,0,1.37,0.06,0.38,1.12-0.06,1.12-0.06s1.4-0.31,1.97-0.25,1.56,0.25,1.56,0.25,1.22,0.4,1.35,0.66c0.12,0.25,0.75,1.18,0.75,1.18l1.15,1.5,1.25,1.72,1.85,1.32,2,1.65,1,1.31s0.84-0.99,1.03-1.31c0.19-0.31,0-0.74,0-1.19,0-0.44-0.37-0.71-0.75-0.96-0.38-0.26-0.97-1.19-1.35-1.63-0.37-0.44-0.56-0.84-0.56-0.84s-0.81-1.06-1.06-1.31c-0.25-0.26-1.09-0.94-1.34-1.19-0.26-0.26-1.25-1.34-1.69-1.97s0-0.75,0-1.06c0-0.32,0.87-1.04,0.87-1.04s0.94-1.3,1.19-1.62,0.44-1.21,0.5-1.59,0.47-1.31,0.85-1.5c0.37-0.19,1.18-0.38,1.68-0.44,0.51-0.06,1.84,0.5,1.97,0.81,0.13,0.32-0.62,0.69-0.75,0.94-0.12,0.25,0,1.59-0.06,2.16-0.06,0.56,0.12,1.71,0.12,2.28,0,0.56,0.75,1.37,0.75,1.37s1.13,1.4,1.44,1.72c0.32,0.32,1.28,0.93,1.59,1.19,0.32,0.25,1.57,1.65,1.57,1.65l3.34,2.32,0.97,0.59s0.75,1.25,0.81,1.69c0.07,0.44,0.44,0.93,0.44,0.93s1.03,0.22,1.34,0.47c0.32,0.26,0.63,1.31,0.63,1.69s-0.12,1.03-0.44,1.47c-0.31,0.44-1.21,0.93-1.53,1.25s-0.69,0.75-0.69,0.75-0.06,5.68-0.06,6.25,0.75,1.78,1,2.16,1.21,2.14,1.72,2.9c0.5,0.76,0.69,1.12,0.69,1.44s0.25,1.66,0.25,1.66,0.56,10.46,0.62,11.09,0.59,1.03,0.78,1.41,0.75,0.93,1,1.18c0.26,0.26,0.75,0.84,0.88,1.16,0.12,0.32,0.97,1.62,0.97,1.62s0.74,2.78,0.87,3.54c0.13,0.75,0.13,1.72,0.13,1.72s1.31,3.96,1.31,4.4v1.47s-0.81,1.75-1.13,2.13c-0.31,0.37-0.06,1.77-0.06,2.09,0,0.31-1.34,2.46-1.84,2.84-0.51,0.38-1.31,1-1.44,1.38s0.25,1.03,0.25,1.03l1.81,0.87,2.28,0.94s1.09,2.15,1.47,2.66c0.38,0.5,0.56,1.59,0.56,1.9,0,0.32,0.32,3.47,0.44,4.16,0.13,0.69,0.38,1.65,0.56,2.09,0.19,0.45,1.79,1.5,1.79,1.5s2.21,3.94,2.34,4.25c0.13,0.32,0.81,1.69,1.06,2,0.08,0.1,0.29,0.25,0.53,0.41,0.62,0.78,3.07,1.94,3.07,1.94l0.93,0.62s4.63,4.25,4.69,4.5c0.06,0.26,2.78,2.32,2.78,2.32s2.34,0.84,2.6,1.03c0.25,0.19,1.68,0.75,1.68,0.75l14.91,10.22,2.03,1.21,3.03,0.94s1.19,1.59,1.44,1.72,3.15,1.19,3.59,1.19c0.45,0,1.47,1,1.47,1s2.59,2.78,2.97,3.03,2.56,1.91,2.56,1.91,2.09,1.18,2.47,1.18,2.85-0.5,2.85-0.5l0.68-0.62v-2.03s-0.06-1.69-0.06-1.88,0-1.21-0.25-1.53-0.81-0.88-0.81-0.88,0.18-1.52,0.44-1.96c0.25-0.45,0.43-0.69,0.43-1.07s-0.31-1.15-0.56-1.4c-0.25-0.26-0.5-1.19-0.5-1.19s-0.06-2.34-0.31-2.66c-0.25-0.31-1.09-0.99-1.28-1.62s-0.5-1.03-0.63-1.41c-0.12-0.38-1.37-1.62-1.62-2.06-0.26-0.44-1.53-1.59-1.72-1.84-0.19-0.26-0.31-1.28-0.5-2.1s-1.02-0.75-1.78-0.75-1.12-0.06-1.38-0.25c-0.25-0.19,0.5-0.43,0.75-0.56,0.26-0.13,1.09-0.9,1.28-1.22,0.19-0.31,0.5-1.37,0.5-1.37l0.69-4.22,1.91-1.6c0.38-0.31,0.25-0.93-0.19-1.31s-1.09-0.25-1.41-0.31c-0.31-0.06-0.8-0.84-1.31-1.16-0.5-0.31-0.84-0.81-1.28-1s-1.24-0.31-2.06-0.56-1.4-1.03-1.91-1.47c-0.5-0.44-0.44-1-0.5-1.25s-0.06-1.96-0.06-2.84v-1.22s-0.97-2.78-0.97-3.1c0-0.31,0.03-1.05,0.16-1.43,0.12-0.38,0.49-0.69,0.75-0.94,0.25-0.25,1.43-0.78,1.43-0.78l1.47-0.88s0.38-1.71,0.38-2.59-0.5-2.25-0.63-2.56c-0.12-0.32-1.34-0.72-1.34-0.72s-1.5-1.19-1.94-1.19-2.46-0.56-2.9-0.69c-0.45-0.12-1.6-0.78-1.85-0.9-0.25-0.13-1.71-1.25-2.09-1.56-0.38-0.32-1.25-1.1-1.5-1.41-0.26-0.32-0.75-1.44-0.88-1.75-0.12-0.32-0.84-1.66-0.84-1.66s0-0.55-0.13-1.12c-0.12-0.57-0.18-1.65-0.18-2.41s1.02-0.62,1.28-0.62c0.25,0,1.68-0.25,2-0.32,0.31-0.06,1.03-0.74,1.22-1,0.19-0.25,0.37-1.77,0.31-2.09s-0.65-0.81-1.22-1-0.94-0.78-1.12-0.84c-0.19-0.07-2.16-0.88-2.16-0.88s-2.06-0.69-2.5-0.75-0.59,0.44-0.84,0.63c-0.26,0.19-0.5,0.37-1.32,0.37s-1.22-0.44-1.22-0.44l-0.87-1.18s-1.18,0.06-1.81,0.06c-0.64,0-0.91-0.59-1.16-0.91-0.25-0.31-1.06-0.56-1.06-0.56s-0.47-0.19-0.69-0.28c0-0.06,0.19-3.44,0.13-3.69-0.07-0.25-0.66-1.21-0.91-1.47-0.25-0.25-1.37-0.44-1.94-0.44s-1.4,0.6-1.84,0.85-1.06,0.75-1.31,0.94c-0.26,0.19-0.13,1.12-0.13,1.68,0,0.57-0.34,1.03-0.72,1.35-0.38,0.31-0.68,0.25-1.31,0.25s-1.12-0.19-1.63-0.31c-0.5-0.13-0.77-0.56-1.03-0.82-0.25-0.25-1.06-0.96-1.37-1.47-0.32-0.5-0.19-1.05-0.25-1.62-0.07-0.57-0.84-1.65-1.1-2.16-0.25-0.5-1.24-2.34-1.37-2.59s-0.56-1.28-1-1.91-0.9-1.99-1.28-2.62-0.74-1.09-1.5-2.1-0.78-0.56-1.35-0.68c-0.56-0.13-0.99-0.78-1.5-1.35-0.5-0.57-0.84-0.93-1.15-1.75-0.32-0.82-0.37-0.83-0.94-2.15-0.57-1.33-0.07-1.09,0.19-1.66,0.25-0.57,1.06-0.62,1.06-0.62l0.47-0.88s-0.38-1.59-0.31-2.09c0.06-0.51,0.36-0.56,1.06-0.75,0.69-0.19,1.56,0.75,1.94,0.75s1.59-0.5,1.9-0.82c0.32-0.31,0.32-1.08,0.32-1.71,0-0.64-0.62-1-1.13-1.13s-0.94-0.56-0.94-1.06c0-0.51,0.25-1.21,0.25-1.91,0-0.69,0-0.74-0.06-1.25-0.06-0.5-0.12-0.53-0.25-0.91-0.13-0.37,0.06-1.18,0.19-1.68,0.12-0.51,0.56-0.44,0.94-0.38,0.37,0.07,1.24,0.69,1.62,0.94s0.65,0.62,0.84,1,1,1.09,1.63,1.16c0.63,0.06,1.15-0.38,1.15-0.38s-0.09-0.52-0.34-1.09-0.81-1.44-1-1.81c-0.19-0.38-0.5-1.22-0.75-1.6s-0.44-0.5-0.44-0.75,0.69-2.09,0.69-2.41v-3.78c0-0.82,0.19-1.4,0.38-1.72,0.19-0.31,0.87-1.24,1.25-2.06s0.84-1.15,1.09-1.9c0.25-0.76,0.87-1.4,1.44-2.16s0.77-1,1.15-1.12c0.38-0.13,2.91,0.06,3.29,0.06,0.37,0,1.96-0.44,2.65-0.56,0.7-0.13,2.71-0.31,3.41-0.57,0.69-0.25,0.25-0.59,0.18-0.84-0.06-0.25-1.27-0.94-1.65-1.06-0.38-0.13-1.12-0.69-1.38-0.94-0.25-0.25-0.5-1.16-0.5-1.16s-0.59-2.96-0.65-3.28c-0.07-0.31-0.75-1.56-0.75-1.56s-0.13-5.18-0.13-5.63c0-0.44-0.68-2.02-1.37-2.34-0.7-0.32-0.91-0.99-0.91-1.5s0-0.96-0.12-1.59c-0.13-0.64-0.75-1.37-1-1.88-0.26-0.5,0.12-0.78,0.12-1.22s-0.12-1.18-0.5-1.5c-0.38-0.31-0.68-0.49-0.94-0.75-0.25-0.25-0.46-0.9-0.46-1.53s0.28-1,0.34-1.31c0.06-0.32,0.06-1.09-0.06-1.53-0.13-0.44-0.35-1.06-0.41-1.31-0.06-0.26-0.37-1.22-0.37-1.22s-0.5-0.44-0.69-0.44-0.94-0.19-0.94-0.19l-1.78-0.31s-1.69-0.44-1.81-0.69c-0.13-0.25-1.04-0.69-1.04-0.69l-1.56-0.59zm7.25,70.22c-0.88,0.44-1.12,0.43-1.06,1s0.37,1.09,0.63,1.47c0.25,0.38,0.44,0.93,0,1.44-0.45,0.5-1.45,0.52-1.19,1.15,0.25,0.63,0.49,1.06,0.75,1.31,0.25,0.26,0.81,0.9,0.94,1.41,0.12,0.51-0.01,1.06,0.31,1.56,0.31,0.51,0.31,0.69,0.69,0.69,0.37,0,0.59,0.32,0.65-0.5s-0.06-0.95,0-2.84c0.06-1.9,0-2.84,0.06-3.41,0.07-0.57,0.26-1.37,0-1.75-0.25-0.38-1.28-0.9-1.4-1.22-0.13-0.31-0.38-0.31-0.38-0.31zm58.91,12.47c-1.07,0.71-1.16,0.62-1.16,1.15,0,0.54-0.18,0.9,0.53,0.72,0.72-0.18,0.91-0.18,1-0.62,0.09-0.45-0.37-1.25-0.37-1.25zm-10.97,4.53c-0.63,0.45-1.08,0.2-0.81,1.09,0.27,0.9,0.44,1.16,1.15,1.25,0.72,0.09,0.73,0.1,2.07,0.1s2.31,0.06,3.03,0.06c0.71,0,0.99,0.36,1.43,0,0.45-0.36,0.63-0.07,0.54-0.78-0.09-0.72-1.24-0.9-2.22-0.81-0.98,0.08-1.52,0.34-3.13-0.19-1.6-0.54-2.06-0.72-2.06-0.72z","name":"Kamchatka Krai"},"in":{"path":"m33.393,395.68,0.08929,5.2679,17.946-8.5714-1.3393-1.25-2.9464-1.25-1.5179-1.9643-2.4107,2.4107-4.1071-2.6786-1.875,1.0714,0.08929,5.8929-1.5179,1.0714z","name":"Republic of Ingushetia"},"cc":{"path":"m33.482,401.04,1.0714,2.5,3.125,1.6964,3.4821,0.44642,2.1429-1.9643,2.1429,1.7857,2.5-1.5178-0.08929-1.6072,1.875-2.1428,2.8571,0.44642,3.8393-2.8571-0.625-1.9643-4.4643-0.53572,0.44643-2.7679z","name":"Chechen Republic"}}}); + +/** Add USA Map Data Points */ +jQuery.fn.vectorMap('addMap', 'usa_en', {"width":959,"height":593,"paths":{"hi":{"path":"m244.66,512.25c-2.48,3.8 2.23,4.04 4.74,5.38 3.06,0.16 3.51,-4.28 2.66,-6.56 -2.72,-0.77 -5.01,-0.19 -7.41,1.19z m-9.31,3.97c-4.02,5.11 3.64,0.48 0.63,-0.09l-0.5,0.07 -0.14,0.02z m39.69,7.97c-0.62,2.09 1.91,6.73 4.39,6.2 2.41,-1.46 3.73,1.73 6.48,0.56 1.23,-1.48 -3.77,-3.2 -3.7,-6.08 -0.95,-3.8 -3.28,-3.2 -5.96,-1.28 -0.41,0.2 -0.81,0.4 -1.22,0.6z m19.94,10.03c3.58,0.95 7.91,2.99 11.25,0.47 -1.05,-1.63 -5.06,-0.59 -7.1,-0.86 -1.44,0.01 -3.54,-1.63 -4.15,0.39z m12.13,4.38c2.33,2.45 3.64,6.83 7.24,7.4 2.36,-0.69 6.84,-0.66 7.32,-3.43 -2.09,-2.51 -5.77,-3.35 -8.88,-4.29 -2.53,-1.2 -4.11,-3.25 -5.68,0.33z m-7.06,1c-0.29,3.69 5.55,3.98 3.67,0.55 -0.27,-1.25 -3.83,-1.74 -3.67,-0.55z m23.66,14.69c0.27,2.45 3.18,3.93 0.47,6.15 -0.65,2.42 -5.54,2.87 -2.52,5.53 2.36,1.46 2.01,4.85 2.92,7.14 -0.72,2.69 -1.43,6.78 1.72,8.06 2.8,2.95 4.5,-1.93 6.19,-3.68 1.27,-1.69 3.85,-4.1 5.94,-2.59 3.04,-0.81 6.3,-2.42 7.78,-5.22 -2.79,-1.31 -4.88,-3.19 -5.57,-6.29 -2.4,-5.33 -8.95,-6.26 -13.58,-8.98 -1.29,-0.52 -2.26,-1.62 -3.34,-0.11z","name":"Hawaii"},"ak":{"path":"m107.84,436.56c-2.27,0.55 -4.87,0.32 -6.84,-0.34 -2.41,1.22 -5.63,4.03 -8.25,1.88 -3.1,0.93 -3.51,3.84 -5.22,5.97 -1.82,2.52 -4.21,3.65 -7.31,3.14 -2.5,-0.94 -5.49,-1.15 -7.5,0.98 2.03,4.34 6.39,8.13 5.82,13.23 -1.85,2.94 6.31,2.99 2.68,5.02 0.15,2.8 3.07,5.68 2.91,7.88 -2.35,2.21 -5.24,-0.38 -7.71,-1.06 -3.24,-0.64 -2.73,-3.35 -0.82,-5.22 -1.57,-1.51 -7.35,-1.81 -6.51,1.12 -2.01,0.04 -3.81,-1.66 -6.27,-0.77 -3.72,-0.44 -5.97,0.65 -2.94,4.05 3.68,1.45 1.06,4.72 1.17,7.57 0.76,2.63 3.66,4.89 6.67,4.17 3.2,-0.06 5.87,3.59 9.21,1.65 2.16,-1.3 5.33,-0.99 4.79,1.89 -2.53,2.07 -1.36,6.13 -2.78,8.75 -1.96,1.88 -4.53,1.59 -6.59,0.16 -1.52,1.37 -4.7,3.68 -6.28,2.22 0.72,-3.71 -4.77,-3.63 -5.51,-0.61 -1.21,3.97 -6.27,4.46 -8.31,7.63 -0.7,2.42 -1.55,6.7 1.74,6.3 1.26,1.11 -1.2,4.8 -2.77,5.52 1.62,2.19 2.65,4.59 2.72,7.34 1.71,1.55 6.35,1.98 7.5,-0.16 2.45,-0.95 1.79,4.1 2.08,5.97 2.47,2.95 -4.02,1.28 -1.61,4.56 -0.85,2.93 -1.76,5.02 2,2.72 2.76,-0.47 5.11,-0.69 5.66,2.09 2.59,-3.91 2.26,2.78 3.25,4.66 0.59,-0.75 1.3,-5.69 3.94,-3.06 -0.17,4.52 5.33,-0.45 5.78,-0.04 0.54,2.92 -1.63,4.24 -2.86,6.41 -1.51,2.24 -2.07,5.63 -4.21,7.17 -3.87,-0.42 -3.37,4.1 -5.5,5.02 -2.65,-0.72 -5.73,0.71 -8.44,1.41 -1.35,2.41 -3.61,4.2 -5.78,1.81 -2.56,0.05 -5.63,0.68 -7.63,2.33 -2.48,2.43 -6.32,3.11 -9.66,2.29 -2.78,-1.91 -7.11,3.41 -3.11,2.31 2.5,-1.91 4.66,0.64 7.25,0.63 2.21,-1.15 4.17,-2.75 6.84,-2.06 2.32,-3.35 5.1,-0.32 7.92,-1.16 2.31,-0.39 7.01,-3.91 5.26,0.66 0.09,-2.91 3.42,-2.73 5.54,-2.04 4.21,0.96 0.29,-3.16 2.08,-3.43 3.47,-2.05 7.52,-2.41 11.2,-3.72 5.48,-3.19 11.62,-5.7 16.21,-10.1 4.27,-2.97 -2.78,-3.48 -1.21,-6.32 1.68,-2.43 4.58,-3.81 7.47,-4.5 1.5,-3.07 3.53,-6.11 5.88,-8.52 2.49,-1.32 4.83,-3.39 7.83,-2.32 2.67,0.71 3.74,5.32 -0.52,3.66 -1.27,-1.88 -5.56,-0.09 -5.25,2.41 -0.21,2.44 -2.56,4.22 -3.06,6.66 4.79,0.85 0.24,3.54 -1.38,3.8 1.67,1.91 5.66,0.6 7.57,-1.14 1.25,-1.85 3.43,-3.8 5.41,-4.22 1.81,2.8 5.1,-1.16 5.74,2.72 0.71,2.78 6.02,-4.86 3.34,-3.1 -3.03,3.11 -3.78,2.86 -1.94,-1.24 1.43,-4.85 -1.76,6.17 -1.45,0.81 -0.81,-3.19 -0.93,-6.03 3.05,-6.4 2.7,-0.86 5.37,-0.87 5.79,2.52 0.42,3.48 3.8,2.84 5.95,4.76 2.41,2.2 4.76,1.95 7.8,1.78 4.34,-0.47 8.01,4.04 12.28,3.17 2.49,-0.42 5.1,-5.2 4.29,-0.23 -2.26,2.83 -0.02,4.12 2.5,5.41 3.13,1.35 5.87,3.14 7.94,5.85 1.31,3.02 6.05,0.28 6.18,2.43 -3.83,1.25 -1.23,3.54 0.21,5.47 1.81,1.95 0.33,5.72 3.64,5.82 1.14,1.28 3.49,7.44 4.01,5.38 -0.35,-2.32 -0.7,-7.86 1.61,-3.76 0.37,1.42 1.04,8.7 2.07,4.74 1.07,-4.88 3.18,0.18 2.22,2.93 3.33,1.69 -1.23,3.33 0.69,4.88 0.69,-3.24 1.31,-0.36 2.16,1.56 1.05,1 1.54,3.94 3.13,3.72 -1.68,-1.72 -2.94,-6.23 0.4,-3 2.42,2.79 4.05,2.12 2.74,-1.66 -2.65,-2.66 0.28,-4.96 2.58,-2.29 3.12,-0.05 2.84,5.21 5.28,4.53 3.31,-3.17 1.5,-7.87 0.69,-11.7 -3.3,-1.55 -7.04,-2.54 -10.22,-4.06 -1.5,-5.33 -6.29,-8.69 -8.4,-13.77 -0.44,-3.33 -4.71,-2.62 -5.75,-5.23 -2.32,-1.72 -2.7,-4.4 -4.56,-6.35 -1.65,-1.53 -5.22,0.95 -5.51,2.94 0.59,3.09 -3.23,3.04 -5.06,4.72 0.05,-4.27 -4.3,-6.15 -6.7,-9.1 -1.33,-1.99 -1.32,-5.36 -4.45,-2.34 -2.37,0.24 -6.38,-0.31 -5.34,-3.62 0.1,-27.7 0.2,-55.4 0.31,-83.09 -2.75,-1.88 -5.88,-4.17 -9.15,-4.4 -2.52,1.72 -5.07,1.09 -7.39,-0.62 -2.72,0.23 -5.12,-0.65 -7.7,-2.89 -3.08,-2.74 -8.58,0.17 -10.98,-3.65 1.13,-3.56 -3.22,-4.83 -5,-2.09 -2.09,0.26 -0.65,-4.31 -3.64,-4.93 -2.57,-2.85 -4.01,-1.28 -5.86,1.21z M36.38,480.63c-0.67,3.11 4.27,1.31 4.72,4.66 0.24,3.82 5.37,3.9 2.34,-0.08 -0.1,-3.22 -3.92,-1.83 -5.06,-4.43 -0.76,-2.02 -0.9,-1.86 -2,-0.16z m-17.16,23.16c2.57,4.06 1.45,1.37 0.13,-1.28 -0.36,0.01 0,1 -0.13,1.28z m21.84,14.81c1.27,1.79 4.99,5.58 6.22,2.03 2.26,-3.3 -3.27,-2.89 -5.23,-3.68 -1.83,-0.9 -0.88,0.54 -0.99,1.65z m91.72,18.78c0.06,3.21 2.81,-1.98 0,0z m-31.47,14.69c-3.2,2.91 -7.24,4.67 -10.56,7.38 0.22,2.75 0.99,7.64 4.67,5.15 2.5,-1.44 4.98,-2.9 7.45,-4.37 -1.84,-3.31 -0.81,-3.15 -4.55,-3.48 -4.15,0.09 1.06,-3.73 2.64,-1.62 3.74,-1.04 3.95,-2.36 1.5,-3.66 0.7,-1.08 -1,0.61 -1.16,0.59z M55.75,570.75c1.42,2.83 3.53,-1.99 0,0z m-35.78,0.34c0.53,2.46 -4.04,4.84 1.05,3.59 4.2,0.47 3.46,-4.35 0.01,-3.84 -0.35,0.08 -0.7,0.16 -1.06,0.24z m62.19,0.69c1.57,2.91 1.31,-2.03 0,0z M58.63,573.13c3.23,0.49 0.99,-3.05 0,0z m-49,0.09c-4.84,2.56 -0.44,1.81 2.29,0.58 2.89,0.16 5.05,-0.48 0.84,-1.46 -1.04,0.29 -2.08,0.58 -3.13,0.88z m7.25,1.38c1.28,0.21 -2.23,-0.59 0,0z","name":"Alaska"},"fl":{"path":"m748.38,439.94c1.69,2.92 1.5,6.12 1.16,9.34 -4.12,0.54 -2.15,-4.69 -5.56,-3.99 -6.18,-0.07 -12.34,1.13 -18.54,1.19 -10.09,0.29 -20.37,2.14 -30.33,0.64 -2.57,-1.57 -2.84,-6.15 -6.5,-5.33 -9.12,-0.12 -18.18,1.79 -27.26,2.55 -5.82,0.63 -11.62,1.37 -17.43,2.12 -1.42,3.25 2.6,4.37 4.06,6.34 0.8,2.28 -1.56,8.42 2.19,7.1 4.11,-1.2 8.08,-2.93 12.48,-2.72 3.34,-0.82 6.63,-0.73 9.89,0.45 4.09,0.8 7.77,3.09 11.41,4.98 1.77,1.94 5.5,1.87 5.97,5 -0.14,3.27 4.32,-0.94 6.5,0.53 3.19,-0.8 5.24,-3.68 7.69,-5.5 4.86,1.69 0.62,-2.9 3.27,-3.97 3.13,-0.83 6.62,-1.39 9.35,0.79 3.04,0.57 5.43,2 6.57,4.99 3.68,0.02 2.88,4.13 5.48,5.3 2.96,0.49 2.98,4.52 6.3,4.3 2.91,0.36 5.45,1.15 5.84,4.45 2.05,2.11 3.92,4.26 3.09,7.41 0.18,3.68 0.12,7.33 -1.44,10.75 0.39,3.68 1.37,7.94 3.28,10.78 2.25,-3.46 0.17,-3.87 -1.74,-6.03 2.19,-1.76 4.86,-0.22 7.3,0.16 0.82,3.15 -2.16,5.6 -3.48,8.19 -3.3,2.21 1.65,4.09 2.73,6.3 3.11,3.34 4.35,7.94 7.53,11.26 0.78,2.29 2.51,7.47 4.63,3.09 2.54,-0.24 3.88,3.44 5.28,5.41 -0.02,2.26 1.93,7.04 3.59,6.44 2.88,-0.8 6.04,0.65 8.28,2.59 2.56,3.3 4.58,6.98 4.56,11.27 1.37,2.73 4.55,0.44 5.81,-1.14 3.74,0.45 7.26,-1.25 9.22,-4.47 -1.01,-2.36 -0.57,-4.83 -0.32,-7.17 -0.04,-2.18 4.33,-3.19 2.25,-6.51 -0.98,-6.33 -0.19,-12.96 -1.87,-19.25 -2.46,-6.93 -7.54,-12.74 -10.4,-19.56 -1.51,-2.41 -4.24,-3.92 -4.62,-7.04 -0.94,-2.28 -2.67,-4.95 -0.07,-6.71 -0.39,-3.56 -4.86,-5.42 -6.84,-8.41 -5.38,-5.57 -8.29,-12.94 -12.35,-19.44 -2.15,-5.53 -4.29,-11.07 -5.91,-16.78 -3.43,0.07 -7.3,-1.03 -10.46,-0.35l-0.34,0.37 -0.26,0.29z m52.91,109.22c-1.9,4.58 0.72,0.38 0.66,-1.91 -0.22,0.64 -0.44,1.27 -0.66,1.91z m-4.69,9.91c2.56,-1.97 3.68,-6.84 1.04,-1.68 -0.35,0.56 -0.69,1.12 -1.04,1.68z m-2.25,2.22c1.46,-1.22 2.04,-2.07 0.18,-0.18l-0.18,0.18z m-5.72,4.16c-5.23,3.69 4.03,-2.14 0.33,-0.19l-0.33,0.19z m-10.72,3.22c-3.41,3.16 5.71,-0.32 4.1,-0.81 -1.8,-0.56 -2.56,-0.71 -4.1,0.81z m-4.59,3.16c0.08,0.16 0.4,-0.3 0,0z","name":"Florida"},"nh":{"path":"m862.56,94c-1.4,-0.41 -3.87,-0.72 -3.05,3 0.22,3.63 -0.73,7.84 2.23,10.59 0.33,2.78 0.08,5.36 -2.17,7.29 -0.19,2.83 -5.98,2.58 -3.35,5.32 1.16,7.35 -0.56,15.03 -0.62,22.51 1.2,1.95 0.98,4.39 0.76,6.75 -1.07,3.79 4.84,-0.05 6.89,0.06 3.93,-1.29 8.46,-1.74 12.04,-3.54 0.77,-3.1 4.37,-2.75 5.94,-4.96 2.59,-3.52 -3.01,-2.73 -2,-6.59 -3.83,0.01 -4.27,-2.46 -4.66,-5.62 -3.84,-11.98 -7.32,-24.45 -11.49,-36.1 -0.18,0.43 -0.35,0.85 -0.53,1.28z","name":"New Hampshire"},"mi":{"path":"M697.86,177.24L694.63,168.99L692.36,159.94L689.94,156.71L687.35,154.93L685.74,156.06L681.86,157.84L679.92,162.85L677.17,166.57L676.04,167.21L674.58,166.57C674.58,166.57 671.99,165.11 672.16,164.47C672.32,163.82 672.64,159.45 672.64,159.45L676.04,158.16L676.84,154.77L677.49,152.18L679.92,150.56L679.59,140.54L677.98,138.28L676.68,137.47L675.87,135.37L676.68,134.56L678.3,134.88L678.46,133.27L676.04,131L674.74,128.42L672.16,128.42L667.63,126.96L662.13,123.57L659.38,123.57L658.74,124.21L657.77,123.73L654.7,121.46L651.79,123.24L648.88,125.51L649.2,129.06L650.17,129.39L652.27,129.87L652.76,130.68L650.17,131.49L647.58,131.81L646.13,133.59L645.81,135.69L646.13,137.31L646.45,142.8L642.9,144.9L642.25,144.74L642.25,140.54L643.54,138.12L644.19,135.69L643.38,134.88L641.44,135.69L640.47,139.89L637.72,141.02L635.94,142.96L635.78,143.93L636.43,144.74L635.78,147.33L633.52,147.81L633.52,148.95L634.33,151.37L633.2,157.51L631.58,161.56L632.23,166.24L632.71,167.38L631.9,169.8L631.58,170.61L631.26,173.36L634.81,179.34L637.72,185.8L639.18,190.65L638.37,195.34L637.4,201.32L634.97,206.5L634.65,209.25L631.39,212.33L635.8,212.17L657.22,209.91L664.5,208.92L664.59,210.58L671.45,209.37L681.74,207.87L685.6,207.41L685.74,206.82L685.9,205.37L688,201.65L690,199.91L689.78,194.86L691.37,193.26L692.46,192.92L692.69,189.36L694.22,186.33L695.27,186.94L695.44,187.58L696.24,187.74L698.18,186.77L697.86,177.24z M581.62,82.06L583.45,80L585.62,79.2L590.99,75.31L593.28,74.74L593.74,75.2L588.59,80.34L585.28,82.29L583.22,83.2L581.62,82.06z M667.79,114.19L668.44,116.69L671.67,116.85L672.97,115.64C672.97,115.64 672.89,114.19 672.56,114.03C672.24,113.86 670.95,112.17 670.95,112.17L668.76,112.41L667.15,112.57L666.82,113.7L667.79,114.19z M567.49,111.21L568.21,110.63L570.96,109.82L574.51,107.56L574.51,106.59L575.16,105.94L581.14,104.97L583.57,103.03L587.93,100.93L588.09,99.64L590.03,96.73L591.81,95.92L593.1,94.14L595.37,91.88L599.73,89.46L604.42,88.97L605.55,90.1L605.23,91.07L601.51,92.04L600.06,95.11L597.79,95.92L597.31,98.35L594.88,101.58L594.56,104.17L595.37,104.65L596.34,103.52L599.89,100.61L601.19,101.9L603.45,101.9L606.68,102.87L608.14,104L609.59,107.08L612.34,109.82L616.22,109.66L617.68,108.69L619.29,109.99L620.91,110.47L622.2,109.66L623.33,109.66L624.95,108.69L628.99,105.14L632.39,104L639.02,103.68L643.54,101.74L646.13,100.45L647.58,100.61L647.58,106.27L648.07,106.59L650.98,107.4L652.92,106.91L659.06,105.3L660.19,104.17L661.65,104.65L661.65,111.6L664.88,114.67L666.17,115.32L667.47,116.29L666.17,116.61L665.37,116.29L661.65,115.81L659.55,116.45L657.28,116.29L654.05,117.75L652.27,117.75L646.45,116.45L641.28,116.61L639.34,119.2L632.39,119.85L629.96,120.66L628.83,123.73L627.54,124.86L627.05,124.7L625.6,123.08L621.07,125.51L620.42,125.51L619.29,123.89L618.48,124.05L616.54,128.42L615.57,132.46L612.39,139.46L611.22,138.42L609.85,137.39L607.9,127.1L604.36,125.73L602.31,123.45L590.19,120.7L587.33,119.67L579.1,117.5L571.21,116.36L567.49,111.21z","name":"Michigan"},"vt":{"path":"m833.16,106.59c0.19,6 4.65,11.21 3.72,17.28 -2.48,4.23 4.52,7.29 2.22,11.58 0.9,1.59 4.66,1.96 4.06,5.25 1.08,4.21 2.86,8.34 1.84,12.76 3.35,-0.51 7.06,-1.17 10.13,-1.97 -0.21,-2.13 1.51,-5.75 -0.53,-7.81 0.2,-7.64 1.01,-15.26 1.13,-22.91 -3.25,-2.41 0.32,-3.79 2.12,-5.18 1.96,-2.28 3.9,-5.07 2.6,-8.1 -2.62,-1.63 -1.02,-5.94 -2.39,-7.22 -8.3,2.1 -16.59,4.21 -24.89,6.31z","name":"Vermont"},"me":{"path":"m889.88,40.22c-2.16,1.31 -3.69,2.74 -4.84,4.69 -2.29,0.6 -4.99,-1.37 -4.88,-3.94 -2.97,-0.82 -3.33,3.68 -4.37,5.71 -1.09,4.29 -3.27,8.39 -3.97,12.69 -0.06,3.04 1,6.63 -1.35,9.09 0.08,2.92 -0.75,6.18 2,8.16 -1.37,5.7 -6.23,10.36 -5.41,16.56 -4.27,-2.21 -1.74,2.47 -1.09,4.73 3.51,11.08 7.19,22.16 10.25,33.35 0.21,3.01 5.81,1.35 4.53,5.7 2.9,2 2.06,-3.92 2.66,-5.87 -1.01,-3.29 2.7,-4.63 0.66,-7.62 0.94,-1.05 2.92,-5.9 4.61,-3.46 2.03,1.03 5.28,-1.89 6.74,-3.19 -0.98,-4.02 4.21,-1.75 4.73,-5.32 -1.11,-2.61 0.74,-5.45 -0.57,-7.44 -2.42,-1.59 3.53,-4.63 3.31,-0.78 2.27,0.48 2.15,2.8 3.66,3.93 1.94,-2.82 -2.15,-3.81 0.35,-6.03 2.43,-0.81 3.1,-3.96 6,-3.31 -0.17,1.46 1.03,3.34 2.26,1.38 2.94,-2.9 5.24,-7.08 9.37,-8.34 1.17,-2.61 3.34,-5.74 0.71,-8.24 -0.55,-1.64 -3.68,-4.84 -4.15,-2.58 -0.75,2.6 -4.66,-0.65 -4.92,-2.22 0.1,-2.8 0.29,-7.17 -3.8,-5.81 -3.96,1.36 -3.64,-3.04 -4.69,-5.61C905.22,58.3 902.75,50.15 900.28,42c-2.86,-1.25 -5.71,-2.92 -8.81,-3.38 -0.53,0.53 -1.06,1.06 -1.59,1.59z m20.47,61c-2.81,1.7 1.87,5.16 1.13,1.22 1.48,-0.9 0.13,-2.4 -1.13,-1.22z m-7.81,7.81c3.16,6.67 2.63,-3.59 0,0z","name":"Maine"},"ri":{"path":"m871,164.28c1.15,4.66 2.29,9.31 3.44,13.97 2.56,-0.49 4.66,-2.29 5.84,-4.56 4.17,0.76 4,-2.64 1.51,-4.97 -1.79,-1.94 -3.16,-5.31 -5.74,-5.92 -1.68,0.49 -3.37,0.99 -5.05,1.48z","name":"Rhode Island"},"ny":{"path":"m825.56,108.66c-2.7,1.12 -5.45,1.68 -8.33,1.43 -5.07,0.72 -10.17,2.73 -12.92,7.31 -2.84,3.43 -4.89,7.49 -7.18,11.2 -1.65,2.36 -5.82,3.73 -5.55,6.84 -0.17,3.56 5.77,0.73 4.43,4.38 -2.69,2.3 0.8,4.23 0.56,6.59 0.5,3.47 -4.26,1.99 -5.36,4 -1.62,2.71 -3.35,6.62 -7.22,6.05 -3.04,-0.43 -5.35,2.05 -7.98,2.63 -2.5,-0.75 -4.7,-2.05 -7.59,-1.31 -5.31,0.21 -10.62,1.98 -15.23,4.53 -0.29,1.77 0.61,6.25 3.17,6.14 1.55,2.48 2.09,4.96 -0.63,6.72 -1.51,1.76 -1.8,4.25 -4.16,5.3 -1.93,1.14 -2.68,3.51 -4.8,4.54 0.33,3.07 -0.22,7.29 4.08,5.12 22.14,-4.26 44.26,-8.68 66.23,-13.74 0.98,3.85 5.67,1.32 6.44,4 0.64,2.93 1.36,7.4 5.33,6.88 3.14,1.9 6.9,3.68 10.69,4.22 2.71,0.47 7.18,1.43 6.44,5.06 -0.33,1.97 -1.62,7.56 1.97,5.93 5.3,-1.65 10.96,-2.84 15.06,-6.85 3.23,-2.49 6.76,-4.64 9.35,-7.86 -2.99,-2.44 -4.65,0.46 -6.81,2.42 -2.91,1.56 -6.01,3.51 -9.16,4.32 -2.6,-0.63 -4.83,-0.86 -6.18,2.07 -1.03,2.04 -4.86,2.98 -3.98,-0.15 4.26,-1.87 -2.17,-3.97 -0.33,-6.21 1.19,-3.13 0.56,-6.87 0.42,-10.21 -1.43,-7.38 -3.69,-14.76 -2.54,-22.36 -0.08,-4.46 1.55,-8.97 -0.51,-13.21 -1.22,-2.56 -0.47,-6.83 -4.05,-7.34 -2.99,-0.66 0.75,-4.31 -1.57,-6.2 -1.7,-2.43 -3.17,-4.91 -1.54,-7.81 0.38,-5.77 -3.83,-10.57 -3.55,-16.35 -2.32,0.65 -4.65,1.29 -6.97,1.94z","name":"New York"},"pa":{"path":"m798.88,181.63c-17.5,3.38 -34.87,7.42 -52.47,10.28 -0.61,-2 0.48,-8.42 -2.41,-4.31 -2.18,2.73 -5.48,3.74 -8.09,5.97 1.52,9.75 2.63,19.57 5.44,29.05 1.14,6.09 2.27,12.17 3.41,18.26 8.85,-1.42 17.79,-2.25 26.51,-4.41 16.39,-3.45 33.03,-6.46 49.33,-9.87 2.48,-3.07 8.03,-1.69 8.97,-6.19 0.64,-2.36 4.86,-3.99 4.33,-5.9 -2.3,-1.89 -5.94,-2.77 -6.39,-6.13 -3.14,1.09 -4.42,-3.94 -3.12,-5.32 3.86,-1.1 -0.49,-3.68 0.55,-5.96 2.52,-1.88 1.12,-5.15 2.81,-7.07 3.87,-2.7 -2.98,-1.1 -3.72,-3.99 -1.35,-2.18 -0.28,-7.24 -4.16,-5.92 -2.34,-1.13 -3.87,-3.75 -7.09,-1.7 -4.64,1.07 -9.28,2.15 -13.92,3.22z","name":"Pennsylvania"},"nj":{"path":"m827.84,191.34c1.03,2.99 -1.82,4.8 -2.06,7.47 2.86,1.63 0.49,4.87 -0.92,5.73 -0.41,3.86 4.01,1.68 4.16,5.14 1.37,2.19 4.72,3.02 6.26,4.94 -0.15,2.61 -3.85,3.5 -4.69,6.06 -0.26,3.07 -4.09,3.19 -4.18,5.96 -0.99,2.38 -0.74,5.09 1.7,6.47 2.85,2.76 6.86,3.99 10.73,4.38 0.48,1.55 -1.84,7.18 1.1,3.59 1.5,-2.42 0.59,-5.95 3.11,-8.01 2.5,-4.08 5.03,-8.84 4.88,-13.61 -1.35,-4.07 0.8,-9.01 -1.81,-12.82 -1.1,1.32 -6.17,1.23 -4.13,-0.8 2.39,-1.39 3.37,-3.62 2.39,-6.31 0.21,-2.31 1.58,-5.42 -1.69,-6.19 -4.35,-1.15 -8.82,-2.13 -12.88,-4.26 -0.66,0.75 -1.31,1.5 -1.97,2.25z","name":"New Jersey"},"de":{"path":"m824.88,225.34c-3.72,0.25 -3.47,3.52 -1.91,6.13 3.35,6.89 3.86,14.58 6.03,21.81 3.45,0.11 6.81,-0.49 10.16,-1.25 -1.2,-2.17 -0.68,-6.38 -3.32,-6.38 -2.9,-1.2 -4.17,-3.69 -4.9,-6.58 -0.91,-3.11 -3.62,-4.96 -5.48,-7.35 -1.85,-1.82 0.94,-5.5 -0.26,-6.47l-0.33,0.09z","name":"Delaware"},"md":{"path":"m813.59,229.19c-17.31,3.18 -34.53,6.83 -51.78,10.28 0.74,3.02 1.31,6.08 1.78,9.16 2.14,-1.9 3.29,-5.35 6.59,-5.34 2.14,-1.85 2.67,-5.25 5.77,-3.55 3.46,0.18 5.43,-5.35 9.01,-3.85 2.63,1.63 5.66,2.79 7.34,5.59 4.19,0.11 3.68,3.73 5.74,4.96 2.73,1.11 5.02,1.18 6.38,-0.53 4.29,1.38 2.24,3.74 1.44,6.9 0.09,2.97 -3.7,4.92 -1.66,7.97 3.1,1.31 6.4,1.2 9.63,1.4 2.17,1.58 6.83,1.03 3.79,-2.1 0.41,-2.74 -3.08,-3.35 -3.32,-6.04 -1.7,-2.67 -1.42,-5.47 -0.36,-8.32 1.68,-2.42 -2.83,-3.82 -0.4,-5.41 1.25,-1.53 0.43,-4.16 2.98,-4.7 1.62,-3.02 5.1,-1.45 2.35,1.02 -2.54,2.98 -0.81,4.5 0.57,6.3 1.41,3.55 -0.68,5.07 -1.53,7.31 -0.22,-0.81 3.62,-1.01 3.22,1.79 -3.15,1.64 -1.45,6.12 1.09,7.31 2.98,0.99 5.58,-1.8 6.98,2.14 1.5,3.75 4.92,0.81 7.41,-0.02 2.74,-1.21 3.47,-4.93 2.78,-7.7 -1.13,-1.58 -4.82,0.92 -7.13,0.4 -3.86,1.26 -4.9,-1.25 -5.28,-4.64 -1.68,-5.97 -2.14,-12.33 -5.16,-17.9 -0.04,-4.32 -2.71,-4.2 -6.07,-2.91 -0.73,0.16 -1.45,0.31 -2.18,0.47z m10.94,32.59c1.32,0.99 0.59,4.97 2.06,4.63 -0.48,-1.31 -0.36,-4.99 -2.06,-4.63z","name":"Maryland"},"va":{"path":"m792.88,242.88c-0.16,1.46 0.24,5.89 -2.4,4.29 -2.58,-0.67 -6.42,-3.2 -8.23,-2.73 0.7,3.72 -1.46,6.77 -2.99,9.94 -3.05,1.14 -2.29,5.83 -5.84,5.58 -1.62,1.74 -1.47,5.31 -2.45,7.73 -3.09,1.14 -5.37,-0.48 -7.28,-1.75 0.11,6.5 -3.72,11.95 -5.91,17.84 -1.69,1.73 1.19,3.8 -0.74,5.77 -1.35,3.56 -3.79,2.72 -6.19,4.19 -2.72,1.1 -4.9,0.5 -5.4,4.61 -2.07,1.14 -4.83,2.63 -6.91,0.47 -2.38,1.51 -5.02,3.21 -7.81,1.6 -2.69,-0.01 -3.9,-6.55 -6.07,-2.94 -3.27,4.09 -7.89,7.48 -10.21,12.09 0.43,3.25 -4.46,3.32 -6.42,5.15 -4.27,1.95 3.62,-0.11 5.16,-0.07 5.56,-0.79 11.14,-1.37 16.76,-1.36 1.95,-2.65 4.98,-1.81 7.77,-1.65 7.86,-0.32 15.65,-2.12 23.48,-2.99 12.85,-1.4 25.44,-4.27 38.04,-7.05 11.65,-2.52 23.3,-5.03 34.96,-7.55 -1.64,-2.66 -2.75,-6.67 -6.42,-4.14 -1.99,2.03 -6.61,-1.82 -2.7,-2.48 2.65,-1.62 -1.75,-4.07 -1.8,-5.97 -2.73,-0.62 -2.88,-5.12 0.54,-3.6 -0.17,-1.37 -1.24,-3.62 -1.62,-5.68 1.47,-3.51 -0.84,-4.97 -3.72,-5.16 0.31,-3.42 -2.9,-2.93 -5.22,-3.97 -3.33,0.21 -7.06,-0.25 -9.91,-1.66 -1.22,-2.41 -0.91,-5.12 1.25,-6.88 1.39,-2.83 -0.28,-5.7 -3.3,-6.27 -2.65,-0.83 -6.97,-0.29 -5.73,-4.3 -0.83,-0.3 -2.05,-1.06 -2.69,-1.06z m39.16,21.59c0.44,4.71 -3.15,8.7 -2.62,13.48 -0.34,4.11 2.64,5.72 3.48,0.92 1.71,-3.04 -0.23,-6.47 0.8,-9.73 0.4,-2.53 3.66,-3.88 3.52,-6.73 -1.73,0.69 -3.46,1.38 -5.19,2.06z","name":"Virginia"},"wv":{"path":"m739.75,223.25c-1.6,2.23 1.3,5.02 0.25,7.75 -0.18,4.04 -0.63,8.11 -0.84,12.13 -1.94,3.58 -4.43,7.35 -8.16,9.13 -3.15,-1.33 -3.92,3.25 -5.76,4.98 -1.56,2.28 2.64,4.93 -0.3,6.69 -2.57,3.58 -2.6,-4.8 -4.46,-0.71 -1.32,2.59 0.02,6.02 -1.35,8.33 -1.82,1.54 -0.53,5.19 -4.16,4.81 -2.23,0.13 -1.45,6.19 1,6.81 2.24,1.47 2.49,4.74 5.5,5.92 1.92,1.96 2.28,5.18 5.39,6.05 1.64,2.19 3.07,4.96 6.25,4.88 2.63,0.5 4.77,-3.86 7.22,-1.35 1.49,0.81 3.93,-0.57 4.58,-1.83 0.43,-4.57 3.42,-2.71 6.03,-4.39 2.39,-0.94 4.82,-0.98 5.62,-4.44 -1.26,-2.59 0.3,-5 1.56,-7.64 2.23,-4.81 4.72,-9.61 4.67,-15.05 2.65,-2.31 3.72,3.56 7.05,1.41 1.64,-1.77 1.12,-5.67 2.6,-7.59 3.47,0.39 2.97,-3.96 5.76,-5.21 2.29,-3.11 3.52,-6.8 3.06,-10.7 1.06,-1.29 5.1,1.62 7.23,2.15 3.3,3.35 4.34,-1.98 2.85,-4.05 -2,-2.28 -5.12,-3.7 -7.62,-4.75 -3.31,0.98 -5.44,5.47 -9.38,3.97 -1.86,-0.23 -2.38,3.98 -4.86,3.88 -2.89,0.71 -3.79,4.38 -6.03,6.22 -1.1,-0.06 -0.99,-4.82 -1.62,-6.64 -0.01,-3.93 -1.77,-5.3 -5.48,-3.82 -4.21,0.6 -8.41,1.23 -12.61,1.91 -1.17,-6.45 -2.29,-12.92 -3.44,-19.38l-0.35,0.35 -0.18,0.18z","name":"West Virginia"},"oh":{"path":"m729.5,197.78c-4.85,2.06 -7.38,6.9 -11.47,9.97 -4.08,0.86 -8.09,1.75 -11.72,3.88 -3.41,1.61 -4.39,-4.09 -7.67,-2.63 -3.13,1.35 -5.49,-1.1 -8.11,-2.41 -8.6,1.15 -17.15,2.64 -25.66,4.38 1.45,17.83 4.12,35.53 5.87,53.33 -0.69,3.82 4.06,2.26 6.23,1.48 2.74,0.41 4.83,2.16 5.48,4.94 1.26,2.48 5.82,-0.87 6.96,2.54 2.19,1.53 4.46,-2.33 7.03,-0.58 2.52,0.04 5.62,1.51 6.84,-1.56 1.49,-0.55 5.37,-3.85 5.41,-0.71 0.38,2.53 3.82,3.57 5.77,4.7 3.53,0.63 2.32,-3.91 4.21,-5.51 -0.11,-2.74 0.21,-5.73 1.39,-8.13 2.53,-2.81 3.8,4.53 4.98,0.39 -2.02,-2.27 -0.99,-5.41 0.93,-7.41 1.07,-4.06 4.05,-2.41 6.5,-4.39 2.93,-3.16 6.59,-6.57 5.97,-11.27 0.44,-4.71 1.18,-9.75 -0.53,-14.23 1.47,-2.48 2.58,-4.29 0.96,-7.33 -2.04,-7.53 -2.56,-15.37 -3.93,-23.04 -1.81,1.2 -3.63,2.4 -5.44,3.59z","name":"Ohio"},"in":{"path":"m658.66,210.31c-9.12,0.93 -18.35,1.98 -27.41,2.68 -2.6,0.39 -4.21,5.08 -6.89,2.98 -3.83,-2.84 -2.64,1.83 -2.41,4.45 1.1,14.81 2.73,29.61 3.44,44.42 -0.76,3.69 -1.39,7.89 1.36,10.91 0.1,2.99 1.4,6.28 -1.14,8.65 -1.83,2.73 -2.55,6.09 -5.02,8.42 0.09,2.08 -2.02,8.2 1.63,5.16 3.49,-0.6 7.25,-1.53 10.69,-1.34 2.36,4.08 2.67,-0.62 5.26,-1.29 2.03,-2.62 4.78,2.05 5.34,1.04 -1.26,-3.41 3.05,-3.77 5.1,-5.22 1.09,0.63 6.05,3.38 5.3,-0.64 -0.46,-2.47 2.02,-4.71 3.65,-6.34 3.11,-1.39 4.33,-3.9 4.16,-7.23 1.83,-1 4.93,-1.01 6.97,-2.47 4.23,-1.03 0.26,-3.48 1.22,-5.92 -0.83,-12.56 -2.8,-25.13 -4.08,-37.69 -0.85,-6.99 -1.44,-14.01 -2.14,-21.02 -1.68,0.16 -3.35,0.31 -5.03,0.47z","name":"Indiana"},"il":{"path":"m569.75,200.44c-0.29,2.58 4.2,1.83 3.73,5.07 2.07,2.09 5.71,4.21 4.38,7.77 -0.31,3.04 -2.61,5.44 -3.08,8.4 -2.38,2.71 -6.06,2.98 -9.31,3.94 -1.61,2.47 -1.05,4.91 1.28,6.47 0.63,3.25 -1.08,5.07 -2.74,7.38 1.41,3.63 -2.39,2.86 -3.56,5.02 1.08,3.12 -2.11,3.8 -2.53,6.64 0.19,3.95 1.33,8.21 3.28,11.58 3.68,3.96 7.38,7.9 12.21,10.47 -0.61,2.88 -0.64,6.7 3.43,5.71 2.05,0 6.18,0.38 6.26,2.68 -0.19,4.39 -3.6,8.24 -3.28,12.53 1.6,3.83 5.33,6.26 8.59,8.42 3.37,-0.29 5.36,1.27 5.9,4.6 1.01,2.64 3.84,4.73 1.73,7.67 0.55,1.74 2.58,7.7 4.31,4.05 1.21,-2.98 5.41,-4.78 8.07,-2.46 3.1,2.46 5.94,0.47 3.13,-2.8 -0.98,-3.39 2.61,-4.96 5.37,-5.33 1.01,-1.55 -1.6,-4.46 1.4,-5.97 1.8,-3.97 -0.56,-9.39 3.32,-12.49 1.43,-2.97 3.23,-5.97 4.4,-8.97 0.13,-3 -0.7,-5.7 -2.34,-8.16 -0.45,-4.59 1.31,-9.09 0.02,-13.65 -1.16,-15 -2.22,-30.05 -3.67,-45.01 -1.02,-3.1 -1.61,-6.46 -4.04,-8.77 -2.27,-1.83 -0.51,-5.93 -1.97,-7.32 -14.76,0.83 -29.52,1.67 -44.28,2.5z","name":"Illinois"},"ct":{"path":"m865.78,165.41c-6.91,1.54 -13.81,3.08 -20.72,4.63 2.17,6.2 2.74,12.83 2.44,19.34 -2.62,4.3 2.61,2.38 3.97,-0.21 2.09,-1.89 4.19,-3.71 5.99,-5.88 2.06,1.35 4.78,-1.86 7.44,-1.46 2.98,-0.68 5.69,-2.24 8.56,-3.26 -1.15,-4.67 -2.29,-9.33 -3.44,-14 -1.42,0.28 -2.83,0.56 -4.25,0.84z","name":"Connecticut"},"wi":{"path":"m559.53,104.97c-4.06,2.75 -8.71,4.92 -13.53,5.84 -2.88,-1.08 -5.54,-1.12 -5.57,2.68 -0.48,3.34 0.51,7.03 -0.47,10.17 -2.02,3.26 -6.91,4.03 -7.36,8.38 -2.63,2.78 2.21,3.06 2.23,5.53 1.79,2.9 -2.13,4.74 -1.33,7.65 0.29,2.93 -0.4,6.49 1.14,8.93 1.33,3.48 5.88,0.21 6.64,3.93 1.56,2.26 5.47,1.03 6.19,4.78 2.15,5.1 9.7,4.85 11.21,10.39 0.68,3.38 0.35,7.34 1.94,10.32 3.26,1.05 1.94,4.34 0.25,6.21 -0.79,3.96 2.53,8.34 6.75,8.25 2.28,1.6 4.86,1.65 7.83,1.19 13.03,-0.77 26.07,-1.53 39.1,-2.3 -0.02,-4.45 -1.98,-8.61 -1.86,-13.13 -1.7,-2.04 -0.86,-4.17 -0.04,-6.39 0.32,-2.84 3.07,-4.93 1.51,-7.87 -1.05,-2.94 -0.88,-6.21 1.73,-8.27 -0.2,-2.83 -0.5,-5.03 -0.16,-7.93 -1.14,-4.2 2.64,-7.5 3.69,-11.36 0.92,-1.13 3.15,-8.34 0.73,-4.93 -2.65,3.81 -4.99,8.01 -8.18,11.29 -0.86,2.06 -3.21,4.55 -5.21,4.5 -2.57,-1.26 0.28,-4.49 0.9,-6.41 0.47,-2.94 3.2,-4.25 4.09,-6.85 -3.31,-1.29 -2.77,-5.03 -3.54,-7.92 0.02,-3.09 -1.23,-5.08 -4.29,-5.57 -2.14,-3.67 -7.04,-2.78 -10.59,-4.12 -7.13,-1.87 -14.21,-4.39 -21.67,-4.99 -2.48,-0.54 -2.84,-5.51 -5.51,-4.73 -1.71,-1.54 -3.85,-0.7 -5.82,0.13 -2.8,-1.32 0.68,-4.59 1.5,-6.38 2.18,-1.34 -1.53,-2.14 -2.31,-1z","name":"Wisconsin"},"nc":{"path":"m830.06,295.97c-18.3,3.8 -36.53,8 -54.86,11.65 -12.74,1.51 -25.38,4.07 -38.18,4.94 -3.32,-0.82 -1.17,3.72 -2.5,5.53 -2.62,1.34 -3.49,4.59 -5.03,6.38 -3.24,-1.36 -5.07,1.46 -6.34,3.97 -1.09,-0.57 -2.96,0.03 -3.41,-1.41 -2.02,1.96 -4.37,3.73 -4.31,6.81 -3.66,1.1 -6.31,3.82 -9.28,5.96 -2.64,0.94 -5.76,2.16 -7.4,4.35 0.73,4.06 -2.98,3.3 -5.1,5.29 -1.98,4.69 2.74,2.66 5.58,2.5 6.41,-1.19 13.32,-0.49 19.18,-3.73 5.04,-1.9 9.41,-5.9 15.06,-5.67 6.5,-0.64 13.15,-0.6 19.62,-0.69 2.99,0.53 3.36,4.79 5.58,5.01 5.37,-0.81 10.87,-1.67 16.25,-1.79 5.38,1.36 9.61,5.45 14.52,7.93 3.59,2.64 6.93,5.66 10.43,8.44 3.15,-0.86 6.32,-1.58 9.59,-1.72 1.06,-4.55 2.04,-9.29 5.39,-12.78 4.2,-4.27 9.23,-8.29 15.33,-9.29 2.91,1.95 3.69,-2.9 5.27,-4.53 2.72,-5 -2.44,3.91 -2.46,-1.22 -3.87,0.7 -5.43,-0.26 -3.29,-4 2.77,-4.25 -2.73,-2.51 -2.12,-6.02 -1.42,-3.76 2.84,2.19 5.06,0.81 2.81,0.12 5.1,-1.87 5.59,-4.6 0.45,-2.9 4.59,-2.7 3.28,-6.48 -4.02,-2.43 4.25,-0.66 0.4,-3.93 -3.52,-3.44 -5.24,-8.33 -7.23,-12.76 -1.54,0.35 -3.08,0.71 -4.63,1.06z m17.13,23.72c1.55,2.61 -4.64,4.26 -0.52,2.69 1.38,-1.92 0.21,-5.22 0.24,-7.62 -0.74,-2.05 0.37,4.57 0.28,4.94z","name":"North Carolina"},"dc":{"path":"m803.44,248.16c2.67,3.43 3.85,-1.02 0.55,-0.75l-0.29,0.4 -0.25,0.35z","name":"District of Columbia"},"ma":{"path":"m877.59,144.41c-1.04,3.1 -4.01,3.5 -6.79,4.13 -8.62,2.32 -17.17,4.6 -25.96,6.12 -0.11,4.77 -1.17,9.59 -0.03,14.31 10.66,-2.6 21.54,-4.29 32,-7.44 3.57,2.81 6.01,6.73 8.28,10.59 2.13,-0.78 0.01,-5.15 3.77,-5.38 2.93,-3.28 1.83,4.78 3.17,2.62 2.13,-3.09 6.1,-3.9 9.41,-5.21 -0.11,-3.41 -2.21,-8.55 -6.38,-7.53 1.64,-0.1 4.89,0.87 4.91,3.82 0.85,2.24 -2.55,3.71 -4.35,4.24 -3.37,0.51 -4.99,-1.76 -6.32,-4.47 -1.38,-2.05 -3.58,-6.56 -6.3,-3.6 -1.89,-1.72 -3.13,-4.04 -1.33,-6.3 2.3,-2.34 1.23,-6.2 -1.28,-7.16 -0.93,0.41 -1.86,0.82 -2.79,1.24z M902.25,172.69c-1.6,2.76 3.05,-2.44 0.08,-0.32l-0.08,0.32z m-11.28,1.28c1.59,0.78 6.09,-2.26 1.78,-2.03 -0.59,0.68 -1.19,1.35 -1.78,2.03z","name":"Massachusetts"},"tn":{"path":"m730.41,314.34c-8.87,-0.11 -17.76,1.5 -26.57,2.73c-10.24,2.86 -20.99,2.66 -31.48,4.02c-16.34,1.45 -32.65,3.29 -48.96,4.95c-4.57,-1.71 -0.43,5.74 -5.06,4.14c-6.97,0.06 -13.87,1.23 -20.84,0.71c-0.95,4.26 -1.37,9.04 -3.6,12.76c1.03276,2.6246 -1.94104,7.30425 -2.59092,9.90471c-2.52529,1.78965 -2.61104,1.92035 -0.46104,4.90035c3.07759,1.94598 -1.38459,5.12506 1.90081,3.86506c33.91,-3.26 65.53115,-6.30012 99.44115,-9.56012c-0.23,-2.54 0.72,-5.31 3.53,-5.69c3.11,-0.4 0.99,-5.41 4.88,-5.81c2.77,-2.02 6.49,-2.19 8.62,-5.18c1.76,-2.26 6.31,-1.64 5.78,-5.38c1.19,-1.77 3.1,-3.84 5.03,-4.85c1.04,-0.39 0.28,1.78 1.72,1.19c2.38,0.56 2.2,-4.36 5.22,-3.86c3.3,1.27 2.68,-2.92 4.96,-4.18c2.05,-0.94 3.81,-6.68 0.92,-6.59c-0.81,0.64 -1.63,1.27 -2.44,1.91l0,0.02z","name":"Tennessee"},"ar":{"path":"m509.47,335.31c1.73,4.9 1.5,10.02 1.53,15.12c2.15,12.21 1.13,24.64 1.47,36.97c0.02,3.71 0.04,7.42 0.06,11.13c2.06,3.2 5.05,-1.45 7.69,1.47c1.53,1.76 -0.88,7.54 2.97,6.49c17.61,-0.36 35.23,-0.72 52.84,-1.08c1.97,-2.6 0.41,-5.9 -1.28,-8.22c3.3,-1.61 -1.59,-3.96 0.84,-6.53c0.75,-2.77 0.62,-6.34 3.78,-7.69c-1.88,-3.07 2.08,-5.24 3.19,-7.88c3.77,-0.38 1.58,-3.3 2.64,-5.42c1.12,-2.67 2.56,-5.28 4.85,-6.58c1.2,-4.12 0.21,-2.67 -1.53,-5.61c-2.76,-3.32 1.95,-3.50023 2.36,-6.84c0.17988,-0.90552 3.08012,-6.46012 1.22,-6.75c-2.65,0.85 -5.34,-0.18 -8.02,-0.33c-0.09,-3.38 4.4,-3.88 4.22,-7.3c0.58,-3.87 -3.58,-3.68 -6.34,-3.26c-24.17,0.77 -48.34,1.54 -72.5,2.31l0.01,0z","name":"Arkansas"},"mo":{"path":"m490.44,245.63c-2.39,-0.46 -0.19,4.05 0.07,5.6 2.45,3.32 4.51,7.86 8.55,9.22 2.81,-0.24 3.61,2.67 2.79,4.84 -3.22,1.64 -1.72,5.03 0.19,7.07 0.9,2.55 4.61,3.05 4.89,5.61 2.1,12.97 1.12,26.14 1.51,39.22 0,5.72 0.08,11.44 0.72,17.13 24.99,-0.94 49.98,-1.8 74.97,-2.51 3.02,-1.12 4.35,1.72 5.31,3.98 0.52,3.48 -2.86,4.46 -4.14,6.86 2.37,0.64 5.57,0.65 8.21,-0.08 1.46,-3.59 1.87,-7.45 2.38,-11.22 0.84,-2.83 5.27,-2.89 4.61,-6.03 1.37,-2.94 0.14,-4.6 -2.22,-4.28 -2.15,-1.81 -2.84,-5.03 -2.86,-7.6 1.45,-2.84 -2.08,-5.07 -2.44,-7.89 -0.66,-3.24 -5.34,-0.87 -6.89,-3.66 -2.64,-2.34 -6.24,-3.94 -6.91,-7.76 -0.94,-3.21 1.52,-6.47 2.17,-9.64 2.2,-3.53 -1.34,-4.7 -4.33,-4.5 -2.66,0.39 -5.34,-1.15 -4.81,-4.1 0.86,-4.07 -4.71,-4.05 -6.43,-6.93 -2.7,-3.4 -6.72,-6.05 -7.25,-10.67 -1.1,-3.16 -2.12,-6.86 -0.62,-10.06 -2.3,-1.34 -2.28,-5.77 -5.37,-4.89 -20.69,0.77 -41.38,1.53 -62.06,2.3z","name":"Missouri"},"ga":{"path":"m672.78,356c-0.74,7.06 4.28,12.69 5.29,19.4 1.36,6.57 3.44,12.96 5.03,19.44 0.94,4.88 2.17,9.95 5.53,13.75 -0.85,3.5 3.37,3.17 2.59,6.44 -1.89,4.45 -3.57,9.65 -0.84,14.13 0.05,2.63 0.94,5.4 -0.38,7.88 2.95,0.94 1.45,4.01 3.07,6.01 1.35,2.67 3.68,4.75 6.83,4 12.35,-0.01 24.69,-1.31 37.03,-1.92 3.32,-0.58 6.67,-0.74 10.04,-0.59 -0.78,4.24 3.04,4.15 2.09,-0.09 -0.9,-2.14 -2.94,-6.23 0.59,-6.62 3.2,0.5 6.42,0.91 9.66,1.02 -0.84,-3.8 -0.8,-7.57 0.5,-11.27 0.2,-3.54 2.62,-6.73 2.21,-10.21 -0.72,-2.93 3.26,-5.26 2.85,-8.05 -2.19,1.37 -5.29,-0.71 -5.34,-3.19 -0.56,-3.12 -2.71,-5.83 -6.03,-6.06 -1.33,-3.9 -2.62,-8.17 -4.99,-11.43 -3.12,-1.07 -6.13,-2.99 -7.17,-6.29 -2.06,-2.33 -5.23,-3.21 -6.66,-6.16 -2.08,-2.2 -5.24,-2.83 -7.66,-4.19 -0.76,-2.53 -3.21,-4.09 -3.94,-6.67 -1.36,-2.63 -2.97,-4.65 -6.15,-3.77 -2.33,-1.57 -7.15,-3.38 -5.31,-6.97 2.02,-2.01 3.76,-4.11 -0.8,-3.11 -12.68,1.51 -25.37,3.01 -38.05,4.52z","name":"Georgia"},"sc":{"path":"m737.03,343.19c-4.26,0.4 -8.64,0.43 -12.24,3.07 -3.2,1.75 -6.48,3.19 -9.88,4.49 2.21,3.31 -4.28,2.74 -2.34,6.44 2.27,2.24 5.2,4.13 8.5,3.28 2.53,3.15 3.83,6.94 6.53,9.88 0.91,2.76 5.13,2.06 6.85,4.46 2.18,1.38 2.96,4.25 5.62,5.01 2.99,1.95 3.36,6.38 7.26,7.24 3.61,0.62 3.77,4.77 5.34,7.38 0.38,3.35 2.02,4.84 4.79,5.96 3.36,1.79 1.76,7.23 5.67,8.16 3.63,-1.38 5.8,-4.63 8.38,-7.34 -2.35,-3.93 0.29,-3.32 3.01,-4.44 1.95,-2.4 5.02,-3.3 6.25,-6.28 2.17,-2 3.86,-4.52 5.4,-6.9 2.81,-0.17 3.42,-3.58 4.92,-5.03 -0.28,-4.13 1.3,-7.89 3.12,-11.47 1.03,-2.11 7.03,-4.5 3.47,-6.34 -5.97,-5.35 -12.78,-9.5 -19.71,-13.47 -4.45,-2.68 -9.74,-0.07 -14.57,-0.06 -2.57,-0.23 -6.63,2.48 -7.32,-1.28 -1.66,-4.5 -6.93,-2.82 -10.63,-2.96 -2.8,0.07 -5.61,0.14 -8.41,0.21z","name":"South Carolina"},"ky":{"path":"m675,267.5c-2.76,-0.77 -6,1.11 -3.38,3.78 1.52,3.15 -3.12,4.12 -5.19,5.27 -2.94,0.53 -4.71,1.29 -4.3,4.82 -1.15,2.66 -5.3,3.24 -6.32,6.32 -2.16,1.4 0.74,6.22 -2.84,5.92 -3.06,0.61 -4.36,-2.79 -7.09,0.11 -2.26,0.51 -1.1,6.98 -3.85,3.1 -2.27,-2.54 -5.57,0.14 -6.16,2.81 -1.91,1.07 -3.4,-3.73 -6.02,-1.91 -3.32,0.61 -7.48,0.47 -9.92,2.91 0.08,2.65 -3.39,3.78 -1.7,6.05 2.34,2.66 -2.23,2.68 -3.86,3.3 -3.57,1.35 -0.68,4.35 -0.76,6.72 0.33,3.45 -3.76,1.44 -5.49,0.72 -2.5,-2.29 -6.26,-0.38 -7.13,2.53 2.86,2.28 -0.04,4.76 0.41,7.66 -3.47,2.04 -3.19,2.73 0.94,2.35 5.84,0.01 11.64,-0.95 17.5,-0.76 -0.7,-3.74 0.98,-4.99 4.56,-4.19 24.33,-3.01 48.82,-4.7 73.16,-7.43 4.3,-0.7 8.2,-2.38 11.75,-4.88 3.3,-0.8 4.04,-2.71 5.12,-5.35 3.46,-4.09 7.13,-8.06 10.79,-12 -3.27,-1.24 -3.03,-5.51 -6.21,-6.95 -2.6,-1.25 -2.07,-4.66 -5.16,-5.36 -2.38,-2.64 0.8,-7.28 -3.02,-8.87 -3.02,-0.01 -2.37,-4.65 -4.57,-3.51 -2.95,0.61 -3.67,4.78 -7.02,3.29 -2.69,-0.23 -5.51,-1.19 -7.82,0.71 -3,0.83 -3.99,-3.61 -7.44,-2.06 -3.51,0.82 -2.17,-5.19 -5.65,-5.26C677.17,266.43 676.21,267.17 675,267.5z","name":"Kentucky"},"al":{"path":"m628.53,359.63c-0.2,14.37 0.12,28.75 -0.54,43.12 -0.04,9.01 -0.88,18.1 -0.07,27.07 1.55,10 2.94,20.01 3.85,30.09 3.07,1.09 3.69,-1.92 4.4,-4.18 -0.3,-3.89 4.27,-3.02 4.89,-0.04 0.72,2.06 4.08,5.27 0.77,6.65 -0.15,0.92 6.17,-0.9 5.88,-2.89 -0.44,-3.01 0.64,-6.86 -2.87,-8.19 -2.29,-0.88 -3.03,-5.59 -0.32,-5.67 14.08,-1.86 28.21,-3.59 42.35,-4.8 2.7,1.07 6.76,-0.25 2.97,-2.5 -1.8,-2 0.95,-5.03 -0.27,-7.65 -0.31,-3.1 -2.63,-5.9 -1.31,-9.15 0.01,-2.92 2.49,-5.36 1.93,-8.3 -3.52,-0.45 -1.34,-5.11 -4.26,-6.7 -3.48,-5.82 -3.36,-13.04 -5.96,-19.21 -2.02,-8.09 -3.34,-16.41 -7.25,-23.88 -0.51,-2.39 -1.08,-4.85 -0.72,-7.31 -14.49,1.18 -28.98,2.35 -43.47,3.53z","name":"Alabama"},"la":{"path":"m521.09,407.28c0.1,7.53 -0.24,15.32 1.67,22.61 2.08,2.49 2.82,5.51 3.15,8.67 1.87,2.78 5.27,4.95 4.59,8.72 1.61,2.18 -0.21,5.69 0.08,8.38 0.42,2.64 -4.36,4.89 -2.01,7.12 1.07,2.26 -0.92,5.31 -0.53,7.95 0.38,3.22 -2.37,5.7 -1.55,8.93 5.18,-2.4 10.98,-0.86 16.47,-1.09 5.72,1.7 11.56,4.87 17.56,4.26 2.93,-2.25 5.94,0.36 8.98,0.93 1.08,-3.4 -4.22,-0.81 -5.8,-2.2 -1.91,-0.36 -2.89,-2.3 -1.17,-3.4 2.08,-1.1 4.08,-1.09 5.66,0.04 2.15,-1.39 5.6,-0.24 6.26,2.38 -0.33,3.62 3.42,1.7 5.28,3.15 3.83,1.5 -1.41,4.07 0.83,5.37 2.88,0.97 5.73,2.94 8.62,3.29 3.51,-0.05 2.81,-4.53 6.47,-4.17 1.83,-2.9 4.44,-0.25 4.39,2.31 1.53,1.64 4,-3.68 1.98,-3.66 0.22,-3.37 2.17,-3.21 4.31,-5.41 1.59,0.95 0.91,2.82 1.41,4.16 3.33,0.39 7.44,1.09 9.34,4.06 2.79,0.08 5.17,1.1 5.56,-2.56 -2.68,-0.27 -4.15,-3.88 -7.35,-3.19 -2.31,0.06 -6.3,-1.62 -6.15,-3.77 1.62,-3.62 2.23,-1.74 2.03,-4.38 2.88,1.09 5.69,-2.27 3.22,-4.47 0.46,-4.62 -3.73,-0.15 -3.34,2.19 -1.36,1.21 -6.35,-0.96 -4.6,-3.27 1.71,-1.84 4.2,-4.5 2.19,-6.95 -0.13,-3.26 -2.69,-5.21 -4.47,-7.38 0.52,-2.7 2.26,-7.35 -2.36,-5.46 -10.43,1.28 -20.97,0.69 -31.45,1.12 -1.61,-3.72 -0.02,-7.76 0.16,-11.59 2.66,-4.86 5.46,-9.65 8.25,-14.44 -2.04,-2.82 3.52,-4.45 -0.74,-6.48 -0.53,-2.15 -1.29,-4.65 -2.32,-6.83 -0.08,-3.1 0.9,-7.3 -3.62,-5.79 -17,0.28 -34,0.57 -51,0.85z","name":"Louisiana"},"ms":{"path":"m591.03,363.5c-1.45,1.74 -4.03,3.15 -4.63,6.03 -1.4,2.22 1.43,5.74 -2.69,6.07 -1.48,1.97 -4.77,4.42 -3.4,7.17 -1.36,1.83 -3.59,3.95 -3.48,7.01 -2.16,2.66 1.55,5.28 -0.27,7.12 -0.45,1.84 2.25,4.42 1.35,7.03 -1.92,2.71 -1.63,6.55 -0.61,9.53 1.6,2.4 0.78,5.54 3.73,6.94 -0.95,2.53 -1.41,3.75 -1.87,6.31 -2.55,4.96 -6.07,9.62 -7.89,14.84 0.01,2.98 -1.44,6.14 -0.14,8.97 11.4,-0.36 22.87,0.25 34.19,-1.5 2.75,2.21 -2.19,6.39 1.33,8.15 2.82,1.62 2.28,5.18 3.89,7.63 2.07,-1.86 2.51,-6.19 5.82,-4.07 3.21,-0.67 6.85,-3.02 9.89,-0.64 3.62,0.73 6.01,-0.27 4.42,-4.26 -0.81,-10.1 -2.99,-20.07 -3.84,-30.15 0.14,-21.99 1.48,-43.98 0.64,-65.97 -12.15,1.26 -24.29,2.52 -36.44,3.78z","name":"Mississippi"},"ia":{"path":"m476.25,181.16c-3.42,-0.05 -2.16,5.68 0.72,6.29 0.54,2.07 -0.75,5.06 -1.41,7.35 -2.13,2.82 -0.93,5.45 1.04,7.92 1.22,4.34 2.24,8.85 4.05,13.06 0.6,3.22 1.29,6.38 3.41,9 0.02,3.49 1.27,6.69 2.3,9.91 -0.04,3.54 0.03,7.05 2.08,10.09 22.2,-1.02 44.44,-1.75 66.66,-2.63 0.77,1.43 3.25,7.11 4.37,4.25 -0.96,-2.5 1.19,-4.52 3.57,-4.72 -0.88,-2.62 1.19,-4.59 2.5,-6.28 1.27,-2.92 -1.39,-4.02 -2.41,-6.31 0.69,-2.9 1.79,-5.3 5.13,-5.46 2.88,-0.83 6.57,-1.81 6.65,-5.41 1.76,-3.04 3.73,-8.01 -0.26,-10.18 -2.74,-1.06 -1.75,-5.27 -5.21,-5.14 -0.64,-1.97 -0.85,-4.76 -4.19,-4.21 -2.75,-0.8 -4.55,-3.47 -5.37,-6 -1.36,-2.89 2.01,-4.72 1.65,-7.28 -3.82,-0.4 -1.19,-6.5 -5.03,-5.47 -26.75,0.41 -53.5,0.81 -80.25,1.22z","name":"Iowa"},"mn":{"path":"m497.03,53.84c-0.69,2.52 0.93,7.42 -1.31,8.34 -9.65,-0.01 -19.29,-0.02 -28.94,-0.03 1.16,2.87 2.18,5.76 0.97,8.81 0.05,5.74 -0.79,11.86 2.51,16.95 2.04,3.78 0.64,8.47 1.5,12.6 0.82,6.84 1.76,13.67 3.55,20.32 0.05,3.83 0.88,7.8 0.03,11.53 -1.57,1.74 -4.91,3.29 -2.22,5.78 1.89,1.83 5.05,2.94 4.58,6.1 0.28,11.9 0.25,23.83 0.42,35.75 26.72,-0.38 53.44,-0.75 80.16,-1.13 -0.15,-3.62 -0.46,-7.93 -4.36,-9.47 -3.02,-1.66 -6.24,-3.1 -7.63,-6.5 -0.72,-3.61 -5.32,-1.16 -6.05,-4.61 -1.56,-2.09 -5.29,-0.37 -6.57,-3.78 -1.66,-2.1 -0.52,-5.5 -1.1,-8.1 -1.34,-2.93 1.65,-4.99 1.47,-7.54 -0.2,-3.22 -5.36,-3.85 -2.24,-7.43 0.41,-4.47 5.39,-5.33 7.61,-8.59 0.24,-3.87 -0.73,-8.14 0.52,-11.77 1.76,-3.14 5.17,-5.1 8.28,-6.26 1.92,-2.08 3.66,-4.57 6.13,-5.81 2.54,-4.97 6.04,-9.99 11.81,-11.4 4.55,-1.98 9.12,-3.92 13.6,-6.04 0.73,-3.15 -3.7,-0.18 -5.06,0.03 -0.82,-3.87 -4.2,-3.09 -7.28,-2.87 -2.25,-0.87 -5.34,2.83 -6,-0.66 -1.13,-3.5 -4.51,0.72 -5.88,2.13 -2.33,1.63 -6.22,1.16 -8.06,-0.56 0.94,-3.05 -4.61,-0.39 -4.53,-3.96 -0.16,-2.3 -3.48,1.3 -5.77,-1.2 -3.04,-0.91 -5.5,-3.22 -8.29,-4.38 -2.49,0.4 -5.86,-2.38 -6.7,1.5 -1.17,0.79 -7.15,1.83 -5.93,-1.54 -2.99,0.03 -6.03,-0.05 -7.53,-1.75 -2.6,0.59 -5.72,-0.41 -5.9,-3.43 -0.88,-3.28 -1.44,-6.61 -1.88,-9.98 -1.23,-0.6 -2.54,-1.02 -3.91,-1.06z","name":"Minnesota"},"ok":{"path":"m363.31,330.03c17.51,1.12 35.04,1.73 52.56,2.47 -1.37,13.62 -2.89,27.23 -2.83,40.93 -0.92,3.93 3.48,5.78 6.14,7.66 0.56,-5.56 2.96,1.46 4.25,-1.31 0.93,-1.5 5.57,1.68 3.39,4.42 1.59,0.66 4.76,0.51 6.73,1.82 2.79,-0.99 5.16,3.32 7.03,1.26 1.82,-1.93 5.59,-0.31 6.5,2.02 2.44,0.79 1.71,5.84 4.76,3.05 1.39,-1.65 6.25,-1.17 6.69,1.21 1.28,1.5 5.69,3.72 7.39,1.92 0.33,-2.75 3.38,-5.95 4.59,-1.83 3.59,0.38 6.96,2 10.46,3 2.28,-1.86 2.44,-4.68 6.53,-3.41 2.53,1.92 3.8,-1.41 6.31,-1.16 0.85,2.42 5.2,2.41 6.19,-0.5 3.2,-0.2 3.66,3.71 6.55,4.35 1.86,0.4 6.31,3.63 5.36,0.18 -0.32,-12.27 0.1,-24.59 -0.7,-36.82 -1.15,-6.03 -1.01,-12.18 -1.43,-18.25 -1.32,-5.29 -2.05,-10.73 -2.07,-16.18 -20.01,0.66 -40.04,-0.04 -60.06,-0.22 -27.85,-1.32 -55.73,-2.3 -83.53,-4.56 -0.27,3.31 -0.54,6.63 -0.81,9.94z","name":"Oklahoma"},"tx":{"path":"m359.47,330.97c2.34,-0.11 -0.86,-1.81 0,0z m0.72,18.31c-1.64,20.84 -2.52,41.75 -4.68,62.55 -0.51,4.33 -0.99,8.66 -1.51,12.98 -17.84,-0.87 -35.67,-1.93 -53.42,-3.89 -4.16,-0.41 -8.32,-0.76 -12.48,-1.11 -0.67,3.74 2.27,3.68 4.04,6.12 2.26,1.83 1.13,6.03 4.65,6.5 3.52,0.48 2.9,4.6 5.45,6.34 3.38,3.15 5.5,7.91 10.27,9.06 1.91,1.27 4,3.22 4.53,5.46 0.69,3.96 4.53,7.02 3.47,11.33 -0.88,5.15 2.22,9.63 5.93,12.88 2.18,2.95 5.14,4.76 8.63,5.78 1.88,1.95 3.01,3.88 5.72,4.88 2.59,0.18 5.38,4.34 7.35,1.18 2.59,-3.14 5.48,-6.41 6.05,-10.55 1.26,-2.82 3.58,-4.32 6.5,-5.06 2.72,-1.59 5.32,-2.13 7.47,0.62 4.91,0.57 10.2,0.53 14.79,2.22 2.83,1.43 2.56,4.53 5.17,6.33 1.73,2.05 4.83,3.37 5.81,5.82 1.37,2.07 2.66,4.26 2.69,7.03 1.62,4.34 4.17,8.51 5.31,12.94 -0.24,2.77 4.65,2.49 4.95,5.51 2.24,4.08 4.37,9.17 9.21,10.49 3.28,2 0.03,5.04 0.91,7.5 3.28,0.87 -0.01,4.68 0.94,6.67 2.53,1.36 4.37,3.2 4.22,6.44 0.39,3.34 2.13,6.83 5.69,7.54 3.01,1.93 6.69,2.13 9.87,3.4 2.28,1.79 5.15,4.09 8.16,2.83 3.46,0.46 6.77,1.29 9.37,3.75 1.43,2.54 6.51,-0.91 4.31,-2.89 -2.04,-3.39 -1.3,-7.79 -2.83,-11.46 -0.63,-3.07 -2.39,-5.95 -0.99,-9.1 1.17,-4.9 2.87,-9.76 4.04,-14.71 -3.37,-1.01 -2.07,-5.47 1.21,-4.71 3.99,0.42 3.65,-6.43 7.81,-6.05 5.25,-1.56 9.07,-6 14.16,-8.05 6.91,-2.81 13.62,-6.46 18.72,-12.05 2.58,-2.98 7.09,-3.95 8.69,-7.75 5,-2.22 9.8,-4.93 15.22,-6 -0.97,-2.64 0.52,-4.86 1.32,-7.22 0.39,-2.99 0.19,-6.07 1.18,-8.94 -3.15,-2.27 0.38,-4.91 1.38,-7.41 -0.2,-2.8 1.42,-6.25 0.09,-8.66 0.3,-2.93 -1.49,-5.14 -3.35,-7.29 -2.46,-2.64 -1.11,-6.91 -3.87,-9.52 -2.53,-4.57 -1.59,-10.19 -2.25,-15.22 0.02,-5 0.19,-10 -0.5,-14.97 -2.63,-2.31 -5.52,2.33 -7.52,-1.37 -3.1,-2.07 -7.66,-2.1 -9.73,-5.68 -2.31,-2.48 -3.82,2.84 -7.18,0.96 -1.91,-2.73 -3.59,0.03 -5.98,0.18 -2.27,-1.15 -6.07,-1.48 -6.09,1.76 -2.76,2.37 -5.95,-0.93 -8.94,-1.28 -3,1.38 -5.23,-3.83 -6.3,-1.87 -0.15,2.66 -2.52,5.1 -5.13,3.34 -3.23,-0.15 -4.91,-2.49 -6.57,-3.89 -2.95,-1.74 -4.3,2.32 -6.94,0.88 -1.48,-1.39 -1.87,-3.6 -3.92,-5.65 -3.06,-2.83 -5.03,3.17 -7.13,0.23 -2.05,-2.11 -5.57,-0.83 -7.94,-2.69 -3.56,0.59 -5.54,-0.24 -4.13,-4.11 -1.89,-1.85 -2.28,1.21 -4.77,-0.14 -0.59,-0.41 -3.45,1.78 -5,-1.11 -1.9,-1.9 -5.13,-3.22 -4.18,-6.45 0.03,-10.58 0.25,-21.15 1.66,-31.65 0.3,-2.99 0.6,-5.98 0.89,-8.98 -17.65,-0.63 -35.3,-1.27 -52.94,-2.22 -0.52,6.07 -1.04,12.15 -1.56,18.22z M466.53,518.63c-5.2,7.17 2.93,-3.27 0,0z","name":"Texas"},"nm":{"path":"m242.72,428.78c4.82,0.63 9.65,1.25 14.47,1.88 0.43,-3.33 0.85,-6.67 1.28,-10 9.7,0.89 19.4,1.86 29.09,2.78 -0.9,-3.14 -1.39,-5.98 2.84,-4.5 18.29,1.28 36.48,3.79 54.81,4.49 2.45,-0.6 7.66,2.13 7.99,-1.01 3.06,-22.93 3.75,-46.09 5.59,-69.14 0.54,-7.79 1.39,-15.56 2.02,-23.34 3.21,0.65 1.17,-4.81 2.07,-6.86 1.79,-4.38 -2.87,-3.37 -5.73,-3.85 -32.35,-3.3 -64.71,-6.59 -97.06,-9.89 -5.79,39.81 -11.58,79.63 -17.38,119.44z","name":"New Mexico"},"ks":{"path":"m380.53,320.34c25.06,1.17 50.11,2.71 75.19,3.35 17.22,0.07 34.44,0.63 51.66,0.18 -0.25,-12.69 0.23,-25.42 -0.47,-38.08 -0.61,-2.83 -0.17,-6.27 -1.38,-8.74 -3.04,-2.03 -6.02,-5.19 -6.68,-8.77 -0.43,-2.51 4.3,-4.59 1.29,-6.64 -3.02,0.54 -4.05,-3.34 -7.17,-2.43 -36.21,-0.82 -72.43,-1.33 -108.63,-2.5 -1.27,21.21 -2.54,42.42 -3.81,63.63z","name":"Kansas"},"ne":{"path":"m353.38,230.59c10.76,0.96 21.27,2.72 32.03,3.66 -0.37,7.11 -0.71,14.23 -1.06,21.34 36.49,1.29 73,1.84 109.5,2.56 -0.31,-1.17 -3.13,-4.05 -4.03,-6.15 -1.99,-2.11 -0.36,-5.13 -2.45,-7.34 -2.42,-3.19 -1.66,-7.14 -2.2,-10.79 -1.66,-2.86 -1.45,-6.25 -2.29,-9.26 -2.94,-2.85 -2.34,-7.01 -3.95,-10.49 -1.13,-3.1 -2.18,-6.19 -2.62,-9.47 -3.51,1.32 -2.89,-3.07 -4.85,-4.29 -2.4,-1.68 -5.57,-1.85 -7.72,-3.93 -3.79,0.07 -7.65,1.04 -11.13,1.94 -2.52,-2.2 -6.03,-3.13 -7.91,-6.06 -13.61,0.96 -27.23,-0.49 -40.83,-1.11 -15.5,-1.05 -31.02,-1.79 -46.51,-2.86 -1.67,14.08 -2.83,28.17 -4,42.25z","name":"Nebraska"},"sd":{"path":"m357.44,187.41c25.68,1.58 51.37,3.15 77.06,4.26 3.58,-0.01 7.34,-0.51 10.81,-0.23 1.8,2.9 5.24,3.85 7.69,6 3.55,-1.45 7.52,-1.89 11.25,-1.91 2.45,2.67 7.26,2.29 9.15,5.33 1.32,4.76 3.27,1.86 0.18,-1.15 -1.53,-2.17 1.46,-4.6 1.56,-6.99 1.2,-2.87 1.38,-5.28 -1.58,-6.75 -0.5,-2.04 -0.73,-6.65 2.41,-5.84 2.62,-0.28 0.39,-5.28 1.06,-7.5 -0.32,-9.7 0.19,-19.47 -0.64,-29.13 -0.24,-3.58 -6.26,-4.19 -5.42,-8.4 1.09,-1.22 5.81,-4.38 2.75,-5.4 -27.23,-0.89 -54.5,-1.01 -81.67,-3.15 -9.79,-0.62 -19.57,-1.24 -29.36,-1.86 -1.75,20.91 -3.5,41.81 -5.25,62.72z","name":"South Dakota"},"nd":{"path":"m362.88,123.72c26.46,1.49 52.89,3.7 79.4,3.91 10.84,0.26 21.67,0.52 32.51,0.78 0.01,-5.53 -1.38,-10.82 -2.5,-16.17 -1.27,-7.42 -2.05,-14.89 -2.13,-22.42 -2.61,-4.16 -4.11,-9 -3.48,-13.94 -0.44,-3.25 0.67,-6.57 0.3,-9.7 -0.15,-4.01 -2.83,-4.61 -6.31,-4.12 -25.15,-0.47 -50.33,-1.05 -75.41,-3.06 -5.17,-0.49 -10.33,-0.98 -15.5,-1.47 -2.29,22.06 -4.58,44.13 -6.88,66.19z","name":"North Dakota"},"wy":{"path":"m240.16,217.84c37.4,4.49 74.29,8.23 111.69,12.72 2.5,-29.2 5.5,-57.65 8,-86.84 -35.26,-4.45 -70.52,-8.9 -105.78,-13.34 -4.64,29.16 -9.27,58.31 -13.91,87.47z","name":"Wyoming"},"mt":{"path":"m192.59,52.19c0.84,2.76 3.25,5.4 3.2,8.23 -1.5,2.79 -1,5.49 0.52,8.15 3.4,0.39 4.18,3.44 5.26,6.16 1.43,3.34 2.55,6.88 5.37,9.34 0.88,2.21 5.27,1.18 4.34,4.72 -2.23,6.21 -5.45,12.23 -7.06,18.56 0.02,3.34 3.4,5.25 5.73,2.22 1.61,-2.43 5.63,-3.04 4.69,0.97 -0.5,5.3 1.81,10.35 2.59,15.53 1.9,2 5.27,3.44 5.68,6.31 -0.71,1.91 -0.39,8.78 2.32,5.14 1.85,-1.89 4.93,-0.29 6.85,0.86 3.28,-1.63 7.26,-1.21 10.34,0.69 3.69,0.41 1.52,-5 5.95,-4.08 2.71,-0.42 2.01,6.69 3.21,4.1 0.56,-3.26 1.09,-6.54 1.68,-9.8 35.57,4.49 71.15,8.96 106.72,13.44 2.9,-28.44 5.79,-56.88 8.69,-85.31 -28.84,-2.29 -57.55,-5.91 -86.19,-9.99 -26.71,-4.12 -53.36,-8.71 -79.73,-14.68 -3.05,-0.61 -6.99,-2.59 -6.53,2.19 -1.21,5.75 -2.42,11.51 -3.62,17.26z","name":"Montana"},"co":{"path":"m260.17,308.53c39.89,4.09 79.51,8.26 119.39,11.91 1.61,-28.46 3.23,-56.92 4.84,-85.38 -37.47,-4.17 -74.94,-8.33 -112.41,-12.5 -4.03,28.98 -7.8,56.99 -11.83,85.97z","name":"Colorado"},"id":{"path":"m169.84,91.72c0.52,3.07 2.27,5.25 4.94,6.78 0.4,3.02 -0.61,5.46 -3.03,7.31 -2.3,2.7 -4.38,5.97 -6.09,8.83 0.39,2.93 -2.57,3.54 -4.23,4.8 -1.77,2.31 -4.28,4.3 -3.93,7.5 -0.64,2.43 4.69,0.57 4.09,4.34 -5.19,11.17 -6.78,23.51 -10.13,35.32 -0.79,3.16 -1.22,4.91 -2.01,8.08 56.92,12.84 62.26,13.45 93.58,19.41 2.75,-17.6 5.5,-35.21 8.25,-52.81 -2.66,-0.84 -0.58,-6.52 -4.23,-4.97 -1.24,1.7 -1.62,4.95 -5.17,3.47 -3.11,-1.99 -6.81,-1.34 -10.13,-0.56 -2.53,-1.76 -5.91,-2.01 -7.69,0.88 -1.75,-0.05 -3.29,-3.39 -2.79,-5.36 1.91,-3.98 -2.85,-5.89 -5.05,-8.27 -0.98,-5.88 -3.48,-11.64 -2.5,-17.69 -1.86,-0.01 -4.25,2.69 -6.47,3.63 -2.21,0.18 -4.52,-3.09 -4.1,-5.31 1.19,-5.37 4.07,-10.37 5.88,-15.6 1.95,-2.64 1.12,-5.57 -2.41,-5.62 -1.55,-3.37 -4.92,-5.66 -5.61,-9.53 -1.31,-2.63 -1.42,-6.47 -5.06,-6.76 -0.99,-1.85 -3.18,-4.47 -1.91,-6.73 2.09,-2.98 -0.34,-5.7 -1.53,-8.5 -2.13,-3.05 0.55,-6.68 0.67,-10.01 0.9,-4.35 1.8,-8.69 2.69,-13.04 -4.18,-0.78 -8.35,-1.56 -12.53,-2.34 -4.5,20.92 -9,41.83 -13.5,62.75z","name":"Idaho"},"ut":{"path":"m176.34,297.78c27.57,3.92 55.15,7.83 82.72,11.75 4.04,-29.08 8.08,-58.17 12.13,-87.25 -10.83,-1.14 -21.65,-2.33 -32.47,-3.59 1.43,-7.93 2.82,-15.85 3.84,-23.84 -15.27,-2.85 -30.54,-5.71 -45.81,-8.56 -6.8,37.17 -13.6,74.33 -20.41,111.5z","name":"Utah"},"az":{"path":"m173.19,314.66c-2.49,-0.06 -3.05,4.43 -6.38,2.94 -0.74,-2.87 -3.59,-2.82 -5.59,-4.22 -3.74,0.74 -2.37,4.58 -2.68,7.41 -0.52,5.04 -0.42,10.21 -0.89,15.22 -2.19,2.33 -2.44,5.78 -0.24,8.19 2.32,2.62 0.58,7.52 4.09,9.09 0.98,3.59 -2.89,4.83 -5.41,6.09 -3.29,2.46 -3.28,6.86 -3.88,10.47 -1.25,2.44 -4.81,2.39 -4.92,4.97 0.47,2.18 6.18,0.38 3.42,4.54 -0.65,2.75 -3.14,3.45 -5.62,3.78 -3.6,1.45 -2.69,4.7 0.77,5.44 14.69,7.84 28.52,17.13 43.01,25.32 5.79,3.19 11.27,7.21 17.27,9.88 11.71,2.83 23.75,3.45 35.68,4.87 5.71,-39.38 11.42,-78.75 17.13,-118.13 -27.58,-3.93 -55.17,-7.85 -82.75,-11.78 -1,5.31 -2,10.63 -3,15.94z","name":"Arizona"},"nv":{"path":"m84.84,232.41c22.96,34.61 45.92,69.23 68.88,103.84 3.66,2.65 3.19,-3.47 3.27,-5.71 0.37,-5.43 0.36,-11.24 1.08,-16.44 2.05,-2.03 4.26,-2 6.08,-0.39 2.62,-0.16 3.86,5.9 6.03,1.27 2.74,-0.82 2.66,-3.64 3.13,-6.41 7.5,-40.87 15,-81.75 22.51,-122.62 -30.72,-6.81 -61.44,-13.63 -92.16,-20.44 -6.27,22.3 -12.54,44.6 -18.81,66.91z","name":"Nevada"},"or":{"path":"M67.16,62.81C64.24,70.42 62.73,78.57 58.5,85.63c-2.86,8.53 -5.96,16.93 -10.17,24.89 -3.06,6.61 -8,12.31 -11.32,18.7 -1.03,6.5 -0.64,13.05 -0.36,19.6 37.23,8.7 74.46,16.69 111.69,25.39 3.45,-13.15 6.51,-25.75 10.19,-38.81 1.2,-2.48 3.15,-6.06 -1.1,-5.42 -2.58,-1.78 -0.23,-4.45 -0.38,-6.91 2.3,-2.82 4.36,-5.82 7.47,-7.75 1.75,-5.08 5.43,-9.19 9.03,-13.06 1.66,-3.48 -2.46,-3.92 -3.39,-6.47 -0.25,-3.79 -3.56,-4.26 -6.62,-4.99 -7.63,-2.2 -15.38,-4.2 -23.21,-5.54 -4.9,0.03 -9.79,0.06 -14.69,0.09 -0.95,-2.84 -4.67,1.86 -7.11,0.5 -2.61,0.82 -4.42,-2.63 -6.57,-1.28 -2.61,-0.06 -5.23,0.11 -7.15,-1.87 -3.09,-1.53 -6.33,-1.81 -9.5,-3.1 -1.87,3.03 -5.69,1.22 -8.53,1.31 -1.65,-1.64 -5.79,-3.02 -6.03,-4.81 1.1,-2.44 0.78,-5.93 0.53,-8.59 -0.42,-3.92 -4.72,-2.63 -6.25,-4.49C74.59,58.67 69.45,62.45 67.16,62.81z","name":"Oregon"},"wa":{"path":"m101.38,8.72c0.05,2.75 2.93,5.39 3.25,8.16 -1.92,2.33 -1.78,5.19 -1.32,7.71 -1.81,2.64 1.63,4.82 0.67,7.42 -3.6,1.52 -2.43,-3.7 -4.86,-4.99 -3.34,-2.24 1.47,-3.87 1.17,-5.42 -2.5,-1.11 -2.24,3.88 -3.69,4.17C92.33,26.39 88.86,23.04 84.76,22.57 79.82,20.66 75.28,17.69 72.25,13.25c-3.13,-0.98 -1.96,4.97 -3.25,6.95 -0.63,2.8 2.59,5.06 1.41,8.21 0.52,3.86 -1.29,7.55 0.18,11.29 -1.06,2.88 4.75,5.54 2.94,6.39 -3.45,-1.05 -6.2,3.2 -2.25,4.34 1.57,0.97 -0.61,6.32 -3.3,5.43 -1.83,2.15 1.28,6.86 4.14,4.17 3.77,-1.55 2.75,3.51 5.83,3.13 2.81,-0.24 4.26,3.31 4.54,5.61 0.04,2.48 -0.15,6.02 -0.26,7.78 2.63,1.76 5.01,4.26 8.46,3.62 3.2,0.66 4.7,-3.26 7.97,-0.5 3.01,0.48 6.37,1.55 8.79,3.66 3.03,0.92 6.02,-1.78 8.19,1.05 3.44,1.3 6.67,0.03 9.84,-1.4 0.99,1.78 4.42,1.32 7,1.3 5.35,-0.19 10.68,-0.16 15.82,1.55 6.99,1.44 13.78,3.45 20.65,5.4 4.47,-20.85 8.94,-41.71 13.41,-62.56 -19.81,-3.93 -39.37,-9.21 -58.73,-14.66 -7.27,-1.53 -14.4,-3.52 -21.46,-5.87L101.75,8.45 101.38,8.72z M95.5,15.16C94.05,13.72 92.15,14.26 94.72,17.63 94.39,13.84 99.19,18.11 98.98,14.18 98.24,12.75 96.05,14.08 95.5,15.16z m2.31,1.91c-3.13,3.04 1.36,2.18 0.16,-0.25l-0.16,0.25z","name":"Washington"},"ca":{"path":"m35.06,153.94c-0.1,4.04 0.4,8.21 -1.99,11.75 -1.86,3.68 -2.55,8.24 -6.48,10.38 -1.19,2.11 -3.49,3.38 -3.59,6.45 -1.94,3.49 2.49,5.65 2.91,8.98 1.54,3.39 2.34,6.94 1.63,10.65 0,2.92 -2.79,5.01 -2.24,8.14 0.05,2.97 -2.24,5.87 0.04,8.54 2.58,5 6.38,9.93 6.71,15.69 -0.54,2.77 -0.99,5.37 1.81,7.17 1.6,1.95 4.49,3.66 2.79,6.46 -1.73,3.87 -1.14,8.04 -1.09,12.16 1.68,2.67 2.83,6.76 6.66,6.53 1.48,2.33 0.97,4.84 -0.22,7.13 -2.5,1.53 -4.36,2.73 -3.66,6.08 0.27,3.49 4.27,5.34 4.36,9.01 1.46,6.2 4.13,11.92 7.59,17.25 0.71,2.57 2.16,4.34 2.9,6.41 -0.24,3.33 -1.93,6.49 -2.41,9.87 -1.66,2.61 1.19,5.52 3.99,5.12 4.03,0.15 7.27,3.31 11.01,4.04 3,-0.55 4.74,2.9 6.07,5.11 1.54,2.71 2.37,6 5.76,6.88 2.51,1.14 6.19,0.05 7.17,3.45 2.41,2.72 -2.39,5.05 1.41,5.17 2.73,1.87 5.56,-1.74 7.56,-0.74 2.13,2.06 4.05,4.2 4.93,7.05 4.3,4.9 1.44,11.77 2.79,17.52 14.73,1.94 29.44,4.72 44.27,5.38 2.78,1.19 6.19,-4.43 2.84,-4.65 -3.13,0.64 -2.83,-4.02 -1.36,-4.66 3.15,-0.88 4.92,-3.83 4.65,-7.04 0.47,-3.98 3.27,-7.43 7.22,-8.4 3.43,-2.04 -0.33,-3.58 -0.79,-5.79 -0.23,-3.65 -1.95,-6.81 -3.62,-9.89 2.02,-3.66 -2.22,-3.32 -3.16,-6.24 -22.6,-34.1 -45.2,-68.19 -67.81,-102.29 6.27,-22.44 12.54,-44.88 18.81,-67.31 -22.04,-5.16 -44.08,-10.31 -66.13,-15.47 -0.45,1.38 -0.9,2.75 -1.34,4.13z m24.13,184.72c-0.27,3.05 7.99,3.06 4.7,2.07 -1.63,-0.35 -3.17,-2.46 -4.7,-2.07z m-5.16,0.38c0.33,3.71 5.81,0.51 1.31,-0.04 -0.44,0.01 -0.88,0.02 -1.31,0.04z M79.69,357.5c-0.2,1.58 4.42,6 3.16,2.37C82.22,358.91 80.8,357.6 79.69,357.5z M77.75,369.13c-0.14,1.55 3.2,3.89 1.32,1.26C78.6,369.72 77.39,366.55 77.75,369.13z","name":"California"}}}); + +/** Add World Map Data Points */ +jQuery.fn.vectorMap('addMap', 'world_en', {"width":950,"height":550,"paths":{"id":{"path":"M781.68,324.4l-2.31,8.68l-12.53,4.23l-3.75-4.4l-1.82,0.5l3.4,13.12l5.09,0.57l6.79,2.57v2.57l3.11-0.57l4.53-6.27v-5.13l2.55-5.13l2.83,0.57l-3.4-7.13l-0.52-4.59L781.68,324.4L781.68,324.4M722.48,317.57l-0.28,2.28l6.79,11.41h1.98l14.15,23.67l5.66,0.57l2.83-8.27l-4.53-2.85l-0.85-4.56L722.48,317.57L722.48,317.57M789.53,349.11l2.26,2.77l-1.47,4.16v0.79h3.34l1.18-10.4l1.08,0.3l1.96,9.5l1.87,0.5l1.77-4.06l-1.77-6.14l-1.47-2.67l4.62-3.37l-1.08-1.49l-4.42,2.87h-1.18l-2.16-3.17l0.69-1.39l3.64-1.78l5.5,1.68l1.67-0.1l4.13-3.86l-1.67-1.68l-3.83,2.97h-2.46l-3.73-1.78l-2.65,0.1l-2.95,4.75l-1.87,8.22L789.53,349.11L789.53,349.11M814.19,330.5l-1.87,4.55l2.95,3.86h0.98l1.28-2.57l0.69-0.89l-1.28-1.39l-1.87-0.69L814.19,330.5L814.19,330.5M819.99,345.45l-4.03,0.89l-1.18,1.29l0.98,1.68l2.65-0.99l1.67-0.99l2.46,1.98l1.08-0.89l-1.96-2.38L819.99,345.45L819.99,345.45M753.17,358.32l-2.75,1.88l0.59,1.58l8.75,1.98l4.42,0.79l1.87,1.98l5.01,0.4l2.36,1.98l2.16-0.5l1.97-1.78l-3.64-1.68l-3.14-2.67l-8.16-1.98L753.17,358.32L753.17,358.32M781.77,366.93l-2.16,1.19l1.28,1.39l3.14-1.19L781.77,366.93L781.77,366.93M785.5,366.04l0.39,1.88l2.26,0.59l0.88-1.09l-0.98-1.49L785.5,366.04L785.5,366.04M790.91,370.99l-2.75,0.4l2.46,2.08h1.96L790.91,370.99L790.91,370.99M791.69,367.72l-0.59,1.19l4.42,0.69l3.44-1.98l-1.96-0.59l-3.14,0.89l-1.18-0.99L791.69,367.72L791.69,367.72M831.93,339.34l-4.17,0.47l-2.68,1.96l1.11,2.24l4.54,0.84v0.84l-2.87,2.33l1.39,4.85l1.39,0.09l1.2-4.76h2.22l0.93,4.66l10.83,8.96l0.28,7l3.7,4.01l1.67-0.09l0.37-24.72l-6.29-4.38l-5.93,4.01l-2.13,1.31l-3.52-2.24l-0.09-7.09L831.93,339.34L831.93,339.34z","name":"Indonesia"},"pg":{"path":"M852.76,348.29l-0.37,24.44l3.52-0.19l4.63-5.41l3.89,0.19l2.5,2.24l0.83,6.9l7.96,4.2l2.04-0.75v-2.52l-6.39-5.32l-3.15-7.28l2.5-1.21l-1.85-4.01l-3.7-0.09l-0.93-4.29l-9.81-6.62L852.76,348.29L852.76,348.29M880.48,349l-0.88,1.25l4.81,4.26l0.66,2.5l1.31-0.15l0.15-2.57l-1.46-1.32L880.48,349L880.48,349M882.89,355.03l-0.95,0.22l-0.58,2.57l-1.82,1.18l-5.47,0.96l0.22,2.06l5.76-0.29l3.65-2.28l-0.22-3.97L882.89,355.03L882.89,355.03M889.38,359.51l1.24,3.45l2.19,2.13l0.66-0.59l-0.22-2.28l-2.48-3.01L889.38,359.51L889.38,359.51z","name":"Papua New Guinea"},"mx":{"path":"M137.49,225.43l4.83,15.21l-2.25,1.26l0.25,3.02l4.25,3.27v6.05l5.25,5.04l-2.25-14.86l-3-9.83l0.75-6.8l2.5,0.25l1,2.27l-1,5.79l13,25.44v9.07l10.5,12.34l11.5,5.29l4.75-2.77l6.75,5.54l4-4.03l-1.75-4.54l5.75-1.76l1.75,1.01l1.75-1.76h2.75l5-8.82l-2.5-2.27l-9.75,2.27l-2.25,6.55l-5.75,1.01l-6.75-2.77l-3-9.57l2.27-12.07l-4.64-2.89l-2.21-11.59l-1.85-0.79l-3.38,3.43l-3.88-2.07l-1.52-7.73l-15.37-1.61l-7.94-5.97L137.49,225.43L137.49,225.43z","name":"Mexico"},"ee":{"path":"M517.77,143.66l-5.6-0.2l-3.55,2.17l-0.05,1.61l2.3,2.17l7.15,1.21L517.77,143.66L517.77,143.66M506.76,147.64l-1.55-0.05l-0.9,0.91l0.65,0.96l1.55,0.1l0.8-1.16L506.76,147.64L506.76,147.64z","name":"Estonia"},"dz":{"path":"M473.88,227.49l-4.08-1.37l-16.98,3.19l-3.7,2.81l2.26,11.67l-6.75,0.27l-4.06,6.53l-9.67,2.32l0.03,4.75l31.85,24.35l5.43,0.46l18.11-14.15l-1.81-2.28l-3.4-0.46l-2.04-3.42v-14.15l-1.36-1.37l0.23-3.65l-3.62-3.65l-0.45-3.88l1.58-1.14l-0.68-4.11L473.88,227.49L473.88,227.49z","name":"Algeria"},"ma":{"path":"M448.29,232.28h-11.55l-2.26,5.02l-5.21,2.51l-4.3,11.64l-8.38,5.02l-11.77,19.39l11.55-0.23l0.45-5.7h2.94v-7.76h10.19l0.23-10.04l9.74-2.28l4.08-6.62l6.34-0.23L448.29,232.28L448.29,232.28z","name":"Morocco"},"mr":{"path":"M404.9,276.66l2.18,2.85l-0.45,12.32l3.17-2.28l2.26-0.46l3.17,1.14l3.62,5.02l3.4-2.28l16.53-0.23l-4.08-27.61l4.38-0.02l-8.16-6.25l0.01,4.06l-10.33,0.01l-0.05,7.75l-2.97-0.01l-0.38,5.72L404.9,276.66L404.9,276.66z","name":"Mauritania"},"sn":{"path":"M412.03,289.84L410.12,290.31L406.18,293.18L405.28,294.78L405,296.37L406.43,297.40L411.28,297.34L414.40,296.5L414.75,298.03L414.46,300.06L414.53,300.09L406.78,300.21L408.03,303.21L408.71,301.37L418,302.15L418.06,302.21L419.03,302.25L422,302.37L422.12,300.62L418.53,296.31L414.53,290.87L412.03,289.84z","name":"Senegal"},"gm":{"path":"M406.89,298.34l-0.13,1.11l6.92-0.1l0.35-1.03l-0.15-1.04l-1.99,0.81L406.89,298.34L406.89,298.34z","name":"Gambia"},"gw":{"path":"M408.6,304.53l1.4,2.77l3.93-3.38l0.04-1.04l-4.63-0.67L408.6,304.53L408.6,304.53z","name":"Guinea-Bissau"},"gn":{"path":"M410.42,307.94l3.04,4.68l3.96-3.44l4.06-0.18l3.38,4.49l2.87,1.89l1.08-2.1l0.96-0.54l-0.07-4.62l-1.91-5.48l-5.86,0.65l-7.25-0.58l-0.04,1.86L410.42,307.94L410.42,307.94z","name":"Guinea"},"sl":{"path":"M413.93,313.13l5.65,5.46l4.03-4.89l-2.52-3.95l-3.47,0.35L413.93,313.13L413.93,313.13z","name":"Sierra Leone"},"lr":{"path":"M420.17,319.19l10.98,7.34l-0.26-5.56l-3.32-3.91l-3.24-2.87L420.17,319.19L420.17,319.19z","name":"Liberia"},"ci":{"path":"M432.07,326.75l4.28-3.03l5.32-0.93l5.43,1.17l-2.77-4.19l-0.81-2.56l0.81-7.57l-4.85,0.23l-2.2-2.1l-4.62,0.12l-2.2,0.35l0.23,5.12l-1.16,0.47l-1.39,2.56l3.58,4.19L432.07,326.75L432.07,326.75z","name":"Cote d'Ivoire"},"ml":{"path":"M419.46,295.84l3.08-2.11l17.12-0.1l-3.96-27.54l4.52-0.13l21.87,16.69l2.94,0.42l-1.11,9.28l-13.75,1.25l-10.61,7.92l-1.93,5.42l-7.37,0.31l-1.88-5.41l-5.65,0.4l0.22-1.77L419.46,295.84L419.46,295.84z","name":"Mali"},"bf":{"path":"M450.59,294.28l3.64-0.29l5.97,8.44l-5.54,4.18l-4.01-1.03l-5.39,0.07l-0.87,3.16l-4.52,0.22l-1.24-1.69l1.6-5.14L450.59,294.28L450.59,294.28z","name":"Burkina Faso"},"ne":{"path":"M460.89,302l2.55-0.06l2.3-3.45l3.86-0.69l4.11,2.51l8.77,0.25l6.78-2.76l2.55-2.19l0.19-2.88l4.73-4.77l1.25-10.53l-3.11-6.52l-7.96-1.94l-18.42,14.36l-2.61-0.25l-1.12,9.97l-9.4,0.94L460.89,302L460.89,302z","name":"Niger"},"gh":{"path":"M444.34,317.05l1.12,2.63l2.92,4.58l1.62-0.06l4.42-2.51l-0.31-14.29l-3.42-1l-4.79,0.13L444.34,317.05L444.34,317.05z","name":"Ghana"},"tg":{"path":"M455.22,321.25l2.68-1.57l-0.06-10.35l-1.74-2.82l-1.12,0.94L455.22,321.25L455.22,321.25z","name":"Togo"},"bj":{"path":"M458.71,319.49h2.12l0.12-6.02l2.68-3.89l-0.12-6.77l-2.43-0.06l-4.17,3.26l1.74,3.32L458.71,319.49L458.71,319.49z","name":"Benin"},"ng":{"path":"M461.57,319.37l3.92,0.19l4.73,5.27l2.3,0.63l1.8-0.88l2.74-0.38l0.93-3.82l3.73-2.45l4.04-0.19l7.4-13.61l-0.12-3.07l-3.42-2.63l-6.84,3.01l-9.15-0.13l-4.36-2.76l-3.11,0.69l-1.62,2.82l-0.12,7.96l-2.61,3.7L461.57,319.37L461.57,319.37z","name":"Nigeria"},"tn":{"path":"M474.91,227.33l5.53-2.23l1.82,1.18l0.07,1.44l-0.85,1.11l0.13,1.97l0.85,0.46v3.54l-0.98,1.64l0.13,1.05l3.71,1.31l-2.99,4.65l-1.17-0.07l-0.2,3.74l-1.3,0.2l-1.11-0.98l0.26-3.8l-3.64-3.54l-0.46-3.08l1.76-1.38L474.91,227.33L474.91,227.33z","name":"Tunisia"},"ly":{"path":"M480.05,248.03l1.56-0.26l0.46-3.6h0.78l3.19-5.24l7.87,2.29l2.15,3.34l7.74,3.54l4.03-1.7l-0.39-1.7l-1.76-1.7l0.2-1.18l2.86-2.42h5.66l2.15,2.88l4.55,0.66l0.59,36.89l-3.38-0.13l-20.42-10.62l-2.21,1.25l-8.39-2.1l-2.28-3.01l-3.32-0.46l-1.69-3.01L480.05,248.03L480.05,248.03z","name":"Libya"},"eg":{"path":"M521.93,243.06l2.67,0.07l5.2,1.44l2.47,0.07l3.06-2.56h1.43l2.6,1.44h3.29l0.59-0.04l2.08,5.98l0.59,1.93l0.55,2.89l-0.98,0.72l-1.69-0.85l-1.95-6.36l-1.76-0.13l-0.13,2.16l1.17,3.74l9.37,11.6l0.2,4.98l-2.73,3.15L522.32,273L521.93,243.06L521.93,243.06z","name":"Egypt"},"td":{"path":"M492.79,296l0.13-2.95l4.74-4.61l1.27-11.32l-3.16-6.04l2.21-1.13l21.4,11.15l-0.13,10.94l-3.77,3.21v5.64l2.47,4.78h-4.36l-7.22,7.14l-0.19,2.16l-5.33-0.07l-0.07,0.98l-3.04-0.4l-2.08-3.93l-1.56-0.77l0.2-1.2l1.96-1.5v-7.02l-2.71-0.42l-3.27-2.43L492.79,296L492.79,296L492.79,296z","name":"Chad"},"sd":{"path":"M520.15,292.43l0.18-11.83l2.46,0.07l-0.28-6.57l25.8,0.23l3.69-3.72l7.96,12.73l-4.36,5.14v7.85l-6.86,14.75l-2.36,1.04l0.75,4.11h2.94l3.99,5.79l-3.2,0.41l-0.82,1.49l-0.08,2.15l-9.6-0.17l-0.98-1.49l-6.71-0.38l-12.32-12.68l1.23-0.74l0.33-2.98l-2.95-1.74l-2.69-5.31l0.15-4.94L520.15,292.43L520.15,292.43z","name":"Sudan"},"cm":{"path":"M477.82,324.28l3.22,2.96l-0.23,4.58l17.66-0.41l1.44-1.62l-5.06-5.45l-0.75-1.97l3.22-6.03l-2.19-4l-1.84-0.99v-2.03l2.13-1.39l0.12-6.32l-1.69-0.19l-0.03,3.32l-7.42,13.85l-4.54,0.23l-3.11,2.14L477.82,324.28L477.82,324.28z","name":"Cameroon"},"er":{"path":"M556.71,294.7l-0.25-5.89l3.96-4.62l1.07,0.82l1.95,6.52l9.36,6.97l-1.7,2.09l-6.85-5.89H556.71L556.71,294.7z","name":"Eritrea"},"dj":{"path":"M571.48,301.54l-0.57,3.36l3.96-0.06l0.06-4.94l-1.45-0.89L571.48,301.54L571.48,301.54z","name":"Djibouti"},"et":{"path":"M549.49,311.76l7.28-16.2l7.23,0.04l6.41,5.57l-0.45,4.59h4.97l0.51,2.76l8.04,4.81l4.96,0.25l-9.43,10.13l-12.95,3.99h-3.21l-5.72-4.88l-2.26-0.95l-4.38-6.45l-2.89,0.04l-0.34-2.96L549.49,311.76L549.49,311.76z","name":"Ethiopia"},"so":{"path":"M575.74,305.04l4.08,2.78l1.21-0.06l10.13-3.48l1.15,3.71l-0.81,3.13l-2.19,1.74l-5.47-0.35l-7.83-4.81L575.74,305.04L575.74,305.04M591.97,304.05l4.37-1.68l1.55,0.93l-0.17,3.88l-4.03,11.48l-21.81,23.36l-2.53-1.74l-0.17-9.86l3.28-3.77l6.96-2.15l10.21-10.78l2.67-2.38l0.75-3.48L591.97,304.05L591.97,304.05z","name":"Somalia"},"ye":{"path":"M599.62,299.65l2.13,2.38l2.88-1.74l1.04-0.35l-1.32-1.28l-2.53,0.75L599.62,299.65L599.62,299.65M571.99,289.23l1.44,4.28v4.18l3.46,3.14l24.38-9.93l0.23-2.73l-3.91-7.02l-9.81,3.13l-5.63,5.54l-6.53-3.86L571.99,289.23L571.99,289.23z","name":"Yemen"},"cf":{"path":"M495.66,324.05l4.66,5.04l1.84-2.38l2.93,0.12l0.63-2.32l2.88-1.8l5.98,4.12l3.45-3.42l13.39,0.59L519,311.18l1.67-1.04l0.23-2.26l-2.82-1.33h-4.14l-6.67,6.61l-0.23,2.72l-5.29-0.17l-0.17,1.16l-3.45-0.35l-3.11,5.91L495.66,324.05L495.66,324.05z","name":"Central African Republic"},"st":{"path":"M470.74,337.15l1.15-0.58l0.86,0.7l-0.86,1.33l-1.04-0.41L470.74,337.15L470.74,337.15M473.05,333.5l1.73-0.29l0.58,1.1l-0.86,0.93l-0.86-0.12L473.05,333.5L473.05,333.5z","name":"Sao Tome and Principe"},"gq":{"path":"M476.84,327.41l-0.46,1.97l1.38,0.75l1.32-0.99l-0.46-2.03L476.84,327.41L476.84,327.41M480.99,332.69l-0.06,1.39l4.54,0.23l-0.06-1.57L480.99,332.69L480.99,332.69z","name":"Equatorial Guinea"},"ga":{"path":"M486.39,332.63l-0.12,2.49l-5.64-0.12l-3.45,6.67l8.11,8.87l2.01-1.68l-0.06-1.74l-1.38-0.64v-1.22l3.11-1.97l2.76,2.09l3.05,0.06l-0.06-10.49l-4.83-0.23l-0.06-2.2L486.39,332.63L486.39,332.63z","name":"Gabon"},"cg":{"path":"M491,332.52l-0.06,1.45l4.78,0.12l0.17,12.41l-4.37-0.12l-2.53-1.97l-1.96,1.1l-0.09,0.55l1.01,0.49l0.29,2.55l-2.7,2.32l0.58,1.22l2.99-2.32h1.44l0.46,1.39l1.9,0.81l6.1-5.16l-0.12-3.77l1.27-3.07l3.91-2.9l1.05-9.81l-2.78,0.01l-3.22,4.41L491,332.52L491,332.52z","name":"Congo"},"ao":{"path":"M486.55,353.23l1.74,2.26l2.25-2.13l-0.66-2.21l-0.56-0.04L486.55,353.23L486.55,353.23M488.62,356.71l3.41,12.73l-0.08,4.02l-4.99,5.36l-0.75,8.71l19.2,0.17l6.24,2.26l5.15-0.67l-3-3.76l0.01-10.74l5.9-0.25v-4.19l-4.79-0.2l-0.96-9.92l-2.02,0.03l-1.09-0.98l-1.19,0.06l-1.58,3.06H502l-1.41-1.42l0.42-2.01l-1.66-2.43L488.62,356.71L488.62,356.71z","name":"Angola"},"cd":{"path":"M489.38,355.71l10.31-0.18l2.09,2.97l-0.08,2.19l0.77,0.7h5.12l1.47-2.89h2.09l0.85,0.86l2.87-0.08l0.85,10.08l4.96,0.16v0.78l13.33,6.01l0.62,1.17h2.79l-0.31-4.22l-5.04-2.42l0.31-3.2l2.17-5.08l4.96-0.16l-4.26-14.14l0.08-6.01l6.74-10.54l0.08-1.48l-1.01-0.55l0.04-2.86l-1.23-0.11l-1.24-1.58l-20.35-0.92l-3.73,3.63l-6.11-4.02l-2.15,1.32l-1.56,13.13l-3.86,2.98l-1.16,2.64l0.21,3.91l-6.96,5.69l-1.85-0.84l0.25,1.09L489.38,355.71L489.38,355.71z","name":"Congo"},"rw":{"path":"M537.82,339.9l2.81,2.59l-0.12,2.77l-4.36,0.09v-3.06L537.82,339.9L537.82,339.9z","name":"Rwanda"},"bi":{"path":"M536.21,346.21l4.27-0.09l-1.11,3.74l-1.08,0.94h-1.32l-0.94-2.53L536.21,346.21L536.21,346.21z","name":"Burundi"},"ug":{"path":"M538.3,339.09l3.03,2.84l1.9-1.21l5.14-0.84l0.88,0.09l0.33-1.95l2.9-6.1l-2.44-5.08l-7.91,0.05l-0.05,2.09l1.06,1.02l-0.16,2.09L538.3,339.09L538.3,339.09z","name":"Uganda"},"ke":{"path":"M550.83,326.52l2.66,5.19l-3.19,6.69l-0.42,2.03l15.93,9.85l4.94-7.76l-2.5-2.03l-0.05-10.22l3.13-3.42l-4.99,1.66l-3.77,0.05l-5.9-4.98l-1.86-0.8l-3.45,0.32l-0.61,1.02L550.83,326.52L550.83,326.52z","name":"Kenya"},"tz":{"path":"M550.57,371.42l17.47-2.14l-3.93-7.6l-0.21-7.28l1.27-3.48l-16.62-10.44l-5.21,0.86l-1.81,1.34l-0.16,3.05l-1.17,4.23l-1.22,1.45l-1.75,0.16l3.35,11.61l5.47,2.57l3.77,0.11L550.57,371.42L550.57,371.42z","name":"Tanzania"},"zm":{"path":"M514.55,384.7l3.17,4.4l4.91,0.3l1.74,0.96l5.14,0.06l4.43-6.21l12.38-5.54l1.08-4.88l-1.44-6.99l-6.46-3.68l-4.31,0.3l-2.15,4.76l0.06,2.17l5.08,2.47l0.3,5.37l-4.37,0.24l-1.08-1.81l-12.14-5.18l-0.36,3.98l-5.74,0.18L514.55,384.7L514.55,384.7z","name":"Zambia"},"mw":{"path":"M547.16,379.4l3.11,3.25l-0.06,4.16l0.6,1.75l4.13-4.46l-0.48-5.67l-2.21-1.69l-1.97-9.95l-3.41-0.12l1.55,7.17L547.16,379.4L547.16,379.4z","name":"Malawi"},"mz":{"path":"M541.17,413.28l2.69,2.23l6.34-3.86l1.02-5.73v-9.46l10.17-8.32l1.74,0.06l6.16-5.91l-0.96-12.18L552,372.17l0.48,3.68l2.81,2.17l0.66,6.63l-5.5,5.37l-1.32-3.01l0.24-3.98l-3.17-3.44l-7.78,3.62l7.24,3.68l0.24,10.73l-4.79,7.11L541.17,413.28L541.17,413.28z","name":"Mozambique"},"zw":{"path":"M524.66,392.3l8.97,10.13l6.88,1.75l4.61-7.23l-0.36-9.58l-7.48-3.86l-2.81,1.27l-4.19,6.39l-5.8-0.06L524.66,392.3L524.66,392.3z","name":"Zimbabwe"},"na":{"path":"M496.55,421.96l3.35,0.24l1.97,1.99l4.67,0.06l1.14-13.26v-8.68l2.99-0.6l1.14-9.1l7.6-0.24l2.69-2.23l-4.55-0.18l-6.16,0.84l-6.64-2.41h-18.66l0.48,5.3l6.22,9.16l-1.08,4.7l0.06,2.47L496.55,421.96L496.55,421.96z","name":"Namibia"},"bw":{"path":"M508.51,411.23l2.15,0.66l-0.3,6.15l2.21,0.3l5.08-4.58l6.1,0.66l1.62-4.1l7.72-7.05l-9.27-10.67l-0.12-1.75l-1.02-0.3l-2.81,2.59l-7.3,0.18l-1.02,9.1l-2.87,0.66L508.51,411.23L508.51,411.23z","name":"Botswana"},"sz":{"path":"M540.87,414l-2.51,0.42l-1.08,2.95l1.92,1.75h2.33l1.97-2.83L540.87,414L540.87,414z","name":"Swaziland"},"ls":{"path":"M527.41,425.39l3.05-2.35l1.44,0.06l1.74,2.17l-0.18,2.17l-2.93,1.08v0.84l-3.23-0.18l-0.78-2.35L527.41,425.39L527.41,425.39z","name":"Lesotho"},"za":{"path":"M534.16,403.63l-7.9,7.3l-1.88,4.51l-6.26-0.78l-5.21,4.63l-3.46-0.34l0.28-6.4l-1.23-0.43l-0.86,13.09l-6.14-0.06l-1.85-2.18l-2.71-0.03l2.47,7.09l4.41,4.17l-3.15,3.67l2.04,4.6l4.72,1.8l3.76-3.2l10.77,0.06l0.77-0.96l4.78-0.84l16.17-16.1l-0.06-5.07l-1.73,2.24h-2.59l-3.15-2.64l1.6-3.98l2.75-0.56l-0.25-8.18L534.16,403.63L534.16,403.63z M530.37,422.13l1.51-0.06l2.45,2.66l-0.07,3.08l-2.87,1.45l-0.18,1.02l-4.38,0.05l-1.37-3.3l1.25-2.42L530.37,422.13L530.37,422.13z","name":"South Africa"},"gl":{"path":"M321.13,50.07l-1.36,2.17l2.45,2.45l-1.09,2.45l3.54,4.62l4.35-1.36l5.71-0.54l6.53,7.07l4.35,11.69l-3.53,7.34l4.89-0.82l2.72,1.63l0.27,3.54l-5.98,0.27l3.26,3.26l4.08,0.82l-8.97,11.96l-1.09,7.34l1.9,5.98l-1.36,3.54l2.45,7.61l4.62,5.17l1.36-0.27l2.99-0.82l0.27,4.35l1.9,2.72l3.53-0.27l2.72-10.06l8.16-10.06l12.24-4.89l7.61-9.52l3.53,1.63h7.34l5.98-5.98l7.34-2.99l0.82-4.62l-4.62-4.08l-4.08-1.36l-2.18-5.71l5.17-2.99l8.16,4.35l2.72-2.99l-4.35-2.45l9.25-12.51l-1.63-5.44l-4.35-0.27l1.63-4.89l5.44-2.45l11.15-9.79l-3.26-3.53l-12.51,1.09l-6.53,6.53l3.81-8.43l-4.35-1.09l-2.45,4.35l-3.53-2.99l-9.79,1.09l2.72-4.35l16.04-0.54l-4.08-5.44l-17.4-3.26l-7.07,1.09l0.27,3.54l-7.34-2.45l0.27-2.45l-5.17,1.09l-1.09,2.72l5.44,1.9l-5.71,4.08l-4.08-4.62l-5.71-1.63l-0.82,4.35h-5.71l-2.18-4.62l-8.97-1.36l-4.89,2.45l-0.27,3.26l-6.25-0.82l-3.81,1.63l0.27,3.81v1.9l-7.07,1.36l-3.26-2.17l-2.18,3.53l3.26,3.54l6.8-0.82l0.54,2.18l-5.17,2.45L321.13,50.07L321.13,50.07M342.89,92.49l1.63,2.45l-0.82,2.99h-1.63l-2.18-2.45l0.54-1.9L342.89,92.49L342.89,92.49M410.87,85.69l4.62,1.36l-0.27,3.81l-4.89-2.45l-1.09-1.36L410.87,85.69L410.87,85.69z","name":"Greenland"},"au":{"path":"M761.17,427.98l-0.35,25.38l-3.9,2.86l-0.35,2.5l5.32,3.57l13.13-2.5h6.74l2.48-3.58l14.9-2.86l10.64,3.22l-0.71,4.29l1.42,4.29l8.16-1.43l0.35,2.14l-5.32,3.93l1.77,1.43l3.9-1.43l-1.06,11.8l7.45,5.72l4.26-1.43l2.13,2.14l12.42-1.79l11.71-18.95l4.26-1.07l8.51-15.73l2.13-13.58l-5.32-6.79l2.13-1.43l-4.26-13.23l-4.61-3.22l0.71-17.87l-4.26-3.22l-1.06-10.01h-2.13l-7.1,23.59l-3.9,0.36l-8.87-8.94l4.97-13.23l-9.22-1.79l-10.29,2.86l-2.84,8.22l-4.61,1.07l-0.35-5.72l-18.8,11.44l0.35,4.29l-2.84,3.93h-7.1l-15.26,6.43L761.17,427.98L761.17,427.98M825.74,496.26l-1.77,7.15l0.35,5l5.32-0.36l6.03-9.29L825.74,496.26L825.74,496.26z","name":"Australia"},"nz":{"path":"M913.02,481.96l1.06,11.8l-1.42,5.36l-5.32,3.93l0.35,4.65v5l1.42,1.79l14.55-12.51v-2.86h-3.55l-4.97-16.8L913.02,481.96L913.02,481.96M902.38,507.7l2.84,5.36l-7.81,7.51l-0.71,3.93l-5.32,0.71l-8.87,8.22l-8.16-3.93l-0.71-2.86l14.9-6.43L902.38,507.7L902.38,507.7z","name":"New Zealand"},"nc":{"path":"M906.64,420.47l-0.35,1.79l4.61,6.43l2.48,1.07l0.35-2.5L906.64,420.47L906.64,420.47z","name":"New Caledonia"},"my":{"path":"M764.14,332.92l3.02,3.49l11.58-4.01l2.29-8.84l5.16-0.37l4.72-3.42l-6.12-4.46l-1.4-2.45l-3.02,5.57l1.11,3.2l-1.84,2.67l-3.47-0.89l-8.41,6.17l0.22,3.57L764.14,332.92L764.14,332.92M732.71,315.45l2.01,4.51l0.45,5.86l2.69,4.17l6.49,3.94l2.46,0.23l-0.45-4.06l-2.13-5.18l-3.12-6.63l-0.26,1.16l-3.76-0.17l-2.7-3.88L732.71,315.45L732.71,315.45z","name":"Malaysia"},"bn":{"path":"M779.77,319.25l-2.88,3.49l2.36,0.74l1.33-1.86L779.77,319.25L779.77,319.25z","name":"Brunei Darussalam"},"tl":{"path":"M806.14,368.42l-5.11,4.26l0.49,1.09l2.16-0.4l2.55-2.38l5.01-0.69l-0.98-1.68L806.14,368.42L806.14,368.42z","name":"Timor-Leste"},"sb":{"path":"M895.43,364.65l0.15,2.28l1.39,1.32l1.31-0.81l-1.17-2.43L895.43,364.65L895.43,364.65M897.18,370.31l-1.17,1.25l1.24,2.28l1.46,0.44l-0.07-1.54L897.18,370.31L897.18,370.31M900.03,368.99l1.02,2.5l1.97,2.35l1.09-1.76l-1.46-2.5L900.03,368.99L900.03,368.99M905.14,372.74l0.58,3.09l1.39,1.91l1.17-2.42L905.14,372.74L905.14,372.74M906.74,379.65l-0.51,0.88l1.68,2.21l1.17,0.07l-0.73-2.87L906.74,379.65L906.74,379.65M903.02,384.05l-1.75,0.81l1.53,2.13l1.31-0.74L903.02,384.05L903.02,384.05z","name":"Solomon Islands"},"vu":{"path":"M920.87,397.22l-1.24,1.66l0.52,1.87l0.62,0.42l1.13-1.46L920.87,397.22L920.87,397.22M921.49,402.31l0.1,1.35l1.34,0.42l0.93-0.52l-0.93-1.46L921.49,402.31L921.49,402.31M923.45,414.37l-0.62,0.94l0.93,1.04l1.55-0.52L923.45,414.37L923.45,414.37z","name":"Vanuatu"},"fj":{"path":"M948.62,412.29l-1.24,1.66l-0.1,1.87l1.44,1.46L948.62,412.29L948.62,412.29z","name":"Fiji"},"ph":{"path":"M789.37,297.53l-0.86,1.64l-0.48,2.02l-4.78,6.07l0.29,1.25l2.01-0.29l6.21-6.94L789.37,297.53L789.37,297.53M797.11,295.22l-0.1,5.01l1.82,1.83l0.67,3.56l1.82,0.39l0.86-2.22l-1.43-1.06l-0.38-6.26L797.11,295.22L797.11,295.22M802.28,297.15l-0.1,4.43l1.05,1.73l1.82-2.12l-0.48-3.85L802.28,297.15L802.28,297.15M803.42,293.29l1.82,2.41l0.86,2.31h1.63l-0.29-3.95l-1.82-1.25L803.42,293.29L803.42,293.29M806.96,302.35l0.38,2.89l-3.35,2.7l-2.77,0.29l-2.96,3.18l0.1,1.45l2.77-0.87l1.91-1.25l1.63,4.14l2.87,2.02l1.15-0.39l1.05-1.25l-2.29-2.31l1.34-1.06l1.53,1.25l1.05-1.73l-1.05-2.12l-0.19-4.72L806.96,302.35L806.96,302.35M791.38,272.97l-2.58,1.83l-0.29,5.78l4.02,7.8l1.34,1.06l1.72-1.16l2.96,0.48l0.57,2.6l2.2,0.19l1.05-1.44l-1.34-1.83l-1.63-1.54l-3.44-0.38l-1.82-2.99l2.1-3.18l0.19-2.79l-1.43-3.56L791.38,272.97L791.38,272.97M792.72,290.21l0.76,2.7l1.34,0.87l0.96-1.25l-1.53-2.12L792.72,290.21L792.72,290.21z","name":"Philippines"},"cn":{"path":"M759.83,270.17l-2.39,0.67l-1.72,2.12l1.43,2.79l2.1,0.19l2.39-2.12l0.57-2.79L759.83,270.17L759.83,270.17M670.4,170.07l-3.46,8.7l-4.77-0.25l-5.03,11.01l4.27,5.44l-8.8,12.15l-4.52-0.76l-3.02,3.8l0.75,2.28l3.52,0.25l1.76,4.05l3.52,0.76l10.81,13.93v7.09l5.28,3.29l5.78-1.01l7.29,4.3l8.8,2.53l4.27-0.51l4.78-0.51l10.05-6.58l3.27,0.51l1.25,2.97l2.77,0.83l3.77,5.57l-2.51,5.57l1.51,3.8l4.27,1.52l0.75,4.56l5.03,0.51l0.75-2.28l7.29-3.8l4.52,0.25l5.28,5.82l3.52-1.52l2.26,0.25l1.01,2.79l1.76,0.25l2.51-3.54l10.05-3.8l9.05-10.89l3.02-10.38l-0.25-6.84l-3.77-0.76l2.26-2.53l-0.5-4.05l-9.55-9.62v-4.81l2.76-3.54l2.76-1.27l0.25-2.79h-7.04l-1.26,3.8l-3.27-0.76l-4.02-4.3l2.51-6.58l3.52-3.8l3.27,0.25l-0.5,5.82l1.76,1.52l4.27-4.3l1.51-0.25l-0.5-3.29l4.02-4.81l3.02,0.25l1.76-5.57l2.06-1.09l0.21-3.47l-2-2.1l-0.17-5.48l3.85-0.25l-0.25-14.13l-2.7,1.62l-1.01,3.62l-4.51-0.01l-13.07-7.35l-9.44-11.38l-9.58-0.1l-2.44,2.12l3.1,7.1l-1.08,6.66l-3.86,1.6l-2.17-0.17l-0.16,6.59l2.26,0.51l4.02-1.77l5.28,2.53v2.53l-3.77,0.25l-3.02,6.58l-2.76,0.25l-9.8,12.91l-10.3,4.56l-7.04,0.51l-4.77-3.29l-6.79,3.55l-7.29-2.28l-1.76-4.81l-12.31-0.76l-6.53-10.63h-2.76l-2.22-4.93L670.4,170.07z","name":"China"},"tw":{"path":"M787.46,248.31l-3.54,2.7l-0.19,5.2l3.06,3.56l0.76-0.67L787.46,248.31L787.46,248.31z","name":"Taiwan"},"jp":{"path":"M803.23,216.42l-1.63,1.64l0.67,2.31l1.43,0.1l0.96,5.01l1.15,1.25l2.01-1.83l0.86-3.28l-2.49-3.56L803.23,216.42L803.23,216.42M812.03,213.15l-2.77,2.6l-0.1,2.99l0.67,0.87l3.73-3.18l-0.29-3.18L812.03,213.15L812.03,213.15M808.2,206.98l-4.88,5.59l0.86,1.35l2.39,0.29l4.49-3.47l3.16-0.58l2.87,3.37l2.2-0.77l0.86-3.28l4.11-0.1l4.02-4.82l-2.1-8l-0.96-4.24l2.1-1.73l-4.78-7.22l-1.24,0.1l-2.58,2.89v2.41l1.15,1.35l0.38,6.36l-2.96,3.66l-1.72-1.06l-1.34,2.99l-0.29,2.79l1.05,1.64l-0.67,1.25l-2.2-1.83h-1.53l-1.34,0.77L808.2,206.98L808.2,206.98M816.43,163.44l-1.53,1.35l0.77,2.89l1.34,1.35l-0.1,4.43l-1.72,0.67l-1.34,2.99l3.92,5.39l2.58-0.87l0.48-1.35l-2.77-2.5l1.72-2.22l1.82,0.29l1.43,1.54l0.1-3.18l3.92-3.18l2.2-0.58l-1.82-3.08l-0.86-1.35l-1.43,0.96l-1.24,1.54l-2.68-0.58l-2.77-1.83L816.43,163.44L816.43,163.44z","name":"Japan"},"ru":{"path":"M506.61,151.72l-1.5-0.15l-2.7,3.23v1.51l0.9,0.35l1.75,0.05l2.9-2.37l0.4-0.81L506.61,151.72L506.61,151.72M830.86,160.45l-2.68,3.76l0.19,1.83l1.34-0.58l3.15-3.95L830.86,160.45L830.86,160.45M834.4,154.96l-0.96,2.6l0.1,1.73l1.63-1.06l1.53-3.08V154L834.4,154.96L834.4,154.96M840.04,132.03l-1.24,1.54l0.1,2.41l1.15-0.1l1.91-3.37L840.04,132.03L840.04,132.03M837.75,137.91v4.24l1.34,0.48l0.96-1.54v-3.27L837.75,137.91L837.75,137.91M798.64,122.59l-0.09,6.17l7.74,11.95l2.77,10.4l4.88,9.25l1.91,0.67l1.63-1.35l0.76-2.22l-6.98-7.61l0.19-3.95l1.53-0.67l0.38-2.31l-13.67-19.36L798.64,122.59L798.64,122.59M852.57,103.42l-1.91,0.19l1.15,1.64l2.39,1.64l0.67-0.77L852.57,103.42L852.57,103.42M856.29,104.58l0.29,1.64l2.96,0.87l0.29-1.16L856.29,104.58L856.29,104.58M547.82,38.79l1.72,0.69l-1.21,2.08v2.95l-2.58,1.56H543l-1.55-1.91l0.17-2.08l1.21-1.56h2.41L547.82,38.79L547.82,38.79M554.36,36.88v2.08l1.72,1.39l2.41-0.17l2.07-1.91v-1.39h-1.89l-1.55,0.52l-1.21-1.39L554.36,36.88L554.36,36.88M564.18,37.06l1.21,2.6l2.41,0.17l1.72-0.69l-0.86-2.43l-2.24-0.52L564.18,37.06L564.18,37.06M573.99,33.59l-1.89-0.35l-1.72,1.74l0.86,1.56l0.52,2.43l2.24-1.73l0.52-1.91L573.99,33.59L573.99,33.59M584.49,51.98l-0.52,2.43l-3.96,3.47l-8.44,1.91l-6.89,11.45l-1.21,3.3l6.89,1.74l1.03-4.16l2.07-6.42l5.34-2.78l4.48-3.47l3.27-1.39h1.72v-4.68L584.49,51.98L584.49,51.98M562.28,77.31l4.65,0.52l1.55,5.38l3.96,4.16l-1.38,2.78h-2.41l-2.24-2.6l-4.99-0.17l-2.07-2.78v-1.91l3.1-0.87L562.28,77.31L562.28,77.31M634.95,18.15l-2.24-1.39h-2.58l-0.52,1.56l-2.75,1.56l-2.07,0.69l-0.34,2.08l4.82,0.35L634.95,18.15L634.95,18.15M640.28,18.67l-1.21,2.6l-2.41-0.17l-3.79,2.78l-1.03,3.47h2.41l1.38-2.26l3.27,2.43l3.1-1.39l2.24-1.91l-0.86-2.95l-1.21-2.08L640.28,18.67L640.28,18.67M645.28,20.58l1.21,4.86l1.89,4.51l2.07-3.64l3.96-0.87v-2.6l-2.58-1.91L645.28,20.58L645.28,20.58M739.76,12.8l2.69,2.26l1.91-0.79l0.56-3.17L741,8.39l-2.58,1.7l-6.28,0.57v2.83l-6.62,0.11v4.63l7.74,5.76l2.02-1.47l-0.45-4.07l4.94-1.24l-1.01-1.92l-1.79-1.81L739.76,12.8L739.76,12.8M746.94,10.09l1.79,3.39l6.96-0.79l1.91-2.49l-0.45-2.15l-1.91-0.79l-1.79,1.36l-5.16,1.13L746.94,10.09L746.94,10.09M746.49,23.31l-3.48-0.9L741,24.56l-0.9,2.94l4.71-0.45l3.59-1.81L746.49,23.31L746.49,23.31M836.68,3.76l-2.92-0.9L830.4,4.1l-1.68,2.49l2.13,2.83l5.61-2.49l1.12-1.24L836.68,3.76L836.68,3.76M817.97,72.93l1.76,6.08l3.52,1.01l3.52-5.57l-2.01-3.8l0.75-3.29h5.28l-1.26,2.53l0.5,9.12l-7.54,18.74l0.75,4.05l-0.25,6.84l14.07,20.51l2.76,0.76l0.25-16.71l2.76-2.53l-3.02-6.58l2.51-2.79l-5.53-7.34l-3.02,0.25l-1-12.15l7.79-2.03l0.5-3.55l4.02-1.01l2.26,2.03l2.76-11.14l4.77-8.1l3.77-2.03l3.27,0.25v-3.8l-5.28-1.01l-7.29-6.08l3.52-4.05l-3.02-6.84l2.51-2.53l3.02,4.05l7.54,2.79l8.29,0.76l1.01-3.54l-4.27-4.3l4.77-6.58l-10.81-3.8l-2.76,5.57l-3.52-4.56l-19.85-6.84l-18.85,3.29l-2.76,1.52v1.52l4.02,2.03l-0.5,4.81l-7.29-3.04l-16.08,6.33l-2.76-5.82h-11.06l-5.03,5.32l-17.84-4.05l-16.33,3.29l-2.01,5.06l2.51,0.76l-0.25,3.8l-15.83,1.77l1.01,5.06l-14.58-2.53l3.52-6.58l-14.83-0.76l1.26,6.84l-4.77,2.28l-4.02-3.8l-16.33,2.79l-6.28,5.82l-0.25,3.54l-4.02,0.25l-0.5-4.05l12.82-11.14v-7.6l-8.29-2.28l-10.81,3.54l-4.52-4.56h-2.01l-2.51,5.06l2.01,2.28l-14.33,7.85l-12.31,9.37l-7.54,10.38v4.3l8.04,3.29l-4.02,3.04l-8.54-3.04l-3.52,3.04l-5.28-6.08l-1.01,2.28l5.78,18.23l1.51,0.51l4.02-2.03l2.01,1.52v3.29l-3.77-1.52l-2.26,1.77l1.51,3.29l-1.26,8.61l-7.79,0.76l-0.5-2.79l4.52-2.79l1.01-7.6l-5.03-6.58l-1.76-11.39l-8.04-1.27l-0.75,4.05l1.51,2.03l-3.27,2.79l1.26,7.6l4.77,2.03l1.01,5.57l-4.78-3.04l-12.31-2.28l-1.51,4.05l-9.8,3.54l-1.51-2.53l-12.82,7.09l-0.25,4.81l-5.03,0.76l1.51-3.54v-3.54l-5.03-1.77l-3.27,1.27l2.76,5.32l2.01,3.54v2.79l-3.77-0.76l-0.75-0.76l-3.77,4.05l2.01,3.54l-8.54-0.25l2.76,3.55l-0.75,1.52h-4.52l-3.27-2.28l-0.75-6.33l-5.28-2.03v-2.53l11.06,2.28l6.03,0.51l2.51-3.8l-2.26-4.05l-16.08-6.33l-5.55,1.38l-1.9,1.63l0.59,3.75l2.36,0.41l-0.55,5.9l7.28,17.1l-5.26,8.34l-0.36,1.88l2.67,1.88l-2.41,1.59l-1.6,0.03l0.3,7.35l2.21,3.13l0.03,3.04l2.83,0.26l4.33,1.65l4.58,6.3l0.05,1.66l-1.49,2.55l3.42-0.19l3.33,0.96l4.5,6.37l11.08,1.01l-0.48,7.58l-3.82,3.27l0.79,1.28l-3.77,4.05l-1,3.8l2.26,3.29l7.29,2.53l3.02-1.77l19.35,7.34l0.75-2.03l-4.02-3.8v-4.81l-2.51-0.76l0.5-4.05l4.02-4.81l-7.21-5.4l0.5-7.51l7.71-5.07l9.05,0.51l1.51,2.79l9.3,0.51l6.79-3.8l-3.52-3.8l0.75-7.09l17.59-8.61l13.53,6.1l4.52-4.05l13.32,12.66l10.05-1.01l3.52,3.54l9.55,1.01l6.28-8.61l8.04,3.55l4.27,0.76l4.27-3.8l-3.77-2.53l3.27-5.06l9.3,3.04l2.01,4.05l4.02,0.25l2.51-1.77l6.79-0.25l0.75,1.77l7.79,0.51l5.28-5.57l10.81,1.27l3.27-1.27l1-6.08l-3.27-7.34l3.27-2.79h10.3l9.8,11.65l12.56,7.09h3.77l0.5-3.04l4.52-2.79l0.5,16.46l-4.02,0.25v4.05l2.26,2.79l-0.42,3.62l1.67,0.69l1.01-2.53l1.51,0.51l1,1.01l4.52-1.01l4.52-13.17l0.5-16.46l-5.78-13.17l-7.29-8.86l-3.52,0.51v2.79l-8.54-3.29l3.27-7.09l2.76-18.74l11.56-3.54l5.53-3.54h6.03L805.86,96l1.51,2.53l5.28-5.57l3.02,0.25l-0.5-3.29l-4.78-1.01l3.27-11.9L817.97,72.93L817.97,72.93z","name":"Russian Federation"},"us":{"path":"M69.17,53.35l3.46,6.47l2.22-0.5v-2.24L69.17,53.35L69.17,53.35M49.66,110.26l-0.17,3.01l2.16-0.5v-1.34L49.66,110.26L49.66,110.26M46.34,111.6l-4.32,2.18l0.67,2.34l1.66-1.34l3.32-1.51L46.34,111.6L46.34,111.6M28.39,114.44l-2.99-0.67l-0.5,1.34l0.33,2.51L28.39,114.44L28.39,114.44M22.07,114.28l-2.83-1.17l-1,1.84l1.83,1.84L22.07,114.28L22.07,114.28M12.27,111.6l-1.33-1.84l-1.33,0.5v2.51l1.5,1L12.27,111.6L12.27,111.6M1.47,99.71l1.66,1.17l-0.5,1.34H1.47V99.71L1.47,99.71M10,248.7l-0.14,2.33l2.04,1.37l1.22-1.09L10,248.7L10,248.7M15.29,252.13l-1.9,1.37l1.63,2.05l1.9-1.64L15.29,252.13L15.29,252.13M19.1,255.41l-1.63,2.19l0.54,1.37l2.31-1.09L19.1,255.41L19.1,255.41M21.81,259.65l-0.95,5.47l0.95,2.05l3.12-0.96l1.63-2.74l-3.4-3.15L21.81,259.65L21.81,259.65M271.05,281.06l-2.64-0.89l-2.12,1.33l1.06,1.24l3.61,0.53L271.05,281.06L271.05,281.06M93.11,44.89l-8.39,1.99l1.73,9.45l9.13,2.49l0.49,1.99L82.5,65.04l-7.65,12.68l2.71,13.43L82,94.13l3.46-3.23l0.99,1.99l-4.2,4.97l-16.29,7.46l-10.37,2.49l-0.25,3.73l23.94-6.96l9.87-2.74l9.13-11.19l10.12-6.71l-5.18,8.7l5.68,0.75l9.63-4.23l1.73,6.96l6.66,1.49l6.91,6.71l0.49,4.97l-0.99,1.24l1.23,4.72h1.73l0.25-7.96h1.97l0.49,19.64l4.94-4.23l-3.46-20.39h-5.18l-5.68-7.21l27.89-47.25l-27.64-21.63l-30.85,5.97l-1.23,9.45l6.66,3.98l-2.47,6.47L93.11,44.89L93.11,44.89M148.76,158.34l-1,4.02l-3.49-2.26h-1.74l-1,4.27l-12.21,27.36l3.24,23.84l3.99,2.01l0.75,6.53h8.22l7.97,6.02l15.69,1.51l1.74,8.03l2.49,1.76l3.49-3.51l2.74,1.25l2.49,11.54l4.23,2.76l3.49-6.53l10.71-7.78l6.97,3.26l5.98,0.5l0.25-3.76l12.45,0.25l2.49,2.76l0.5,6.27l-1.49,3.51l1.74,6.02h3.74l3.74-5.77l-1.49-2.76l-1.49-6.02l2.24-6.78l10.21-8.78l7.72-2.26l-1-7.28l10.71-11.55l10.71-1.76L272.8,199l10.46-6.02v-8.03l-1-0.5l-3.74,1.25l-0.5,4.92l-12.43,0.15l-9.74,6.47l-15.29,5l-2.44-2.99l6.94-10.5l-3.43-3.27l-2.33-4.44l-4.83-3.88l-5.25-0.44l-9.92-6.77L148.76,158.34L148.76,158.34z","name":"United States of America"},"mu":{"path":"M613.01,398.99l-1.52,1.99l0.3,2.15l3.2-2.61L613.01,398.99L613.01,398.99z","name":"Mauritius"},"re":{"path":"M607.38,402.37l-2.28,0.15l-0.15,1.99l1.52,0.31l2.28-1.07L607.38,402.37L607.38,402.37z","name":"Reunion"},"mg":{"path":"M592.3,372.92l-2.13,5.06l-3.65,6.44l-6.39,0.46l-2.74,3.22l0.46,9.82l-3.96,4.6l0.46,7.82l3.35,3.83l3.96-0.46l3.96-2.92l-0.91-4.6l9.13-15.8l-1.83-1.99l1.83-3.83l1.98,0.61l0.61-1.53l-1.83-7.82l-1.07-3.22L592.3,372.92L592.3,372.92z","name":"Madagascar"},"km":{"path":"M577.69,371.23l0.46,1.53l1.98,0.31l0.76-1.99L577.69,371.23L577.69,371.23M580.58,374.3l0.76,1.69h1.22l0.61-2.15L580.58,374.3L580.58,374.3z","name":"Comoros"},"sc":{"path":"M602.35,358.34l-0.61,1.23l1.67,1.38l1.22-1.38L602.35,358.34L602.35,358.34M610.88,349.14l-1.83,1.23l1.37,2.15h1.83L610.88,349.14L610.88,349.14M611.64,354.51l-1.22,1.38l0.91,1.38l1.67,0.31l0.15-2.92L611.64,354.51L611.64,354.51z","name":"Seychelles"},"mv":{"path":"M656.4,320.76l0.3,2.61l1.67,0.61l0.3-2.3L656.4,320.76L656.4,320.76M658.53,326.28l-0.15,3.22l1.22,0.61l1.07-2.15L658.53,326.28L658.53,326.28M658.84,332.57l-1.07,1.07l1.22,1.07l1.52-1.07L658.84,332.57L658.84,332.57z","name":"Maldives"},"pt":{"path":"M372.64,217.02l-1.36,1.37l2.44,1.37l0.27-1.91L372.64,217.02L372.64,217.02M379.97,216.2l-1.63,1.09l1.36,1.09l2.17-0.55L379.97,216.2L379.97,216.2M381.05,220.03l-0.81,2.19l1.08,1.37l1.36-1.09L381.05,220.03L381.05,220.03M387.56,224.4l-0.54,1.37l0.81,0.82l2.17-1.37L387.56,224.4L387.56,224.4M408.18,236.42l-1.08,1.37l1.08,1.37l1.63-0.82L408.18,236.42L408.18,236.42M430.93,211.24l-0.62,8.65l-1.77,1.6l0.18,0.98l1.24,2.05l-0.8,2.5l1.33,0.45l3.1-0.36l-0.18-2.5l2.03-11.59l-0.44-1.6L430.93,211.24L430.93,211.24z","name":"Portugal"},"es":{"path":"M415.62,253.73l-1.75,1.01l0.81,0.82L415.62,253.73L415.62,253.73M409.54,253.92l-2.17,0.55l1.08,1.64h1.63L409.54,253.92L409.54,253.92M404.38,252.28l-1.36,1.37l1.9,1.64l1.08-2.46L404.38,252.28L404.38,252.28M448.36,205h-12.74l-2.57-1.16l-1.24,0.09l-1.5,3.12l0.53,3.21l4.87,0.45l0.62,2.05l-2.12,11.95l0.09,2.14l3.45,1.87l3.98,0.27l7.96-1.96l3.89-4.9l0.09-4.99l6.9-6.24l0.35-2.76l-6.28-0.09L448.36,205L448.36,205M461.1,217.21l-1.59,0.54l0.35,1.43h2.3l0.97-1.07L461.1,217.21L461.1,217.21z","name":"Spain"},"cv":{"path":"M387.56,290.54l-1.9,1.09l1.36,1.09l1.63-0.82L387.56,290.54L387.56,290.54M392.23,292.74l-1.24,1.1l0.88,1.63l2.12-0.95L392.23,292.74L392.23,292.74M389.52,295.83l-1.59,0.95l1.71,2.29l1.35-0.71L389.52,295.83L389.52,295.83z","name":"Cape Verde"},"pf":{"path":"M27.25,402.68l-1.9-0.14l-0.14,1.78l1.49,0.96l1.77-1.09L27.25,402.68L27.25,402.68M33.77,404.6l-2.72,1.78l2.04,2.46l1.77-0.41l0.95-1.23L33.77,404.6L33.77,404.6z","name":"French Polynesia"},"kn":{"path":"M276.6,283.37l-1.5,0.62l0.53,1.33l1.76-1.15l-0.35-0.36L276.6,283.37L276.6,283.37z","name":"Saint Kitts and Nevis"},"ag":{"path":"M279.07,284.88l-0.88,1.87l1.06,1.42l1.32-1.15L279.07,284.88L279.07,284.88z","name":"Antigua and Barbuda"},"dm":{"path":"M282.07,290.03l-1.06,0.98l0.79,1.6l1.5-0.44L282.07,290.03L282.07,290.03z","name":"Dominica"},"lc":{"path":"M281.98,294.03l-0.71,1.51l1.15,1.24l1.5-0.8L281.98,294.03L281.98,294.03z","name":"Saint Lucia"},"bb":{"path":"M282.07,297.85l-1.23,0.89l0.97,1.78l1.59-0.89L282.07,297.85L282.07,297.85z","name":"Barbados"},"gd":{"path":"M280.57,301.31l-1.15,1.15l0.44,0.71h1.41l0.44-1.16L280.57,301.31L280.57,301.31z","name":"Grenada"},"tt":{"path":"M282.24,304.78l-1.06,0.98l-1.15,0.18v1.42l2.12,1.95l0.88-1.42l0.53-1.6l-0.18-1.33L282.24,304.78L282.24,304.78z","name":"Trinidad and Tobago"},"do":{"path":"M263.11,280.44l-5.29-3.46l-2.5-0.85l-0.84,6l0.88,1.69l1.15-1.33l3.35-0.89l2.91,0.62L263.11,280.44L263.11,280.44z","name":"Dominican Republic"},"ht":{"path":"M250.86,275.38l3.44,0.36l-0.41,4.22l-0.34,2.22l-4.01-0.22l-0.71,1.07l-1.23-0.09l-0.44-2.31l4.23-0.35l-0.26-2.4l-1.94-0.8L250.86,275.38L250.86,275.38z","name":"Haiti"},"fk":{"path":"M307.95,508.18l-2.63-0.29l-2.62,1.76l1.9,2.06L307.95,508.18L307.95,508.18M310.57,506.86l-0.87,2.79l-2.48,2.2l0.15,0.73l4.23-1.62l1.75-2.2L310.57,506.86L310.57,506.86z","name":"Falkland Islands"},"is":{"path":"M406.36,117.31l-1.96-1.11l-2.64,1.67l-2.27,2.1l0.06,1.17l2.94,0.37l-0.18,2.1l-1.04,1.05l0.25,0.68l2.94,0.19v3.4l4.23,0.74l2.51,1.42l2.82,0.12l4.84-2.41l3.74-4.94l0.06-3.34l-2.27-1.92l-1.9-1.61l-0.86,0.62l-1.29,1.67l-1.47-0.19l-1.47-1.61l-1.9,0.18l-2.76,2.29l-1.66,1.79l-0.92-0.8l-0.06-1.98l0.92-0.62L406.36,117.31L406.36,117.31z","name":"Iceland"},"no":{"path":"M488.26,53.96l-1.65-1.66l-3.66,1.78h-6.72L475.17,58l3.77,3.33l1.65-0.24l2.36-4.04l2,1.43l-1.42,2.85l-0.71,4.16l1.65,2.61l3.54-5.94l4.6-5.59l-1.77-1.54L488.26,53.96L488.26,53.96M490.26,46.83l-2.95,2.73l1.77,2.73h3.18l1.3,1.78l3.89,2.02l4.48-2.61l3.07-2.61l-1.06-2.14l-3.07-1.78l-2.24,2.02l-1.53-1.9l-1.18,0.12l-1.53,3.33l-2.24-2.26l-0.24-1.54L490.26,46.83L490.26,46.83M496.98,59.07l-2.36,2.14l-2,1.54l0.94,1.66l1.89,0.59l3.07-1.43l1.42-1.78l-1.3-2.14L496.98,59.07L496.98,59.07M515.46,102.14l2.02-1.48L517.3,99l-1.28-0.74l0.18-2.03h1.1v-1.11l-4.77-1.29l-7.15,0.74l-0.73,3.14L503,97.16l-1.1-1.85l-3.49,0.18L498.04,99l-1.65,0.74l-0.92-1.85l-7.34,5.91l1.47,1.66l-2.75,1.29l-6.24,12.38l-2.2,1.48l0.18,1.11l2.2,1.11l-0.55,2.4l-3.67-0.19l-1.1-1.29l-2.38,2.77l-1.47,1.11l-0.37,2.59l-1.28,0.74l-3.3,0.74l-1.65,5.18l1.1,8.5l1.28,3.88l1.47,1.48l3.3-0.18l4.77-4.62l1.83-3.14l0.55,4.62l3.12-5.54l0.18-15.53l2.54-1.6l0.76-8.57l7.7-11.09l3.67-1.29l1.65-2.03l5.5,1.29l2.75,1.66l0.92-4.62l4.59-2.77L515.46,102.14L515.46,102.14z","name":"Norway"},"lk":{"path":"M680.54,308.05l0.25,2.72l0.25,1.98l-1.47,0.25l0.74,4.45l2.21,1.24l3.43-1.98l-0.98-4.69l0.25-1.73l-3.19-2.96L680.54,308.05L680.54,308.05z","name":"Sri Lanka"},"cu":{"path":"M220.85,266.92v1.27l5.32,0.1l2.51-1.46l0.39,1.07l5.22,1.27l4.64,4.19l-1.06,1.46l0.19,1.66l3.87,0.97l3.87-1.75l1.74-1.75l-2.51-1.27l-12.95-7.6l-4.54-0.49L220.85,266.92L220.85,266.92z","name":"Cuba"},"bs":{"path":"M239.61,259.13l-1.26-0.39l-0.1,2.43l1.55,1.56l1.06-1.56L239.61,259.13L239.61,259.13M242.12,262.93l-1.74,0.97l1.64,2.34l0.87-1.17L242.12,262.93L242.12,262.93M247.73,264.68l-1.84-0.1l0.19,1.17l1.35,1.95l1.16-1.27L247.73,264.68L247.73,264.68M246.86,262.35l-3-1.27l-0.58-3.02l1.16-0.49l1.16,2.34l1.16,0.88L246.86,262.35L246.86,262.35M243.96,256.21l-1.55-0.39l-0.29-1.95l-1.64-0.58l1.06-1.07l1.93,0.68l1.45,0.88L243.96,256.21L243.96,256.21z","name":"Bahamas"},"jm":{"path":"M238.93,279.59l-3.48,0.88v0.97l2.03,1.17h2.13l1.35-1.56L238.93,279.59L238.93,279.59z","name":"Jamaica"},"ec":{"path":"M230.2,335.85l-4.73,2.94l-0.34,4.36l-0.95,1.43l2.98,2.86l-1.29,1.41l0.3,3.6l5.33,1.27l8.07-9.55l-0.02-3.33l-3.87-0.25L230.2,335.85L230.2,335.85z","name":"Ecuador"},"ca":{"path":"M203.73,35.89l0.22,4.02l-7.98,8.27l2,6.7l5.76-1.56l3.33-4.92l8.42-3.13l6.87-0.45l-5.32-5.81l-2.66,2.01l-2-0.67l-1.11-2.46l-2.44-2.46L203.73,35.89L203.73,35.89M214.15,24.05l-1.77,3.13l8.65,3.13l3.1-4.69l1.33,3.13h2.22l4.21-4.69l-5.1-1.34l-2-1.56l-2.66,2.68L214.15,24.05L214.15,24.05M229.23,30.31l-6.87,2.9v2.23l8.87,3.35l-2,2.23l1.33,2.9l5.54-2.46h4.66l2.22,3.57l3.77-3.8l-0.89-3.58l-3.1,1.12l-0.44-4.47l1.55-2.68h-1.55l-2.44,1.56l-1.11,0.89l0.67,3.13l-1.77,1.34l-2.66-0.22l-0.67-4.02L229.23,30.31L229.23,30.31M238.32,23.38l-0.67,2.23l4.21,2.01l3.1-1.79l-0.22-1.34L238.32,23.38L238.32,23.38M241.64,19.58l-3.1,1.12l0.22,1.56l6.87-0.45l-0.22-1.56L241.64,19.58L241.64,19.58M256.5,23.38l-0.44,1.56l-1.11,1.56v2.23l4.21-0.67l4.43,3.8h1.55v-3.8l-4.43-4.92L256.5,23.38L256.5,23.38M267.81,27.85l1.77,2.01l-1.55,2.68l1.11,2.9l4.88-2.68v-2.01l-2.88-3.35L267.81,27.85L267.81,27.85M274.24,22.71l0.22,3.57h5.99l1.55,1.34l-0.22,1.56l-5.32,0.67l3.77,5.14l5.1,0.89l7.09-3.13l-10.2-15.42l-3.1,2.01l0.22,2.68l-3.55-1.34L274.24,22.71L274.24,22.71M222.58,47.96l-8.42,2.23l-4.88,4.25l0.44,4.69l8.87,2.68l-2,4.47l-6.43-4.02l-1.77,3.35l4.21,2.9l-0.22,4.69l6.43,1.79l7.76-0.45l1.33-2.46l5.76,6.48l3.99-1.34l0.67-4.47l2.88,2.01l0.44-4.47l-3.55-2.23l0.22-14.07l-3.1-2.46L231.89,56L222.58,47.96L222.58,47.96M249.63,57.79l-2.88-1.34l-1.55,2.01l3.1,4.92l0.22,4.69l6.65-4.02v-5.81l2.44-2.46l-2.44-1.79h-3.99L249.63,57.79L249.63,57.79M263.82,55.78l-4.66,3.8l1.11,4.69h2.88l1.33-2.46l2,2.01l2-0.22l5.32-4.47L263.82,55.78L263.82,55.78M263.37,48.4l-1.11,2.23l4.88,1.79l1.33-2.01L263.37,48.4L263.37,48.4M260.49,39.91l-4.88,0.67l-2.88,2.68l5.32,0.22l-1.55,4.02l1.11,1.79l1.55-0.22l3.77-6.03L260.49,39.91L260.49,39.91M268.92,38.35l-2.66,0.89l0.44,3.57l4.43,2.9l0.22,2.23l-1.33,1.34l0.67,4.47l17.07,5.58l4.66,1.56l4.66-4.02l-5.54-4.47l-5.1,1.34l-7.09-0.67l-2.66-2.68l-0.67-7.37l-4.43-2.23L268.92,38.35L268.92,38.35M282.88,61.59L278,61.14l-5.76,2.23l-3.1,4.24l0.89,11.62l9.53,0.45l9.09,4.47l6.43,7.37l4.88-0.22l-1.33,6.92l-4.43,7.37l-4.88,2.23l-3.55-0.67l-1.77-1.56l-2.66,3.57l1.11,3.57l3.77,0.22l4.66-2.23l3.99,10.28l9.98,6.48l6.87-8.71l-5.76-9.38l3.33-3.8l4.66,7.82l8.42-7.37l-1.55-3.35l-5.76,1.79l-3.99-10.95l3.77-6.25l-7.54-8.04l-4.21,2.9l-3.99-8.71l-8.42,1.12l-2.22-10.5l-6.87,4.69l-0.67,5.81h-3.77l0.44-5.14L282.88,61.59L282.88,61.59M292.86,65.61l-1.77,1.79l1.55,2.46l7.32,0.89l-4.66-4.92L292.86,65.61L292.86,65.61M285.77,40.36v2.01l-4.88,1.12l1.33,2.23l5.54,2.23l6.21,0.67l4.43,3.13l4.43-2.46l-3.1-3.13h3.99l2.44-2.68l5.99-0.89v-1.34l-3.33-2.23l0.44-2.46l9.31,1.56l13.75-5.36l-5.1-1.56l1.33-1.79h10.64l1.77-1.79l-21.51-7.6l-5.1-1.79l-5.54,4.02l-6.21-5.14l-3.33-0.22l-0.67,4.25l-4.21-3.8l-4.88,1.56l0.89,2.46l7.32,1.56l-0.44,3.57l3.99,2.46l9.76-2.46l0.22,3.35l-7.98,3.8l-4.88-3.8l-4.43,0.45l4.43,6.26l-2.22,1.12l-3.33-2.9l-2.44,1.56l2.22,4.24h3.77l-0.89,4.02l-3.1-0.45l-3.99-4.25L285.77,40.36L285.77,40.36M266.01,101.85l-4.23,5.32l-0.26,5.86l3.7-2.13h4.49l3.17,2.93l2.91-2.4L266.01,101.85L266.01,101.85M317.52,171.05l-10.57,10.12l1.06,2.4l12.94,4.79l1.85-3.19l-1.06-5.32l-4.23,0.53l-2.38-2.66l3.96-3.99L317.52,171.05L317.52,171.05M158.22,48.66l1.99,3.01l1,4.02l4.98,1.25l3.49-3.76l2.99,1.51l8.47,0.75l5.98-2.51l1,8.28h3.49V57.7l3.49,0.25l8.72,10.29l5.73,3.51l-2.99,4.77l1.25,1.25L219,80.03l0.25,5.02l2.99,0.5l0.75-7.53l4.73-1.25l3.49,5.27l7.47,3.51l3.74,0.75l2.49-3.01l0.25-4.77l4.48-2.76l1.49,4.02l-3.99,7.03l0.5,3.51l2.24-3.51l4.48-4.02l0.25-5.27l-2.49-4.02l0.75-3.26l5.98-3.01l2.74,2.01l0.5,17.57l4.23-3.76l2.49,1.51l-3.49,6.02l4.48,1l6.48-10.04l5.48,5.77l-2.24,10.29l-5.48,3.01l-5.23-2.51l-9.46,2.01l1,3.26l-2.49,4.02l-7.72,1.76l-8.72,6.78l-7.72,10.29l-1,3.26l5.23,2.01l1.99,5.02l7.22,7.28l11.46,5.02l-2.49,11.54l-0.25,3.26l2.99,2.01l3.99-5.27l0.5-10.04l6.23-0.25l2.99-5.77l0.5-8.78l7.97-15.56l9.96,3.51l5.23,7.28l-2.24,7.28l3.99,2.26l9.71-6.53l2.74,17.82l8.97,10.79l0.25,5.52l-9.96,2.51l-4.73,5.02l-9.96-2.26l-4.98-0.25l-8.72,6.78l5.23-1.25l6.48-1.25l1.25,1.51l-1.74,5.52l0.25,5.02l2.99,2.01l2.99-0.75l1.5-2.26h1.99l-3.24,6.02l-6.23,0.25l-2.74,4.02h-3.49l-1-3.01l4.98-5.02l-5.98,2.01l-0.27-8.53l-1.72-1l-5.23,2.26l-0.5,4.27h-11.96l-10.21,7.03l-13.7,4.52l-1.49-2.01l6.9-10.3l-3.92-3.77l-2.49-4.78l-5.07-3.87l-5.44-0.45l-9.75-6.83l-70.71-11.62l-1.17-4.79l-6.48-6.02v-5.02l1-4.52l-0.5-2.51l-2.49-2.51l-0.5-4.02l6.48-4.52l-3.99-21.58l-5.48-0.25l-4.98-6.53L158.22,48.66L158.22,48.66M133.83,128.41l-1.7,3.26l0.59,2.31l1.11,0.69l-0.26,0.94l-1.19,0.34l0.34,3.43l1.28,1.29l1.02-1.11l-1.28-3.34l0.76-2.66l1.87-2.49l-1.36-2.31L133.83,128.41L133.83,128.41M139.45,147.95l-1.53,0.6l2.81,3.26l0.68,3.86l2.81,3l2.38-0.43v-3.94l-2.89-1.8L139.45,147.95L139.45,147.95z","name":"Canada"},"gt":{"path":"M194.88,291.52l5.93,4.34l5.98-7.43l-1.02-1.54l-2.04-0.07v-4.35l-1.53-0.93l-4.63,1.38l1.77,4.08L194.88,291.52L194.88,291.52z","name":"Guatemala"},"hn":{"path":"M207.55,288.78l9.24-0.35l2.74,3.26l-1.71-0.39l-3.29,0.14l-4.3,4.04l-1.84,4.09l-1.21-0.64l-0.01-4.48l-2.66-1.78L207.55,288.78L207.55,288.78z","name":"Honduras"},"sv":{"path":"M201.65,296.27l4.7,2.34l-0.07-3.71l-2.41-1.47L201.65,296.27L201.65,296.27z","name":"El Salvador"},"ni":{"path":"M217.74,292.11l2.19,0.44l0.07,4.49l-2.55,7.28l-6.87-0.68l-1.53-3.51l2.04-4.26l3.87-3.6L217.74,292.11L217.74,292.11z","name":"Nicaragua"},"cr":{"path":"M217.38,304.98l1.39,2.72l1.13,1.5l-1.52,4.51l-2.9-2.04l-4.74-4.34v-2.87L217.38,304.98L217.38,304.98z","name":"Costa Rica"},"pa":{"path":"M220.59,309.61l-1.46,4.56l4.82,1.25l2.99,0.59l0.51-3.53l3.21-1.62l2.85,1.47l1.12,1.79l1.36-0.16l1.07-3.25l-3.56-1.47l-2.7-1.47l-2.7,1.84l-3.21,1.62l-3.28-1.32L220.59,309.61L220.59,309.61z","name":"Panama"},"co":{"path":"M253.73,299.78l-2.06-0.21l-13.62,11.23l-1.44,3.95l-1.86,0.21l0.83,8.73l-4.75,11.65l5.16,4.37l6.61,0.42l4.54,6.66l6.6,0.21l-0.21,4.99H256l2.68-9.15l-2.48-3.12l0.62-5.82l5.16-0.42l-0.62-13.52l-11.56-3.74l-2.68-7.28L253.73,299.78L253.73,299.78z","name":"Colombia"},"ve":{"path":"M250.46,305.92l0.44,2.59l3.25,1.03l0.74-4.77l3.43-3.55l3.43,4.02l7.89,2.15l6.68-1.4l4.55,5.61l3.43,2.15l-3.76,5.73l1.26,4.34l-2.15,2.66l-2.23,1.87l-4.83-2.43l-1.11,1.12v3.46l3.53,1.68l-2.6,2.81l-2.6,2.81l-3.43-0.28l-3.45-3.79l-0.73-14.26l-11.78-4.02l-2.14-6.27L250.46,305.92L250.46,305.92z","name":"Venezuela"},"gy":{"path":"M285.05,314.13l7.22,6.54l-2.87,3.32l-0.23,1.97l3.77,3.89l-0.09,3.74l-6.56,2.5l-3.93-5.31l0.84-6.38l-1.68-4.75L285.05,314.13L285.05,314.13z","name":"Guyana"},"sr":{"path":"M293.13,321.14l2.04,1.87l3.16-1.96l2.88,0.09l-0.37,1.12l-1.21,2.52l-0.19,6.27l-5.75,2.34l0.28-4.02l-3.71-3.46l0.19-1.78L293.13,321.14L293.13,321.14z","name":"Suriname"},"gf":{"path":"M302.13,321.8l5.85,3.65l-3.06,6.08l-1.11,1.4l-3.25-1.87l0.09-6.55L302.13,321.8L302.13,321.8z","name":"French Guiana"},"pe":{"path":"M225.03,349.52l-1.94,1.96l0.13,3.13l16.94,30.88l17.59,11.34l2.72-4.56l0.65-10.03l-1.42-6.25l-4.79-8.08l-2.85,0.91l-1.29,1.43l-5.69-6.52l1.42-7.69l6.6-4.3l-0.52-4.04l-6.72-0.26l-3.49-5.86l-1.94-0.65l0.13,3.52l-8.66,10.29l-6.47-1.56L225.03,349.52L225.03,349.52z","name":"Peru"},"bo":{"path":"M258.71,372.79l8.23-3.59l2.72,0.26l1.81,7.56l12.54,4.17l2.07,6.39l5.17,0.65l2.2,5.47l-1.55,4.95l-8.41,0.65l-3.1,7.95l-6.6-0.13l-2.07-0.39l-3.81,3.7l-1.88-0.18l-6.47-14.99l1.79-2.68l0.63-10.6l-1.6-6.31L258.71,372.79L258.71,372.79z","name":"Bolivia"},"py":{"path":"M291.76,399.51l2.2,2.4l-0.26,5.08l6.34-0.39l4.79,6.13l-0.39,5.47l-3.1,4.69l-6.34,0.26l-0.26-2.61l1.81-4.3l-6.21-3.91h-5.17l-3.88-4.17l2.82-8.06L291.76,399.51L291.76,399.51z","name":"Paraguay"},"uy":{"path":"M300.36,431.93l-2.05,2.19l0.85,11.78l6.44,1.87l8.19-8.21L300.36,431.93L300.36,431.93z","name":"Uruguay"},"ar":{"path":"M305.47,418.2l1.94,1.82l-7.37,10.95l-2.59,2.87l0.9,12.51l5.69,6.91l-4.78,8.34l-3.62,1.56h-4.14l1.16,6.51l-6.47,2.22l1.55,5.47l-3.88,12.38l4.79,3.91l-2.59,6.38l-4.4,6.91l2.33,4.82l-5.69,0.91l-4.66-5.73l-0.78-17.85l-7.24-30.32l2.19-10.6l-4.66-13.55l3.1-17.59l2.85-3.39l-0.7-2.57l3.66-3.34l8.16,0.56l4.56,4.87l5.27,0.09l5.4,3.3l-1.59,3.72l0.38,3.76l7.65-0.36L305.47,418.2L305.47,418.2M288.92,518.79l0.26,5.73l4.4-0.39l3.75-2.48l-6.34-1.3L288.92,518.79L288.92,518.79z","name":"Argentina"},"cl":{"path":"M285.04,514.1l-4.27,9.38l7.37,0.78l0.13-6.25L285.04,514.1L285.04,514.1M283.59,512.63l-3.21,3.55l-0.39,4.17l-6.21-3.52l-6.6-9.51l-1.94-3.39l2.72-3.52l-0.26-4.43l-3.1-1.3l-2.46-1.82l0.52-2.48l3.23-0.91l0.65-14.33l-5.04-2.87l-3.29-74.59l0.85-1.48l6.44,14.85l2.06,0.04l0.67,2.37l-2.74,3.32l-3.15,17.87l4.48,13.76l-2.07,10.42l7.3,30.64l0.77,17.92l5.23,6.05L283.59,512.63L283.59,512.63M262.28,475.14l-1.29,1.95l0.65,3.39l1.29,0.13l0.65-4.3L262.28,475.14L262.28,475.14z","name":"Chile"},"br":{"path":"M314.24,438.85l6.25-12.02l0.23-10.1l11.66-7.52h6.53l5.13-8.69l0.93-16.68l-2.1-4.46l12.36-11.28l0.47-12.45l-16.79-8.22l-20.28-6.34l-9.56-0.94l2.57-5.4l-0.7-8.22l-2.09-0.69l-3.09,6.14l-1.62,2.03l-4.16-1.84l-13.99,4.93l-4.66-5.87l0.75-6.13l-4.4,4.48l-4.86-2.62l-0.49,0.69l0.01,2.13l4.19,2.25l-6.29,6.63l-3.97-0.04l-4.02-4.09l-4.55,0.14l-0.56,4.86l2.61,3.17l-3.08,9.87l-3.6,0.28l-5.73,3.62l-1.4,7.11l4.97,5.32l0.91-1.03l3.49-0.94l2.98,5.02l8.53-3.66l3.31,0.19l2.28,8.07l12.17,3.86l2.1,6.44l5.18,0.62l2.47,6.15l-1.67,5.47l2.18,2.86l-0.32,4.26l5.84-0.55l5.35,6.76l-0.42,4.75l3.17,2.68l-7.6,11.51L314.24,438.85L314.24,438.85z","name":"Brazil"},"bz":{"path":"M204.56,282.4l-0.05,3.65h0.84l2.86-5.34h-1.94L204.56,282.4L204.56,282.4z","name":"Belize"},"mn":{"path":"M673.8,170.17l5.82-7.72l6.99,3.23l4.75,1.27l5.82-5.34l-3.95-2.91l2.6-3.67l7.76,2.74l2.69,4.41l4.86,0.13l2.54-1.89l5.23-0.21l1.14,1.94l8.69,0.44l5.5-5.61l7.61,0.8l-0.44,7.64l3.33,0.76l4.09-1.86l4.33,2.14l-0.1,1.08l-3.14,0.09l-3.27,6.86l-2.54,0.25l-9.88,12.91l-10.09,4.45l-6.31,0.49l-5.24-3.38l-6.7,3.58l-6.6-2.05l-1.87-4.79l-12.5-0.88l-6.4-10.85l-3.11-0.2L673.8,170.17L673.8,170.17z","name":"Mongolia"},"kp":{"path":"M778.28,194.27l1.84,0.77l0.56,6.44l3.65,0.21l3.44-4.03l-1.19-1.06l0.14-4.32l3.16-3.82l-1.61-2.9l1.05-1.2l0.58-3l-1.83-0.83l-1.56,0.79l-1.93,5.86l-3.12-0.27l-3.61,4.26L778.28,194.27L778.28,194.27z","name":"North Korea"},"kr":{"path":"M788.34,198.2l6.18,5.04l1.05,4.88l-0.21,2.62l-3.02,3.4l-2.6,0.14l-2.95-6.37l-1.12-3.04l1.19-0.92l-0.28-1.27l-1.47-0.66L788.34,198.2L788.34,198.2z","name":"South Korea"},"kz":{"path":"M576.69,188.62l4.1-1.75l4.58-0.16l0.32,7h-2.68l-2.05,3.34l2.68,4.45l3.95,2.23l0.36,2.55l1.45-0.48l1.34-1.59l2.21,0.48l1.11,2.23h2.84v-2.86l-1.74-5.09l-0.79-4.13l5.05-2.23l6.79,1.11l4.26,4.29l9.63-0.95l5.37,7.63l6.31,0.32l1.74-2.86l2.21-0.48l0.32-3.18l3.31-0.16l1.74,2.07l1.74-4.13l14.99,2.07l2.52-3.34l-4.26-5.25l5.68-12.4l4.58,0.32l3.16-7.63l-6.31-0.64l-3.63-3.5l-10,1.16l-12.88-12.45l-4.54,4.03l-13.77-6.25l-16.89,8.27l-0.47,5.88l3.95,4.61l-7.7,4.35l-9.99-0.22l-2.09-3.07l-7.83-0.43l-7.42,4.77l-0.16,6.52L576.69,188.62L576.69,188.62z","name":"Kazakhstan"},"tm":{"path":"M593.85,207.59l-0.62,2.63h-4.15v3.56l4.46,2.94l-1.38,4.03v1.86l1.85,0.31l2.46-3.25l5.54-1.24l11.84,4.49l0.15,3.25l6.61,0.62l7.38-7.75l-0.92-2.48l-4.92-1.08l-13.84-8.99l-0.62-3.25h-5.23l-2.31,4.34h-2.31L593.85,207.59L593.85,207.59z","name":"Turkmenistan"},"uz":{"path":"M628.92,219.06l3.08,0.16v-5.27l-2.92-1.7l4.92-6.2h2l2,2.33l5.23-2.01l-7.23-2.48l-0.28-1.5l-1.72,0.42l-1.69,2.94l-7.29-0.24l-5.35-7.57l-9.4,0.93l-4.48-4.44l-6.2-1.05l-4.5,1.83l2.61,8.68l0.03,2.92l1.9,0.04l2.33-4.44l6.2,0.08l0.92,3.41l13.29,8.82l5.14,1.18L628.92,219.06L628.92,219.06z","name":"Uzbekistan"},"tj":{"path":"M630.19,211.84l4.11-5.1h1.55l0.54,1.14l-1.9,1.38v1.14l1.25,0.9l6.01,0.36l1.96-0.84l0.89,0.18l0.6,1.92l3.57,0.36l1.79,3.78l-0.54,1.14l-0.71,0.06l-0.71-1.44l-1.55-0.12l-2.68,0.36l-0.18,2.52l-2.68-0.18l0.12-3.18l-1.96-1.92l-2.98,2.46l0.06,1.62l-2.62,0.9h-1.55l0.12-5.58L630.19,211.84L630.19,211.84z","name":"Tajikistan"},"kg":{"path":"M636.81,199.21l-0.31,2.53l0.25,1.56l8.7,2.92l-7.64,3.08l-0.87-0.72l-1.65,1.06l0.08,0.58l0.88,0.4l5.36,0.14l2.72-0.82l3.49-4.4l4.37,0.76l5.27-7.3l-14.1-1.92l-1.95,4.73l-2.46-2.64L636.81,199.21L636.81,199.21z","name":"Kyrgyz Republic"},"af":{"path":"M614.12,227.05l1.59,12.46l3.96,0.87l0.37,2.24l-2.84,2.37l5.29,4.27l10.28-3.7l0.82-4.38l6.47-4.04l2.48-9.36l1.85-1.99l-1.92-3.34l6.26-3.87l-0.8-1.12l-2.89,0.18l-0.26,2.66l-3.88-0.04l-0.07-3.55l-1.25-1.49l-2.1,1.91l0.06,1.75l-3.17,1.2l-5.85-0.37l-7.6,7.96L614.12,227.05L614.12,227.05z","name":"Afghanistan"},"pk":{"path":"M623.13,249.84l2.6,3.86l-0.25,1.99l-3.46,1.37l-0.25,3.24h3.96l1.36-1.12h7.54l6.8,5.98l0.87-2.87h5.07l0.12-3.61l-5.19-4.98l1.11-2.74l5.32-0.37l7.17-14.95l-3.96-3.11l-1.48-5.23l9.64-0.87l-5.69-8.1l-3.03-0.82l-1.24,1.5l-0.93,0.07l-5.69,3.61l1.86,3.12l-2.1,2.24l-2.6,9.59l-6.43,4.11l-0.87,4.49L623.13,249.84L623.13,249.84z","name":"Pakistan"},"in":{"path":"M670.98,313.01l4.58-2.24l2.72-9.84l-0.12-12.08l15.58-16.82v-3.99l3.21-1.25l-0.12-4.61l-3.46-6.73l1.98-3.61l4.33,3.99l5.56,0.25v2.24l-1.73,1.87l0.37,1l2.97,0.12l0.62,3.36h0.87l2.23-3.99l1.11-10.46l3.71-2.62l0.12-3.61l-1.48-2.87l-2.35-0.12l-9.2,6.08l0.58,3.91l-6.46-0.02l-2.28-2.79l-1.24,0.16l0.42,3.88l-13.97-1l-8.66-3.86l-0.46-4.75l-5.77-3.58l-0.07-7.37l-3.96-4.53l-9.1,0.87l0.99,3.96l4.46,3.61l-7.71,15.78l-5.16,0.39l-0.85,1.9l5.08,4.7l-0.25,4.75l-5.19-0.08l-0.56,2.36l4.31-0.19l0.12,1.87l-3.09,1.62l1.98,3.74l3.83,1.25l2.35-1.74l1.11-3.11l1.36-0.62l1.61,1.62l-0.49,3.99l-1.11,1.87l0.25,3.24L670.98,313.01L670.98,313.01z","name":"India"},"np":{"path":"M671.19,242.56l0.46,4.27l8.08,3.66l12.95,0.96l-0.49-3.13l-8.65-2.38l-7.34-4.37L671.19,242.56L671.19,242.56z","name":"Nepal"},"bt":{"path":"M695.4,248.08l1.55,2.12l5.24,0.04l-0.53-2.9L695.4,248.08L695.4,248.08z","name":"Bhutan"},"bd":{"path":"M695.57,253.11l-1.31,2.37l3.4,6.46l0.1,5.04l0.62,1.35l3.99,0.07l2.26-2.17l1.64,0.99l0.33,3.07l1.31-0.82l0.08-3.92l-1.1-0.13l-0.69-3.33l-2.78-0.1l-0.69-1.85l1.7-2.27l0.03-1.12h-4.94L695.57,253.11L695.57,253.11z","name":"Bangladesh"},"mm":{"path":"M729.44,303.65l-2.77-4.44l2.01-2.82l-1.9-3.49l-1.79-0.34l-0.34-5.86l-2.68-5.19l-0.78,1.24l-1.79,3.04l-2.24,0.34l-1.12-1.47l-0.56-3.95l-1.68-3.16l-6.84-6.45l1.68-1.11l0.31-4.67l2.5-4.2l1.08-10.45l3.62-2.47l0.12-3.81l2.17,0.72l3.42,4.95l-2.54,5.44l1.71,4.27l4.23,1.66l0.77,4.65l5.68,0.88l-1.57,2.71l-7.16,2.82l-0.78,4.62l5.26,6.76l0.22,3.61l-1.23,1.24l0.11,1.13l3.92,5.75l0.11,5.97L729.44,303.65L729.44,303.65z","name":"Myanmar"},"th":{"path":"M730.03,270.47l3.24,4.17v5.07l1.12,0.56l5.15-2.48l1.01,0.34l6.15,7.1l-0.22,4.85l-2.01-0.34l-1.79-1.13l-1.34,0.11l-2.35,3.94l0.45,2.14l1.9,1.01l-0.11,2.37l-1.34,0.68l-4.59-3.16v-2.82l-1.9-0.11l-0.78,1.24l-0.4,12.62l2.97,5.42l5.26,5.07l-0.22,1.47l-2.8-0.11l-2.57-3.83h-2.69l-3.36-2.71l-1.01-2.82l1.45-2.37l0.5-2.14l1.58-2.8l-0.07-6.44l-3.86-5.58l-0.16-0.68l1.25-1.26l-0.29-4.43l-5.14-6.51l0.6-3.75L730.03,270.47L730.03,270.47z","name":"Thailand"},"kh":{"path":"M740.48,299.47l4.09,4.37l7.61-5.64l0.67-8.9l-3.93,2.71l-2.04-1.14l-2.77-0.37l-1.55-1.09l-0.75,0.04l-2.03,3.33l0.33,1.54l2.06,1.15l-0.25,3.13L740.48,299.47L740.48,299.47z","name":"Cambodia"},"la":{"path":"M735.47,262.93l-2.42,1.23l-2.01,5.86l3.36,4.28l-0.56,4.73l0.56,0.23l5.59-2.71l7.5,8.38l-0.18,5.28l1.63,0.88l4.03-3.27l-0.33-2.59l-11.63-11.05l0.11-1.69l1.45-1.01l-1.01-2.82l-4.81-0.79L735.47,262.93L735.47,262.93z","name":"Lao People's Democratic Republic"},"vn":{"path":"M745.06,304.45l1.19,1.87l0.22,2.14l3.13,0.34l3.8-5.07l3.58-1.01l1.9-5.18l-0.89-8.34l-3.69-5.07l-3.89-3.11l-4.95-8.5l3.55-5.94l-5.08-5.83l-4.07-0.18l-3.66,1.97l1.09,4.71l4.88,0.86l1.31,3.63l-1.72,1.12l0.11,0.9l11.45,11.2l0.45,3.29l-0.69,10.4L745.06,304.45L745.06,304.45z","name":"Vietnam"},"ge":{"path":"M555.46,204.16l3.27,4.27l4.08,1.88l2.51-0.01l4.31-1.17l1.08-1.69l-12.75-4.77L555.46,204.16L555.46,204.16z","name":"Georgia"},"am":{"path":"M569.72,209.89l4.8,6.26l-1.41,1.65l-3.4-0.59l-4.22-3.78l0.23-2.48L569.72,209.89L569.72,209.89z","name":"Armenia"},"az":{"path":"M571.41,207.72l-1.01,1.72l4.71,6.18l1.64-0.53l2.7,2.83l1.17-4.96l2.93,0.47l-0.12-1.42l-4.82-4.22l-0.92,2.48L571.41,207.72L571.41,207.72z","name":"Azerbaijan"},"ir":{"path":"M569.65,217.95l-1.22,1.27l0.12,2.01l1.52,2.13l5.39,5.9l-0.82,2.36h-0.94l-0.47,2.36l3.05,3.9l2.81,0.24l5.63,7.79l3.16,0.24l2.46,1.77l0.12,3.54l9.73,5.67h3.63l2.23-1.89l2.81-0.12l1.64,3.78l10.51,1.46l0.31-3.86l3.48-1.26l0.16-1.38l-2.77-3.78l-6.17-4.96l3.24-2.95l-0.23-1.3l-4.06-0.63l-1.72-13.7l-0.2-3.15l-11.01-4.21l-4.88,1.1l-2.73,3.35l-2.42-0.16l-0.7,0.59l-5.39-0.35l-6.8-4.96l-2.53-2.77l-1.16,0.28l-2.09,2.39L569.65,217.95L569.65,217.95z","name":"Iran"},"tr":{"path":"M558.7,209.19l-2.23,2.36l-8.2-0.24l-4.92-2.95l-4.8-0.12l-5.51,3.9l-5.16,0.24l-0.47,2.95h-5.86l-2.34,2.13v1.18l1.41,1.18v1.3l-0.59,1.54l0.59,1.3l1.88-0.94l1.88,2.01l-0.47,1.42l-0.7,0.95l1.05,1.18l5.16,1.06l3.63-1.54v-2.24l1.76,0.35l4.22,2.48l4.57-0.71l1.99-1.89l1.29,0.47v2.13h1.76l1.52-2.95l13.36-1.42l5.83-0.71l-1.54-2.02l-0.03-2.73l1.17-1.4l-4.26-3.42l0.23-2.95h-2.34L558.7,209.19L558.7,209.19M523.02,209.7l-0.16,3.55l3.1-0.95l1.42-0.95l-0.42-1.54l-1.47-1.17L523.02,209.7L523.02,209.7z","name":"Turkey"},"om":{"path":"M598.38,280.84l7.39-4.26l1.31-6.25l-1.62-0.93l0.67-6.7l1.41-0.82l1.51,2.37l8.99,4.7v2.61l-10.89,16.03l-5.01,0.17L598.38,280.84L598.38,280.84z","name":"Oman"},"ae":{"path":"M594.01,264.94l0.87,3.48l9.86,0.87l0.69-7.14l1.9-1.04l0.52-2.61l-3.11,0.87l-3.46,5.23L594.01,264.94L594.01,264.94z","name":"United Arab Emirates"},"qa":{"path":"M592.63,259.02l-0.52,4.01l1.54,1.17l1.4-0.13l0.52-5.05l-1.21-0.87L592.63,259.02L592.63,259.02z","name":"Qatar"},"kw":{"path":"M583.29,247.17l-2.25-1.22l-1.56,1.57l0.17,3.14l3.63,1.39L583.29,247.17L583.29,247.17z","name":"Kuwait"},"sa":{"path":"M584,253.24l7.01,9.77l2.26,1.8l1.01,4.38l10.79,0.85l1.22,0.64l-1.21,5.4l-7.09,4.18l-10.37,3.14l-5.53,5.4l-6.57-3.83l-3.98,3.48L566,279.4l-3.8-1.74l-1.38-2.09v-4.53l-13.83-16.72l-0.52-2.96h3.98l4.84-4.18l0.17-2.09l-1.38-1.39l2.77-2.26l5.88,0.35l10.03,8.36l5.92-0.27l0.38,1.46L584,253.24L584,253.24z","name":"Saudi Arabia"},"sy":{"path":"M546.67,229.13l-0.35,2.54l2.82,1.18l-0.12,7.04l2.82-0.06l2.82-2.13l1.06-0.18l6.4-5.09l1.29-7.39l-12.79,1.3l-1.35,2.96L546.67,229.13L546.67,229.13z","name":"Syrian Arab Republic"},"iq":{"path":"M564.31,225.03l-1.56,7.71l-6.46,5.38l0.41,2.54l6.31,0.43l10.05,8.18l5.62-0.16l0.15-1.89l2.06-2.21l2.88,1.63l0.38-0.36l-5.57-7.41l-2.64-0.16l-3.51-4.51l0.7-3.32l1.07-0.14l0.37-1.47l-4.78-5.03L564.31,225.03L564.31,225.03z","name":"Iraq"},"jo":{"path":"M548.9,240.78l-2.46,8.58l-0.11,1.31h3.87l4.33-3.82l0.11-1.45l-1.77-1.81l3.17-2.63l-0.46-2.44l-0.87,0.2l-2.64,1.89L548.9,240.78L548.9,240.78z","name":"Jordan"},"lb":{"path":"M546.2,232.44l0.06,1.95l-0.82,2.96l2.82,0.24l0.18-4.2L546.2,232.44L546.2,232.44z","name":"Lebanon"},"il":{"path":"M545.32,238.06l-1.58,5.03l2.05,6.03l2.35-8.81v-1.89L545.32,238.06L545.32,238.06z","name":"Israel"},"cy":{"path":"M543.21,229.84l1.23,0.89l-3.81,3.61l-1.82-0.06l-1.35-0.95l0.18-1.77l2.76-0.18L543.21,229.84L543.21,229.84z","name":"Cyprus"},"gb":{"path":"M446.12,149.08l-1.83,2.77l0.73,1.11h4.22v1.85l-1.1,1.48l0.73,3.88l2.38,4.62l1.83,4.25l2.93,1.11l1.28,2.22l-0.18,2.03l-1.83,1.11l-0.18,0.92l1.28,0.74l-1.1,1.48l-2.57,1.11l-4.95-0.55l-7.71,3.51l-2.57-1.29l7.34-4.25l-0.92-0.55l-3.85-0.37l2.38-3.51l0.37-2.96l3.12-0.37l-0.55-5.73l-3.67-0.18l-1.1-1.29l0.18-4.25l-2.2,0.18l2.2-7.39l4.04-2.96L446.12,149.08L446.12,149.08M438.42,161.47l-3.3,0.37l-0.18,2.96l2.2,1.48l2.38-0.55l0.92-1.66L438.42,161.47L438.42,161.47z","name":"United Kingdom"},"ie":{"path":"M439.51,166.55l-0.91,6l-8.07,2.96h-2.57l-1.83-1.29v-1.11l4.04-2.59l-1.1-2.22l0.18-3.14l3.49,0.18l1.6-3.76l-0.21,3.34l2.71,2.15L439.51,166.55L439.51,166.55z","name":"Ireland"},"se":{"path":"M497.72,104.58l1.96,1.81h3.67l2.02,3.88l0.55,6.65l-4.95,3.51v3.51l-3.49,4.81l-2.02,0.18l-2.75,4.62l0.18,4.44l4.77,3.51l-0.37,2.03l-1.83,2.77l-2.75,2.4l0.18,7.95l-4.22,1.48l-1.47,3.14h-2.02l-1.1-5.54l-4.59-7.04l3.77-6.31l0.26-15.59l2.6-1.43l0.63-8.92l7.41-10.61L497.72,104.58L497.72,104.58M498.49,150.17l-2.11,1.67l1.06,2.45l1.87-1.82L498.49,150.17L498.49,150.17z","name":"Sweden"},"fi":{"path":"M506.79,116.94l2.07,0.91l1.28,2.4l-1.28,1.66l-6.42,7.02l-1.1,3.7l1.47,5.36l4.95,3.7l6.6-3.14l5.32-0.74l4.95-7.95l-3.67-8.69l-3.49-8.32l0.55-5.36l-2.2-0.37l-0.57-3.91l-2.96-4.83l-3.28,2.27l-1.29,5.27l-3.48-2.09l-4.84-1.18l-1.08,1.26l1.86,1.68l3.39-0.06l2.73,4.41L506.79,116.94L506.79,116.94z","name":"Finland"},"lv":{"path":"M518.07,151.37l-6.85-1.11l0.15,3.83l6.35,3.88l2.6-0.76l-0.15-2.92L518.07,151.37L518.07,151.37z","name":"Latvia"},"lt":{"path":"M510.81,154.7l-2.15-0.05l-2.95,2.82h-2.5l0.15,3.53l-1.5,2.77l5.4,0.05l1.55-0.2l1.55,1.87l3.55-0.15l3.4-4.33l-0.2-2.57L510.81,154.7L510.81,154.7z","name":"Lithuania"},"by":{"path":"M510.66,166.29l1.5,2.47l-0.6,1.97l0.1,1.56l0.55,1.87l3.1-1.76l3.85,0.1l2.7,1.11h6.85l2-4.79l1.2-1.81v-1.21l-4.3-6.05l-3.8-1.51l-3.1-0.35l-2.7,0.86l0.1,2.72l-3.75,4.74L510.66,166.29L510.66,166.29z","name":"Belarus"},"pl":{"path":"M511.46,174.76l0.85,1.56l0.2,1.66l-0.7,1.61l-1.6,3.08l-1.35,0.61l-1.75-0.76l-1.05,0.05l-2.55,0.96l-2.9-0.86l-4.7-3.33l-4.6-2.47l-1.85-2.82l-0.35-6.65l3.6-3.13l4.7-1.56l1.75-0.2l-0.7,1.41l0.45,0.55l7.91,0.15l1.7-0.05l2.8,4.29l-0.7,1.76l0.3,2.07L511.46,174.76L511.46,174.76z","name":"Poland"},"it":{"path":"M477.56,213.38l-2.65,1.34l0.35,5.17l2.12,0.36l1.59-1.52v-4.9L477.56,213.38L477.56,213.38M472.27,196.98l-0.62,1.57l0.17,1.71l2.39,2.79l3.76-0.13l8.3,9.64l5.18,1.5l3.06,2.89l0.73,6.59l1.64-0.96l1.42-3.59l-0.35-2.58l2.43-0.22l0.35-1.46l-6.85-3.28l-6.5-6.39l-2.59-3.82l-0.63-3.63l3.31-0.79l-0.85-2.39l-2.03-1.71l-1.75-0.08l-2.44,0.67l-2.3,3.22l-1.39,0.92l-2.15-1.32L472.27,196.98L472.27,196.98M492.44,223.02l-1.45-0.78l-4.95,0.78l0.17,1.34l4.45,2.24l0.67,0.73l1.17,0.17L492.44,223.02L492.44,223.02z","name":"Italy"},"fr":{"path":"M477.83,206.96l-1.95,1.96l-0.18,1.78l1.59,0.98l0.62-0.09l0.35-2.59L477.83,206.96L477.83,206.96M460.4,178.7l-2.21,0.54l-4.42,4.81l-1.33,0.09l-1.77-1.25l-1.15,0.27l-0.88,2.76l-6.46,0.18l0.18,1.43l4.42,2.94l5.13,4.1l-0.09,4.9l-2.74,4.81l5.93,2.85l6.02,0.18l1.86-2.14l3.8,0.09l1.06,0.98l3.8-0.27l1.95-2.5l-2.48-2.94l-0.18-1.87l0.53-2.05l-1.24-1.78l-2.12,0.62l-0.27-1.6l4.69-5.17v-3.12l-3.1-1.78l-1.59-0.27L460.4,178.7L460.4,178.7z","name":"France"},"nl":{"path":"M470.09,168.27l-4.53,2.23l0.96,0.87l0.1,2.23l-0.96-0.19l-1.06-1.65l-2.53,4.01l3.89,0.81l1.45,1.53l0.77,0.02l0.51-3.46l2.45-1.03L470.09,168.27L470.09,168.27z","name":"Netherlands"},"be":{"path":"M461.61,176.52l-0.64,1.6l6.88,4.54l1.98,0.47l0.07-2.15l-1.73-1.94h-1.06l-1.45-1.65L461.61,176.52L461.61,176.52z","name":"Belgium"},"de":{"path":"M471.14,167.88l3.57-0.58v-2.52l2.99-0.49l1.64,1.65l1.73,0.19l2.7-1.17l2.41,0.68l2.12,1.84l0.29,6.89l2.12,2.82l-2.79,0.39l-4.63,2.91l0.39,0.97l4.14,3.88l-0.29,1.94l-3.85,1.94l-3.57,0.1l-0.87,1.84h-1.83l-0.87-1.94l-3.18-0.78l-0.1-3.2l-2.7-1.84l0.29-2.33l-1.83-2.52l0.48-3.3l2.5-1.17L471.14,167.88L471.14,167.88z","name":"Germany"},"dk":{"path":"M476.77,151.5l-4.15,4.59l-0.15,2.99l1.89,4.93l2.96-0.56l-0.37-4.03l2.04-2.28l-0.04-1.79l-1.44-3.73L476.77,151.5L476.77,151.5M481.44,159.64l-0.93-0.04l-1.22,1.12l0.15,1.75l2.89,0.08l0.15-1.98L481.44,159.64L481.44,159.64z","name":"Denmark"},"ch":{"path":"M472.91,189.38l-4.36,4.64l0.09,0.47l1.79-0.56l1.61,2.24l2.72-0.96l1.88,1.46l0.77-0.44l2.32-3.64l-0.59-0.56l-2.29-0.06l-1.11-2.27L472.91,189.38L472.91,189.38z","name":"Switzerland"},"cz":{"path":"M488.43,184.87h2.97h1.46l2.37,1.69l4.39-3.65l-4.26-3.04l-4.22-2.04l-2.89,0.52l-3.92,2.52L488.43,184.87L488.43,184.87z","name":"Czech Republic"},"sk":{"path":"M495.84,187.13l0.69,0.61l0.09,1.04l7.63-0.17l5.64-2.43l-0.09-2.47l-1.08,0.48l-1.55-0.83l-0.95-0.04l-2.5,1l-3.4-0.82L495.84,187.13L495.84,187.13z","name":"Slovakia"},"at":{"path":"M480.63,190.12l-0.65,1.35l0.56,0.96l2.33-0.48h1.98l2.15,1.82l4.57-0.83l3.36-2l0.86-1.35l-0.13-1.74l-3.02-2.26l-4.05,0.04l-0.34,2.3l-4.26,2.08L480.63,190.12L480.63,190.12z","name":"Austria"},"hu":{"path":"M496.74,189.6l-1.16,1.82l0.09,2.78l1.85,0.95l5.69,0.17l7.93-6.68l0.04-1.48l-0.86-0.43l-5.73,2.6L496.74,189.6L496.74,189.6z","name":"Hungary"},"si":{"path":"M494.8,191.99l-2.54,1.52l-4.74,1.04l0.95,2.74l3.32,0.04l3.06-2.56L494.8,191.99L494.8,191.99z","name":"Slovenia"},"hr":{"path":"M495.62,195.16l-3.53,2.91h-3.58l-0.43,2.52l1.64,0.43l0.82-1.22l1.29,1.13l1.03,3.6l7.07,3.3l0.7-0.8l-7.17-7.4l0.73-1.35l6.81-0.26l0.69-2.17l-4.44,0.13L495.62,195.16L495.62,195.16z","name":"Croatia"},"ba":{"path":"M494.8,198.94l-0.37,0.61l6.71,6.92l2.46-3.62l-0.09-1.43l-2.15-2.61L494.8,198.94L494.8,198.94z","name":"Bosnia and Herzegovina"},"mt":{"path":"M492.61,230.47l-1.67,0.34l0.06,1.85l1.5,0.5l0.67-0.56L492.61,230.47L492.61,230.47z","name":"Malta"},"ua":{"path":"M515.57,173.15l-2.9,1.63l0.72,3.08l-2.68,5.65l0.02,2.49l1.26,0.8l8.08,0.4l2.26-1.87l2.42,0.81l3.47,4.63l-2.54,4.56l3.02,0.88l3.95-4.55l2.26,0.41l2.1,1.46l-1.85,2.44l2.5,3.9h2.66l1.37-2.6l2.82-0.57l0.08-2.11l-5.24-0.81l0.16-2.27h5.08l5.48-4.39l2.42-2.11l0.4-6.66l-10.8-0.97l-4.43-6.25l-3.06-1.05l-3.71,0.16l-1.67,4.13l-7.6,0.1l-2.47-1.14L515.57,173.15L515.57,173.15z","name":"Ukraine"},"md":{"path":"M520.75,187.71l3.1,4.77l-0.26,2.7l1.11,0.05l2.63-4.45l-3.16-3.92l-1.79-0.74L520.75,187.71L520.75,187.71z","name":"Moldova"},"ro":{"path":"M512.18,187.6l-0.26,1.48l-5.79,4.82l4.84,7.1l3.1,2.17h5.58l1.84-1.54l2.47-0.32l1.84,1.11l3.26-3.71l-0.63-1.86l-3.31-0.85l-2.26-0.11l0.11-3.18l-3-4.72L512.18,187.6L512.18,187.6z","name":"Romania"},"rs":{"path":"M505.55,194.54l-2.05,1.54h-1l-0.68,2.12l2.42,2.81l0.16,2.23l-3,4.24l0.42,1.27l1.74,0.32l1.37-1.86l0.74-0.05l1.26,1.22l3.84-1.17l-0.32-5.46L505.55,194.54L505.55,194.54z","name":"Serbia"},"bg":{"path":"M511.44,202.39l0.16,4.98l1.68,3.5l6.31,0.11l2.84-2.01l2.79-1.11l-0.68-3.18l0.63-1.7l-1.42-0.74l-1.95,0.16l-1.53,1.54l-6.42,0.05L511.44,202.39L511.44,202.39z","name":"Bulgaria"},"al":{"path":"M504.02,209.76v4.61l1.32,2.49l0.95-0.11l1.63-2.97l-0.95-1.33l-0.37-3.29l-1.26-1.17L504.02,209.76L504.02,209.76z","name":"Albania"},"mk":{"path":"M510.92,208.01l-3.37,1.11l0.16,2.86l0.79,1.01l4-1.86L510.92,208.01L510.92,208.01z","name":"Macedonia"},"gr":{"path":"M506.71,217.6l-0.11,1.33l4.63,2.33l2.21,0.85l-1.16,1.22l-2.58,0.26l-0.37,1.17l0.89,2.01l2.89,1.54l1.26,0.11l0.16-3.45l1.89-2.28l-5.16-6.1l0.68-2.07l1.21-0.05l1.84,1.48l1.16-0.58l0.37-2.07l5.42,0.05l0.21-3.18l-2.26,1.59l-6.63-0.16l-4.31,2.23L506.71,217.6L506.71,217.6M516.76,230.59l1.63,0.05l0.68,1.01h2.37l1.58-0.58l0.53,0.64l-1.05,1.38l-4.63,0.16l-0.84-1.11l-0.89-0.53L516.76,230.59L516.76,230.59z","name":"Greece"}}}); diff --git a/public/components/base/accordions.html b/public/components/base/accordions.html new file mode 100644 index 00000000..570ba499 --- /dev/null +++ b/public/components/base/accordions.html @@ -0,0 +1,4295 @@ + + + + + + + + Metronic | Accordions + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Accordions +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Default Accordions +

          +
          +
          +
          +
          + +
          + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Bordered Accordions +

          +
          +
          +
          +
          + +
          + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + +
          + +
          +
          + +
          +
          +
          +
          + +
          +
          +
          +
          +

          + Default Solid Background Accordions +

          +
          +
          +
          +
          + +
          + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Bordered & Solid Background Accordions +

          +
          +
          +
          +
          + +
          + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + +
          + +
          +
          + +
          +
          +
          +
          + +
          +
          +
          +
          +

          + Default State Accordion Examples +

          +
          +
          +
          +
          + +
          + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Bordered State Accordion Examples +

          +
          +
          +
          +
          + +
          + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + + +
          + +
          + + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing + +
          +
          + +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/base/alerts.html b/public/components/base/alerts.html new file mode 100644 index 00000000..a43cdaef --- /dev/null +++ b/public/components/base/alerts.html @@ -0,0 +1,4308 @@ + + + + + + + + Metronic | Alerts + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Alerts +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Basic Contextual Alerts +

          +
          +
          +
          +
          + +
          + + + + + + + +
          + +
          +
          + + +
          +
          +
          +
          +

          + Dismissible Alerts +

          +
          +
          +
          +
          + +
          + + + + + + +
          + +
          +
          + + +
          +
          +
          +
          +

          + Alert Icons & Action Buttons +

          +
          +
          +
          +
          + + + + + + + + +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Alert Styles +

          +
          +
          +
          +
          + +
          +

          + Outline Style +

          +
          + + + + +
          +
          + + +
          +

          + Outline 2x Style +

          +
          + + + + +
          +
          + + +
          +

          + Square Style +

          +
          + + + + + + +
          +
          + + +
          +

          + Air Style +

          +
          + + + + + + + + + +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/base/blockui.html b/public/components/base/blockui.html new file mode 100644 index 00000000..e33b4b53 --- /dev/null +++ b/public/components/base/blockui.html @@ -0,0 +1,4185 @@ + + + + + + + + Metronic | BlockUI + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + BlockUI +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Basic Examples +

          +
          +
          +
          +
          + +
          + + Click below buttons to block below content area: + +
          +

          + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Inceptos imperdiet magna! Sed fusce fames tempus litora venenatis ad: Ac aliquet leo hendrerit taciti viverra? Nisl suscipit potenti accumsan quis ipsum purus cursus. Suspendisse ultrices morbi in purus lectus dictum porta; Commodo penatibus nec. +

          + + + + + +
          +
          + +
          +
          +
          + + +
          +
          +
          +
          +

          + Modal Blocking +

          +
          +
          +
          +
          + +
          + + Click below buttons to block modal content: + +
          + + + + + +
          +
          + +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Portlet Blocking +

          +
          +
          +
          +
          + +
          + + Click below buttons to block this portlet: + +
          + + + + + +
          +
          + +
          +
          +
          + + +
          +
          +
          +
          +

          + Page Blocking +

          +
          +
          +
          +
          + +
          + + Click below buttons to block current page: + +
          + + + + + +
          +
          + +
          +
          +
          + +
          +
          + + + + + + + + + + + + + + + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/base/bootstrap-notify.html b/public/components/base/bootstrap-notify.html new file mode 100644 index 00000000..cd2db730 --- /dev/null +++ b/public/components/base/bootstrap-notify.html @@ -0,0 +1,4535 @@ + + + + + + + + Metronic | Bootstrap Notify + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Bootstrap Notify +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Bootstrap Notify Demo +

          +
          +
          +
          + +
          +
          +
          + +
          + + +
          +
          +
          + +
          + + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +
          +
          +
          + + Display + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/base/dropdown.html b/public/components/base/dropdown.html new file mode 100644 index 00000000..80a6ebb9 --- /dev/null +++ b/public/components/base/dropdown.html @@ -0,0 +1,5390 @@ + + + + + + + + Metronic | Dropdown + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Dropdown +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Basic Examples +

          +
          +
          +
          +
          + +
          + + Metronic Dropdown component allows to build rubost dropdown menus: + +
          +
          +
          + + + +
          +
          + + + + + + +
          +
          + + + +
          +
          + + + +
          +
          +
          +
          + +
          + +
          + + Dropdowns can be toggled via click or hover by setting + + data-dropdown-toggle="hover" + + and + + data-dropdown-toggle="click" + + : + +
          + + +
          +
          + +
          + +
          + + Dropdowns can be shown persistent when toggled by click to avoid closing on mouse click on it + + data-dropdown-persistent="true" + + : + + +
          + +
          +
          + + +
          +
          +
          +
          +

          + Dropdown API +

          +
          +
          +
          +
          + +
          + + Metronic Dropdown component allows to build rubost dropdown menus: + +
          + + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Advance Examples +

          +
          +
          +
          +
          + +
          + + Dropdowns can be aligned to + + left + + , + + center + + and + + right + + : + +
          + + + +
          +
          + +
          + +
          + + Dropdowns support + + small + + , + + medium + + , + + large + + and + + huge + + sizes: + +
          + + +
          + + +
          + +
          +
          + + +
          + + Apply + + m-dropdown--up + + to display dropdown in opposite mode: + +
          + +
          +
          + + +
          + + To display dropdowns without arrow just remove the arrow element from the HTML markup: + + +
          + + +
          + + Dropdowns can contain scrollable long contents: + + +
          + + +
          + + Dropdowns can contain free content such as text, elements or components: + +
          + + +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/base/lists.html b/public/components/base/lists.html new file mode 100644 index 00000000..7b38198f --- /dev/null +++ b/public/components/base/lists.html @@ -0,0 +1,5160 @@ + + + + + + + + Metronic | Lists + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Lists +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Timeline List +

          +
          +
          +
          +
          + +
          +

          + Default Timelime +

          +
          + +
          +
          +
          +
          +
          + + + 12 new users registered and pending for activation + + + Just now + +
          +
          + + + Scheduled system reboot completed + + completed + + + + 14 mins + +
          +
          + + + New order has been planced and pending for processing + + + 20 mins + +
          +
          + + + Database server overloaded 80% and requires quick reboot + + settled + + + + 1 hr + +
          +
          + + + System error occured and hard drive has been shutdown - + + Check + + + + 2 hrs + +
          +
          + + + Production server is rebooting... + + + 3 hrs + +
          +
          +
          +
          +
          + + + + +
          +
          + + +
          +

          + State Colors +

          +
          + +
          +
          +
          +
          +
          + + + 12 new users registered and pending for activation + + + Just now + +
          +
          + + + Scheduled system reboot completed + + completed + + + + 14 mins + +
          +
          + + + New order has been planced and pending for processing + + + 20 mins + +
          +
          + + + Database server overloaded 80% and requires quick reboot + + settled + + + + 1 hr + +
          +
          + + + System error occured and hard drive has been shutdown - + + Check + + + + 2 hrs + +
          +
          + + + Production server is rebooting... + + + 3 hrs + +
          +
          +
          +
          +
          + + + + +
          +
          + + +
          +

          + Item Icons +

          +
          + +
          +
          +
          +
          +
          + + + + 12 new users registered and pending for activation + + + Just now + +
          +
          + + + + Scheduled system reboot completed + + completed + + + + 14 mins + +
          +
          + + + + New order has been planced and pending for processing + + + 20 mins + +
          +
          + + + + Database server overloaded 80% and requires quick reboot + + settled + + + + 1 hr + +
          +
          + + + + System error occured and hard drive has been shutdown - + + Check + + + + 2 hrs + +
          +
          + + + + Production server is rebooting... + + + 3 hrs + +
          +
          +
          +
          +
          + + + + +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Badge List +

          +
          +
          +
          +
          + +
          +

          + Default Badge List +

          +
          + +
          +
          + +
          +
          + 13:00 +
          +
          + + Web Design + + + Programming + + + Illustration + +
          +
          + +
          +
          + +
          +
          + + +
          +

          + Default Badge List On White Background +

          +
          + +
          +
          + +
          +
          + 13:00 +
          +
          + + Web Design + + + Programming + + + Illustration + +
          +
          + +
          +
          + +
          +
          + + +
          +

          + Badge List With State Colors +

          +
          + +
          +
          +
          + +
          +
          + 18:30 +
          +
          + + Web Design + + + Programming + + + Illustration + +
          +
          + +
          +
          +
          + +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + User Pics List +

          +
          +
          +
          +
          + +
          +

          + Default User Pics List +

          + +
          + + +
          +

          + Small User Pics +

          + +
          + +
          +
          + +
          +
          + + + + + + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/base/modal.html b/public/components/base/modal.html new file mode 100644 index 00000000..c77b155f --- /dev/null +++ b/public/components/base/modal.html @@ -0,0 +1,4135 @@ + + + + + + + + Metronic | Modal + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Modal +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Modal Demos +

          +
          +
          +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Basic demo + + +
          + Scrollable fixed content + + +
          + Scrolling long content + + +
          + Tooltips and popovers + + +
          + Large modal + + +
          + Small modal + + +
          +
          +
          + + + + + + + + + + + + + + + + + + + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/base/navs.html b/public/components/base/navs.html new file mode 100644 index 00000000..98b3cf0f --- /dev/null +++ b/public/components/base/navs.html @@ -0,0 +1,4654 @@ + + + + + + + + Metronic | Navs + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Navs +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + + + + +
          +
          +
          +
          +

          + Section and Separator +

          +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          + + + + +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Active and disabled links +

          +
          +
          +
          + +
          + +
          + +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/base/popover.html b/public/components/base/popover.html new file mode 100644 index 00000000..4d7e2a3a --- /dev/null +++ b/public/components/base/popover.html @@ -0,0 +1,3962 @@ + + + + + + + + Metronic | Popover + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Popover +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Basic Examples +

          +
          +
          +
          +
          + +
          +

          + Basic Usage +

          + + Click below button to toggle popover: + +
          + +
          +
          + +
          + +
          +

          + Directions +

          + + Four direction options are available: top, right, bottom, and left aligned: + +
          + + + + +
          +
          + +
          + +
          +

          + Dismiss on next click +

          + + Use the focus trigger to dismiss popovers on the next click that the user makes. + + +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Advanced Examples +

          +
          +
          +
          +
          + +
          +

          + HTML Content +

          + + Insert HTML into the popover: + +
          + +
          +
          + +
          + +
          +

          + Offset +

          + + Offset of the popover relative to its target. For more information refer to + + Tether's offset docs. + + +
          + + + +
          +
          + + +
          +

          + Skin +

          + + Use + + data-skin="light" + + or + + data-skin="dark" + + parameters to set popover skin. Default skin is light. + +
          + + +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/base/progress.html b/public/components/base/progress.html new file mode 100644 index 00000000..4bbcd57c --- /dev/null +++ b/public/components/base/progress.html @@ -0,0 +1,4112 @@ + + + + + + + + Metronic | Progress + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Progress +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Basic Progress Bars +

          +
          +
          +
          +
          + +
          + + Progress components are built with two HTML elements, some CSS to set the width, and a few attributes. + +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Customizing +

          +
          +
          +
          +
          + + +
          +
          +
          +
          +

          + Sizing +

          +
          +
          +
          +
          + +
          +

          + Sizing +

          + + Use + + .m-progress--sm + + class to change progress size to small: + +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + + Use + + .m-progress--lg + + class to change progress size to large: + +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +

          + Custom Height +

          + + Set a height value on the + + .progress-bar + + , so if you change that value the outer + + .progress + + will automatically resize accordingly. + +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Progress States +

          +
          +
          +
          +
          + +
          +

          + Backgrounds +

          + + Use state utility classes to change the appearance of individual progress bars. + +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + + +
          +

          + Multiple bars +

          + + Include multiple progress bars in a progress component if you need. + +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Striped +

          +
          +
          +
          +
          + +
          + + Add + + .progress-bar-striped + + to any + + .progress-bar + + to apply a stripe via CSS gradient over the progress bar’s background color. + +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + + The striped gradient can also be animated. Add + + .progress-bar-animated + + to + + .progress-bar + + to animate the stripes right to left via CSS3 animations. + +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/base/scrollable.html b/public/components/base/scrollable.html new file mode 100644 index 00000000..36458e3e --- /dev/null +++ b/public/components/base/scrollable.html @@ -0,0 +1,4016 @@ + + + + + + + + Metronic | Scrollable + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Scrollable +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Basic Example +

          +
          +
          +
          +
          +
          +

          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +

          +

          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +

          +

          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +

          +
          +
          +
          + + +
          +
          +
          +
          +

          + Show Scrollbar +

          +
          +
          +
          +
          +
          +

          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +

          +

          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +

          +

          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +

          +
          +
          +
          + + +
          +
          +
          +
          +

          + Scrollable Modal Contents +

          +
          +
          +
          +
          + +
          + + Click below buttons to check scrollable modal content: + +
          + +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Horizontal Scrollbar +

          +
          +
          +
          +
          +
          +
          +

          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +

          +

          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +

          +

          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +

          +
          +
          +
          +
          + + +
          +
          +
          +
          +

          + Horizontal & Vertical Scrollbars +

          +
          +
          +
          +
          +
          +
          +

          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +

          +

          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +

          +

          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +

          +

          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +

          +

          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +

          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/base/spinners.html b/public/components/base/spinners.html new file mode 100644 index 00000000..437479fe --- /dev/null +++ b/public/components/base/spinners.html @@ -0,0 +1,3981 @@ + + + + + + + + Metronic | Spinners + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + spinners +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Loaders +

          +
          +
          +
          +
          + + + + + + + + + + + + + + + + + + + + + +
          + Basic loader + +
          +
          + Loader states + +
          +
          +
          +
          +
          +
          +
          + Loader sizing + +
          +
          +
          +
          + Using on inputs + +
          + +
          +
          +
          + +
          +
          + Using on buttons + + + Button + + + Button + + + Button + +
          + + Button + + + Button + + + Button + +
          + + Button + + + Button + + + Button + +
          + + Button + + + Button + + + Button + +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Default Spinner +

          +
          +
          +
          +
          + + + + + + + + + + + + + + + + + +
          + Basic spinner + +
          +
          + Spinner states + +
          +
          +
          +
          +
          +
          +
          + Small Size + +
          +
          +
          +
          +
          +
          +
          + Large Size + +
          +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/base/stack.html b/public/components/base/stack.html new file mode 100644 index 00000000..88cd7483 --- /dev/null +++ b/public/components/base/stack.html @@ -0,0 +1,4281 @@ + + + + + + + + Metronic | Stack + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Stack +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Base Stack Examples +

          +
          +
          +
          +
          + +
          + + Metronic's Stack allows building an equal height flexbile blocks easily: + +
          +
          +
          +
          +
          + Item 1 +
          +
          + Item 2 +
          +
          + Item 3 +
          +
          + Item 4 +
          +
          +
          +
          +
          + + Item vertical and horizontal aligments done super easy: + +
          +
          +
          +
          +
          + Left aligment +
          +
          + Center aligment +
          +
          + Right aligment +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + Top aligment +
          +
          + Middle aligment +
          +
          + Bottom aligment +
          +
          +
          +
          +
          + + Enable any number of fixed and fluid height items: + +
          +
          +
          +
          +
          + Fixed width - 120px +
          +
          + Fluid width - 100% +
          +
          + Fluid width - 100% +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + Fixed width - 150px +
          +
          + Fluid width - 100% +
          +
          + Fixed width - 150px +
          +
          +
          +
          +
          + + Default stack comes with fluid width + + width: 100% + + . With inline stack option you can have + + width:auto + + stack: + +
          +
          +
          +
          +
          + Free content +
          +
          + Free content +
          +
          + Longer free content +
          +
          +
          +
          +
          + + Unlimited level of nesting supported: + +
          +
          +
          +
          +
          + Item +
          +
          + Item +
          +
          + Item +
          +
          + Item +
          +
          +
          +
          + Item +
          +
          + Item +
          +
          + Item +
          +
          + Item +
          +
          + Item +
          +
          + Item +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          + + + +

          + Responsive Modes +

          +
          +
          +
          +
          + +
          + + You can set responsive mode to your stack by just enabling one of responsive mode with special classes + + m-stack--general + + , + + m-stack--desktop + + , + + m-stack--tablet + + , + + m-stack--desktop-and-tablet + + , + + m-stack--mobile + + , + + m-stack--tablet-and-mobile + + . + When + + m-stack--general + + mode used the stack mode will remain but with other modes, for example with + + m-stack--tablet + + the stack mode will be activate within the device width and outside the device with the stack will be have just normal block tag. + +
          +
          +
          + + m-stack--general: + +
          +
          +
          + Top +
          +
          + Middle +
          +
          + Bottom +
          +
          +
          +
          +
          +
          + + m-stack--desktop: + +
          +
          +
          + Top +
          +
          + Middle +
          +
          + Bottom +
          +
          +
          +
          +
          +
          + + m-stack--tablet: + +
          +
          +
          + Top +
          +
          + Middle +
          +
          + Bottom +
          +
          +
          +
          +
          +
          + + m-stack--mobile: + +
          +
          +
          + Top +
          +
          + Middle +
          +
          + Bottom +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Horizontal Stack Examples +

          +
          +
          +
          +
          + +
          + + Metronic's Stack allows building an equal height flexbile blocks easily: + +
          +
          +
          +
          +
          +
          + Item 1 +
          +
          +
          +
          + Item 2 +
          +
          +
          +
          + Item 3 +
          +
          +
          +
          + Item 4 +
          +
          +
          +
          +
          +
          + + Item vertical and horizontal aligments done super easy: + +
          +
          +
          +
          +
          +
          + Left aligment +
          +
          +
          +
          + Center aligment +
          +
          +
          +
          + Right aligment +
          +
          +
          +
          +
          +
          + + Enable any number of fixed and fluid width items: + +
          +
          +
          +
          +
          +
          + Fixed height - 100px +
          +
          +
          +
          + Fluid height - 100% +
          +
          +
          +
          + Fixed height - 100px +
          +
          +
          +
          +
          +
          + + Nested horizontal and vertical stacks: + +
          +
          +
          +
          +
          +
          +
          + Item +
          +
          + Item +
          +
          + Item +
          +
          +
          +
          +
          +
          + Item +
          +
          + Item +
          +
          + Item +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/base/state.html b/public/components/base/state.html new file mode 100644 index 00000000..49f1e7eb --- /dev/null +++ b/public/components/base/state.html @@ -0,0 +1,4265 @@ + + + + + + + + Metronic | State Colors + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + State Colors +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + State Colors +

          +
          +
          +
          +
          + +
          + + Metronic comes with a number of state colors that can be applied to the most of elements and components. It reuses Bootstrap's original 6 states: + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + State + + Preview + + Class postfix + + Usage example +
          + Success + + + + + *-success + + + + btn-success + + + m--font-success + +
          + Warning + + + + + *-warning + + + + btn-warning + + + m--font-warning + +
          + Danger + + + + + *-danger + + + + btn-danger + + + m--font-danger + +
          + Info + + + + + *-info + + + + btn-info + + + m--font-info + +
          + Primary + + + + + *-primary + + + + btn-primary + + + m--font-primary + +
          + Secondary + + + + + *-secondary + + + + btn-secondary + + +m--font-secondary + +
          +
          +
          + + And also adds its own + + brand + +and + +metal + +states: + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + State + + Preview + + Class addon + + Usage example +
          + Brand + + + + + *-brand + + + + btn-success + + + m--font-brand + +
          + Accent + + + + + *-accent + + + + btn-accent + + +m--font-accent + +
          + Focus + + + + + *-focus + + + + btn-focus + + +m--font-focus + +
          + Metal + + + + + *-metal + + + + btn-metal + + +m--font-metal + +
          + Light + + + + + *-light + + + + btn-light + + +m--font-light + +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + State Examples +

          +
          +
          +
          +
          + +
          + + Apply state classes to any typography element: + +
          +
          +
          + + Success state text + + + Warning state text + + + Info state text + + + Danger state text + + + Primary state text + + + Focus state text + +
          +
          +
          + + Apply state classes to any component: + + +
          +
          +
          + + new + + + pending + + + 203 + + + hot + + + fixed + + + in process + + + completed + + + focus + + + accent + +
          +
          +
          +
          +
          +
          + + +
          +
          + 25% +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/base/sweetalert2.html b/public/components/base/sweetalert2.html new file mode 100644 index 00000000..7185ec5c --- /dev/null +++ b/public/components/base/sweetalert2.html @@ -0,0 +1,3965 @@ + + + + + + + + Metronic | SweetAlert2 + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + SweetAlert2 +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + SweetAlert Examples +

          +
          +
          +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Basic alert + + +
          + Alert title and text + + +
          + Enable + + warning + + , + + error + + , + + success + + , + + info + + and + + question + + state icons + + + + + + +
          + Change confirm button text and class + + +
          + Custom button with icon + + +
          + A custom positioned dialog with timer to auto close + + +
          + jQuery HTML with custom animate.css animation + + +
          + A warning message, with a function attached to the confirm button + + +
          + By passing a parameter, you can execute something else for cancel + + +
          + A message with a custom image and CSS animation disabled + + +
          + A message with auto close timer + + +
          +
          +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/base/tables.html b/public/components/base/tables.html new file mode 100644 index 00000000..9c280fb2 --- /dev/null +++ b/public/components/base/tables.html @@ -0,0 +1,5300 @@ + + + + + + + + Metronic | Tables + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Tables +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Basic Tables +

          +
          +
          +
          +
          + +
          + + Using the most basic table markup, here’s how tables look in Metronic: + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          +
          +
          + + +
          + + You can also invert the colors—with light text on dark backgrounds—with + + .table-inverse + + . + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          +
          +
          + +
          + +
          + + +
          +
          +
          +
          +

          + Table Head Options +

          +
          +
          +
          +
          + +
          + + Similar to default and inverse tables, use one of two modifier classes to make <thead>s appear light or dark gray. + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          +
          +
          + + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          +
          +
          + + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Small Table +

          +
          +
          +
          +
          + +
          + + Add + + .table-sm + + to make tables more compact by cutting cell padding in half. + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Striped Rows +

          +
          +
          +
          +
          + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          +
          +
          + +
          + +
          + + +
          +
          +
          +
          +

          + Bordered Table +

          +
          +
          +
          +
          + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          +
          +
          + +
          + +
          + + +
          +
          +
          +
          +

          + Hoverable Table +

          +
          +
          +
          +
          + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          +
          +
          + +
          + +
          + +
          +
          + +
          +
          +
          +
          +

          + Table Head States +

          +
          +
          +
          +
          + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          +
          +
          + + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          +
          +
          + + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          +
          +
          + + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          +
          +
          + +
          + +
          + + +
          +
          +
          +
          +

          + Table Bordered States +

          +
          +
          +
          +
          + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          +
          +
          + + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          +
          +
          + + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          +
          +
          + +
          + +
          + + +
          +
          +
          +
          +

          + Table Row States +

          +
          +
          +
          +
          + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + First Name + + Last Name + + Username +
          + 1 + + Jhon + + Stone + + @jhon +
          + 2 + + Lisa + + Nilson + + @lisa +
          + 3 + + Larry + + the Bird + + @twitter +
          + 4 + + Nick + + looper + + @king +
          + 5 + + Joan + + thestar + + @joan +
          + 6 + + Sean + + coder + + @coder +
          +
          +
          + +
          + +
          + + +
          +
          +
          +
          +

          + Responsive tables +

          +
          +
          +
          +
          + +
          +
          + Create responsive tables by adding + + .table-responsive + + to any + + .table + + to make them scroll horizontally on small devices (under 768px) +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + # + + Table heading + + Table heading + + Table heading + + Table heading + + Table heading + + Table heading +
          + 1 + + Table cell + + Table cell + + Table cell + + Table cell + + Table cell + + Table cell +
          + 2 + + Table cell + + Table cell + + Table cell + + Table cell + + Table cell + + Table cell +
          + 3 + + Table cell + + Table cell + + Table cell + + Table cell + + Table cell + + Table cell +
          +
          +
          + +
          + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/base/tabs/bootstrap.html b/public/components/base/tabs/bootstrap.html new file mode 100644 index 00000000..1d70e507 --- /dev/null +++ b/public/components/base/tabs/bootstrap.html @@ -0,0 +1,4508 @@ + + + + + + + + Metronic | Bootstrap Tabs + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Bootstrap Tabs +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Basic Tabs +

          +
          +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and +
          +
          +
          +
          + + +
          +
          +
          +
          +

          + Icon Tabs +

          +
          +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and +
          +
          +
          +
          + + +
          +
          +
          +
          +

          + Adjusted Tabs +

          +
          +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Pills +

          +
          +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and +
          +
          +
          +
          + + +
          +
          +
          +
          +

          + Pill Icon Tabs +

          +
          +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and +
          +
          +
          +
          + + +
          +
          +
          +
          +

          + Pill States +

          +
          +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. +
          +
          +
          +
          + + +
          +
          +
          +
          +

          + Adjusted Pills +

          +
          +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/base/tabs/line.html b/public/components/base/tabs/line.html new file mode 100644 index 00000000..3b3c795f --- /dev/null +++ b/public/components/base/tabs/line.html @@ -0,0 +1,4410 @@ + + + + + + + + Metronic | Line Tabs + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Line Tabs +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Default Line Tabs +

          +
          +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged +
          +
          +
          +
          + + +
          +
          +
          +
          +

          + Line Tabs States +

          +
          +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scramble. +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scramble. +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scramble. +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scramble. +
          +
          +
          +
          + + +
          +
          +
          +
          +

          + Bold Line Tabs +

          +
          +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Icon Tabs +

          +
          +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. +
          +
          +
          + +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. +
          +
          +
          +
          + + +
          +
          +
          +
          +

          + Portlet Tabs +

          +
          +
          + +
          +
          +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged +
          +
          +
          +
          + + +
          + +
          +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged +
          +
          +
          +
          + + +
          + +
          +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
          +
          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/base/toastr.html b/public/components/base/toastr.html new file mode 100644 index 00000000..0b21c3a3 --- /dev/null +++ b/public/components/base/toastr.html @@ -0,0 +1,4034 @@ + + + + + + + + Metronic | Toastr + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Toastr +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Toastr Notifications Examples +

          +
          +
          +
          + +
          +
          +
          +
          +
          + + +
          +
          + + +
          +
          +
          + + + + + + + +
          +
          +
          +
          +
          + +
          + + + + +
          +
          +
          + +
          + + + + + + + + +
          +
          +
          +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          +
          +
          +
          +
          +
          +													Output:
          +												
          +
          +
          +
          +
          + +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/base/tooltip.html b/public/components/base/tooltip.html new file mode 100644 index 00000000..bfde072e --- /dev/null +++ b/public/components/base/tooltip.html @@ -0,0 +1,3964 @@ + + + + + + + + Metronic | Tooltip + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Tooltip +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Basic Examples +

          +
          +
          +
          +
          + +
          +

          + Basic Usage +

          + + Click below button to toggle tooltip: + +
          + +
          +
          + +
          + +
          +

          + Directions +

          + + Four direction options are available: top, right, bottom, and left aligned: + +
          + +
          + +
          + +
          + +
          +
          + +
          + +
          +

          + Dismiss on next click +

          + + Use the focus trigger to dismiss tooltips on the next click that the user makes. + + +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Advanced Examples +

          +
          +
          +
          +
          + +
          +

          + HTML Content +

          + + Insert HTML into the tooltip: + +
          + +
          +
          + +
          + +
          +

          + Offset +

          + + Offset of the tooltip relative to its target. For more information refer to + + Tether's offset docs. + + +
          + + + +
          +
          + + +
          +

          + Skin +

          + + Use + + data-skin="light" + + or + + data-skin="dark" + + parameters to set tooltip skin. Default skin is light. + +
          + + +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/base/treeview.html b/public/components/base/treeview.html new file mode 100644 index 00000000..9b3e7c8b --- /dev/null +++ b/public/components/base/treeview.html @@ -0,0 +1,3984 @@ + + + + + + + + Metronic | Treeview + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Treeview +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Basic Tree +

          +
          +
          +
          +
          +
          + +
          +
          + Note! Opened and selected nodes will be saved in the user's browser, so when returning to the same tree the previous state will be restored. +
          +
          +
          + + +
          +
          +
          +
          +

          + Custom Icons & Clickable Nodes +

          +
          +
          +
          +
          +
          + +
          +
          +
          + + +
          +
          +
          +
          +

          + Checkable Tree +

          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Contextual Menu +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +

          + Drag & Drop +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +

          + Ajax Data +

          +
          +
          +
          +
          +
          +
          + Note! The tree nodes are loaded from server side demo script via ajax. +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/base/typography.html b/public/components/base/typography.html new file mode 100644 index 00000000..aee0514d --- /dev/null +++ b/public/components/base/typography.html @@ -0,0 +1,4528 @@ + + + + + + + + Metronic | Typography + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Typography +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Heading +

          +
          +
          +
          +
          + +
          +

          + Default headings +

          + + All HTML headings, + + <h1> + + through + + <h6> + + , are available. + +
          +
          +
          +
          +
          +

          + h1. Heading 1 +

          +
          +

          + h2. Heading 2 +

          +
          +

          + h3. Heading 3 +

          +
          +

          + h4. Heading 4 +

          +
          +
          + h5. Heading 5 +
          +
          +
          + h6. Heading 6 +
          +
          +
          +

          + h1. Heading 1 +

          +
          +

          + h2. Heading 2 +

          +
          +

          + h3. Heading 3 +

          +
          +

          + h4. Heading 4 +

          +
          +
          + h5. Heading 5 +
          +
          +
          + h6. Heading 6 +
          +
          +
          +
          +
          +
          +
          + + +
          +

          + Customizing headings +

          + + Use the included utility classes to recreate the small secondary heading text. + +
          +
          +
          +

          + Fancy display heading + + With faded secondary text + +

          +
          +
          +
          +
          + + +
          +

          + Display headings +

          + + Larger, slightly more opinionated heading styles. + +
          +
          +
          +

          + Display 1 +

          +

          + Display 2 +

          +

          + Display 3 +

          +
          +
          +
          +
          + + +
          +

          + Lead +

          + + Make a paragraph stand out by adding + + .lead + + . + +
          +
          +
          +

          + Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus. +

          +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          + + + +

          + General +

          +
          +
          +
          +
          + +
          +

          + Inline text elements +

          + + Styling for common inline HTML5 elements. + +
          +
          +
          +

          + You can use the mark tag to + + highlight + + text. +

          +

          + + This line of text is meant to be treated as deleted text. + +

          +

          + + This line of text is meant to be treated as no longer accurate. + +

          +

          + + This line of text is meant to be treated as an addition to the document. + +

          +

          + + This line of text will render as underlined + +

          +

          + + This line of text is meant to be treated as fine print. + +

          +

          + + This line rendered as bold text. + +

          +

          + + This line rendered as italicized text. + +

          +
          +
          +
          +
          + + +
          +

          + Abbreviations +

          + + Stylized implementation of HTML’s + + <abbr> + + element. + +
          +
          +
          +

          + + attr + +

          +

          + + HTML + +

          +
          +
          +
          +
          + + +
          +

          + Blockquotes +

          + + Quoting blocks of content. + +
          +
          +
          +
          +

          + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante. +

          +
          + Someone famous in + + Source Title + +
          +
          +
          +

          + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante. +

          +
          + Someone famous in + + Source Title + +
          +
          +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          + + + +

          + Badges +

          +
          +
          +
          +
          + +
          +

          + Basic Badges +

          + + Basic state color badges + +
          +
          +
          + + 3 + + + 4 + + + 7 + + + 8 + + + 11 + + + 2 + + + 5 + +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Text +

          +
          +
          +
          +
          + +
          +

          + Basic text +

          + + Basic text examples + +
          +
          +
          +

          + + Example text + +

          +

          + + Example bold text + +

          +

          + + Example bolder text + +

          +

          + + Example boldest text + +

          +

          + + Example uppercase text + +

          +
          +
          +
          + + State colors + +
          +
          +
          +

          + + Success state text + +

          +

          + + Warning state text + +

          +

          + + Info state text + +

          +

          + + Danger state text + +

          +

          + + Primary state text + +

          +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          + + + +

          + Links +

          +
          +
          +
          +
          + + + +
          +
          + + +
          +
          +
          +
          + + + +

          + Badges +

          +
          +
          +
          +
          + +
          +

          + Basic Badges +

          + + Basic state color badges + +
          +
          +
          + + 3 + + + 4 + + + 7 + + + 8 + + + 11 + + + 2 + + + 5 + +
          +
          +
          +
          + + +
          +

          + Dot Badges +

          + + State color dot badges + +
          +
          +
          + + + + + + + +
          + Pending + + Caption + + Heading + + Status + +
          + Pending + + Caption + + Heading + + Status + +
          +
          +
          +
          + + +
          +

          + Wide Badges +

          + + Wide badges for longer text + +
          +
          +
          + + new + + + pending + + + 203 + + + hot + + + fixed + + + in process + + + completed + +
          +
          +
          +
          + + +
          +

          + Rounded Badges +

          + + Rounded badges examples + +
          +
          +
          + + new + + + pending + + + 203 + + + hot + + + fixed + + + in process + + + completed + +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/buttons/base/air.html b/public/components/buttons/base/air.html new file mode 100644 index 00000000..084deb4e --- /dev/null +++ b/public/components/buttons/base/air.html @@ -0,0 +1,4749 @@ + + + + + + + + Metronic | Air Style + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Air Style +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Base Buttons +

          +
          +
          +
          +
          + +
          + + Bootstrap state buttons + +
          +
          +
          + + + + + + + +
          +
          +
          + + Bootstrap gradient state buttons + +
          +
          +
          + + + + + +
          +
          +
          + + Metronic custom state buttons + +
          +
          +
          + + + + +
          +
          +
          + + Metronic gradient state buttons + +
          +
          +
          + + + + + +
          +
          +
          + + The + + .btn + + classes are designed to be used with + + <button> + + , + + <a> + + and + + <input> + + elements. + +
          +
          +
          + + Link + + + + + + + Metal + + +
          +
          +
          + + Wide bootstrap buttons + +
          +
          +
          + + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Outline Buttons +

          +
          +
          +
          +
          + +
          + + Bootstrap outline buttons + +
          +
          +
          + + + + + +
          + + + +
          +
          +
          +
          + + +
          + + Bootstrap outline 2x buttons + +
          +
          +
          + + + + + +
          + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Metronic Buttons +

          +
          +
          +
          +
          + +
          + + Metronic style solid buttons + +
          +
          +
          + + + + + + + + +
          + + + + + + + + +
          + + + + + + + + +
          +
          +
          +
          + + +
          + + Metronic style outline buttons + +
          +
          +
          + + + + + + + + +
          + + + + + + + + +
          + + + + + + + + +
          + + + + + + + + +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Button Sizes +

          +
          +
          +
          +
          + +
          + + Add + + .btn-lg + + or + + .btn-sm + + for additional sizes. + +
          +
          +
          + + + + +
          +
          +
          +
          + + + + +
          +
          +
          +
          + + + + + +
          +
          +
          +
          + + +
          + + Metronic style buttons sizing + +
          +
          +
          + + + +
          +
          +
          +
          + + + +
          +
          +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Button States +

          +
          +
          +
          +
          + +
          + + Add + + .active + + for active state and + + .disabled + + class or + + disabled="disabled" + + attribute + +
          +
          +
          + + + + + + +
          + + + + + + + +
          + + + + + + +
          +
          +
          +
          + + + + + + +
          + + + + + + + +
          + + + + + + +
          +
          +
          +
          + + + + +
          + + + + +
          + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Block Buttons +

          +
          +
          +
          +
          + +
          + + Bootstrap block buttons span the full width of a parent + +
          +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Checkbox and radio buttons +

          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          +
          +
          +
          +
          +
          + + + + +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/buttons/base/default.html b/public/components/buttons/base/default.html new file mode 100644 index 00000000..fbddb1f3 --- /dev/null +++ b/public/components/buttons/base/default.html @@ -0,0 +1,4771 @@ + + + + + + + + Metronic | Default Style + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Default Style +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Base Buttons +

          +
          +
          +
          +
          + +
          + + Bootstrap state buttons + +
          +
          +
          + + + + + + + +
          +
          +
          + + Bootstrap gradient state buttons + +
          +
          +
          + + + + + +
          +
          +
          + + Metronic custom state buttons + +
          +
          +
          + + + + +
          +
          +
          + + Metronic gradient state buttons + +
          +
          +
          + + + + + +
          +
          +
          + + The + + .btn + + classes are designed to be used with + + <button> + + , + + <a> + + and + + <input> + + elements. + +
          +
          +
          + + Link + + + + + + + Metal + + +
          +
          +
          + + Wide bootstrap buttons + +
          +
          +
          + + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Outline Buttons +

          +
          +
          +
          +
          + +
          + + Bootstrap outline buttons + +
          +
          +
          + + + + + +
          + + + +
          +
          +
          +
          + + +
          + + Bootstrap outline 2x buttons + +
          +
          +
          + + + + + +
          + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Metronic Buttons +

          +
          +
          +
          +
          + +
          + + Metronic style solid buttons + +
          +
          +
          + + + + + + + + +
          + + + + + + + + +
          + + + + + + + + +
          +
          +
          +
          + + +
          + + Metronic style outline buttons + +
          +
          +
          + + + + + + + + +
          + + + + + + + + +
          + + + + + + + + +
          + + + + + + + + +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Button Sizes +

          +
          +
          +
          +
          + +
          + + Add + + .btn-lg + + or + + .btn-sm + + for additional sizes. + +
          +
          +
          + + + + +
          +
          +
          +
          + + + + +
          +
          +
          +
          + + + + + +
          +
          +
          +
          + + +
          + + Metronic style buttons sizing + +
          +
          +
          + + + +
          +
          +
          +
          + + + +
          +
          +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Button States +

          +
          +
          +
          +
          + +
          + + Add + + .active + + for active state and + + .disabled + + class or + + disabled="disabled" + + attribute + +
          +
          +
          + + + + + + +
          + + + + + + + +
          + + + + + + +
          +
          +
          +
          + + + + + + +
          + + + + + + + +
          + + + + + + +
          +
          +
          +
          + + + + +
          + + + + +
          + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Block Buttons +

          +
          +
          +
          +
          + +
          + + Bootstrap block buttons span the full width of a parent + +
          +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Checkbox and radio buttons +

          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + +
          +
          +
          +
          +
          +
          + + + +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/buttons/base/pill.html b/public/components/buttons/base/pill.html new file mode 100644 index 00000000..1c44d7e9 --- /dev/null +++ b/public/components/buttons/base/pill.html @@ -0,0 +1,4749 @@ + + + + + + + + Metronic | Pill Style + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Pill Style +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Base Buttons +

          +
          +
          +
          +
          + +
          + + Bootstrap state buttons + +
          +
          +
          + + + + + + + +
          +
          +
          + + Bootstrap gradient state buttons + +
          +
          +
          + + + + + +
          +
          +
          + + Metronic custom state buttons + +
          +
          +
          + + + + +
          +
          +
          + + Metronic gradient state buttons + +
          +
          +
          + + + + + +
          +
          +
          + + The + + .btn + + classes are designed to be used with + + <button> + + , + + <a> + + and + + <input> + + elements. + +
          +
          +
          + + Link + + + + + + + Metal + + +
          +
          +
          + + Wide bootstrap buttons + +
          +
          +
          + + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Outline Buttons +

          +
          +
          +
          +
          + +
          + + Bootstrap outline buttons + +
          +
          +
          + + + + + +
          + + + +
          +
          +
          +
          + + +
          + + Bootstrap outline 2x buttons + +
          +
          +
          + + + + + +
          + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Metronic Buttons +

          +
          +
          +
          +
          + +
          + + Metronic style solid buttons + +
          +
          +
          + + + + + + + + +
          + + + + + + + + +
          + + + + + + + + +
          +
          +
          +
          + + +
          + + Metronic style outline buttons + +
          +
          +
          + + + + + + + + +
          + + + + + + + + +
          + + + + + + + + +
          + + + + + + + + +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Button Sizes +

          +
          +
          +
          +
          + +
          + + Add + + .btn-lg + + or + + .btn-sm + + for additional sizes. + +
          +
          +
          + + + + +
          +
          +
          +
          + + + + +
          +
          +
          +
          + + + + + +
          +
          +
          +
          + + +
          + + Metronic style buttons sizing + +
          +
          +
          + + + +
          +
          +
          +
          + + + +
          +
          +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Button States +

          +
          +
          +
          +
          + +
          + + Add + + .active + + for active state and + + .disabled + + class or + + disabled="disabled" + + attribute + +
          +
          +
          + + + + + + +
          + + + + + + + +
          + + + + + + +
          +
          +
          +
          + + + + + + +
          + + + + + + + +
          + + + + + + +
          +
          +
          +
          + + + + +
          + + + + +
          + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Block Buttons +

          +
          +
          +
          +
          + +
          + + Bootstrap block buttons span the full width of a parent + +
          +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Checkbox and radio buttons +

          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          +
          +
          +
          +
          +
          + + + + +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/buttons/base/square.html b/public/components/buttons/base/square.html new file mode 100644 index 00000000..84308184 --- /dev/null +++ b/public/components/buttons/base/square.html @@ -0,0 +1,4749 @@ + + + + + + + + Metronic | Square Style + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Square Style +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +

          + Base Buttons +

          +
          +
          +
          +
          + +
          + + Bootstrap state buttons + +
          +
          +
          + + + + + + + +
          +
          +
          + + Bootstrap gradient state buttons + +
          +
          +
          + + + + + +
          +
          +
          + + Metronic custom state buttons + +
          +
          +
          + + + + +
          +
          +
          + + Metronic gradient state buttons + +
          +
          +
          + + + + + +
          +
          +
          + + The + + .btn + + classes are designed to be used with + + <button> + + , + + <a> + + and + + <input> + + elements. + +
          +
          +
          + + Link + + + + + + + Metal + + +
          +
          +
          + + Wide bootstrap buttons + +
          +
          +
          + + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Outline Buttons +

          +
          +
          +
          +
          + +
          + + Bootstrap outline buttons + +
          +
          +
          + + + + + +
          + + + +
          +
          +
          +
          + + +
          + + Bootstrap outline 2x buttons + +
          +
          +
          + + + + + +
          + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Metronic Buttons +

          +
          +
          +
          +
          + +
          + + Metronic style solid buttons + +
          +
          +
          + + + + + + + + +
          + + + + + + + + +
          + + + + + + + + +
          +
          +
          +
          + + +
          + + Metronic style outline buttons + +
          +
          +
          + + + + + + + + +
          + + + + + + + + +
          + + + + + + + + +
          + + + + + + + + +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Button Sizes +

          +
          +
          +
          +
          + +
          + + Add + + .btn-lg + + or + + .btn-sm + + for additional sizes. + +
          +
          +
          + + + + +
          +
          +
          +
          + + + + +
          +
          +
          +
          + + + + + +
          +
          +
          +
          + + +
          + + Metronic style buttons sizing + +
          +
          +
          + + + +
          +
          +
          +
          + + + +
          +
          +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Button States +

          +
          +
          +
          +
          + +
          + + Add + + .active + + for active state and + + .disabled + + class or + + disabled="disabled" + + attribute + +
          +
          +
          + + + + + + +
          + + + + + + + +
          + + + + + + +
          +
          +
          +
          + + + + + + +
          + + + + + + + +
          + + + + + + +
          +
          +
          +
          + + + + +
          + + + + +
          + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Block Buttons +

          +
          +
          +
          +
          + +
          + + Bootstrap block buttons span the full width of a parent + +
          +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +

          + Checkbox and radio buttons +

          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          +
          +
          +
          +
          +
          + + + + +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/buttons/dropdown.html b/public/components/buttons/dropdown.html new file mode 100644 index 00000000..93b88a7d --- /dev/null +++ b/public/components/buttons/dropdown.html @@ -0,0 +1,4832 @@ + + + + + + + + Metronic | Button Group + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Button Group +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Dropdown Button +

          +
          +
          +
          +
          + +
          +

          + Basic Example +

          + + Single button dropdowns + +
          +
          +
          +
          + + + +
          +
          +
          +
          + + Dropdown menu with icons + +
          + +
          + + Button state dropdowns + + + + Single button dropdowns + +
          +
          +
          +
          + + + +
          + +
          + + + +
          + +
          + + + +
          + +
          + + + +
          + +
          +
          +
          +
          + + +
          +

          + Sizing +

          + + Button dropdowns work with buttons of all sizes, including default and split dropdown buttons. + +
          + +
          +
          + + +
          +

          + Dropup variation +

          + + Trigger dropdown menus above elements by adding + + .dropup + + to the parent element. + +
          +
          + +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Dropdown Button +

          +
          +
          +
          +
          + +
          +

          + Menu items +

          + + You can optionally use + + button + + elements in your dropdowns instead + +
          +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          + + +
          +

          + Menu alignment +

          + + Add + + .dropdown-menu-right + + to a + + .dropdown-menu + + to right align the dropdown menu. + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          +
          + + +
          +

          + Menu headers +

          + + Add a header to label sections of actions in any dropdown menu. + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          + + +
          +

          + Menu dividers +

          + + Separate groups of related menu items with a divider. + + +
          + + +
          +

          + Disabled Menu Items +

          + + Add + + .disabled + + to items in the dropdown to style them as disabled. + +
          +
          +
          + +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/buttons/group.html b/public/components/buttons/group.html new file mode 100644 index 00000000..3a9ca082 --- /dev/null +++ b/public/components/buttons/group.html @@ -0,0 +1,5281 @@ + + + + + + + + Metronic | Button Group + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Button Group +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Base Buttons +

          +
          +
          + +
          +
          + +
          + +
          + +
          +

          + Basic example +

          + + Basic button group examples + +
          + +
          +
          +
          +
          +
          + + + +
          +
          +
          +
          + + + +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + + + +
          +
          +
          +
          + + + +
          +
          +
          +
          +
          + +
          +
          + + +
          +

          + Buttons toolbar +

          + + Combine sets of + + btn-group + + into a + + btn-toolbar + + for more complex components. + +
          + +
          +
          + +
          +
          + + +
          +
          + + +
          +
          + +
          +
          + + +
          +

          + Sizing +

          + + Instead of applying button sizing classes to every button in a group, just add + + .btn-group-* + + to each + + .btn-group + + , including each one when nesting multiple groups. + +
          + +
          +
          +
          + + + +
          +
          +
          + + + +
          +
          +
          + + + +
          +
          +
          + +
          +
          + + +
          +

          + Nesting +

          + + Place a .btn-group within another + + .btn-group + + when you want dropdown menus mixed with a series of buttons. + +
          + +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          + + +
          +

          + Vertical +

          + + Make a set of buttons appear vertically stacked rather than horizontally + +
          + +
          +
          +
          + + + + +
          +
          +
          + +
          +
          + +
          + + +
          + +
          +

          + Basic example +

          + + Basic button group examples + +
          + +
          +
          +
          +
          +
          + + + +
          +
          +
          +
          + + + +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + + + +
          +
          +
          +
          + + + +
          +
          +
          +
          +
          + +
          +
          + + +
          +

          + Buttons toolbar +

          + + Combine sets of + + btn-group + + into a + + btn-toolbar + + for more complex components. + +
          + +
          +
          + +
          +
          + + +
          +
          + + +
          +
          + +
          +
          + + +
          +

          + Sizing +

          + + Instead of applying button sizing classes to every button in a group, just add + + .btn-group-* + + to each + + .btn-group + + , including each one when nesting multiple groups. + +
          + +
          +
          +
          + + + +
          +
          +
          + + + +
          +
          +
          + + + +
          +
          +
          + +
          +
          + + +
          +

          + Nesting +

          + + Place a .btn-group within another + + .btn-group + + when you want dropdown menus mixed with a series of buttons. + +
          + +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          + + +
          +

          + Vertical +

          + + Make a set of buttons appear vertically stacked rather than horizontally + +
          + +
          +
          +
          + + + + +
          +
          +
          + +
          +
          + +
          + +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Custom Buttons +

          +
          +
          + +
          +
          + +
          + +
          + +
          +

          + Basic example +

          + + Basic button group examples + +
          + +
          +
          +
          +
          +
          + + + +
          +
          +
          +
          + + + +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + + + +
          +
          +
          +
          + + + +
          +
          +
          +
          +
          + +
          +
          + + +
          +

          + Buttons toolbar +

          + + Combine sets of + + m-btn-group m-btn-group--pill btn-group + + into a + + btn-toolbar + + for more complex components. + +
          + +
          +
          + +
          +
          + + +
          +
          + + +
          +
          + +
          +
          + + +
          +

          + Sizing +

          + + Instead of applying button sizing classes to every button in a group, just add + + .m-btn-group m-btn-group--pill btn-group-* + + to each + + .m-btn-group m-btn-group--pill btn-group + + , including each one when nesting multiple groups. + +
          + +
          +
          +
          + + + +
          +
          +
          + + + +
          +
          +
          + + + +
          +
          +
          + +
          +
          + + +
          +

          + Nesting +

          + + Place a .m-btn-group m-btn-group--pill btn-group within another + + .m-btn-group m-btn-group--pill btn-group + + when you want dropdown menus mixed with a series of buttons. + +
          + +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          + +
          + + +
          + +
          +

          + Basic example +

          + + Basic button group examples + +
          + +
          +
          +
          +
          +
          + + + +
          +
          +
          +
          + + + +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + + + +
          +
          +
          +
          + + + +
          +
          +
          +
          +
          + +
          +
          + + +
          +

          + Buttons toolbar +

          + + Combine sets of + + btn-group m-btn-group m-btn-group--air + + into a + + btn-toolbar + + for more complex components. + +
          + +
          +
          + +
          +
          + + +
          +
          + + +
          +
          + +
          +
          + + +
          +

          + Sizing +

          + + Instead of applying button sizing classes to every button in a group, just add + + .btn-group m-btn-group m-btn-group--air-* + + to each + + .btn-group m-btn-group m-btn-group--air + +, including each one when nesting multiple groups. + +
          + +
          +
          +
          + + + +
          +
          +
          + + + +
          +
          +
          + + + +
          +
          +
          + +
          +
          + + +
          +

          + Nesting +

          + + Place a .btn-group m-btn-group m-btn-group--air within another + + .btn-group m-btn-group m-btn-group--air + + when you want dropdown menus mixed with a series of buttons. + +
          + +
          +
          +
          + + + + + +
          +
          +
          + +
          +
          + + +
          +

          + Vertical +

          + + Make a set of buttons appear vertically stacked rather than horizontally + +
          + +
          +
          +
          + + + + +
          +
          +
          + +
          +
          + +
          + +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/buttons/icon/flaticon.html b/public/components/buttons/icon/flaticon.html new file mode 100644 index 00000000..c35c1c32 --- /dev/null +++ b/public/components/buttons/icon/flaticon.html @@ -0,0 +1,6159 @@ + + + + + + + + Metronic | Flaticon Icons + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Flaticon Icons +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + + + + + + + + + + + + +
          +
          + + + + +
          +
          +
          +
          + + + +

          + Button Sizing +

          +
          +
          +
          +
          + + + + + + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/buttons/icon/fontawesome.html b/public/components/buttons/icon/fontawesome.html new file mode 100644 index 00000000..fd8ba8bc --- /dev/null +++ b/public/components/buttons/icon/fontawesome.html @@ -0,0 +1,6159 @@ + + + + + + + + Metronic | Fontawesome Icons + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Fontawesome Icons +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + + + + + + + + + + + + +
          +
          + + + + +
          +
          +
          +
          + + + +

          + Button Sizing +

          +
          +
          +
          +
          + + + + + + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/buttons/icon/lineawesome.html b/public/components/buttons/icon/lineawesome.html new file mode 100644 index 00000000..5aead2e7 --- /dev/null +++ b/public/components/buttons/icon/lineawesome.html @@ -0,0 +1,6159 @@ + + + + + + + + Metronic | Lineawesome Icons + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Lineawesome Icons +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + + + + + + + + + + + + +
          +
          + + + + +
          +
          +
          +
          + + + +

          + Button Sizing +

          +
          +
          +
          +
          + + + + + + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/buttons/spinner.html b/public/components/buttons/spinner.html new file mode 100644 index 00000000..a66a0d3e --- /dev/null +++ b/public/components/buttons/spinner.html @@ -0,0 +1,3775 @@ + + + + + + + + Metronic | Button Spinner + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Button Spinner +

          +
          +
          + +
          +
          +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/calendar/background-events.html b/public/components/calendar/background-events.html new file mode 100644 index 00000000..4911fa15 --- /dev/null +++ b/public/components/calendar/background-events.html @@ -0,0 +1,3913 @@ + + + + + + + + Metronic | Background Events + + + + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Background Events +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Background Events +

          +
          +
          +
          + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + + + + diff --git a/public/components/calendar/basic.html b/public/components/calendar/basic.html new file mode 100644 index 00000000..37aefec8 --- /dev/null +++ b/public/components/calendar/basic.html @@ -0,0 +1,3849 @@ + + + + + + + + Metronic | Basic Calendar + + + + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Basic Calendar +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Basic Calendar +

          +
          +
          + +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + + + + diff --git a/public/components/calendar/external-events.html b/public/components/calendar/external-events.html new file mode 100644 index 00000000..02701e98 --- /dev/null +++ b/public/components/calendar/external-events.html @@ -0,0 +1,4009 @@ + + + + + + + + Metronic | External Events + + + + + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + External Events +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Draggable Events +

          +
          +
          +
          +
          +
          +
          +
          +
          + Meeting +
          +
          +
          +
          +
          +
          + Conference Call +
          +
          +
          +
          +
          +
          + Dinner +
          +
          +
          +
          +
          +
          + Product Launch +
          +
          +
          +
          +
          +
          + Reporting +
          +
          +
          +
          +
          +
          +
          + Client Meeting +
          +
          +
          +
          +
          +
          + Project Update +
          +
          +
          +
          +
          +
          + Staff Meeting +
          +
          +
          +
          +
          +
          + Lunch +
          +
          +
          +
          +
          + +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + My Calendar +

          +
          +
          +
          + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + + + + + diff --git a/public/components/calendar/google.html b/public/components/calendar/google.html new file mode 100644 index 00000000..8e35a475 --- /dev/null +++ b/public/components/calendar/google.html @@ -0,0 +1,3913 @@ + + + + + + + + Metronic | Google Calendar + + + + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Google Calendar +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Google Calendar +

          +
          +
          +
          + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + + + + diff --git a/public/components/calendar/list-view.html b/public/components/calendar/list-view.html new file mode 100644 index 00000000..e3aa4250 --- /dev/null +++ b/public/components/calendar/list-view.html @@ -0,0 +1,3849 @@ + + + + + + + + Metronic | List View + + + + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + List View +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + List View +

          +
          +
          + +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + + + + diff --git a/public/components/charts/amcharts/charts.html b/public/components/charts/amcharts/charts.html new file mode 100644 index 00000000..f56f5f86 --- /dev/null +++ b/public/components/charts/amcharts/charts.html @@ -0,0 +1,4124 @@ + + + + + + + + Metronic | AmCharts Charts + + + + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + amCharts Charts +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Simple Column Chart +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Column and Line mix +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Layered Column Chart +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + 3D Stacked Column Chart +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Bar and line chart mix +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Date Based Data +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Line Chart with Scroll and Zoom +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Duration on Value Axis +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Radar Chart +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Polar Chart +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Polar Scatter +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Simple Pie Chart +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Animated Time-Line Pie Chart +

          +
          +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/components/charts/amcharts/maps.html b/public/components/charts/amcharts/maps.html new file mode 100644 index 00000000..a28c59cb --- /dev/null +++ b/public/components/charts/amcharts/maps.html @@ -0,0 +1,3989 @@ + + + + + + + + Metronic | AmCharts Maps + + + + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + amCharts Maps +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Animations along lines +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Map with curved lines +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Zooming to Countries Map +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Flight routes map +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Grouped countries map +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + US heat (choropleth) map +

          +
          +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + + + + + + + + + diff --git a/public/components/charts/amcharts/stock-charts.html b/public/components/charts/amcharts/stock-charts.html new file mode 100644 index 00000000..9d91c6af --- /dev/null +++ b/public/components/charts/amcharts/stock-charts.html @@ -0,0 +1,3970 @@ + + + + + + + + Metronic | AmCharts Stock Charts + + + + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + amCharts Stock Charts +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Multiple Data Sets +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Stock Events +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Drawing Trend Lines +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Intra-day Data +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Multiple Panels +

          +
          +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + + + + + + + + + diff --git a/public/components/charts/flotcharts.html b/public/components/charts/flotcharts.html new file mode 100644 index 00000000..8b21cf1d --- /dev/null +++ b/public/components/charts/flotcharts.html @@ -0,0 +1,4043 @@ + + + + + + + + Metronic | Flotcharts + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Flotcharts +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Basic Chart +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Axis Labels +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Tracking Curves +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Dynamic Chart +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Stack Chart Controls +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +     +
          + + + +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Interactive Chart +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Bar Chart +

          +
          +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Pie Chart 1 +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Pie Chart 3 +

          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Pie Chart 2 +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Pie Chart 4 +

          +
          +
          +
          +
          +

          + Slightly more transparent label backgrounds and adjusted the radius values to place them within the pie. +

          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + + + + diff --git a/public/components/charts/google-charts.html b/public/components/charts/google-charts.html new file mode 100644 index 00000000..28cd9769 --- /dev/null +++ b/public/components/charts/google-charts.html @@ -0,0 +1,3935 @@ + + + + + + + + Metronic | Google Charts + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Google Charts +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Column Chart 1 +

          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Column Chart 2 +

          +
          +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Pie Chart 1 +

          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Pie Chart 2 +

          +
          +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Line Chart 1 +

          +
          +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + + + + diff --git a/public/components/charts/morris-charts.html b/public/components/charts/morris-charts.html new file mode 100644 index 00000000..2c7e3a89 --- /dev/null +++ b/public/components/charts/morris-charts.html @@ -0,0 +1,3913 @@ + + + + + + + + Metronic | Morris Charts + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Morris Charts +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Line Chart +

          +
          +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Area Chart +

          +
          +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Bar Chart +

          +
          +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Pie Chart +

          +
          +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/api/events.html b/public/components/datatables/api/events.html new file mode 100644 index 00000000..c7e3e88e --- /dev/null +++ b/public/components/datatables/api/events.html @@ -0,0 +1,3961 @@ + + + + + + + + Metronic | Events + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Events +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Static Datatable + + initialized from table element + +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + + +
          + + +
          +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/api/methods.html b/public/components/datatables/api/methods.html new file mode 100644 index 00000000..15c52a52 --- /dev/null +++ b/public/components/datatables/api/methods.html @@ -0,0 +1,4037 @@ + + + + + + + + Metronic | Methods + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Methods +

          + +
          +
          + +
          +
          +
          + +
          + + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +

          + Static Datatable + + initialized from table element + +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          + + + + + + +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          + + ID: + + + + + +
          +
          +
          + + + + + +
          +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/base/auto-column-hide.html b/public/components/datatables/base/auto-column-hide.html new file mode 100644 index 00000000..58a07912 --- /dev/null +++ b/public/components/datatables/base/auto-column-hide.html @@ -0,0 +1,3782 @@ + + + + + + + + Metronic | Auto Column Hide + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Auto Column Hide +

          +
          +
          + +
          +
          +
          + +
          + + Partial not found: C:\wamp64\www\kt\m5\theme\dist\preview\inc/view/demos/default/pages/components/datatables/base/auto-column-hide.php + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/base/column-rendering.html b/public/components/datatables/base/column-rendering.html new file mode 100644 index 00000000..487dc446 --- /dev/null +++ b/public/components/datatables/base/column-rendering.html @@ -0,0 +1,4002 @@ + + + + + + + + Metronic | Column Rendering + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Column Rendering +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Static Datatable +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/base/column-width.html b/public/components/datatables/base/column-width.html new file mode 100644 index 00000000..1937d513 --- /dev/null +++ b/public/components/datatables/base/column-width.html @@ -0,0 +1,3949 @@ + + + + + + + + Metronic | Column Width + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Column Width +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Static Datatable +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/base/data-ajax.html b/public/components/datatables/base/data-ajax.html new file mode 100644 index 00000000..5bab0dd2 --- /dev/null +++ b/public/components/datatables/base/data-ajax.html @@ -0,0 +1,4004 @@ + + + + + + + + Metronic | Remote Data + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Remote Data +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + AJAX Datatable + + data loaded from remote data source + +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/base/data-json.html b/public/components/datatables/base/data-json.html new file mode 100644 index 00000000..f6ac5dd9 --- /dev/null +++ b/public/components/datatables/base/data-json.html @@ -0,0 +1,4004 @@ + + + + + + + + Metronic | Local Data + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Local Data +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + JSON Datatable + + initialized from remote json file + +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/base/data-local.html b/public/components/datatables/base/data-local.html new file mode 100644 index 00000000..72eb1aaf --- /dev/null +++ b/public/components/datatables/base/data-local.html @@ -0,0 +1,4004 @@ + + + + + + + + Metronic | Local Data + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Local Data +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Local Datatable + + initialized from javascript array + +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/base/html-table.html b/public/components/datatables/base/html-table.html new file mode 100644 index 00000000..dc23f593 --- /dev/null +++ b/public/components/datatables/base/html-table.html @@ -0,0 +1,7698 @@ + + + + + + + + Metronic | HTML Table + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + HTML Table +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Datatable initilized from HTML table +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Order ID + + Owner + + Contact + + Car Make + + Car Model + + Color + + Deposit Paid + + Order Date +
          + 16590-107 + + Zandra Fisbburne + + (916) 6137523 + + Pontiac + + Grand Am + + Puce + + $75343.80 + + 2016-09-08 +
          + 58232-0517 + + Mela Ord + + (331) 6613809 + + Lamborghini + + Gallardo + + Aquamarine + + $46031.10 + + 2016-08-21 +
          + 67296-0590 + + Benyamin Boerderman + + (248) 3715044 + + Lexus + + LX + + Green + + $86721.38 + + 2017-11-17 +
          + 61957-1005 + + Melva Whiteford + + (765) 5831579 + + Land Rover + + Freelander + + Fuscia + + $99239.55 + + 2016-11-20 +
          + 60660-7787 + + Tara Gow + + (661) 8838768 + + Audi + + S5 + + Puce + + $81068.37 + + 2017-05-19 +
          + 43353-839 + + Jeannie Leech + + (464) 1467700 + + Chevrolet + + Camaro + + Teal + + $54172.96 + + 2017-02-28 +
          + 49304-0018 + + Craggy Muzzlewhite + + (849) 3931687 + + Ford + + Freestar + + Puce + + $34581.44 + + 2017-08-19 +
          + 63304-436 + + Lorie Bointon + + (888) 8512009 + + Nissan + + Altima + + Yellow + + $43010.64 + + 2017-07-30 +
          + 53603-1005 + + Perren Illingworth + + (640) 8089210 + + Ford + + Expedition EL + + Fuscia + + $39020.81 + + 2017-12-07 +
          + 58118-3750 + + Gerri Haverson + + (993) 2745169 + + Chevrolet + + Astro + + Purple + + $99551.01 + + 2017-02-13 +
          + 61787-482 + + Seumas Parlott + + (653) 6455420 + + Ford + + Tempo + + Mauv + + $23592.86 + + 2016-01-14 +
          + 36987-1887 + + Dorelle Phillps + + (827) 7291094 + + Chevrolet + + Malibu + + Pink + + $76838.03 + + 2017-01-12 +
          + 16995-002 + + Kaylee Sargeaunt + + (161) 8333672 + + BMW + + M5 + + Crimson + + $67140.62 + + 2017-03-14 +
          + 36987-1754 + + Annie Wase + + (645) 8966205 + + Toyota + + Venza + + Mauv + + $73734.86 + + 2017-04-21 +
          + 0591-3770 + + Gerhard Snooks + + (550) 4667160 + + Cadillac + + CTS + + Aquamarine + + $31302.87 + + 2017-11-24 +
          + 21130-857 + + Helen-elizabeth Hanrahan + + (802) 8582404 + + Toyota + + Sienna + + Aquamarine + + $15431.90 + + 2016-07-27 +
          + 0591-5716 + + Igor Wonter + + (807) 5379676 + + GMC + + Yukon XL 2500 + + Red + + $75150.20 + + 2017-03-20 +
          + 50474-400 + + Tess Ekkel + + (559) 6762220 + + Jeep + + Compass + + Khaki + + $62661.50 + + 2017-09-30 +
          + 54868-0325 + + Raimondo Tatterton + + (877) 5037536 + + Mitsubishi + + Diamante + + Aquamarine + + $44990.93 + + 2017-09-23 +
          + 60429-582 + + Raina Dudenie + + (934) 6575468 + + Hyundai + + Veracruz + + Orange + + $10346.71 + + 2017-07-06 +
          + 52584-026 + + Randy Casserly + + (500) 3178012 + + Pontiac + + G6 + + Khaki + + $51466.87 + + 2017-01-09 +
          + 68745-2010 + + Casey Barracks + + (902) 3150101 + + Mazda + + RX-7 + + Mauv + + $18157.31 + + 2016-04-08 +
          + 63629-3377 + + Cally Giddings + + (743) 9739630 + + Pontiac + + Firebird + + Khaki + + $31753.47 + + 2016-12-25 +
          + 16590-215 + + Eloise Elcoux + + (504) 8539563 + + Land Rover + + Discovery + + Purple + + $38805.21 + + 2016-10-18 +
          + 76519-1004 + + Leontine Perceval + + (488) 2025428 + + Chevrolet + + APV + + Purple + + $44888.84 + + 2017-01-01 +
          + 61958-1004 + + Nerte Djekic + + (337) 5952491 + + MINI + + Countryman + + Mauv + + $33244.77 + + 2016-12-11 +
          + 47682-302 + + Murielle Elmore + + (198) 5450152 + + Saab + + 900 + + Fuscia + + $14351.38 + + 2017-01-18 +
          + 64141-111 + + Carla Gridley + + (275) 4871078 + + Ford + + Laser + + Orange + + $96048.82 + + 2017-10-15 +
          + 52731-7045 + + Candice Roseman + + (789) 4124609 + + GMC + + 2500 Club Coupe + + Pink + + $81502.84 + + 2016-01-22 +
          + 54575-362 + + Sharleen Gibson + + (814) 4808286 + + Porsche + + Boxster + + Mauv + + $22766.12 + + 2016-08-06 +
          + 49260-613 + + Tedi Cullingford + + (839) 5548407 + + Pontiac + + Firebird + + Orange + + $28603.11 + + 2016-09-27 +
          + 0268-0885 + + Imogene Gennings + + (376) 5838776 + + Honda + + Element + + Maroon + + $80170.45 + + 2016-10-08 +
          + 42291-662 + + Saw Iban + + (885) 1834755 + + Dodge + + Dakota Club + + Green + + $88624.91 + + 2017-09-16 +
          + 11344-919 + + Niccolo Proudley + + (374) 7137956 + + Chevrolet + + Lumina + + Green + + $61079.97 + + 2017-08-29 +
          + 0006-0575 + + Quinn Gocke + + (526) 5562038 + + Ford + + E150 + + Purple + + $27265.59 + + 2017-11-14 +
          + 52125-244 + + Tobe Urling + + (818) 5041622 + + Mercedes-Benz + + R-Class + + Goldenrod + + $79407.62 + + 2016-05-07 +
          + 68308-325 + + Tine Beagen + + (806) 5042730 + + Ford + + Aerostar + + Aquamarine + + $62500.19 + + 2017-03-16 +
          + 36000-282 + + Yardley Elgey + + (310) 7532769 + + Lotus + + Esprit + + Maroon + + $42287.88 + + 2017-11-18 +
          + 55118-225 + + Nanine Laister + + (878) 4281779 + + Nissan + + Quest + + Mauv + + $30422.47 + + 2016-05-27 +
          + 55154-8376 + + Gardy Ennever + + (795) 3148895 + + Saab + + 900 + + Crimson + + $20340.35 + + 2016-09-26 +
          + 59746-248 + + Jorrie Lehrle + + (880) 7746744 + + GMC + + Sierra 1500 + + Mauv + + $35216.99 + + 2017-04-19 +
          + 64257-515 + + Catlin Syalvester + + (473) 8824525 + + Mazda + + MX-5 + + Blue + + $86902.40 + + 2017-06-26 +
          + 52380-1101 + + Tybie Bonehill + + (625) 7153506 + + Ford + + Courier + + Teal + + $58548.57 + + 2016-08-31 +
          + 16590-935 + + Alard Caddock + + (653) 9185720 + + Buick + + Century + + Puce + + $58531.62 + + 2017-10-29 +
          + 43063-217 + + Sherwood Dugdale + + (825) 7198840 + + Mazda + + 626 + + Maroon + + $40018.92 + + 2016-02-25 +
          + 67046-672 + + Juditha Gallier + + (632) 8511983 + + Hyundai + + Accent + + Crimson + + $88732.19 + + 2017-07-14 +
          + 68016-823 + + Barton Finan + + (134) 5545060 + + Oldsmobile + + Cutlass Supreme + + Purple + + $56025.91 + + 2017-04-05 +
          + 69244-3001 + + Pepi MacDunlevy + + (355) 3036719 + + Mercedes-Benz + + E-Class + + Maroon + + $65530.48 + + 2017-10-27 +
          + 52533-160 + + Siegfried Hearthfield + + (199) 4233976 + + Chrysler + + Aspen + + Puce + + $55826.86 + + 2016-02-12 +
          + 37000-184 + + Emmanuel Klehn + + (522) 6504441 + + Mercedes-Benz + + SL-Class + + Yellow + + $99530.02 + + 2016-10-16 +
          + 55154-9615 + + Misha Wherrett + + (563) 6333585 + + Nissan + + Altima + + Indigo + + $46389.16 + + 2016-09-07 +
          + 30142-601 + + Grace Lipman + + (216) 8991083 + + Suzuki + + Swift + + Crimson + + $70355.23 + + 2017-02-01 +
          + 41163-078 + + Tania Dinning + + (222) 1194615 + + Chevrolet + + Suburban + + Blue + + $71922.35 + + 2017-12-09 +
          + 68428-044 + + Inigo Harnor + + (292) 3092919 + + BMW + + 5 Series + + Purple + + $70783.75 + + 2017-05-14 +
          + 0093-4161 + + Albina Yerrell + + (436) 2775370 + + Mitsubishi + + Chariot + + Mauv + + $98347.91 + + 2016-09-13 +
          + 64942-1225 + + Arron Kezourec + + (227) 5907590 + + Audi + + Coupe GT + + Goldenrod + + $88578.67 + + 2017-03-26 +
          + 0406-8960 + + Sergeant Paddefield + + (873) 3110165 + + Suzuki + + SX4 + + Goldenrod + + $22339.95 + + 2016-11-25 +
          + 53150-250 + + Anestassia De Fries + + (243) 7619758 + + Volkswagen + + Touareg + + Indigo + + $98734.53 + + 2016-05-18 +
          + 65862-061 + + Montgomery Southcoat + + (435) 8829120 + + Ford + + Bronco + + Violet + + $97615.88 + + 2017-02-09 +
          + 36987-1967 + + Kleon Minchenton + + (831) 3893014 + + Dodge + + Dakota + + Green + + $85134.59 + + 2016-10-27 +
          + 67544-298 + + Rosalyn McTeer + + (845) 6966658 + + Volkswagen + + GTI + + Pink + + $40741.32 + + 2016-08-07 +
          + 60505-0176 + + Sampson Mingay + + (582) 5639971 + + Infiniti + + I + + Violet + + $88649.99 + + 2016-07-25 +
          + 60319-4001 + + Ailene Swindells + + (150) 7296562 + + Audi + + 5000S + + Orange + + $57310.99 + + 2017-09-11 +
          + 46708-035 + + Virgie Vella + + (822) 5869741 + + Toyota + + Tacoma + + Red + + $40856.55 + + 2016-07-06 +
          + 67718-938 + + Beilul Bonnett + + (966) 3438432 + + Dodge + + Dakota + + Violet + + $20927.13 + + 2017-05-09 +
          + 10889-106 + + Zaccaria Canto + + (302) 7119085 + + Mercury + + Topaz + + Violet + + $73285.39 + + 2016-09-03 +
          + 16590-217 + + Elysia Mewrcik + + (958) 1047384 + + Ford + + Tempo + + Violet + + $94717.43 + + 2017-12-24 +
          + 51346-208 + + Shirlene Moan + + (495) 8670921 + + Maserati + + Spyder + + Orange + + $92595.92 + + 2016-02-02 +
          + 49817-0070 + + Jo ann Doggrell + + (663) 2181102 + + Lotus + + Exige + + Indigo + + $61597.27 + + 2016-04-21 +
          + 31720-211 + + Axe Ifill + + (203) 1949159 + + GMC + + Vandura 3500 + + Violet + + $28371.88 + + 2017-09-21 +
          + 59886-340 + + Randi Gockeler + + (939) 3260442 + + Chevrolet + + Aveo + + Turquoise + + $34479.82 + + 2016-08-11 +
          + 10812-873 + + Dukey Letteresse + + (249) 5119236 + + Infiniti + + G + + Fuscia + + $22117.39 + + 2017-01-19 +
          + 63323-238 + + Klaus Andrassy + + (970) 6395503 + + Mitsubishi + + Sigma + + Violet + + $16694.16 + + 2017-09-14 +
          + 68084-062 + + Hillary Hully + + (203) 3759234 + + Honda + + Civic + + Khaki + + $82730.20 + + 2016-11-12 +
          + 62011-0032 + + Bond Ofener + + (571) 1562188 + + Jeep + + Cherokee + + Pink + + $27135.34 + + 2016-02-07 +
          + 0006-0951 + + Turner Silvermann + + (766) 9823362 + + Dodge + + Ram 2500 + + Orange + + $35100.35 + + 2016-07-11 +
          + 61715-098 + + Ines Clemenzo + + (839) 6476213 + + Mitsubishi + + Truck + + Violet + + $86481.08 + + 2017-07-12 +
          + 76472-1129 + + Flory Orvis + + (954) 8668304 + + Saturn + + VUE + + Red + + $41773.44 + + 2016-03-27 +
          + 0363-0236 + + Maggee Cicetti + + (502) 8818640 + + Oldsmobile + + Silhouette + + Khaki + + $38969.12 + + 2016-12-22 +
          + 55154-1336 + + Derron Rigmond + + (521) 1010631 + + Chevrolet + + Express 1500 + + Turquoise + + $61520.54 + + 2017-07-01 +
          + 49288-0600 + + Giovanni Martinello + + (213) 6361851 + + Oldsmobile + + Aurora + + Blue + + $42877.19 + + 2017-07-31 +
          + 61957-0903 + + Arly Duigan + + (501) 9547783 + + Volkswagen + + Golf + + Turquoise + + $15494.89 + + 2016-05-15 +
          + 0093-7473 + + Mason Anker + + (722) 6021152 + + Audi + + S6 + + Puce + + $95903.74 + + 2016-07-31 +
          + 60764-006 + + Taber Nevett + + (919) 9971430 + + Dodge + + Dakota + + Puce + + $42240.15 + + 2016-08-21 +
          + 59279-507 + + Abbye Branca + + (988) 2061648 + + Audi + + Q5 + + Khaki + + $16814.44 + + 2017-10-12 +
          + 15478-001 + + Aviva Lower + + (434) 1774422 + + Mazda + + Tribute + + Yellow + + $84483.81 + + 2016-02-09 +
          + 0555-0595 + + Nessy Aaronsohn + + (677) 5096397 + + Toyota + + Celica + + Green + + $66632.25 + + 2016-07-20 +
          + 0067-8105 + + Klara Mort + + (927) 9164412 + + Suzuki + + Forenza + + Indigo + + $80973.60 + + 2016-01-03 +
          + 0013-8303 + + Nathan Scrase + + (849) 4082617 + + Isuzu + + Axiom + + Pink + + $88463.97 + + 2016-06-27 +
          + 63941-003 + + Nellie Marcinkowski + + (800) 8182585 + + Hyundai + + XG350 + + Orange + + $39504.17 + + 2017-12-04 +
          + 67046-915 + + Heda Fretwell + + (171) 6527161 + + Ford + + Fairlane + + Yellow + + $50807.63 + + 2016-06-02 +
          + 0046-1104 + + Courtney Curtayne + + (823) 4506262 + + Mercedes-Benz + + E-Class + + Maroon + + $67363.15 + + 2016-12-13 +
          + 50181-0013 + + Doll Kirkman + + (819) 5400302 + + GMC + + Yukon XL 1500 + + Violet + + $24037.13 + + 2016-05-06 +
          + 44911-0121 + + Meredithe Gaither + + (134) 7310512 + + Hyundai + + Elantra + + Purple + + $22714.10 + + 2016-11-04 +
          + 43063-339 + + Florenza Chominski + + (158) 4154311 + + Hyundai + + Elantra + + Violet + + $37418.20 + + 2017-06-10 +
          + 24653-282 + + Corabel Pizzey + + (962) 8955912 + + Volvo + + S40 + + Pink + + $39343.37 + + 2017-03-02 +
          + 0228-2837 + + Cristian Frisch + + (956) 1587850 + + Mazda + + B-Series + + Fuscia + + $89968.73 + + 2016-11-09 +
          + 49035-516 + + Selie Tillerton + + (401) 6603509 + + Hyundai + + Sonata + + Mauv + + $93302.34 + + 2016-05-30 +
          + 57237-056 + + Carol MacIlriach + + (906) 5303069 + + Mitsubishi + + Mirage + + Orange + + $79033.14 + + 2017-01-02 +
          + 76214-020 + + Inga Suttie + + (409) 7446305 + + Morgan + + Aero 8 + + Pink + + $40506.96 + + 2017-06-18 +
          + 68828-084 + + Erich Scandrick + + (353) 2695067 + + Buick + + Rendezvous + + Turquoise + + $17788.34 + + 2017-09-13 +
          + 48951-8142 + + Thaddus Phizacklea + + (108) 4424643 + + Chevrolet + + Camaro + + Green + + $99785.96 + + 2017-09-12 +
          + 55289-018 + + Ilario Roadnight + + (434) 6769019 + + Dodge + + Dakota + + Goldenrod + + $44697.63 + + 2017-02-26 +
          + 33261-416 + + Gwenette Ridhole + + (407) 7656030 + + Chevrolet + + Tahoe + + Indigo + + $66543.51 + + 2017-08-09 +
          + 0093-4146 + + Gretchen Coult + + (844) 6417821 + + Hyundai + + Accent + + Goldenrod + + $32727.98 + + 2016-02-16 +
          + 52380-1880 + + Olivero Arman + + (991) 3750974 + + Toyota + + 4Runner + + Maroon + + $84613.29 + + 2017-08-31 +
          + 33992-0268 + + Merilee Malsher + + (830) 7990701 + + Buick + + Enclave + + Teal + + $19820.19 + + 2016-08-01 +
          + 0280-1440 + + Giffard Bertolin + + (876) 9968818 + + Mazda + + 929 + + Orange + + $14235.30 + + 2016-07-25 +
          + 69114-2001 + + Tobias Brombell + + (948) 5326501 + + Mercedes-Benz + + E-Class + + Mauv + + $23693.34 + + 2016-10-21 +
          + 11673-395 + + Elvis Bartels + + (792) 2836414 + + Buick + + Century + + Fuscia + + $66276.64 + + 2016-06-06 +
          + 0406-9926 + + Vania Lourens + + (201) 5588530 + + Ford + + Explorer Sport Trac + + Fuscia + + $44164.25 + + 2017-07-09 +
          + 50111-333 + + Kain De'Ath + + (621) 2342331 + + Lexus + + LS + + Goldenrod + + $31826.25 + + 2016-05-02 +
          + 37808-422 + + Timmie Gatecliff + + (848) 9069629 + + Mercedes-Benz + + GLK-Class + + Khaki + + $61960.06 + + 2017-11-13 +
          + 36000-176 + + Carrissa Davana + + (991) 5619687 + + Ford + + F-Series Super Duty + + Khaki + + $99478.27 + + 2016-10-31 +
          + 62856-705 + + Ferdinande Itzhaiek + + (867) 6094265 + + GMC + + Canyon + + Mauv + + $24702.01 + + 2017-05-03 +
          + 54273-000 + + Misti Pick + + (985) 9871608 + + Nissan + + Pathfinder + + Blue + + $32344.81 + + 2016-08-30 +
          + 54473-228 + + Ddene Stebbings + + (934) 5084472 + + BMW + + M3 + + Mauv + + $57983.36 + + 2016-04-14 +
          + 67296-0801 + + Hermine Mundford + + (819) 3022082 + + Toyota + + MR2 + + Khaki + + $46202.99 + + 2016-05-21 +
          + 64471-330 + + Maynord Vaneev + + (330) 8996328 + + Cadillac + + Escalade ESV + + Blue + + $45740.26 + + 2016-03-30 +
          + 0378-0344 + + Jaimie Wrey + + (209) 5215049 + + GMC + + Sierra 1500 + + Khaki + + $12938.74 + + 2017-09-21 +
          + 60846-807 + + Eliot Brunetti + + (520) 9958820 + + Chevrolet + + TrailBlazer + + Purple + + $26441.50 + + 2016-12-03 +
          + 49288-0752 + + Mandi Bielefeld + + (103) 6044691 + + Chevrolet + + Corvette + + Blue + + $73061.25 + + 2017-11-27 +
          + 62011-0248 + + Carol Ible + + (819) 4166523 + + Lexus + + RX + + Blue + + $77034.66 + + 2017-01-31 +
          + 65044-2101 + + Anastasia Hutley + + (333) 2412744 + + Cadillac + + Escalade + + Crimson + + $82055.16 + + 2016-10-24 +
          + 43547-254 + + Christoffer Gullam + + (666) 8751957 + + Lotus + + Elan + + Maroon + + $21632.15 + + 2016-03-02 +
          + 11673-208 + + Wat Wrates + + (147) 5178268 + + Audi + + V8 + + Khaki + + $72574.55 + + 2016-07-12 +
          + 68084-401 + + Florenza Jorat + + (330) 4787446 + + Toyota + + Sequoia + + Puce + + $24295.37 + + 2017-03-30 +
          + 0615-5576 + + Lurleen Upjohn + + (332) 9654826 + + Jeep + + Patriot + + Mauv + + $55204.50 + + 2016-08-13 +
          + 68001-242 + + Norine Scedall + + (426) 9356871 + + GMC + + 2500 + + Turquoise + + $60227.86 + + 2016-09-04 +
          + 51346-188 + + Ricki Yarnton + + (751) 5116297 + + Audi + + A6 + + Orange + + $83227.75 + + 2016-01-06 +
          + 54868-2093 + + Shirline Scrafton + + (270) 9246449 + + Suzuki + + Forenza + + Fuscia + + $92530.81 + + 2016-11-14 +
          + 49349-867 + + Chico Rubinowitsch + + (392) 6963561 + + Hyundai + + Accent + + Violet + + $75138.19 + + 2016-02-24 +
          + 52533-142 + + Fanchon Durran + + (945) 3614142 + + Chevrolet + + Express 2500 + + Khaki + + $20926.39 + + 2016-01-06 +
          + 64942-1214 + + Ursulina Lanphier + + (191) 8945727 + + GMC + + Envoy + + Indigo + + $84545.27 + + 2017-08-26 +
          + 54868-0843 + + Ayn Garvin + + (360) 5221311 + + Toyota + + Prius + + Maroon + + $93920.58 + + 2016-01-09 +
          + 57520-0615 + + Risa Bayford + + (968) 4661308 + + Ford + + Mustang + + Mauv + + $60440.20 + + 2016-02-27 +
          + 30142-396 + + Batholomew Peppard + + (228) 1082053 + + Infiniti + + G + + Purple + + $44794.18 + + 2016-03-08 +
          + 0009-0176 + + Davita Woolsey + + (355) 3639205 + + Dodge + + Ram 2500 Club + + Yellow + + $64164.18 + + 2017-01-21 +
          + 76237-188 + + Lauren Thunderchief + + (824) 9195850 + + Chrysler + + LeBaron + + Violet + + $34031.52 + + 2016-10-17 +
          + 60505-3638 + + Virginie Barrett + + (109) 3478355 + + Honda + + Pilot + + Purple + + $89898.57 + + 2017-07-14 +
          + 76267-060 + + Rodge Spafford + + (368) 8209458 + + Nissan + + 240SX + + Khaki + + $27001.99 + + 2016-12-16 +
          + 35000-674 + + Aldous Reams + + (880) 7359671 + + Mercury + + Sable + + Khaki + + $53892.90 + + 2016-03-23 +
          + 49869-002 + + Broderic Burnsell + + (252) 6243116 + + Mercedes-Benz + + W201 + + Goldenrod + + $73661.98 + + 2016-04-20 +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/base/local-sort.html b/public/components/datatables/base/local-sort.html new file mode 100644 index 00000000..4bfe77d5 --- /dev/null +++ b/public/components/datatables/base/local-sort.html @@ -0,0 +1,4001 @@ + + + + + + + + Metronic | Local Sort + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Local Sort +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Local Sort Datatable +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/base/record-selection.html b/public/components/datatables/base/record-selection.html new file mode 100644 index 00000000..4662f41e --- /dev/null +++ b/public/components/datatables/base/record-selection.html @@ -0,0 +1,4324 @@ + + + + + + + + Metronic | Record Selection + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Record Selection +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Default Record Selection Datatable +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +
          + +
          +
          +
          + +     + +     + +
          +
          +
          +
          +
          +
          + + +
          + +
          +
          +
          +
          +
          +
          +

          + Server Side Record Selection Datatable +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          +
          + +
          +
          +
          + +     + +     + +
          +
          +
          +
          +
          +
          + + +
          + + + + + + + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/base/responsive-columns.html b/public/components/datatables/base/responsive-columns.html new file mode 100644 index 00000000..4495b4a9 --- /dev/null +++ b/public/components/datatables/base/responsive-columns.html @@ -0,0 +1,3949 @@ + + + + + + + + Metronic | Responsive Columns + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Responsive Columns +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Static Datatable +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/base/row-details.html b/public/components/datatables/base/row-details.html new file mode 100644 index 00000000..fbe0c514 --- /dev/null +++ b/public/components/datatables/base/row-details.html @@ -0,0 +1,3952 @@ + + + + + + + + Metronic | Row Details + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Row Details +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Row Details + + data loaded from remote data source + +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/base/translation.html b/public/components/datatables/base/translation.html new file mode 100644 index 00000000..eb64a15f --- /dev/null +++ b/public/components/datatables/base/translation.html @@ -0,0 +1,3950 @@ + + + + + + + + Metronic | Translation + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Translation +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Spanish Translation +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/child/data-ajax.html b/public/components/datatables/child/data-ajax.html new file mode 100644 index 00000000..dfa76c40 --- /dev/null +++ b/public/components/datatables/child/data-ajax.html @@ -0,0 +1,3949 @@ + + + + + + + + Metronic | Remote Data + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Remote Data +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Static Datatable +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/child/data-local.html b/public/components/datatables/child/data-local.html new file mode 100644 index 00000000..a9956a0f --- /dev/null +++ b/public/components/datatables/child/data-local.html @@ -0,0 +1,3949 @@ + + + + + + + + Metronic | Local Data + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Local Data +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Static Datatable +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/locked/both.html b/public/components/datatables/locked/both.html new file mode 100644 index 00000000..5cf13cac --- /dev/null +++ b/public/components/datatables/locked/both.html @@ -0,0 +1,3949 @@ + + + + + + + + Metronic | Both Locked Columns + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Both Locked Columns +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Left & Right Columns Locked Datatable +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/locked/html-table.html b/public/components/datatables/locked/html-table.html new file mode 100644 index 00000000..3ecc4df0 --- /dev/null +++ b/public/components/datatables/locked/html-table.html @@ -0,0 +1,7698 @@ + + + + + + + + Metronic | HTML Table + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + HTML Table +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Datatable initilized from HTML table and locked columns +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Order ID + + Owner + + Contact + + Car Make + + Car Model + + Color + + Deposit Paid + + Order Date +
          + 16590-107 + + Zandra Fisbburne + + (916) 6137523 + + Pontiac + + Grand Am + + Puce + + $75343.80 + + 2016-09-08 +
          + 58232-0517 + + Mela Ord + + (331) 6613809 + + Lamborghini + + Gallardo + + Aquamarine + + $46031.10 + + 2016-08-21 +
          + 67296-0590 + + Benyamin Boerderman + + (248) 3715044 + + Lexus + + LX + + Green + + $86721.38 + + 2017-11-17 +
          + 61957-1005 + + Melva Whiteford + + (765) 5831579 + + Land Rover + + Freelander + + Fuscia + + $99239.55 + + 2016-11-20 +
          + 60660-7787 + + Tara Gow + + (661) 8838768 + + Audi + + S5 + + Puce + + $81068.37 + + 2017-05-19 +
          + 43353-839 + + Jeannie Leech + + (464) 1467700 + + Chevrolet + + Camaro + + Teal + + $54172.96 + + 2017-02-28 +
          + 49304-0018 + + Craggy Muzzlewhite + + (849) 3931687 + + Ford + + Freestar + + Puce + + $34581.44 + + 2017-08-19 +
          + 63304-436 + + Lorie Bointon + + (888) 8512009 + + Nissan + + Altima + + Yellow + + $43010.64 + + 2017-07-30 +
          + 53603-1005 + + Perren Illingworth + + (640) 8089210 + + Ford + + Expedition EL + + Fuscia + + $39020.81 + + 2017-12-07 +
          + 58118-3750 + + Gerri Haverson + + (993) 2745169 + + Chevrolet + + Astro + + Purple + + $99551.01 + + 2017-02-13 +
          + 61787-482 + + Seumas Parlott + + (653) 6455420 + + Ford + + Tempo + + Mauv + + $23592.86 + + 2016-01-14 +
          + 36987-1887 + + Dorelle Phillps + + (827) 7291094 + + Chevrolet + + Malibu + + Pink + + $76838.03 + + 2017-01-12 +
          + 16995-002 + + Kaylee Sargeaunt + + (161) 8333672 + + BMW + + M5 + + Crimson + + $67140.62 + + 2017-03-14 +
          + 36987-1754 + + Annie Wase + + (645) 8966205 + + Toyota + + Venza + + Mauv + + $73734.86 + + 2017-04-21 +
          + 0591-3770 + + Gerhard Snooks + + (550) 4667160 + + Cadillac + + CTS + + Aquamarine + + $31302.87 + + 2017-11-24 +
          + 21130-857 + + Helen-elizabeth Hanrahan + + (802) 8582404 + + Toyota + + Sienna + + Aquamarine + + $15431.90 + + 2016-07-27 +
          + 0591-5716 + + Igor Wonter + + (807) 5379676 + + GMC + + Yukon XL 2500 + + Red + + $75150.20 + + 2017-03-20 +
          + 50474-400 + + Tess Ekkel + + (559) 6762220 + + Jeep + + Compass + + Khaki + + $62661.50 + + 2017-09-30 +
          + 54868-0325 + + Raimondo Tatterton + + (877) 5037536 + + Mitsubishi + + Diamante + + Aquamarine + + $44990.93 + + 2017-09-23 +
          + 60429-582 + + Raina Dudenie + + (934) 6575468 + + Hyundai + + Veracruz + + Orange + + $10346.71 + + 2017-07-06 +
          + 52584-026 + + Randy Casserly + + (500) 3178012 + + Pontiac + + G6 + + Khaki + + $51466.87 + + 2017-01-09 +
          + 68745-2010 + + Casey Barracks + + (902) 3150101 + + Mazda + + RX-7 + + Mauv + + $18157.31 + + 2016-04-08 +
          + 63629-3377 + + Cally Giddings + + (743) 9739630 + + Pontiac + + Firebird + + Khaki + + $31753.47 + + 2016-12-25 +
          + 16590-215 + + Eloise Elcoux + + (504) 8539563 + + Land Rover + + Discovery + + Purple + + $38805.21 + + 2016-10-18 +
          + 76519-1004 + + Leontine Perceval + + (488) 2025428 + + Chevrolet + + APV + + Purple + + $44888.84 + + 2017-01-01 +
          + 61958-1004 + + Nerte Djekic + + (337) 5952491 + + MINI + + Countryman + + Mauv + + $33244.77 + + 2016-12-11 +
          + 47682-302 + + Murielle Elmore + + (198) 5450152 + + Saab + + 900 + + Fuscia + + $14351.38 + + 2017-01-18 +
          + 64141-111 + + Carla Gridley + + (275) 4871078 + + Ford + + Laser + + Orange + + $96048.82 + + 2017-10-15 +
          + 52731-7045 + + Candice Roseman + + (789) 4124609 + + GMC + + 2500 Club Coupe + + Pink + + $81502.84 + + 2016-01-22 +
          + 54575-362 + + Sharleen Gibson + + (814) 4808286 + + Porsche + + Boxster + + Mauv + + $22766.12 + + 2016-08-06 +
          + 49260-613 + + Tedi Cullingford + + (839) 5548407 + + Pontiac + + Firebird + + Orange + + $28603.11 + + 2016-09-27 +
          + 0268-0885 + + Imogene Gennings + + (376) 5838776 + + Honda + + Element + + Maroon + + $80170.45 + + 2016-10-08 +
          + 42291-662 + + Saw Iban + + (885) 1834755 + + Dodge + + Dakota Club + + Green + + $88624.91 + + 2017-09-16 +
          + 11344-919 + + Niccolo Proudley + + (374) 7137956 + + Chevrolet + + Lumina + + Green + + $61079.97 + + 2017-08-29 +
          + 0006-0575 + + Quinn Gocke + + (526) 5562038 + + Ford + + E150 + + Purple + + $27265.59 + + 2017-11-14 +
          + 52125-244 + + Tobe Urling + + (818) 5041622 + + Mercedes-Benz + + R-Class + + Goldenrod + + $79407.62 + + 2016-05-07 +
          + 68308-325 + + Tine Beagen + + (806) 5042730 + + Ford + + Aerostar + + Aquamarine + + $62500.19 + + 2017-03-16 +
          + 36000-282 + + Yardley Elgey + + (310) 7532769 + + Lotus + + Esprit + + Maroon + + $42287.88 + + 2017-11-18 +
          + 55118-225 + + Nanine Laister + + (878) 4281779 + + Nissan + + Quest + + Mauv + + $30422.47 + + 2016-05-27 +
          + 55154-8376 + + Gardy Ennever + + (795) 3148895 + + Saab + + 900 + + Crimson + + $20340.35 + + 2016-09-26 +
          + 59746-248 + + Jorrie Lehrle + + (880) 7746744 + + GMC + + Sierra 1500 + + Mauv + + $35216.99 + + 2017-04-19 +
          + 64257-515 + + Catlin Syalvester + + (473) 8824525 + + Mazda + + MX-5 + + Blue + + $86902.40 + + 2017-06-26 +
          + 52380-1101 + + Tybie Bonehill + + (625) 7153506 + + Ford + + Courier + + Teal + + $58548.57 + + 2016-08-31 +
          + 16590-935 + + Alard Caddock + + (653) 9185720 + + Buick + + Century + + Puce + + $58531.62 + + 2017-10-29 +
          + 43063-217 + + Sherwood Dugdale + + (825) 7198840 + + Mazda + + 626 + + Maroon + + $40018.92 + + 2016-02-25 +
          + 67046-672 + + Juditha Gallier + + (632) 8511983 + + Hyundai + + Accent + + Crimson + + $88732.19 + + 2017-07-14 +
          + 68016-823 + + Barton Finan + + (134) 5545060 + + Oldsmobile + + Cutlass Supreme + + Purple + + $56025.91 + + 2017-04-05 +
          + 69244-3001 + + Pepi MacDunlevy + + (355) 3036719 + + Mercedes-Benz + + E-Class + + Maroon + + $65530.48 + + 2017-10-27 +
          + 52533-160 + + Siegfried Hearthfield + + (199) 4233976 + + Chrysler + + Aspen + + Puce + + $55826.86 + + 2016-02-12 +
          + 37000-184 + + Emmanuel Klehn + + (522) 6504441 + + Mercedes-Benz + + SL-Class + + Yellow + + $99530.02 + + 2016-10-16 +
          + 55154-9615 + + Misha Wherrett + + (563) 6333585 + + Nissan + + Altima + + Indigo + + $46389.16 + + 2016-09-07 +
          + 30142-601 + + Grace Lipman + + (216) 8991083 + + Suzuki + + Swift + + Crimson + + $70355.23 + + 2017-02-01 +
          + 41163-078 + + Tania Dinning + + (222) 1194615 + + Chevrolet + + Suburban + + Blue + + $71922.35 + + 2017-12-09 +
          + 68428-044 + + Inigo Harnor + + (292) 3092919 + + BMW + + 5 Series + + Purple + + $70783.75 + + 2017-05-14 +
          + 0093-4161 + + Albina Yerrell + + (436) 2775370 + + Mitsubishi + + Chariot + + Mauv + + $98347.91 + + 2016-09-13 +
          + 64942-1225 + + Arron Kezourec + + (227) 5907590 + + Audi + + Coupe GT + + Goldenrod + + $88578.67 + + 2017-03-26 +
          + 0406-8960 + + Sergeant Paddefield + + (873) 3110165 + + Suzuki + + SX4 + + Goldenrod + + $22339.95 + + 2016-11-25 +
          + 53150-250 + + Anestassia De Fries + + (243) 7619758 + + Volkswagen + + Touareg + + Indigo + + $98734.53 + + 2016-05-18 +
          + 65862-061 + + Montgomery Southcoat + + (435) 8829120 + + Ford + + Bronco + + Violet + + $97615.88 + + 2017-02-09 +
          + 36987-1967 + + Kleon Minchenton + + (831) 3893014 + + Dodge + + Dakota + + Green + + $85134.59 + + 2016-10-27 +
          + 67544-298 + + Rosalyn McTeer + + (845) 6966658 + + Volkswagen + + GTI + + Pink + + $40741.32 + + 2016-08-07 +
          + 60505-0176 + + Sampson Mingay + + (582) 5639971 + + Infiniti + + I + + Violet + + $88649.99 + + 2016-07-25 +
          + 60319-4001 + + Ailene Swindells + + (150) 7296562 + + Audi + + 5000S + + Orange + + $57310.99 + + 2017-09-11 +
          + 46708-035 + + Virgie Vella + + (822) 5869741 + + Toyota + + Tacoma + + Red + + $40856.55 + + 2016-07-06 +
          + 67718-938 + + Beilul Bonnett + + (966) 3438432 + + Dodge + + Dakota + + Violet + + $20927.13 + + 2017-05-09 +
          + 10889-106 + + Zaccaria Canto + + (302) 7119085 + + Mercury + + Topaz + + Violet + + $73285.39 + + 2016-09-03 +
          + 16590-217 + + Elysia Mewrcik + + (958) 1047384 + + Ford + + Tempo + + Violet + + $94717.43 + + 2017-12-24 +
          + 51346-208 + + Shirlene Moan + + (495) 8670921 + + Maserati + + Spyder + + Orange + + $92595.92 + + 2016-02-02 +
          + 49817-0070 + + Jo ann Doggrell + + (663) 2181102 + + Lotus + + Exige + + Indigo + + $61597.27 + + 2016-04-21 +
          + 31720-211 + + Axe Ifill + + (203) 1949159 + + GMC + + Vandura 3500 + + Violet + + $28371.88 + + 2017-09-21 +
          + 59886-340 + + Randi Gockeler + + (939) 3260442 + + Chevrolet + + Aveo + + Turquoise + + $34479.82 + + 2016-08-11 +
          + 10812-873 + + Dukey Letteresse + + (249) 5119236 + + Infiniti + + G + + Fuscia + + $22117.39 + + 2017-01-19 +
          + 63323-238 + + Klaus Andrassy + + (970) 6395503 + + Mitsubishi + + Sigma + + Violet + + $16694.16 + + 2017-09-14 +
          + 68084-062 + + Hillary Hully + + (203) 3759234 + + Honda + + Civic + + Khaki + + $82730.20 + + 2016-11-12 +
          + 62011-0032 + + Bond Ofener + + (571) 1562188 + + Jeep + + Cherokee + + Pink + + $27135.34 + + 2016-02-07 +
          + 0006-0951 + + Turner Silvermann + + (766) 9823362 + + Dodge + + Ram 2500 + + Orange + + $35100.35 + + 2016-07-11 +
          + 61715-098 + + Ines Clemenzo + + (839) 6476213 + + Mitsubishi + + Truck + + Violet + + $86481.08 + + 2017-07-12 +
          + 76472-1129 + + Flory Orvis + + (954) 8668304 + + Saturn + + VUE + + Red + + $41773.44 + + 2016-03-27 +
          + 0363-0236 + + Maggee Cicetti + + (502) 8818640 + + Oldsmobile + + Silhouette + + Khaki + + $38969.12 + + 2016-12-22 +
          + 55154-1336 + + Derron Rigmond + + (521) 1010631 + + Chevrolet + + Express 1500 + + Turquoise + + $61520.54 + + 2017-07-01 +
          + 49288-0600 + + Giovanni Martinello + + (213) 6361851 + + Oldsmobile + + Aurora + + Blue + + $42877.19 + + 2017-07-31 +
          + 61957-0903 + + Arly Duigan + + (501) 9547783 + + Volkswagen + + Golf + + Turquoise + + $15494.89 + + 2016-05-15 +
          + 0093-7473 + + Mason Anker + + (722) 6021152 + + Audi + + S6 + + Puce + + $95903.74 + + 2016-07-31 +
          + 60764-006 + + Taber Nevett + + (919) 9971430 + + Dodge + + Dakota + + Puce + + $42240.15 + + 2016-08-21 +
          + 59279-507 + + Abbye Branca + + (988) 2061648 + + Audi + + Q5 + + Khaki + + $16814.44 + + 2017-10-12 +
          + 15478-001 + + Aviva Lower + + (434) 1774422 + + Mazda + + Tribute + + Yellow + + $84483.81 + + 2016-02-09 +
          + 0555-0595 + + Nessy Aaronsohn + + (677) 5096397 + + Toyota + + Celica + + Green + + $66632.25 + + 2016-07-20 +
          + 0067-8105 + + Klara Mort + + (927) 9164412 + + Suzuki + + Forenza + + Indigo + + $80973.60 + + 2016-01-03 +
          + 0013-8303 + + Nathan Scrase + + (849) 4082617 + + Isuzu + + Axiom + + Pink + + $88463.97 + + 2016-06-27 +
          + 63941-003 + + Nellie Marcinkowski + + (800) 8182585 + + Hyundai + + XG350 + + Orange + + $39504.17 + + 2017-12-04 +
          + 67046-915 + + Heda Fretwell + + (171) 6527161 + + Ford + + Fairlane + + Yellow + + $50807.63 + + 2016-06-02 +
          + 0046-1104 + + Courtney Curtayne + + (823) 4506262 + + Mercedes-Benz + + E-Class + + Maroon + + $67363.15 + + 2016-12-13 +
          + 50181-0013 + + Doll Kirkman + + (819) 5400302 + + GMC + + Yukon XL 1500 + + Violet + + $24037.13 + + 2016-05-06 +
          + 44911-0121 + + Meredithe Gaither + + (134) 7310512 + + Hyundai + + Elantra + + Purple + + $22714.10 + + 2016-11-04 +
          + 43063-339 + + Florenza Chominski + + (158) 4154311 + + Hyundai + + Elantra + + Violet + + $37418.20 + + 2017-06-10 +
          + 24653-282 + + Corabel Pizzey + + (962) 8955912 + + Volvo + + S40 + + Pink + + $39343.37 + + 2017-03-02 +
          + 0228-2837 + + Cristian Frisch + + (956) 1587850 + + Mazda + + B-Series + + Fuscia + + $89968.73 + + 2016-11-09 +
          + 49035-516 + + Selie Tillerton + + (401) 6603509 + + Hyundai + + Sonata + + Mauv + + $93302.34 + + 2016-05-30 +
          + 57237-056 + + Carol MacIlriach + + (906) 5303069 + + Mitsubishi + + Mirage + + Orange + + $79033.14 + + 2017-01-02 +
          + 76214-020 + + Inga Suttie + + (409) 7446305 + + Morgan + + Aero 8 + + Pink + + $40506.96 + + 2017-06-18 +
          + 68828-084 + + Erich Scandrick + + (353) 2695067 + + Buick + + Rendezvous + + Turquoise + + $17788.34 + + 2017-09-13 +
          + 48951-8142 + + Thaddus Phizacklea + + (108) 4424643 + + Chevrolet + + Camaro + + Green + + $99785.96 + + 2017-09-12 +
          + 55289-018 + + Ilario Roadnight + + (434) 6769019 + + Dodge + + Dakota + + Goldenrod + + $44697.63 + + 2017-02-26 +
          + 33261-416 + + Gwenette Ridhole + + (407) 7656030 + + Chevrolet + + Tahoe + + Indigo + + $66543.51 + + 2017-08-09 +
          + 0093-4146 + + Gretchen Coult + + (844) 6417821 + + Hyundai + + Accent + + Goldenrod + + $32727.98 + + 2016-02-16 +
          + 52380-1880 + + Olivero Arman + + (991) 3750974 + + Toyota + + 4Runner + + Maroon + + $84613.29 + + 2017-08-31 +
          + 33992-0268 + + Merilee Malsher + + (830) 7990701 + + Buick + + Enclave + + Teal + + $19820.19 + + 2016-08-01 +
          + 0280-1440 + + Giffard Bertolin + + (876) 9968818 + + Mazda + + 929 + + Orange + + $14235.30 + + 2016-07-25 +
          + 69114-2001 + + Tobias Brombell + + (948) 5326501 + + Mercedes-Benz + + E-Class + + Mauv + + $23693.34 + + 2016-10-21 +
          + 11673-395 + + Elvis Bartels + + (792) 2836414 + + Buick + + Century + + Fuscia + + $66276.64 + + 2016-06-06 +
          + 0406-9926 + + Vania Lourens + + (201) 5588530 + + Ford + + Explorer Sport Trac + + Fuscia + + $44164.25 + + 2017-07-09 +
          + 50111-333 + + Kain De'Ath + + (621) 2342331 + + Lexus + + LS + + Goldenrod + + $31826.25 + + 2016-05-02 +
          + 37808-422 + + Timmie Gatecliff + + (848) 9069629 + + Mercedes-Benz + + GLK-Class + + Khaki + + $61960.06 + + 2017-11-13 +
          + 36000-176 + + Carrissa Davana + + (991) 5619687 + + Ford + + F-Series Super Duty + + Khaki + + $99478.27 + + 2016-10-31 +
          + 62856-705 + + Ferdinande Itzhaiek + + (867) 6094265 + + GMC + + Canyon + + Mauv + + $24702.01 + + 2017-05-03 +
          + 54273-000 + + Misti Pick + + (985) 9871608 + + Nissan + + Pathfinder + + Blue + + $32344.81 + + 2016-08-30 +
          + 54473-228 + + Ddene Stebbings + + (934) 5084472 + + BMW + + M3 + + Mauv + + $57983.36 + + 2016-04-14 +
          + 67296-0801 + + Hermine Mundford + + (819) 3022082 + + Toyota + + MR2 + + Khaki + + $46202.99 + + 2016-05-21 +
          + 64471-330 + + Maynord Vaneev + + (330) 8996328 + + Cadillac + + Escalade ESV + + Blue + + $45740.26 + + 2016-03-30 +
          + 0378-0344 + + Jaimie Wrey + + (209) 5215049 + + GMC + + Sierra 1500 + + Khaki + + $12938.74 + + 2017-09-21 +
          + 60846-807 + + Eliot Brunetti + + (520) 9958820 + + Chevrolet + + TrailBlazer + + Purple + + $26441.50 + + 2016-12-03 +
          + 49288-0752 + + Mandi Bielefeld + + (103) 6044691 + + Chevrolet + + Corvette + + Blue + + $73061.25 + + 2017-11-27 +
          + 62011-0248 + + Carol Ible + + (819) 4166523 + + Lexus + + RX + + Blue + + $77034.66 + + 2017-01-31 +
          + 65044-2101 + + Anastasia Hutley + + (333) 2412744 + + Cadillac + + Escalade + + Crimson + + $82055.16 + + 2016-10-24 +
          + 43547-254 + + Christoffer Gullam + + (666) 8751957 + + Lotus + + Elan + + Maroon + + $21632.15 + + 2016-03-02 +
          + 11673-208 + + Wat Wrates + + (147) 5178268 + + Audi + + V8 + + Khaki + + $72574.55 + + 2016-07-12 +
          + 68084-401 + + Florenza Jorat + + (330) 4787446 + + Toyota + + Sequoia + + Puce + + $24295.37 + + 2017-03-30 +
          + 0615-5576 + + Lurleen Upjohn + + (332) 9654826 + + Jeep + + Patriot + + Mauv + + $55204.50 + + 2016-08-13 +
          + 68001-242 + + Norine Scedall + + (426) 9356871 + + GMC + + 2500 + + Turquoise + + $60227.86 + + 2016-09-04 +
          + 51346-188 + + Ricki Yarnton + + (751) 5116297 + + Audi + + A6 + + Orange + + $83227.75 + + 2016-01-06 +
          + 54868-2093 + + Shirline Scrafton + + (270) 9246449 + + Suzuki + + Forenza + + Fuscia + + $92530.81 + + 2016-11-14 +
          + 49349-867 + + Chico Rubinowitsch + + (392) 6963561 + + Hyundai + + Accent + + Violet + + $75138.19 + + 2016-02-24 +
          + 52533-142 + + Fanchon Durran + + (945) 3614142 + + Chevrolet + + Express 2500 + + Khaki + + $20926.39 + + 2016-01-06 +
          + 64942-1214 + + Ursulina Lanphier + + (191) 8945727 + + GMC + + Envoy + + Indigo + + $84545.27 + + 2017-08-26 +
          + 54868-0843 + + Ayn Garvin + + (360) 5221311 + + Toyota + + Prius + + Maroon + + $93920.58 + + 2016-01-09 +
          + 57520-0615 + + Risa Bayford + + (968) 4661308 + + Ford + + Mustang + + Mauv + + $60440.20 + + 2016-02-27 +
          + 30142-396 + + Batholomew Peppard + + (228) 1082053 + + Infiniti + + G + + Purple + + $44794.18 + + 2016-03-08 +
          + 0009-0176 + + Davita Woolsey + + (355) 3639205 + + Dodge + + Ram 2500 Club + + Yellow + + $64164.18 + + 2017-01-21 +
          + 76237-188 + + Lauren Thunderchief + + (824) 9195850 + + Chrysler + + LeBaron + + Violet + + $34031.52 + + 2016-10-17 +
          + 60505-3638 + + Virginie Barrett + + (109) 3478355 + + Honda + + Pilot + + Purple + + $89898.57 + + 2017-07-14 +
          + 76267-060 + + Rodge Spafford + + (368) 8209458 + + Nissan + + 240SX + + Khaki + + $27001.99 + + 2016-12-16 +
          + 35000-674 + + Aldous Reams + + (880) 7359671 + + Mercury + + Sable + + Khaki + + $53892.90 + + 2016-03-23 +
          + 49869-002 + + Broderic Burnsell + + (252) 6243116 + + Mercedes-Benz + + W201 + + Goldenrod + + $73661.98 + + 2016-04-20 +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/locked/left.html b/public/components/datatables/locked/left.html new file mode 100644 index 00000000..d496953f --- /dev/null +++ b/public/components/datatables/locked/left.html @@ -0,0 +1,3949 @@ + + + + + + + + Metronic | Left Locked Columns + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Left Locked Columns +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Left Columns Locked Datatable +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/locked/right.html b/public/components/datatables/locked/right.html new file mode 100644 index 00000000..a7497e52 --- /dev/null +++ b/public/components/datatables/locked/right.html @@ -0,0 +1,3949 @@ + + + + + + + + Metronic | Right Locked Columns + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Right Locked Columns +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Right Columns Locked Datatable +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/scrolling/both.html b/public/components/datatables/scrolling/both.html new file mode 100644 index 00000000..1f850196 --- /dev/null +++ b/public/components/datatables/scrolling/both.html @@ -0,0 +1,3949 @@ + + + + + + + + Metronic | Both Scrolling + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Both Scrolling +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Static Datatable +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/scrolling/horizontal.html b/public/components/datatables/scrolling/horizontal.html new file mode 100644 index 00000000..66b25a2b --- /dev/null +++ b/public/components/datatables/scrolling/horizontal.html @@ -0,0 +1,3949 @@ + + + + + + + + Metronic | Horizontal Scrolling + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Horizontal Scrolling +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Static Datatable +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/datatables/scrolling/vertical.html b/public/components/datatables/scrolling/vertical.html new file mode 100644 index 00000000..2cc518a1 --- /dev/null +++ b/public/components/datatables/scrolling/vertical.html @@ -0,0 +1,3949 @@ + + + + + + + + Metronic | Vertical Scrolling + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Vertical Scrolling +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Static Datatable +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/controls/base.html b/public/components/forms/controls/base.html new file mode 100644 index 00000000..a7d86301 --- /dev/null +++ b/public/components/forms/controls/base.html @@ -0,0 +1,4720 @@ + + + + + + + + Metronic | Base Controls + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Base Controls +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Base Form Controls +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + + + + We'll never share your email with anyone else. + +
          +
          + + +
          +
          + +

          + email@example.com +

          +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Textual HTML5 Inputs +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Air Input Style +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + + + + We'll never share your email with anyone else. + +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Pill Input Style +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + + + + We'll never share your email with anyone else. + +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          + +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Square Input Style +

          +
          +
          +
          + +
          +
          +
          + + + + We'll never share your email with anyone else. + +
          +
          + + +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Square & Solid Input Style +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + + + + We'll never share your email with anyone else. + +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Disabled & Readonly States +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Input Sizing +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Custom Controls +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          + +
          +
          + +
          + +
          +
          +
          +
          + + +
          +
          +
          + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/forms/controls/checkbox-radio.html b/public/components/forms/controls/checkbox-radio.html new file mode 100644 index 00000000..abf6b72e --- /dev/null +++ b/public/components/forms/controls/checkbox-radio.html @@ -0,0 +1,4525 @@ + + + + + + + + Metronic | Checkbox & Radios + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Checkbox & Radios +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Custom Checkboxes +

          +
          +
          +
          +
          + +
          + + Custom checkboxes in default form layout: + +
          +
          +
          + +
          +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + + Some help text goes here + +
          +
          + +
          + + + +
          + + Some help text goes here + +
          +
          + +
          + + + +
          + + Some help text goes here + +
          +
          + +
          + + + +
          + + Some help text goes here + +
          +
          + +
          + + + + + + + +
          + + Some help text goes here + +
          +
          + +
          + + + + + +
          + + Some help text goes here + +
          +
          + +
          + + + + + + + + +
          + + Some help text goes here + +
          +
          + +
          +
          +
          + + Custom checkboxes in horizontal form layout: + +
          +
          +
          + +
          +
          + +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + + +
          + + Some help text goes here + +
          +
          +
          + +
          +
          + + + +
          + + Some help text goes here + +
          +
          +
          + +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Custom Radios +

          +
          +
          +
          +
          + +
          + + Custom radios in default form layout: + +
          +
          +
          + +
          +
          + +
          + + + + +
          +
          +
          + +
          + + + +
          + + Some help text goes here + +
          +
          + +
          + + + +
          + + Some help text goes here + +
          +
          + +
          + + + +
          + + Some help text goes here + +
          +
          + +
          + + + + + + + + +
          + + Some help text goes here + +
          +
          + +
          + + + + + + +
          + + Some help text goes here + +
          +
          + +
          +
          +
          + + Custom radios in horizontal form layout: + +
          +
          +
          + +
          +
          + +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + + +
          + + Some help text goes here + +
          +
          +
          + +
          +
          + + + +
          + + Some help text goes here + +
          +
          +
          + +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/forms/controls/input-group.html b/public/components/forms/controls/input-group.html new file mode 100644 index 00000000..bd97f245 --- /dev/null +++ b/public/components/forms/controls/input-group.html @@ -0,0 +1,4832 @@ + + + + + + + + Metronic | Input Groups + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Input Groups +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Basic Example +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          + + @ + + +
          + + Some help content goes here + +
          +
          + +
          + + + @example.com + +
          +
          +
          + +
          + + $ + + + 0.00 + + +
          +
          +
          + +
          + + # + + + + px + +
          +
          +
          + +
          + + Amount: + + +
          + + Some help content goes here + +
          +
          + +
          + + % + + +
          + + Some help content goes here + +
          +
          + +
          + + + + + +
          + + Some help content goes here + +
          +
          + +
          + + # + + + + % + +
          + + Some help content goes here + +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Icon Groups +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          + + + + +
          + + Some help content goes here + +
          +
          + +
          + + + + +
          +
          +
          + +
          + + + + + USD + + + + + +
          +
          +
          + +
          + + + + + + + +
          +
          +
          + +
          + + + + +
          +
          +
          + +
          + + + + +
          +
          +
          + +
          + + + + +
          +
          +
          + +
          + + + + +
          +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Sizing +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          + + + + +
          + + Some help content goes here + +
          +
          + +
          + + + + + 0.00 + + +
          +
          +
          + +
          + + + + +
          +
          +
          + +
          + + + + +
          +
          +
          +
          +
          + + +
          +
          +
          + +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Icon Input Groups +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          + + + + + + +
          +
          +
          + +
          + + + + + + +
          +
          +
          + +
          + + + + + + + + + + + +
          +
          +
          + +
          + + + + + + + + + + + +
          +
          +
          + +
          + + + + + + + + + + + +
          +
          +
          + +
          + + + + + + + + + + + +
          +
          +
          + +
          + + + + + + + + + + + +
          +
          +
          + +
          + + + + + + +
          +
          +
          + +
          + + + + + + +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Checkboxes and Radio addons +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          + + + + + $ + + +
          +
          +
          + +
          + + $ + + + + + +
          +
          +
          + +
          + + + + + + + +
          +
          +
          + +
          + + + + + $ + + +
          +
          +
          + +
          + + $ + + + + + +
          +
          +
          + +
          + + + + + + + +
          +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Button Addons +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          + + + + +
          +
          +
          + +
          + + + + +
          +
          +
          + +
          + + + + + + + +
          +
          +
          + +
          + + + + +
          +
          +
          + +
          + + + + +
          +
          +
          + +
          + + + + + + + +
          +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Buttons With Dropdowns +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + + +
          +
          + + +
          + +
          +
          +
          + + +
          +
          +
          + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/forms/controls/switch.html b/public/components/forms/controls/switch.html new file mode 100644 index 00000000..92e437c7 --- /dev/null +++ b/public/components/forms/controls/switch.html @@ -0,0 +1,4598 @@ + + + + + + + + Metronic | Switch + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Switch +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Basic Usage +

          +
          +
          +
          +
          + +
          + + Basic checkboxes states: + +
          +
          +
          + +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          + + + +

          + Switch Sizing +

          +
          +
          +
          +
          + +
          + + Large size: + +
          +
          +
          + +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          +
          +
          + + Small size: + +
          +
          +
          + +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          +
          +
          +
          + +
          +
          + + +
          +
          +
          +
          + + + +

          + Switch State Colors +

          +
          +
          +
          +
          + +
          + + Solid style: + +
          +
          +
          + +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Switch State Colors +

          +
          +
          +
          +
          + +
          + + Solid style with icon: + +
          +
          +
          + +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          +
          +
          + + Outline style: + +
          +
          +
          + +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          +
          +
          + + Outline style with icon: + +
          +
          +
          + +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          + + + +
          + +
          + + + +
          +
          +
          + +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/forms/layouts/action-bars.html b/public/components/forms/layouts/action-bars.html new file mode 100644 index 00000000..50f3ac97 --- /dev/null +++ b/public/components/forms/layouts/action-bars.html @@ -0,0 +1,4444 @@ + + + + + + + + Metronic | Action Bars + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Action Bars +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Default Action Bar +

          +
          +
          +
          + +
          +
          +
          + + + + Please enter your full name + +
          +
          + + + + We'll never share your email with anyone else + +
          +
          + +
          + + + +
          +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Right Action Bar +

          +
          +
          +
          + +
          +
          +
          + + + + Please enter your full name + +
          +
          + + + + We'll never share your email with anyone else + +
          +
          + +
          + + + +
          +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Multiple Buttons +

          +
          +
          +
          + +
          +
          +
          + + + + Please enter your full name + +
          +
          + + + + We'll never share your email with anyone else + +
          +
          + +
          + + + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          + +
          +
          +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Action Button & Link +

          +
          +
          +
          + +
          +
          +
          + + + + Please enter your full name + +
          +
          + + + + We'll never share your email with anyone else + +
          +
          + +
          + + + +
          +
          +
          +
          +
          + + + or + + Cancel + + +
          +
          +
          + +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Layout With Space +

          +
          +
          +
          + +
          +
          +
          + + + + Please enter your full name + +
          +
          + + + + We'll never share your email with anyone else + +
          +
          + +
          + + + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          + +
          +
          +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Solid Bar +

          +
          +
          +
          + +
          +
          +
          + + + + Please enter your full name + +
          +
          + + + + We'll never share your email with anyone else + +
          +
          + +
          + + + +
          +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Top & Bottom Actions Bars +

          +
          +
          +
          + +
          +
          +
          +
          +
          + Top Actions: +
          +
          + + +
          +
          +
          +
          +
          +
          + + + + Please enter your full name + +
          +
          + + + + We'll never share your email with anyone else + +
          +
          + +
          + + + +
          +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Hirozontal Form Layout +

          +
          +
          +
          + +
          +
          +
          + +
          + + + Please enter your full name + +
          +
          +
          + +
          + + + We'll never share your email with anyone else + +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/forms/layouts/default-forms.html b/public/components/forms/layouts/default-forms.html new file mode 100644 index 00000000..81438104 --- /dev/null +++ b/public/components/forms/layouts/default-forms.html @@ -0,0 +1,4445 @@ + + + + + + + + Metronic | Default Forms + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Default Forms +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Default Form Layout +

          +
          +
          +
          + +
          +
          +
          +
          + + + + Please enter your full name + +
          +
          + + + + We'll never share your email with anyone else + +
          +
          + +
          + + $ + + +
          +
          +
          + +
          + + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Horizontal Form Layout +

          +
          +
          +
          + +
          +
          +
          +
          + +
          + + + Please enter your full name + +
          +
          +
          + +
          + + + We'll never share your email with anyone else + +
          +
          +
          + +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Form Sections +

          +
          +
          +
          + +
          +
          +
          +
          +

          + 1. Customer Info: +

          +
          +
          + + + + Please enter your full name + +
          +
          + + + + We'll never share your email with anyone else + +
          +
          + +
          + + + + + + +
          + + We'll never share your email with anyone else + +
          +
          + +
          + + + +
          +
          +
          +
          +
          +
          +

          + 2. Payment Info: +

          +
          +
          + +
          + + + +
          + + Please select payment method + +
          +
          + + + + Please enter payment amount + +
          +
          +
          +
          +
          + + +
          +
          +
          + +
          + +
          +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Horizontal Form Sections +

          +
          +
          +
          + +
          +
          +
          +
          +

          + Customer Info: +

          +
          +
          + +
          + + + Please enter your full name + +
          +
          +
          + +
          + + + We'll never share your email with anyone else + +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +

          + Payment Info: +

          +
          +
          + +
          +
          + + + +
          + + Please select payment method + +
          +
          +
          + +
          + + + Please enter payment amount + +
          +
          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Border Seperator Form Groups +

          +
          +
          +
          + +
          +
          +
          + +
          + + + Please enter your full name + +
          +
          +
          + +
          + + + We'll never share your email with anyone else + +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Dashed Seperator Form Groups +

          +
          +
          +
          + +
          +
          +
          + +
          + + + Please enter your full name + +
          +
          +
          + +
          + + + We'll never share your email with anyone else + +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/forms/layouts/multi-column-forms.html b/public/components/forms/layouts/multi-column-forms.html new file mode 100644 index 00000000..36b7470f --- /dev/null +++ b/public/components/forms/layouts/multi-column-forms.html @@ -0,0 +1,4351 @@ + + + + + + + + Metronic | Multi Column Forms + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Multi Column Forms +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + 2 Columns Form Layout +

          +
          +
          +
          + +
          +
          +
          +
          + + + + Please enter your full name + +
          +
          + + + + Please enter your contact number + +
          +
          +
          +
          + +
          + + + + + + +
          + + Please enter your address + +
          +
          + +
          + + + + + + +
          + + Please enter your postcode + +
          +
          +
          +
          + +
          + + +
          + + Please select user group + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          + +
          +
          +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + 2 Columns Horizontal Form Layout +

          +
          +
          +
          + +
          +
          +
          + +
          + + + Please enter your full name + +
          + +
          + + + Please enter your contact number + +
          +
          +
          + +
          +
          + + + + + + +
          + + Please enter your address + +
          + +
          +
          + + + + + + +
          + + Please enter your postcode + +
          +
          +
          + +
          +
          + + +
          + + Please select user group + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + 3 Columns Form Layout +

          +
          +
          +
          + +
          +
          +
          +
          + + + + Please enter your full name + +
          +
          + + + + Please enter your email + +
          +
          + +
          + + + + +
          + + Please enter your username + +
          +
          +
          +
          + + + + Please enter your contact + +
          +
          + +
          + + + + + + +
          + + Please enter fax + +
          +
          + +
          + + + + + + +
          + + Please enter your address + +
          +
          +
          +
          + +
          + + + + + + +
          + + Please enter your postcode + +
          +
          + +
          + + +
          + + Please select user group + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + 3 Columns Horizontal Form Layout +

          +
          +
          +
          + +
          +
          +
          + +
          + + + Please enter your full name + +
          + +
          + + + Please enter your email + +
          + +
          +
          + + + + +
          + + Please enter your username + +
          +
          +
          + +
          + + + Please enter your contact + +
          + +
          +
          + + + + + + +
          + + Please enter fax + +
          + +
          +
          + + + + + + +
          + + Please enter your address + +
          +
          +
          + +
          +
          + + + + + + +
          + + Please enter your postcode + +
          + +
          +
          + + +
          + + Please select user group + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/forms/validation/form-controls.html b/public/components/forms/validation/form-controls.html new file mode 100644 index 00000000..7fb98c5f --- /dev/null +++ b/public/components/forms/validation/form-controls.html @@ -0,0 +1,4346 @@ + + + + + + + + Metronic | Form Controls + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Form Controls +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Default Form Validation +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          + + + We'll never share your email with anyone else. + +
          +
          +
          + +
          +
          + + + .via.com + +
          + + Please enter your website URL. + +
          +
          +
          + +
          +
          + + + + + + +
          + + Please enter only digits + +
          +
          +
          + +
          +
          + + + + +
          + + Please enter your credit card number + +
          +
          +
          + +
          +
          + + + + + + +
          + + Please enter your US phone number + +
          +
          +
          + +
          + + + Please select an option. + +
          +
          +
          + +
          + + + Please select at least one or maximum 4 options + +
          +
          +
          + +
          + + + Please enter a menu within text length range 10 and 100. + +
          +
          +
          +
          + +
          +
          + +
          + + Please tick the checkbox + +
          +
          +
          + +
          +
          + + + +
          + + Please select at lease 1 and maximum 2 options + +
          +
          +
          + +
          +
          + + + +
          + + Please select an option + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + +
          +
          +
          +
          +

          + Inputs Highlighted Validation State +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          + + + We'll never share your email with anyone else. + +
          +
          +
          + +
          +
          + + + .via.com + +
          + + Please enter your website URL. + +
          +
          +
          + +
          +
          + + + + + + +
          + + Please enter only digits + +
          +
          +
          + +
          +
          + + + + +
          + + Please enter your credit card number + +
          +
          +
          + +
          +
          + + + + + + +
          + + Please enter your US phone number + +
          +
          +
          + +
          + + + Please select an option. + +
          +
          +
          + +
          + + + Please select at least one or maximum 4 options + +
          +
          +
          + +
          + + + Please enter a menu within text length range 10 and 100. + +
          +
          +
          +
          + +
          +
          + +
          + + Please tick the checkbox + +
          +
          +
          + +
          +
          + + + +
          + + Please select at lease 1 and maximum 2 options + +
          +
          +
          + +
          +
          + + + +
          + + Please select an option + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/validation/form-widgets.html b/public/components/forms/validation/form-widgets.html new file mode 100644 index 00000000..71146319 --- /dev/null +++ b/public/components/forms/validation/form-widgets.html @@ -0,0 +1,4169 @@ + + + + + + + + Metronic | Form Widgets + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Form Widgets +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Form Widgets Validation Examples +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          +
          + + + + +
          + + Select a date + +
          +
          +
          + +
          +
          + + + + +
          + + Select a date time + +
          +
          +
          + +
          +
          + + + + +
          + + Select time + +
          +
          +
          + +
          +
          + + + + +
          + + Select a date range + +
          +
          +
          +
          + +
          + + +
          +
          +
          +
          + +
          + + + Select at least 2 and maximum 4 options + +
          +
          +
          + +
          + + + Select an option + +
          +
          +
          + +
          +
          + +
          + + Please select a state + +
          +
          +
          +
          + +
          + + + Enter some markdown content + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/validation/states.html b/public/components/forms/validation/states.html new file mode 100644 index 00000000..1f6ccf9c --- /dev/null +++ b/public/components/forms/validation/states.html @@ -0,0 +1,4889 @@ + + + + + + + + Metronic | Validation States + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Validation States +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Default Form Validation States +

          +
          +
          +
          + +
          +
          +
          + + + + + Example help text that remains unchanged. + +
          +
          + + + + + Example help text that remains unchanged. + +
          +
          + + + + + Example help text that remains unchanged. + +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Highlight Input Control Border +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + + + + + Example help text that remains unchanged. + +
          +
          + + + + + Example help text that remains unchanged. + +
          +
          + + + + + Example help text that remains unchanged. + +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Horizontal Form Validation States +

          +
          +
          +
          + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Input Style Validation States +

          +
          +
          +
          + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Input Group Validation States +

          +
          +
          +
          + +
          +
          +
          + +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          + +
          + + + USD + +
          + + + Example help text that remains unchanged. + +
          +
          + +
          + + @ + + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Icon Input Validation States +

          +
          +
          +
          + +
          +
          +
          + +
          + + + + + + +
          + + + Example help text that remains unchanged. + +
          +
          + +
          + + + + + + +
          + + + Example help text that remains unchanged. + +
          +
          + +
          + + + + + + + + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          +
          + + +
          +
          +
          + +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Checkbox & Radio Validation States +

          +
          +
          +
          + +
          +
          +
          + +
          + + + +
          + + + Example help text that remains unchanged. + +
          +
          + +
          + + + +
          + + + Example help text that remains unchanged. + +
          +
          + +
          + + + +
          + + + Example help text that remains unchanged. + +
          +
          + +
          + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Button Addons Validation States +

          +
          +
          +
          + +
          +
          +
          + +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          + +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          + +
          + + + + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Highlight Input Control Border +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          + +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          + +
          + + + + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Button Addons Validation States +

          +
          +
          +
          + +
          +
          +
          + +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          + +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          + +
          + + + + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          +
          + + +
          +
          +
          + +
          + + +
          +
          +
          +
          + + + +

          + Dropdowns Addon Validation States +

          +
          +
          +
          + +
          +
          +
          + + + + + Example help text that remains unchanged. + +
          +
          + + + + + Example help text that remains unchanged. + +
          +
          + + + + + Example help text that remains unchanged. + +
          +
          +
          +
          + + +
          +
          +
          + +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/forms/widgets/autosize.html b/public/components/forms/widgets/autosize.html new file mode 100644 index 00000000..6ce29ecf --- /dev/null +++ b/public/components/forms/widgets/autosize.html @@ -0,0 +1,3867 @@ + + + + + + + + Metronic | Autosize + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Autosize +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Autosize Textarea Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/bootstrap-datepicker.html b/public/components/forms/widgets/bootstrap-datepicker.html new file mode 100644 index 00000000..b396608b --- /dev/null +++ b/public/components/forms/widgets/bootstrap-datepicker.html @@ -0,0 +1,4110 @@ + + + + + + + + Metronic | Bootstrap Datepicker + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Bootstrap Datepicker +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Bootstrap Date Picker Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + + + +
          + + Enable clear and today helper buttons + +
          +
          +
          + +
          +
          + + + + +
          +
          +
          + + + + +
          +
          +
          + + + + +
          +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + + + + +
          + + Linked pickers for date range selection + +
          +
          +
          + +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + + + + +
          +
          +
          +
          +

          + Validation State Examples +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          + +
          +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          + +
          +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/bootstrap-daterangepicker.html b/public/components/forms/widgets/bootstrap-daterangepicker.html new file mode 100644 index 00000000..c2e6f01f --- /dev/null +++ b/public/components/forms/widgets/bootstrap-daterangepicker.html @@ -0,0 +1,4088 @@ + + + + + + + + Metronic | Bootstrap Daterangepicker + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Bootstrap Daterangepicker +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Bootstrap Date Range Picker Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + + + + + +
          +
          +
          +
          + +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + + + +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + + + + +
          +
          +
          +
          +

          + Validation State Examples +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          + +
          +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          + +
          +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/bootstrap-datetimepicker.html b/public/components/forms/widgets/bootstrap-datetimepicker.html new file mode 100644 index 00000000..8a68ffa1 --- /dev/null +++ b/public/components/forms/widgets/bootstrap-datetimepicker.html @@ -0,0 +1,4133 @@ + + + + + + + + Metronic | Bootstrap Datetimepicker + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Bootstrap Datetimepicker +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Bootstrap Date Time Picker Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + + + +
          + + Enable clear and today helper buttons + +
          +
          +
          + +
          +
          + + + + +
          +
          +
          + + + + +
          +
          +
          + + + + +
          +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + + + +
          + + Linked pickers for date range selection + +
          +
          +
          + +
          +
          + + + + +
          + + Only date selection + +
          +
          +
          + +
          +
          + + + + +
          + + Only time selection + +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + + + + +
          +
          +
          +
          +

          + Validation State Examples +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          + +
          +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          + +
          +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/bootstrap-markdown.html b/public/components/forms/widgets/bootstrap-markdown.html new file mode 100644 index 00000000..4ed6ff68 --- /dev/null +++ b/public/components/forms/widgets/bootstrap-markdown.html @@ -0,0 +1,3978 @@ + + + + + + + + Metronic | Bootstrap Markdown + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Bootstrap Markdown +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Bootstrap Markdown Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + + + + +
          +
          +
          +
          +

          + Validation State Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/bootstrap-maxlength.html b/public/components/forms/widgets/bootstrap-maxlength.html new file mode 100644 index 00000000..cfcaa58d --- /dev/null +++ b/public/components/forms/widgets/bootstrap-maxlength.html @@ -0,0 +1,4003 @@ + + + + + + + + Metronic | Bootstrap Maxlength + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Bootstrap Maxlength +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Bootstrap Maxlength Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + + + The badge will show up by default when the remaining chars are 3 or less + +
          +
          +
          + +
          + + + Set threshold value to show there are 5 chars or less + +
          +
          +
          + +
          + + + Show the counter on input focus + +
          +
          +
          + +
          + + + Display custom text on input focus + +
          +
          +
          + +
          + + + Bootstrap maxlength supports textarea as well as inputs + +
          +
          +
          + +
          + +
          + +
          + +
          + + + The field counter can be positioned at the top, bottom, left or right. + +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + + + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/bootstrap-multipleselectsplitter.html b/public/components/forms/widgets/bootstrap-multipleselectsplitter.html new file mode 100644 index 00000000..adc6a2a7 --- /dev/null +++ b/public/components/forms/widgets/bootstrap-multipleselectsplitter.html @@ -0,0 +1,4030 @@ + + + + + + + + Metronic | Bootstrap Multiple Select Splitter + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Bootstrap Multiple Select Splitter +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Bootstrap Multiple Select Splitter Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/bootstrap-select.html b/public/components/forms/widgets/bootstrap-select.html new file mode 100644 index 00000000..62c7a302 --- /dev/null +++ b/public/components/forms/widgets/bootstrap-select.html @@ -0,0 +1,4978 @@ + + + + + + + + Metronic | Bootstrap Select + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Bootstrap Select +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Bootstrap Select Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + + + Select boxes with optgroups + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          + +
          + + + You can add a search input by passing + + data-live-search="true" + + attribute + +
          +
          +
          + +
          + + + Add key words to options to improve their searchability using + + data-tokens + + +
          +
          +
          + +
          + + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          + +
          + +
          + +
          +
          +
          + +
          +
          + + + + +
          +
          +
          + + + + +
          +
          +
          + + + + + + + +
          +
          +
          + + + + + USD + + + + + +
          +
          +
          + + + + +
          +
          +
          + + + + +
          +
          +
          + + + + +
          +
          +
          + + + + + + + +
          +
          +
          + + + + + + + +
          +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + + + + +
          +
          +
          +
          +

          + Validation State Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/bootstrap-switch.html b/public/components/forms/widgets/bootstrap-switch.html new file mode 100644 index 00000000..a9b03353 --- /dev/null +++ b/public/components/forms/widgets/bootstrap-switch.html @@ -0,0 +1,4023 @@ + + + + + + + + Metronic | Bootstrap Switch + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Bootstrap Switch +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Bootstrap Switch Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + + +
          +
          +
          + +
          + + + + +
          +
          +
          + +
          + + + +
          +
          +
          + +
          + + +
          +
          +
          + +
          + + + +
          +
          +
          + +
          + + + + + + + + + +
          +
          +
          + +
          + + + + + + + + + +
          +
          +
          + +
          + + + + + + + + + +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + + + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/bootstrap-timepicker.html b/public/components/forms/widgets/bootstrap-timepicker.html new file mode 100644 index 00000000..e6734261 --- /dev/null +++ b/public/components/forms/widgets/bootstrap-timepicker.html @@ -0,0 +1,4071 @@ + + + + + + + + Metronic | Bootstrap Timepicker + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Bootstrap Timepicker +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Bootstrap Time Picker Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + + + +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + + + + +
          +
          +
          +
          +

          + Validation State Examples +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          + +
          +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          + +
          +
          + + + + +
          + + + Example help text that remains unchanged. + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/bootstrap-touchspin.html b/public/components/forms/widgets/bootstrap-touchspin.html new file mode 100644 index 00000000..3c318093 --- /dev/null +++ b/public/components/forms/widgets/bootstrap-touchspin.html @@ -0,0 +1,4047 @@ + + + + + + + + Metronic | Bootstrap Touchspin + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Bootstrap Touchspin +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Bootstrap Touchspin Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + +
          +
          +
          +
          +

          + Bootstrap Touchspin Brand Color Skin +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + +
          +
          +
          +
          +

          + Validation State Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/clipboard.html b/public/components/forms/widgets/clipboard.html new file mode 100644 index 00000000..f687fd65 --- /dev/null +++ b/public/components/forms/widgets/clipboard.html @@ -0,0 +1,3909 @@ + + + + + + + + Metronic | Clipboard + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Clipboard +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Clipboard Examples +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + + + + + + +
          +
          +
          +
          + +
          + +
          + + + Copy to clipboard + +
          +
          +
          + +
          + +
          + + + Cut to clipboard + +
          +
          +
          + +
          +
          + Mussum ipsum cacilds, vidis litro abertis. Consetis adipiscings elitis. Pra lá , depois divoltis porris, paradis. Paisis, filhis, espiritis santis. Mé faiz elementum girarzis, nisi eros vermeio, in elementis mé pra quem é amistosis quis leo. Manduma pindureta quium dia nois paga. +
          +
          + + + Copy to clipboard + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/dropzone.html b/public/components/forms/widgets/dropzone.html new file mode 100644 index 00000000..90581bc7 --- /dev/null +++ b/public/components/forms/widgets/dropzone.html @@ -0,0 +1,3904 @@ + + + + + + + + Metronic | Dropzone + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Dropzone +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Dropzone File Upload Examples +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +

          + Drop files here or click to upload. +

          + + This is just a demo dropzone. Selected files are + + not + + actually uploaded. + +
          +
          +
          +
          +
          + +
          +
          +
          +

          + Drop files here or click to upload. +

          + + Upload up to 10 files + +
          +
          +
          +
          +
          + +
          +
          +
          +

          + Drop files here or click to upload. +

          + + Only image, pdf and psd files are allowed for upload + +
          +
          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/form-repeater.html b/public/components/forms/widgets/form-repeater.html new file mode 100644 index 00000000..4d0d2a79 --- /dev/null +++ b/public/components/forms/widgets/form-repeater.html @@ -0,0 +1,4264 @@ + + + + + + + + Metronic | Form Repeater + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Form Repeater +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          + + + +

          + Form Repeater Example +

          +
          +
          +
          + +
          +
          +
          +
          + +
          + + + Please enter your full name + +
          +
          +
          + +
          + + + We'll never share your email with anyone else + +
          +
          +
          + +
          +
          + + + + +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + + + + Delete + + +
          +
          +
          +
          +
          +
          + +
          +
          + + + + Add + + +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + +
          +
          +
          +
          +
          +
          + + + +

          + Form Repeater Example +

          +
          +
          +
          + +
          +
          +
          +
          + +
          + + + Please enter your full name + +
          +
          +
          + +
          + + + We'll never share your email with anyone else + +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          + +
          +
          + + + + +
          +
          +
          +
          +
          + +
          +
          +
          + + + + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + + + + Add + + +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          +
          +
          + + + +

          + Form Repeater Example +

          +
          +
          +
          + +
          +
          +
          +
          + +
          + + + Please enter your full name + +
          +
          +
          + +
          + + + We'll never share your email with anyone else + +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          + +
          +
          + + + + +
          +
          +
          +
          +
          + +
          +
          +
          +
          + + + + +
          +
          +
          +
          + + + + +
          +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + + + + Add + + +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/input-mask.html b/public/components/forms/widgets/input-mask.html new file mode 100644 index 00000000..2194cd1b --- /dev/null +++ b/public/components/forms/widgets/input-mask.html @@ -0,0 +1,3968 @@ + + + + + + + + Metronic | Input Masks + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Input Masks +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Input Mask Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + + + Custom date format: + + mm/dd/yyyy + + +
          +
          +
          + +
          + + + Date mask with custom placeholder: + + mm/dd/yyyy + + +
          +
          +
          + +
          + + + Phone number mask: + + (999) 999-9999 + + +
          +
          +
          + +
          + + + Phone number mask: + + 99-9999999 + + +
          +
          +
          + +
          + + + Mask + + 9 + + , + + 99 + + or ... + + 9999999999 + + +
          +
          +
          + +
          + + + Right aligned numeric mask + +
          +
          +
          + +
          + + + Currency format + + € ___.__1.234,56 + + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/ion-range-slider.html b/public/components/forms/widgets/ion-range-slider.html new file mode 100644 index 00000000..5f966b30 --- /dev/null +++ b/public/components/forms/widgets/ion-range-slider.html @@ -0,0 +1,3929 @@ + + + + + + + + Metronic | Ion Range Slider + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + ion Range Slider +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + ion Range Slider Examples +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          +
          +
          +
          + +
          + +
          + +
          +
          +
          +
          + +
          +
          + +
          +
          + Set type to double and specify range, also showing grid and adding prefix "$" +
          +
          +
          +
          + +
          +
          + +
          +
          + Set up range with negative values +
          +
          +
          +
          + +
          +
          + +
          +
          + Set up range with fractional values, using fractional step +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/nouislider.html b/public/components/forms/widgets/nouislider.html new file mode 100644 index 00000000..34d278ea --- /dev/null +++ b/public/components/forms/widgets/nouislider.html @@ -0,0 +1,4053 @@ + + + + + + + + Metronic | NoUiSlider + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + noUiSlider +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          +

          + Bootstrap noUiSlider Examples +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          + + Input control is attached to slider + +
          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          + + To format the slider output, noUiSlider offers a format option. + +
          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + Slider with tooltips to show slider values. + +
          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          +
          +
          +
          +
          + + Use state classes to change the slider's connect path and handle colors. + +
          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          + + Disables the edges of slider where handler bounces back when released + +
          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          + + Vertical orientation slider example + +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + +
          + + + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/recaptcha.html b/public/components/forms/widgets/recaptcha.html new file mode 100644 index 00000000..7fb10fdf --- /dev/null +++ b/public/components/forms/widgets/recaptcha.html @@ -0,0 +1,3926 @@ + + + + + + + + Metronic | Google reCaptcha + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Google reCaptcha +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Google reCaptcha Examples +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          + To learn more about Google reCaptcha please visit + + http://www.google.com/recaptcha + +
          +
          + +
          +
          + +
          + +
          +
          + + +
          +
          + + + + + + + + + + + + + + + + + + + + + +
          +
          + + Enter the words above + + + Enter the numbers you hear + +
          +
          +
          + + Note:  + + Please visit + + http://www.google.com/recaptcha + + to learn more about the Google reCaptcha +
          + + + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/forms/widgets/select2.html b/public/components/forms/widgets/select2.html new file mode 100644 index 00000000..06070c4a --- /dev/null +++ b/public/components/forms/widgets/select2.html @@ -0,0 +1,6830 @@ + + + + + + + + Metronic | Select2 + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Select2 +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Select2 Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + +
          +
          + + + + +
          +
          +
          + + + + +
          +
          +
          + + + + + + + +
          +
          +
          + + + + + USD + + + + + +
          +
          +
          + + + + +
          +
          +
          + + + + +
          +
          +
          + + + + +
          +
          +
          + + + + + + + +
          +
          +
          + + + + + + + +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + + + + +
          +
          +
          +
          +

          + Validation State Examples +

          +
          +
          +
          + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          + +
          + + + + Example help text that remains unchanged. + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/summernote.html b/public/components/forms/widgets/summernote.html new file mode 100644 index 00000000..f2ccd488 --- /dev/null +++ b/public/components/forms/widgets/summernote.html @@ -0,0 +1,3978 @@ + + + + + + + + Metronic | Summernote WYSIWYG + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Summernote WYSIWYG +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Summernote Examples +

          +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + + + + +
          +
          +
          +
          +

          + Validation State Examples +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + + + Example help text that remains unchanged. + +
          +
          +
          + +
          +
          + + + Example help text that remains unchanged. + +
          +
          +
          + +
          +
          + + + Example help text that remains unchanged. + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/widgets/typeahead.html b/public/components/forms/widgets/typeahead.html new file mode 100644 index 00000000..449b00ad --- /dev/null +++ b/public/components/forms/widgets/typeahead.html @@ -0,0 +1,4066 @@ + + + + + + + + Metronic | Typeahead + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Typeahead +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +

          + Typeahead Examples +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          +
          +
          +
          + +
          +
          + +
          +
          + Bloodhound offers advanced functionalities such as prefetching and backfilling with remote data. +
          +
          +
          +
          + +
          +
          + +
          +
          + Prefetched data is fetched and processed on initialization +
          +
          +
          +
          + +
          +
          + +
          +
          + Custom templates give you full control over how suggestions get rendered +
          +
          +
          +
          + +
          +
          + +
          +
          + Remote data is only used when the data provided by local and prefetch is insufficient +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + + + + + +
          +
          +
          +
          +

          + Validation State Examples +

          +
          +
          +
          + +
          +
          +
          + +
          +
          + +
          + + + Example help text that remains unchanged. + +
          +
          +
          + +
          +
          + +
          + + + Example help text that remains unchanged. + +
          +
          +
          + +
          +
          + +
          + + + Example help text that remains unchanged. + +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/wizard/wizard-1.html b/public/components/forms/wizard/wizard-1.html new file mode 100644 index 00000000..fcd8e321 --- /dev/null +++ b/public/components/forms/wizard/wizard-1.html @@ -0,0 +1,5534 @@ + + + + + + + + Metronic | Form Wizard 1 + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Form Wizard 1 +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          + +
          +
          +
          +

          + Client Registration + + form wizard example + +

          +
          +
          +
          + +
          +
          + + +
          + +
          + +
          + + +
          + +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + + 1 + + + +
          + +
          +
          + Client Information +
          +
          +
          +
          +
          + + + + 2 + + + +
          + +
          +
          + Account Setup +
          +
          +
          +
          +
          + + + + 3 + + + +
          + +
          +
          + Billing Setup +
          +
          +
          +
          +
          + + + + 4 + + + +
          + +
          +
          + Confirmation +
          +
          +
          +
          +
          + +
          + + +
          + +
          + +
          + +
          +
          +
          +
          +
          +

          + Client Details +

          +
          +
          + +
          + + + Please enter your first and last names + +
          +
          +
          + +
          + + + We'll never share your email with anyone else + +
          +
          +
          + +
          +
          + + + + +
          + + Enter your valid phone in US phone format. E.g: 1-541-754-3010 + +
          +
          +
          +
          +
          +
          +

          + Mailing Address + +

          +
          +
          + +
          + + + Street address, P.O. box, company name, c/o + +
          +
          +
          + +
          + + + Appartment, suite, unit, building, floor, etc + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +

          + Account Details +

          +
          +
          +
          + + + + Please enter your preferred URL to your dashboard + +
          +
          +
          +
          + + + + Your username to login to your dashboard + +
          +
          + + + + Please use letters and at least one number and symbol + +
          +
          +
          +
          +
          +
          +

          + Client Settings +

          +
          +
          +
          + +
          + + +
          + + Please select user group + +
          +
          + +
          + + + +
          + + Please select user communication options + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +

          + Billing Information +

          +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          +
          +
          +
          +
          +

          + Billing Address + +

          +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Account Details +

          +
          +
          + +
          + + sinortech.vertoffice.com + +
          +
          +
          + +
          + + sinortech.admin + +
          +
          +
          + +
          + + ********* + +
          +
          +
          +
          +
          +
          +

          + Client Settings +

          +
          +
          + +
          + + Customer + +
          +
          +
          + +
          + + Phone, Email + +
          +
          +
          +
          + +
          +
          + + +
          + +
          + +
          +
          +
          +

          + Account Details +

          +
          +
          + +
          + + sinortech.vertoffice.com + +
          +
          +
          + +
          + + sinortech.admin + +
          +
          +
          + +
          + + ********* + +
          +
          +
          +
          +
          +
          +

          + Client Settings +

          +
          +
          + +
          + + Customer + +
          +
          +
          + +
          + + Phone, Email + +
          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          +
          +

          + Billing Information +

          +
          +
          + +
          + + Nick Stone + +
          +
          +
          + +
          + + *************4589 + +
          +
          +
          + +
          + + 10 + +
          +
          +
          + +
          + + 2018 + +
          +
          +
          + +
          + + *** + +
          +
          +
          +
          +
          +
          +

          + Billing Address +

          +
          +
          + +
          + + Headquarters 1120 N Street Sacramento 916-654-5266 + +
          +
          +
          + +
          + + P.O. Box 942873 Sacramento, CA 94273-0001 + +
          +
          +
          + +
          + + Polo Alto + +
          +
          +
          + +
          + + California + +
          +
          +
          + +
          + + 37505 + +
          +
          +
          + +
          + + USA + +
          +
          +
          +
          +
          +
          + +
          + +
          +
          +
          +
          + +
          +
          +
          +
          +
          +
          + +
          + + + + +
          +
          + +
          + +
          + +
          +
          +
          +
          +
          +

          + Benifits Of Joining +

          +
          +

          + Lorem Ipsum is simply dummy text of the printing and typesetting industry. + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, +

          +

          + when an unknown printer took a galley of type and scrambled it to make a type specimen book. + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. +

          +
          +
          +
          +
          +
          +
          +
          +

          + Member Profit +

          + + Awerage Weekly Profit + +
          +
          + + +$17,800 + +
          +
          +
          +
          +
          +
          +

          + Orders +

          + + Weekly Customer Orders + +
          +
          + + +1,800 + +
          +
          +
          +
          +
          +
          +

          + Issue Reports +

          + + System bugs and issues + +
          +
          + + -27,49% + +
          +
          +
          + +
          + +
          +
          +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/wizard/wizard-2.html b/public/components/forms/wizard/wizard-2.html new file mode 100644 index 00000000..6821600e --- /dev/null +++ b/public/components/forms/wizard/wizard-2.html @@ -0,0 +1,5183 @@ + + + + + + + + Metronic | Form Wizard 2 + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Form Wizard 2 +

          + +
          +
          + +
          +
          +
          + +
          + +
          + +
          +
          +
          +

          + Client Registration + + form wizard example + +

          +
          +
          +
          + +
          +
          + + +
          + +
          + +
          + + +
          + +
          +
          +
          +
          +
          + + +
          +
          +
          + + + + + +
          +
          + 1. Client Information +
          +
          + Lorem ipsum doler amet elit +
          + sed eiusmod tempors +
          +
          +
          +
          + + + + + +
          +
          + 2. Account Setup +
          +
          + Lorem ipsum doler amet elit +
          + sed eiusmod tempors +
          +
          +
          +
          + + + + + +
          +
          + 3. Confirmation +
          +
          + Lorem ipsum doler amet elit +
          + sed eiusmod tempors +
          +
          +
          +
          +
          + +
          + + +
          + +
          + +
          + +
          +
          +
          +
          +
          +

          + Client Details +

          +
          +
          + +
          + + + Please enter your first and last names + +
          +
          +
          + +
          + + + We'll never share your email with anyone else + +
          +
          +
          + +
          +
          + + + + +
          + + Enter your valid phone in US phone format. E.g: 1-541-754-3010 + +
          +
          +
          +
          +
          +
          +

          + Mailing Address + +

          +
          +
          + +
          + + + Street address, P.O. box, company name, c/o + +
          +
          +
          + +
          + + + Appartment, suite, unit, building, floor, etc + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +

          + Account Details +

          +
          +
          +
          + + + + Please enter your preferred URL to your dashboard + +
          +
          +
          +
          + + + + Your username to login to your dashboard + +
          +
          + + + + Please use letters and at least one number and symbol + +
          +
          +
          +
          +
          +
          +

          + Client Settings +

          +
          +
          +
          + +
          + + +
          + + Please select user group + +
          +
          + +
          + + + +
          + + Please select user communication options + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          + + +
          +
          +
          +
          +

          + Client Details +

          +
          +
          + +
          + + Nick Stone + +
          +
          +
          + +
          + + nick.stone@gmail.com + +
          +
          +
          + +
          + + +206-78-55034890 + +
          +
          +
          +
          +
          +
          +

          + Corresponding Address + +

          +
          +
          + +
          + + Headquarters 1120 N Street Sacramento 916-654-5266 + +
          +
          +
          + +
          + + P.O. Box 942873 Sacramento, CA 94273-0001 + +
          +
          +
          + +
          + + Polo Alto + +
          +
          +
          + +
          + + California + +
          +
          +
          + +
          + + USA + +
          +
          +
          +
          +
          +
          +
          +

          + Account Details +

          +
          +
          + +
          + + sinortech.vertoffice.com + +
          +
          +
          + +
          + + sinortech.admin + +
          +
          +
          + +
          + + ********* + +
          +
          +
          +
          +
          +
          +

          + Account Details +

          +
          +
          + +
          + + sinortech.vertoffice.com + +
          +
          +
          + +
          + + sinortech.admin + +
          +
          +
          + +
          + + ********* + +
          +
          +
          +
          +
          +
          +
          +
          +

          + Client Settings +

          +
          +
          + +
          + + Customer + +
          +
          +
          + +
          + + Phone, Email + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + +
          +
          +
          +
          +
          +
          + +
          + + + + +
          +
          + +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/wizard/wizard-3.html b/public/components/forms/wizard/wizard-3.html new file mode 100644 index 00000000..ab829248 --- /dev/null +++ b/public/components/forms/wizard/wizard-3.html @@ -0,0 +1,5476 @@ + + + + + + + + Metronic | Form Wizard 3 + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Form Wizard 3 +

          + +
          +
          + +
          +
          +
          + +
          + +
          + +
          +
          +
          +

          + Form Wizard +

          +
          +
          +
          + +
          +
          + + +
          + +
          + +
          + +
          + +
          +
          + +
          + +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + + 1 + + + +
          + +
          +
          + Account Setup +
          +
          +
          +
          +
          + + + + 2 + + + +
          + +
          +
          + Profile Setup +
          +
          +
          +
          +
          + + + + 3 + + + +
          + +
          +
          + Billing Setup +
          +
          +
          +
          +
          + + + + 4 + + + +
          + +
          +
          + Confirmation +
          +
          +
          +
          +
          + +
          + +
          +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Client Details +

          +
          +
          + +
          + + + Please enter your first and last names + +
          +
          +
          + +
          + + + We'll never share your email with anyone else + +
          +
          +
          + +
          +
          + + + + +
          + + Enter your valid phone in US phone format. E.g: 1-541-754-3010 + +
          +
          +
          +
          +
          +
          +

          + Mailing Address + +

          +
          +
          + +
          + + + Street address, P.O. box, company name, c/o + +
          +
          +
          + +
          + + + Appartment, suite, unit, building, floor, etc + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          + + +
          +
          +
          +

          + Account Details +

          +
          +
          +
          + + + + Please enter your preferred URL to your dashboard + +
          +
          +
          +
          + + + + Your username to login to your dashboard + +
          +
          + + + + Please use letters and at least one number and symbol + +
          +
          +
          +
          +
          +
          +

          + Client Settings +

          +
          +
          +
          + +
          + + +
          + + Please select user group + +
          +
          + +
          + + + +
          + + Please select user communication options + +
          +
          +
          +
          + + +
          +
          +
          +

          + Billing Information +

          +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          +
          +
          +
          +
          +

          + Billing Address + +

          +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          +
          +
          + + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Client Details +

          +
          +
          + +
          + + Nick Stone + +
          +
          +
          + +
          + + nick.stone@gmail.com + +
          +
          +
          + +
          + + +206-78-55034890 + +
          +
          +
          +
          +
          +
          +

          + Corresponding Address + +

          +
          +
          + +
          + + Headquarters 1120 N Street Sacramento 916-654-5266 + +
          +
          +
          + +
          + + P.O. Box 942873 Sacramento, CA 94273-0001 + +
          +
          +
          + +
          + + Polo Alto + +
          +
          +
          + +
          + + California + +
          +
          +
          + +
          + + USA + +
          +
          +
          +
          + +
          +
          + + +
          + +
          + +
          +
          +
          +

          + Account Details +

          +
          +
          + +
          + + sinortech.vertoffice.com + +
          +
          +
          + +
          + + sinortech.admin + +
          +
          +
          + +
          + + ********* + +
          +
          +
          +
          +
          +
          +

          + Client Settings +

          +
          +
          + +
          + + Customer + +
          +
          +
          + +
          + + Phone, Email + +
          +
          +
          +
          + +
          +
          + + +
          + +
          + +
          +
          +
          +

          + Billing Information +

          +
          +
          + +
          + + Nick Stone + +
          +
          +
          + +
          + + *************4589 + +
          +
          +
          + +
          + + 10 + +
          +
          +
          + +
          + + 2018 + +
          +
          +
          + +
          + + *** + +
          +
          +
          +
          +
          +
          +

          + Billing Address +

          +
          +
          + +
          + + Headquarters 1120 N Street Sacramento 916-654-5266 + +
          +
          +
          + +
          + + P.O. Box 942873 Sacramento, CA 94273-0001 + +
          +
          +
          + +
          + + Polo Alto + +
          +
          +
          + +
          + + California + +
          +
          +
          + +
          + + 37505 + +
          +
          +
          + +
          + + USA + +
          +
          +
          +
          + +
          +
          + +
          + + +
          +
          +
          +
          + +
          +
          +
          +
          + +
          + + + + +
          +
          + +
          +
          +
          + +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/forms/wizard/wizard-4.html b/public/components/forms/wizard/wizard-4.html new file mode 100644 index 00000000..d101c0e1 --- /dev/null +++ b/public/components/forms/wizard/wizard-4.html @@ -0,0 +1,5464 @@ + + + + + + + + Metronic | Form Wizard 4 + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Form Wizard 4 +

          + +
          +
          + +
          +
          +
          + +
          + +
          + +
          +
          +
          +

          + Form Wizard +

          +
          +
          +
          + +
          +
          + + +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          + + + + 1 + + + +
          + Account Setup +
          +
          + +
          +
          +
          +
          +
          + + + + 2 + + + +
          + Profile Setup +
          +
          + +
          +
          +
          +
          +
          + + + + 3 + + + +
          + Billing Setup +
          +
          + +
          +
          +
          +
          +
          + + + + 4 + + + +
          + Confirmation +
          +
          + +
          +
          +
          +
          +
          + +
          + +
          +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Client Details +

          +
          +
          + +
          + + + Please enter your first and last names + +
          +
          +
          + +
          + + + We'll never share your email with anyone else + +
          +
          +
          + +
          +
          + + + + +
          + + Enter your valid phone in US phone format. E.g: 1-541-754-3010 + +
          +
          +
          +
          +
          +
          +

          + Mailing Address + +

          +
          +
          + +
          + + + Street address, P.O. box, company name, c/o + +
          +
          +
          + +
          + + + Appartment, suite, unit, building, floor, etc + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          + +
          + +
          +
          +
          +
          + + +
          +
          +
          +

          + Account Details +

          +
          +
          +
          + + + + Please enter your preferred URL to your dashboard + +
          +
          +
          +
          + + + + Your username to login to your dashboard + +
          +
          + + + + Please use letters and at least one number and symbol + +
          +
          +
          +
          +
          +
          +

          + Client Settings +

          +
          +
          +
          + +
          + + +
          + + Please select user group + +
          +
          + +
          + + + +
          + + Please select user communication options + +
          +
          +
          +
          + + +
          +
          +
          +

          + Billing Information +

          +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          +
          +
          +
          +
          +

          + Billing Address + +

          +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          + + +
          +
          + + +
          +
          +
          +
          + + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Client Details +

          +
          +
          + +
          + + Nick Stone + +
          +
          +
          + +
          + + nick.stone@gmail.com + +
          +
          +
          + +
          + + +206-78-55034890 + +
          +
          +
          +
          +
          +
          +

          + Corresponding Address + +

          +
          +
          + +
          + + Headquarters 1120 N Street Sacramento 916-654-5266 + +
          +
          +
          + +
          + + P.O. Box 942873 Sacramento, CA 94273-0001 + +
          +
          +
          + +
          + + Polo Alto + +
          +
          +
          + +
          + + California + +
          +
          +
          + +
          + + USA + +
          +
          +
          +
          + +
          +
          + + +
          + +
          + +
          +
          +
          +

          + Account Details +

          +
          +
          + +
          + + sinortech.vertoffice.com + +
          +
          +
          + +
          + + sinortech.admin + +
          +
          +
          + +
          + + ********* + +
          +
          +
          +
          +
          +
          +

          + Client Settings +

          +
          +
          + +
          + + Customer + +
          +
          +
          + +
          + + Phone, Email + +
          +
          +
          +
          + +
          +
          + + +
          + +
          + +
          +
          +
          +

          + Billing Information +

          +
          +
          + +
          + + Nick Stone + +
          +
          +
          + +
          + + *************4589 + +
          +
          +
          + +
          + + 10 + +
          +
          +
          + +
          + + 2018 + +
          +
          +
          + +
          + + *** + +
          +
          +
          +
          +
          +
          +

          + Billing Address +

          +
          +
          + +
          + + Headquarters 1120 N Street Sacramento 916-654-5266 + +
          +
          +
          + +
          + + P.O. Box 942873 Sacramento, CA 94273-0001 + +
          +
          +
          + +
          + + Polo Alto + +
          +
          +
          + +
          + + California + +
          +
          +
          + +
          + + 37505 + +
          +
          +
          + +
          + + USA + +
          +
          +
          +
          + +
          +
          + +
          + + +
          +
          +
          +
          + +
          +
          +
          +
          + +
          + + + + +
          +
          + +
          +
          +
          + +
          + +
          + +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + + + + diff --git a/public/components/icons/flaticon.html b/public/components/icons/flaticon.html new file mode 100644 index 00000000..26ff1aa7 --- /dev/null +++ b/public/components/icons/flaticon.html @@ -0,0 +1,5645 @@ + + + + + + + + Metronic | Flaticon + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Flaticon +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Flaticon Icons +

          +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-alarm-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-music-2 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-support +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-stopwatch +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-puzzle +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-settings-1 +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-calendar-3 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-add-circular-button +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-plus +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-menu-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-menu +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-piggy-bank +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-confetti +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-rocket +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-gift +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-truck +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-user-settings +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-user-add +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-user-ok +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-internet +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-alert-2 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-alarm +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-grid-menu +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-up-arrow-1 +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-more-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-more-v3 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-lock-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-profile-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-users +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-map-location +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-placeholder-2 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-route +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-more-v4 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-lock +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-multimedia-2 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-add +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-more-v5 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-more-v6 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-grid-menu-v2 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-suitcase +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-app +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-interface-9 +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-time-3 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-list-3 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-list-2 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-file-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-folder-4 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-folder-3 +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-folder-2 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-folder-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-time-2 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-search-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-tool-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-security +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-interface-8 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-interface-7 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-interface-6 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-placeholder-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-placeholder +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-web +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-multimedia-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-tabs +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-signs-2 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-interface-5 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-network +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-share +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-info +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-exclamation-2 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-music +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-medical +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-imac +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-profile +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-time-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-list-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-multimedia +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-interface-4 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-file +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-background +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-chat-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-graph +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-pie-chart +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-bag +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-cart +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-warning-2 +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-download +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-edit-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-visible +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-line-graph +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-browser +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-statistics +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-paper-plane +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-cogwheel-2 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-lifebuoy +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-settings +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-menu-button +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-user +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-apps +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-clock-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-close +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-pin +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-circle +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-interface-3 +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-technology-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-danger +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-exclamation-square +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-cancel +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-calendar-2 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-warning-sign +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-more +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-exclamation-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-cogwheel-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-more-v2 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-up-arrow +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-computer +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-alert-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-alert-off +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-map +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-interface-2 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-graphic-2 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-cogwheel +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-alert +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-folder +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-interface-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-interface +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-calendar-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-time +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-signs-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-calendar +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-chat +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-infinity +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-list +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-bell +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-delete +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-squares-4 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-clipboard +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-shapes +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-comment +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-squares-3 +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-mark +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-signs +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-squares-2 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-business +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-car +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-light +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-information +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-dashboard +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-edit +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-location +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-technology +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-exclamation +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-tea-cup +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-notes +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-analytics +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-transport +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-layers +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-book +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-squares-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-clock +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-graphic-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-symbol +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-graphic +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-tool +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-laptop +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-event-calendar-symbol +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-logout +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-refresh +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-questions-circular-button +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-search-magnifier-interface-symbol +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-search +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-attachment +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-speech-bubble-1 +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-open-box +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-coins +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-speech-bubble +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-squares +
          +
          +
          +
          +
          +
          + +
          +
          + flaticon-diagram +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/icons/fontawesome.html b/public/components/icons/fontawesome.html new file mode 100644 index 00000000..9cc7728a --- /dev/null +++ b/public/components/icons/fontawesome.html @@ -0,0 +1,11947 @@ + + + + + + + + Metronic | Fontawesome Icons + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Fontawesome Icons +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + FontAwesome Icons +

          +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-glass +
          +
          +
          +
          +
          +
          + +
          +
          + fa-music +
          +
          +
          +
          +
          +
          + +
          +
          + fa-search +
          +
          +
          +
          +
          +
          + +
          +
          + fa-envelope-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-heart +
          +
          +
          +
          +
          +
          + +
          +
          + fa-star +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-star-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-user +
          +
          +
          +
          +
          +
          + +
          +
          + fa-film +
          +
          +
          +
          +
          +
          + +
          +
          + fa-th-large +
          +
          +
          +
          +
          +
          + +
          +
          + fa-th +
          +
          +
          +
          +
          +
          + +
          +
          + fa-th-list +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-check +
          +
          +
          +
          +
          +
          + +
          +
          + fa-remove +
          +
          +
          +
          +
          +
          + +
          +
          + fa-close +
          +
          +
          +
          +
          +
          + +
          +
          + fa-times +
          +
          +
          +
          +
          +
          + +
          +
          + fa-search-plus +
          +
          +
          +
          +
          +
          + +
          +
          + fa-search-minus +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-power-off +
          +
          +
          +
          +
          +
          + +
          +
          + fa-signal +
          +
          +
          +
          +
          +
          + +
          +
          + fa-gear +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cog +
          +
          +
          +
          +
          +
          + +
          +
          + fa-trash-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-home +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-clock-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-road +
          +
          +
          +
          +
          +
          + +
          +
          + fa-download +
          +
          +
          +
          +
          +
          + +
          +
          + fa-arrow-circle-o-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-arrow-circle-o-up +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-inbox +
          +
          +
          +
          +
          +
          + +
          +
          + fa-play-circle-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-rotate-right +
          +
          +
          +
          +
          +
          + +
          +
          + fa-repeat +
          +
          +
          +
          +
          +
          + +
          +
          + fa-refresh +
          +
          +
          +
          +
          +
          + +
          +
          + fa-list-alt +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-lock +
          +
          +
          +
          +
          +
          + +
          +
          + fa-flag +
          +
          +
          +
          +
          +
          + +
          +
          + fa-headphones +
          +
          +
          +
          +
          +
          + +
          +
          + fa-volume-off +
          +
          +
          +
          +
          +
          + +
          +
          + fa-volume-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-volume-up +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-qrcode +
          +
          +
          +
          +
          +
          + +
          +
          + fa-barcode +
          +
          +
          +
          +
          +
          + +
          +
          + fa-tag +
          +
          +
          +
          +
          +
          + +
          +
          + fa-tags +
          +
          +
          +
          +
          +
          + +
          +
          + fa-book +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bookmark +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-print +
          +
          +
          +
          +
          +
          + +
          +
          + fa-camera +
          +
          +
          +
          +
          +
          + +
          +
          + fa-font +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bold +
          +
          +
          +
          +
          +
          + +
          +
          + fa-italic +
          +
          +
          +
          +
          +
          + +
          +
          + fa-text-height +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-text-width +
          +
          +
          +
          +
          +
          + +
          +
          + fa-align-left +
          +
          +
          +
          +
          +
          + +
          +
          + fa-align-center +
          +
          +
          +
          +
          +
          + +
          +
          + fa-align-right +
          +
          +
          +
          +
          +
          + +
          +
          + fa-align-justify +
          +
          +
          +
          +
          +
          + +
          +
          + fa-list +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-dedent +
          +
          +
          +
          +
          +
          + +
          +
          + fa-outdent +
          +
          +
          +
          +
          +
          + +
          +
          + fa-indent +
          +
          +
          +
          +
          +
          + +
          +
          + fa-video-camera +
          +
          +
          +
          +
          +
          + +
          +
          + fa-photo +
          +
          +
          +
          +
          +
          + +
          +
          + fa-image +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-picture-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-pencil +
          +
          +
          +
          +
          +
          + +
          +
          + fa-map-marker +
          +
          +
          +
          +
          +
          + +
          +
          + fa-adjust +
          +
          +
          +
          +
          +
          + +
          +
          + fa-tint +
          +
          +
          +
          +
          +
          + +
          +
          + fa-edit +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-pencil-square-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-share-square-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-check-square-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-arrows +
          +
          +
          +
          +
          +
          + +
          +
          + fa-step-backward +
          +
          +
          +
          +
          +
          + +
          +
          + fa-fast-backward +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-backward +
          +
          +
          +
          +
          +
          + +
          +
          + fa-play +
          +
          +
          +
          +
          +
          + +
          +
          + fa-pause +
          +
          +
          +
          +
          +
          + +
          +
          + fa-stop +
          +
          +
          +
          +
          +
          + +
          +
          + fa-forward +
          +
          +
          +
          +
          +
          + +
          +
          + fa-fast-forward +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-step-forward +
          +
          +
          +
          +
          +
          + +
          +
          + fa-eject +
          +
          +
          +
          +
          +
          + +
          +
          + fa-chevron-left +
          +
          +
          +
          +
          +
          + +
          +
          + fa-chevron-right +
          +
          +
          +
          +
          +
          + +
          +
          + fa-plus-circle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-minus-circle +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-times-circle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-check-circle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-question-circle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-info-circle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-crosshairs +
          +
          +
          +
          +
          +
          + +
          +
          + fa-times-circle-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-check-circle-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-ban +
          +
          +
          +
          +
          +
          + +
          +
          + fa-arrow-left +
          +
          +
          +
          +
          +
          + +
          +
          + fa-arrow-right +
          +
          +
          +
          +
          +
          + +
          +
          + fa-arrow-up +
          +
          +
          +
          +
          +
          + +
          +
          + fa-arrow-down +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-mail-forward +
          +
          +
          +
          +
          +
          + +
          +
          + fa-share +
          +
          +
          +
          +
          +
          + +
          +
          + fa-expand +
          +
          +
          +
          +
          +
          + +
          +
          + fa-compress +
          +
          +
          +
          +
          +
          + +
          +
          + fa-plus +
          +
          +
          +
          +
          +
          + +
          +
          + fa-minus +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-asterisk +
          +
          +
          +
          +
          +
          + +
          +
          + fa-exclamation-circle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-gift +
          +
          +
          +
          +
          +
          + +
          +
          + fa-leaf +
          +
          +
          +
          +
          +
          + +
          +
          + fa-fire +
          +
          +
          +
          +
          +
          + +
          +
          + fa-eye +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-eye-slash +
          +
          +
          +
          +
          +
          + +
          +
          + fa-warning +
          +
          +
          +
          +
          +
          + +
          +
          + fa-exclamation-triangle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-plane +
          +
          +
          +
          +
          +
          + +
          +
          + fa-calendar +
          +
          +
          +
          +
          +
          + +
          +
          + fa-random +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-comment +
          +
          +
          +
          +
          +
          + +
          +
          + fa-magnet +
          +
          +
          +
          +
          +
          + +
          +
          + fa-chevron-up +
          +
          +
          +
          +
          +
          + +
          +
          + fa-chevron-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-retweet +
          +
          +
          +
          +
          +
          + +
          +
          + fa-shopping-cart +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-folder +
          +
          +
          +
          +
          +
          + +
          +
          + fa-folder-open +
          +
          +
          +
          +
          +
          + +
          +
          + fa-arrows-v +
          +
          +
          +
          +
          +
          + +
          +
          + fa-arrows-h +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bar-chart-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bar-chart +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-twitter-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-facebook-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-camera-retro +
          +
          +
          +
          +
          +
          + +
          +
          + fa-key +
          +
          +
          +
          +
          +
          + +
          +
          + fa-gears +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cogs +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-comments +
          +
          +
          +
          +
          +
          + +
          +
          + fa-thumbs-o-up +
          +
          +
          +
          +
          +
          + +
          +
          + fa-thumbs-o-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-star-half +
          +
          +
          +
          +
          +
          + +
          +
          + fa-heart-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sign-out +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-linkedin-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-thumb-tack +
          +
          +
          +
          +
          +
          + +
          +
          + fa-external-link +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sign-in +
          +
          +
          +
          +
          +
          + +
          +
          + fa-trophy +
          +
          +
          +
          +
          +
          + +
          +
          + fa-github-square +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-upload +
          +
          +
          +
          +
          +
          + +
          +
          + fa-lemon-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-phone +
          +
          +
          +
          +
          +
          + +
          +
          + fa-square-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bookmark-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-phone-square +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-twitter +
          +
          +
          +
          +
          +
          + +
          +
          + fa-facebook-f +
          +
          +
          +
          +
          +
          + +
          +
          + fa-facebook +
          +
          +
          +
          +
          +
          + +
          +
          + fa-github +
          +
          +
          +
          +
          +
          + +
          +
          + fa-unlock +
          +
          +
          +
          +
          +
          + +
          +
          + fa-credit-card +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-feed +
          +
          +
          +
          +
          +
          + +
          +
          + fa-rss +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hdd-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bullhorn +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bell +
          +
          +
          +
          +
          +
          + +
          +
          + fa-certificate +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hand-o-right +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hand-o-left +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hand-o-up +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hand-o-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-arrow-circle-left +
          +
          +
          +
          +
          +
          + +
          +
          + fa-arrow-circle-right +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-arrow-circle-up +
          +
          +
          +
          +
          +
          + +
          +
          + fa-arrow-circle-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-globe +
          +
          +
          +
          +
          +
          + +
          +
          + fa-wrench +
          +
          +
          +
          +
          +
          + +
          +
          + fa-tasks +
          +
          +
          +
          +
          +
          + +
          +
          + fa-filter +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-briefcase +
          +
          +
          +
          +
          +
          + +
          +
          + fa-arrows-alt +
          +
          +
          +
          +
          +
          + +
          +
          + fa-group +
          +
          +
          +
          +
          +
          + +
          +
          + fa-users +
          +
          +
          +
          +
          +
          + +
          +
          + fa-chain +
          +
          +
          +
          +
          +
          + +
          +
          + fa-link +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cloud +
          +
          +
          +
          +
          +
          + +
          +
          + fa-flask +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cut +
          +
          +
          +
          +
          +
          + +
          +
          + fa-scissors +
          +
          +
          +
          +
          +
          + +
          +
          + fa-copy +
          +
          +
          +
          +
          +
          + +
          +
          + fa-files-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-paperclip +
          +
          +
          +
          +
          +
          + +
          +
          + fa-save +
          +
          +
          +
          +
          +
          + +
          +
          + fa-floppy-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-navicon +
          +
          +
          +
          +
          +
          + +
          +
          + fa-reorder +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bars +
          +
          +
          +
          +
          +
          + +
          +
          + fa-list-ul +
          +
          +
          +
          +
          +
          + +
          +
          + fa-list-ol +
          +
          +
          +
          +
          +
          + +
          +
          + fa-strikethrough +
          +
          +
          +
          +
          +
          + +
          +
          + fa-underline +
          +
          +
          +
          +
          +
          + +
          +
          + fa-table +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-magic +
          +
          +
          +
          +
          +
          + +
          +
          + fa-truck +
          +
          +
          +
          +
          +
          + +
          +
          + fa-pinterest +
          +
          +
          +
          +
          +
          + +
          +
          + fa-pinterest-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-google-plus-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-google-plus +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-money +
          +
          +
          +
          +
          +
          + +
          +
          + fa-caret-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-caret-up +
          +
          +
          +
          +
          +
          + +
          +
          + fa-caret-left +
          +
          +
          +
          +
          +
          + +
          +
          + fa-caret-right +
          +
          +
          +
          +
          +
          + +
          +
          + fa-columns +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-unsorted +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sort +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sort-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sort-desc +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sort-up +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sort-asc +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-envelope +
          +
          +
          +
          +
          +
          + +
          +
          + fa-linkedin +
          +
          +
          +
          +
          +
          + +
          +
          + fa-rotate-left +
          +
          +
          +
          +
          +
          + +
          +
          + fa-undo +
          +
          +
          +
          +
          +
          + +
          +
          + fa-legal +
          +
          +
          +
          +
          +
          + +
          +
          + fa-gavel +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-dashboard +
          +
          +
          +
          +
          +
          + +
          +
          + fa-tachometer +
          +
          +
          +
          +
          +
          + +
          +
          + fa-comment-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-comments-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-flash +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bolt +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sitemap +
          +
          +
          +
          +
          +
          + +
          +
          + fa-umbrella +
          +
          +
          +
          +
          +
          + +
          +
          + fa-paste +
          +
          +
          +
          +
          +
          + +
          +
          + fa-clipboard +
          +
          +
          +
          +
          +
          + +
          +
          + fa-lightbulb-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-exchange +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cloud-download +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cloud-upload +
          +
          +
          +
          +
          +
          + +
          +
          + fa-user-md +
          +
          +
          +
          +
          +
          + +
          +
          + fa-stethoscope +
          +
          +
          +
          +
          +
          + +
          +
          + fa-suitcase +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bell-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-coffee +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cutlery +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-text-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-building-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hospital-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-ambulance +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-medkit +
          +
          +
          +
          +
          +
          + +
          +
          + fa-fighter-jet +
          +
          +
          +
          +
          +
          + +
          +
          + fa-beer +
          +
          +
          +
          +
          +
          + +
          +
          + fa-h-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-plus-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-angle-double-left +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-angle-double-right +
          +
          +
          +
          +
          +
          + +
          +
          + fa-angle-double-up +
          +
          +
          +
          +
          +
          + +
          +
          + fa-angle-double-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-angle-left +
          +
          +
          +
          +
          +
          + +
          +
          + fa-angle-right +
          +
          +
          +
          +
          +
          + +
          +
          + fa-angle-up +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-angle-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-desktop +
          +
          +
          +
          +
          +
          + +
          +
          + fa-laptop +
          +
          +
          +
          +
          +
          + +
          +
          + fa-tablet +
          +
          +
          +
          +
          +
          + +
          +
          + fa-mobile-phone +
          +
          +
          +
          +
          +
          + +
          +
          + fa-mobile +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-circle-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-quote-left +
          +
          +
          +
          +
          +
          + +
          +
          + fa-quote-right +
          +
          +
          +
          +
          +
          + +
          +
          + fa-spinner +
          +
          +
          +
          +
          +
          + +
          +
          + fa-circle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-mail-reply +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-reply +
          +
          +
          +
          +
          +
          + +
          +
          + fa-github-alt +
          +
          +
          +
          +
          +
          + +
          +
          + fa-folder-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-folder-open-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-smile-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-frown-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-meh-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-gamepad +
          +
          +
          +
          +
          +
          + +
          +
          + fa-keyboard-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-flag-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-flag-checkered +
          +
          +
          +
          +
          +
          + +
          +
          + fa-terminal +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-code +
          +
          +
          +
          +
          +
          + +
          +
          + fa-mail-reply-all +
          +
          +
          +
          +
          +
          + +
          +
          + fa-reply-all +
          +
          +
          +
          +
          +
          + +
          +
          + fa-star-half-empty +
          +
          +
          +
          +
          +
          + +
          +
          + fa-star-half-full +
          +
          +
          +
          +
          +
          + +
          +
          + fa-star-half-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-location-arrow +
          +
          +
          +
          +
          +
          + +
          +
          + fa-crop +
          +
          +
          +
          +
          +
          + +
          +
          + fa-code-fork +
          +
          +
          +
          +
          +
          + +
          +
          + fa-unlink +
          +
          +
          +
          +
          +
          + +
          +
          + fa-chain-broken +
          +
          +
          +
          +
          +
          + +
          +
          + fa-question +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-info +
          +
          +
          +
          +
          +
          + +
          +
          + fa-exclamation +
          +
          +
          +
          +
          +
          + +
          +
          + fa-superscript +
          +
          +
          +
          +
          +
          + +
          +
          + fa-subscript +
          +
          +
          +
          +
          +
          + +
          +
          + fa-eraser +
          +
          +
          +
          +
          +
          + +
          +
          + fa-puzzle-piece +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-microphone +
          +
          +
          +
          +
          +
          + +
          +
          + fa-microphone-slash +
          +
          +
          +
          +
          +
          + +
          +
          + fa-shield +
          +
          +
          +
          +
          +
          + +
          +
          + fa-calendar-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-fire-extinguisher +
          +
          +
          +
          +
          +
          + +
          +
          + fa-rocket +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-maxcdn +
          +
          +
          +
          +
          +
          + +
          +
          + fa-chevron-circle-left +
          +
          +
          +
          +
          +
          + +
          +
          + fa-chevron-circle-right +
          +
          +
          +
          +
          +
          + +
          +
          + fa-chevron-circle-up +
          +
          +
          +
          +
          +
          + +
          +
          + fa-chevron-circle-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-html5 +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-css3 +
          +
          +
          +
          +
          +
          + +
          +
          + fa-anchor +
          +
          +
          +
          +
          +
          + +
          +
          + fa-unlock-alt +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bullseye +
          +
          +
          +
          +
          +
          + +
          +
          + fa-ellipsis-h +
          +
          +
          +
          +
          +
          + +
          +
          + fa-ellipsis-v +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-rss-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-play-circle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-ticket +
          +
          +
          +
          +
          +
          + +
          +
          + fa-minus-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-minus-square-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-level-up +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-level-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-check-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-pencil-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-external-link-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-share-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-compass +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-toggle-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-caret-square-o-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-toggle-up +
          +
          +
          +
          +
          +
          + +
          +
          + fa-caret-square-o-up +
          +
          +
          +
          +
          +
          + +
          +
          + fa-toggle-right +
          +
          +
          +
          +
          +
          + +
          +
          + fa-caret-square-o-right +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-euro +
          +
          +
          +
          +
          +
          + +
          +
          + fa-eur +
          +
          +
          +
          +
          +
          + +
          +
          + fa-gbp +
          +
          +
          +
          +
          +
          + +
          +
          + fa-dollar +
          +
          +
          +
          +
          +
          + +
          +
          + fa-usd +
          +
          +
          +
          +
          +
          + +
          +
          + fa-rupee +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-inr +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cny +
          +
          +
          +
          +
          +
          + +
          +
          + fa-rmb +
          +
          +
          +
          +
          +
          + +
          +
          + fa-yen +
          +
          +
          +
          +
          +
          + +
          +
          + fa-jpy +
          +
          +
          +
          +
          +
          + +
          +
          + fa-ruble +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-rouble +
          +
          +
          +
          +
          +
          + +
          +
          + fa-rub +
          +
          +
          +
          +
          +
          + +
          +
          + fa-won +
          +
          +
          +
          +
          +
          + +
          +
          + fa-krw +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bitcoin +
          +
          +
          +
          +
          +
          + +
          +
          + fa-btc +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-text +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sort-alpha-asc +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sort-alpha-desc +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sort-amount-asc +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sort-amount-desc +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sort-numeric-asc +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sort-numeric-desc +
          +
          +
          +
          +
          +
          + +
          +
          + fa-thumbs-up +
          +
          +
          +
          +
          +
          + +
          +
          + fa-thumbs-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-youtube-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-youtube +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-xing +
          +
          +
          +
          +
          +
          + +
          +
          + fa-xing-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-youtube-play +
          +
          +
          +
          +
          +
          + +
          +
          + fa-dropbox +
          +
          +
          +
          +
          +
          + +
          +
          + fa-stack-overflow +
          +
          +
          +
          +
          +
          + +
          +
          + fa-instagram +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-flickr +
          +
          +
          +
          +
          +
          + +
          +
          + fa-adn +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bitbucket +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bitbucket-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-tumblr +
          +
          +
          +
          +
          +
          + +
          +
          + fa-tumblr-square +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-long-arrow-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-long-arrow-up +
          +
          +
          +
          +
          +
          + +
          +
          + fa-long-arrow-left +
          +
          +
          +
          +
          +
          + +
          +
          + fa-long-arrow-right +
          +
          +
          +
          +
          +
          + +
          +
          + fa-apple +
          +
          +
          +
          +
          +
          + +
          +
          + fa-windows +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-android +
          +
          +
          +
          +
          +
          + +
          +
          + fa-linux +
          +
          +
          +
          +
          +
          + +
          +
          + fa-dribbble +
          +
          +
          +
          +
          +
          + +
          +
          + fa-skype +
          +
          +
          +
          +
          +
          + +
          +
          + fa-foursquare +
          +
          +
          +
          +
          +
          + +
          +
          + fa-trello +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-female +
          +
          +
          +
          +
          +
          + +
          +
          + fa-male +
          +
          +
          +
          +
          +
          + +
          +
          + fa-gittip +
          +
          +
          +
          +
          +
          + +
          +
          + fa-gratipay +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sun-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-moon-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-archive +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bug +
          +
          +
          +
          +
          +
          + +
          +
          + fa-vk +
          +
          +
          +
          +
          +
          + +
          +
          + fa-weibo +
          +
          +
          +
          +
          +
          + +
          +
          + fa-renren +
          +
          +
          +
          +
          +
          + +
          +
          + fa-pagelines +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-stack-exchange +
          +
          +
          +
          +
          +
          + +
          +
          + fa-arrow-circle-o-right +
          +
          +
          +
          +
          +
          + +
          +
          + fa-arrow-circle-o-left +
          +
          +
          +
          +
          +
          + +
          +
          + fa-toggle-left +
          +
          +
          +
          +
          +
          + +
          +
          + fa-caret-square-o-left +
          +
          +
          +
          +
          +
          + +
          +
          + fa-dot-circle-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-wheelchair +
          +
          +
          +
          +
          +
          + +
          +
          + fa-vimeo-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-turkish-lira +
          +
          +
          +
          +
          +
          + +
          +
          + fa-try +
          +
          +
          +
          +
          +
          + +
          +
          + fa-plus-square-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-space-shuttle +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-slack +
          +
          +
          +
          +
          +
          + +
          +
          + fa-envelope-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-wordpress +
          +
          +
          +
          +
          +
          + +
          +
          + fa-openid +
          +
          +
          +
          +
          +
          + +
          +
          + fa-institution +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bank +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-university +
          +
          +
          +
          +
          +
          + +
          +
          + fa-mortar-board +
          +
          +
          +
          +
          +
          + +
          +
          + fa-graduation-cap +
          +
          +
          +
          +
          +
          + +
          +
          + fa-yahoo +
          +
          +
          +
          +
          +
          + +
          +
          + fa-google +
          +
          +
          +
          +
          +
          + +
          +
          + fa-reddit +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-reddit-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-stumbleupon-circle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-stumbleupon +
          +
          +
          +
          +
          +
          + +
          +
          + fa-delicious +
          +
          +
          +
          +
          +
          + +
          +
          + fa-digg +
          +
          +
          +
          +
          +
          + +
          +
          + fa-pied-piper-pp +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-pied-piper-alt +
          +
          +
          +
          +
          +
          + +
          +
          + fa-drupal +
          +
          +
          +
          +
          +
          + +
          +
          + fa-joomla +
          +
          +
          +
          +
          +
          + +
          +
          + fa-language +
          +
          +
          +
          +
          +
          + +
          +
          + fa-fax +
          +
          +
          +
          +
          +
          + +
          +
          + fa-building +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-child +
          +
          +
          +
          +
          +
          + +
          +
          + fa-paw +
          +
          +
          +
          +
          +
          + +
          +
          + fa-spoon +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cube +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cubes +
          +
          +
          +
          +
          +
          + +
          +
          + fa-behance +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-behance-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-steam +
          +
          +
          +
          +
          +
          + +
          +
          + fa-steam-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-recycle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-automobile +
          +
          +
          +
          +
          +
          + +
          +
          + fa-car +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cab +
          +
          +
          +
          +
          +
          + +
          +
          + fa-taxi +
          +
          +
          +
          +
          +
          + +
          +
          + fa-tree +
          +
          +
          +
          +
          +
          + +
          +
          + fa-spotify +
          +
          +
          +
          +
          +
          + +
          +
          + fa-deviantart +
          +
          +
          +
          +
          +
          + +
          +
          + fa-soundcloud +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-database +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-pdf-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-word-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-excel-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-powerpoint-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-photo-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-picture-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-image-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-zip-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-archive-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-sound-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-audio-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-movie-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-video-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-file-code-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-vine +
          +
          +
          +
          +
          +
          + +
          +
          + fa-codepen +
          +
          +
          +
          +
          +
          + +
          +
          + fa-jsfiddle +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-life-bouy +
          +
          +
          +
          +
          +
          + +
          +
          + fa-life-buoy +
          +
          +
          +
          +
          +
          + +
          +
          + fa-life-saver +
          +
          +
          +
          +
          +
          + +
          +
          + fa-support +
          +
          +
          +
          +
          +
          + +
          +
          + fa-life-ring +
          +
          +
          +
          +
          +
          + +
          +
          + fa-circle-o-notch +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-ra +
          +
          +
          +
          +
          +
          + +
          +
          + fa-resistance +
          +
          +
          +
          +
          +
          + +
          +
          + fa-rebel +
          +
          +
          +
          +
          +
          + +
          +
          + fa-ge +
          +
          +
          +
          +
          +
          + +
          +
          + fa-empire +
          +
          +
          +
          +
          +
          + +
          +
          + fa-git-square +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-git +
          +
          +
          +
          +
          +
          + +
          +
          + fa-y-combinator-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-yc-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hacker-news +
          +
          +
          +
          +
          +
          + +
          +
          + fa-tencent-weibo +
          +
          +
          +
          +
          +
          + +
          +
          + fa-qq +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-wechat +
          +
          +
          +
          +
          +
          + +
          +
          + fa-weixin +
          +
          +
          +
          +
          +
          + +
          +
          + fa-send +
          +
          +
          +
          +
          +
          + +
          +
          + fa-paper-plane +
          +
          +
          +
          +
          +
          + +
          +
          + fa-send-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-paper-plane-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-history +
          +
          +
          +
          +
          +
          + +
          +
          + fa-circle-thin +
          +
          +
          +
          +
          +
          + +
          +
          + fa-header +
          +
          +
          +
          +
          +
          + +
          +
          + fa-paragraph +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sliders +
          +
          +
          +
          +
          +
          + +
          +
          + fa-share-alt +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-share-alt-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bomb +
          +
          +
          +
          +
          +
          + +
          +
          + fa-soccer-ball-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-futbol-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-tty +
          +
          +
          +
          +
          +
          + +
          +
          + fa-binoculars +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-plug +
          +
          +
          +
          +
          +
          + +
          +
          + fa-slideshare +
          +
          +
          +
          +
          +
          + +
          +
          + fa-twitch +
          +
          +
          +
          +
          +
          + +
          +
          + fa-yelp +
          +
          +
          +
          +
          +
          + +
          +
          + fa-newspaper-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-wifi +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-calculator +
          +
          +
          +
          +
          +
          + +
          +
          + fa-paypal +
          +
          +
          +
          +
          +
          + +
          +
          + fa-google-wallet +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cc-visa +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cc-mastercard +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cc-discover +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cc-amex +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cc-paypal +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cc-stripe +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bell-slash +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bell-slash-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-trash +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-copyright +
          +
          +
          +
          +
          +
          + +
          +
          + fa-at +
          +
          +
          +
          +
          +
          + +
          +
          + fa-eyedropper +
          +
          +
          +
          +
          +
          + +
          +
          + fa-paint-brush +
          +
          +
          +
          +
          +
          + +
          +
          + fa-birthday-cake +
          +
          +
          +
          +
          +
          + +
          +
          + fa-area-chart +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-pie-chart +
          +
          +
          +
          +
          +
          + +
          +
          + fa-line-chart +
          +
          +
          +
          +
          +
          + +
          +
          + fa-lastfm +
          +
          +
          +
          +
          +
          + +
          +
          + fa-lastfm-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-toggle-off +
          +
          +
          +
          +
          +
          + +
          +
          + fa-toggle-on +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bicycle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bus +
          +
          +
          +
          +
          +
          + +
          +
          + fa-ioxhost +
          +
          +
          +
          +
          +
          + +
          +
          + fa-angellist +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cc +
          +
          +
          +
          +
          +
          + +
          +
          + fa-shekel +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sheqel +
          +
          +
          +
          +
          +
          + +
          +
          + fa-ils +
          +
          +
          +
          +
          +
          + +
          +
          + fa-meanpath +
          +
          +
          +
          +
          +
          + +
          +
          + fa-buysellads +
          +
          +
          +
          +
          +
          + +
          +
          + fa-connectdevelop +
          +
          +
          +
          +
          +
          + +
          +
          + fa-dashcube +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-forumbee +
          +
          +
          +
          +
          +
          + +
          +
          + fa-leanpub +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sellsy +
          +
          +
          +
          +
          +
          + +
          +
          + fa-shirtsinbulk +
          +
          +
          +
          +
          +
          + +
          +
          + fa-simplybuilt +
          +
          +
          +
          +
          +
          + +
          +
          + fa-skyatlas +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cart-plus +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cart-arrow-down +
          +
          +
          +
          +
          +
          + +
          +
          + fa-diamond +
          +
          +
          +
          +
          +
          + +
          +
          + fa-ship +
          +
          +
          +
          +
          +
          + +
          +
          + fa-user-secret +
          +
          +
          +
          +
          +
          + +
          +
          + fa-motorcycle +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-street-view +
          +
          +
          +
          +
          +
          + +
          +
          + fa-heartbeat +
          +
          +
          +
          +
          +
          + +
          +
          + fa-venus +
          +
          +
          +
          +
          +
          + +
          +
          + fa-mars +
          +
          +
          +
          +
          +
          + +
          +
          + fa-mercury +
          +
          +
          +
          +
          +
          + +
          +
          + fa-intersex +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-transgender +
          +
          +
          +
          +
          +
          + +
          +
          + fa-transgender-alt +
          +
          +
          +
          +
          +
          + +
          +
          + fa-venus-double +
          +
          +
          +
          +
          +
          + +
          +
          + fa-mars-double +
          +
          +
          +
          +
          +
          + +
          +
          + fa-venus-mars +
          +
          +
          +
          +
          +
          + +
          +
          + fa-mars-stroke +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-mars-stroke-v +
          +
          +
          +
          +
          +
          + +
          +
          + fa-mars-stroke-h +
          +
          +
          +
          +
          +
          + +
          +
          + fa-neuter +
          +
          +
          +
          +
          +
          + +
          +
          + fa-genderless +
          +
          +
          +
          +
          +
          + +
          +
          + fa-facebook-official +
          +
          +
          +
          +
          +
          + +
          +
          + fa-pinterest-p +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-whatsapp +
          +
          +
          +
          +
          +
          + +
          +
          + fa-server +
          +
          +
          +
          +
          +
          + +
          +
          + fa-user-plus +
          +
          +
          +
          +
          +
          + +
          +
          + fa-user-times +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hotel +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bed +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-viacoin +
          +
          +
          +
          +
          +
          + +
          +
          + fa-train +
          +
          +
          +
          +
          +
          + +
          +
          + fa-subway +
          +
          +
          +
          +
          +
          + +
          +
          + fa-medium +
          +
          +
          +
          +
          +
          + +
          +
          + fa-yc +
          +
          +
          +
          +
          +
          + +
          +
          + fa-y-combinator +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-optin-monster +
          +
          +
          +
          +
          +
          + +
          +
          + fa-opencart +
          +
          +
          +
          +
          +
          + +
          +
          + fa-expeditedssl +
          +
          +
          +
          +
          +
          + +
          +
          + fa-battery-4 +
          +
          +
          +
          +
          +
          + +
          +
          + fa-battery +
          +
          +
          +
          +
          +
          + +
          +
          + fa-battery-full +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-battery-3 +
          +
          +
          +
          +
          +
          + +
          +
          + fa-battery-three-quarters +
          +
          +
          +
          +
          +
          + +
          +
          + fa-battery-2 +
          +
          +
          +
          +
          +
          + +
          +
          + fa-battery-half +
          +
          +
          +
          +
          +
          + +
          +
          + fa-battery-1 +
          +
          +
          +
          +
          +
          + +
          +
          + fa-battery-quarter +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-battery-0 +
          +
          +
          +
          +
          +
          + +
          +
          + fa-battery-empty +
          +
          +
          +
          +
          +
          + +
          +
          + fa-mouse-pointer +
          +
          +
          +
          +
          +
          + +
          +
          + fa-i-cursor +
          +
          +
          +
          +
          +
          + +
          +
          + fa-object-group +
          +
          +
          +
          +
          +
          + +
          +
          + fa-object-ungroup +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sticky-note +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sticky-note-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cc-jcb +
          +
          +
          +
          +
          +
          + +
          +
          + fa-cc-diners-club +
          +
          +
          +
          +
          +
          + +
          +
          + fa-clone +
          +
          +
          +
          +
          +
          + +
          +
          + fa-balance-scale +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hourglass-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hourglass-1 +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hourglass-start +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hourglass-2 +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hourglass-half +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hourglass-3 +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hourglass-end +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hourglass +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hand-grab-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hand-rock-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hand-stop-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hand-paper-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hand-scissors-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hand-lizard-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hand-spock-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hand-pointer-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hand-peace-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-trademark +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-registered +
          +
          +
          +
          +
          +
          + +
          +
          + fa-creative-commons +
          +
          +
          +
          +
          +
          + +
          +
          + fa-gg +
          +
          +
          +
          +
          +
          + +
          +
          + fa-gg-circle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-tripadvisor +
          +
          +
          +
          +
          +
          + +
          +
          + fa-odnoklassniki +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-odnoklassniki-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-get-pocket +
          +
          +
          +
          +
          +
          + +
          +
          + fa-wikipedia-w +
          +
          +
          +
          +
          +
          + +
          +
          + fa-safari +
          +
          +
          +
          +
          +
          + +
          +
          + fa-chrome +
          +
          +
          +
          +
          +
          + +
          +
          + fa-firefox +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-opera +
          +
          +
          +
          +
          +
          + +
          +
          + fa-internet-explorer +
          +
          +
          +
          +
          +
          + +
          +
          + fa-tv +
          +
          +
          +
          +
          +
          + +
          +
          + fa-television +
          +
          +
          +
          +
          +
          + +
          +
          + fa-contao +
          +
          +
          +
          +
          +
          + +
          +
          + fa-500px +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-amazon +
          +
          +
          +
          +
          +
          + +
          +
          + fa-calendar-plus-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-calendar-minus-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-calendar-times-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-calendar-check-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-industry +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-map-pin +
          +
          +
          +
          +
          +
          + +
          +
          + fa-map-signs +
          +
          +
          +
          +
          +
          + +
          +
          + fa-map-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-map +
          +
          +
          +
          +
          +
          + +
          +
          + fa-commenting +
          +
          +
          +
          +
          +
          + +
          +
          + fa-commenting-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-houzz +
          +
          +
          +
          +
          +
          + +
          +
          + fa-vimeo +
          +
          +
          +
          +
          +
          + +
          +
          + fa-black-tie +
          +
          +
          +
          +
          +
          + +
          +
          + fa-fonticons +
          +
          +
          +
          +
          +
          + +
          +
          + fa-reddit-alien +
          +
          +
          +
          +
          +
          + +
          +
          + fa-edge +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-credit-card-alt +
          +
          +
          +
          +
          +
          + +
          +
          + fa-codiepie +
          +
          +
          +
          +
          +
          + +
          +
          + fa-modx +
          +
          +
          +
          +
          +
          + +
          +
          + fa-fort-awesome +
          +
          +
          +
          +
          +
          + +
          +
          + fa-usb +
          +
          +
          +
          +
          +
          + +
          +
          + fa-product-hunt +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-mixcloud +
          +
          +
          +
          +
          +
          + +
          +
          + fa-scribd +
          +
          +
          +
          +
          +
          + +
          +
          + fa-pause-circle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-pause-circle-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-stop-circle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-stop-circle-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-shopping-bag +
          +
          +
          +
          +
          +
          + +
          +
          + fa-shopping-basket +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hashtag +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bluetooth +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bluetooth-b +
          +
          +
          +
          +
          +
          + +
          +
          + fa-percent +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-gitlab +
          +
          +
          +
          +
          +
          + +
          +
          + fa-wpbeginner +
          +
          +
          +
          +
          +
          + +
          +
          + fa-wpforms +
          +
          +
          +
          +
          +
          + +
          +
          + fa-envira +
          +
          +
          +
          +
          +
          + +
          +
          + fa-universal-access +
          +
          +
          +
          +
          +
          + +
          +
          + fa-wheelchair-alt +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-question-circle-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-blind +
          +
          +
          +
          +
          +
          + +
          +
          + fa-audio-description +
          +
          +
          +
          +
          +
          + +
          +
          + fa-volume-control-phone +
          +
          +
          +
          +
          +
          + +
          +
          + fa-braille +
          +
          +
          +
          +
          +
          + +
          +
          + fa-assistive-listening-systems +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-asl-interpreting +
          +
          +
          +
          +
          +
          + +
          +
          + fa-american-sign-language-interpreting +
          +
          +
          +
          +
          +
          + +
          +
          + fa-deafness +
          +
          +
          +
          +
          +
          + +
          +
          + fa-hard-of-hearing +
          +
          +
          +
          +
          +
          + +
          +
          + fa-deaf +
          +
          +
          +
          +
          +
          + +
          +
          + fa-glide +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-glide-g +
          +
          +
          +
          +
          +
          + +
          +
          + fa-signing +
          +
          +
          +
          +
          +
          + +
          +
          + fa-sign-language +
          +
          +
          +
          +
          +
          + +
          +
          + fa-low-vision +
          +
          +
          +
          +
          +
          + +
          +
          + fa-viadeo +
          +
          +
          +
          +
          +
          + +
          +
          + fa-viadeo-square +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-snapchat +
          +
          +
          +
          +
          +
          + +
          +
          + fa-snapchat-ghost +
          +
          +
          +
          +
          +
          + +
          +
          + fa-snapchat-square +
          +
          +
          +
          +
          +
          + +
          +
          + fa-pied-piper +
          +
          +
          +
          +
          +
          + +
          +
          + fa-first-order +
          +
          +
          +
          +
          +
          + +
          +
          + fa-yoast +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-themeisle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-google-plus-circle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-google-plus-official +
          +
          +
          +
          +
          +
          + +
          +
          + fa-fa +
          +
          +
          +
          +
          +
          + +
          +
          + fa-font-awesome +
          +
          +
          +
          +
          +
          + +
          +
          + fa-handshake-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-envelope-open +
          +
          +
          +
          +
          +
          + +
          +
          + fa-envelope-open-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-linode +
          +
          +
          +
          +
          +
          + +
          +
          + fa-address-book +
          +
          +
          +
          +
          +
          + +
          +
          + fa-address-book-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-vcard +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-address-card +
          +
          +
          +
          +
          +
          + +
          +
          + fa-vcard-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-address-card-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-user-circle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-user-circle-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-user-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-id-badge +
          +
          +
          +
          +
          +
          + +
          +
          + fa-drivers-license +
          +
          +
          +
          +
          +
          + +
          +
          + fa-id-card +
          +
          +
          +
          +
          +
          + +
          +
          + fa-drivers-license-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-id-card-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-quora +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-free-code-camp +
          +
          +
          +
          +
          +
          + +
          +
          + fa-telegram +
          +
          +
          +
          +
          +
          + +
          +
          + fa-thermometer-4 +
          +
          +
          +
          +
          +
          + +
          +
          + fa-thermometer +
          +
          +
          +
          +
          +
          + +
          +
          + fa-thermometer-full +
          +
          +
          +
          +
          +
          + +
          +
          + fa-thermometer-3 +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-thermometer-three-quarters +
          +
          +
          +
          +
          +
          + +
          +
          + fa-thermometer-2 +
          +
          +
          +
          +
          +
          + +
          +
          + fa-thermometer-half +
          +
          +
          +
          +
          +
          + +
          +
          + fa-thermometer-1 +
          +
          +
          +
          +
          +
          + +
          +
          + fa-thermometer-quarter +
          +
          +
          +
          +
          +
          + +
          +
          + fa-thermometer-0 +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-thermometer-empty +
          +
          +
          +
          +
          +
          + +
          +
          + fa-shower +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bathtub +
          +
          +
          +
          +
          +
          + +
          +
          + fa-s15 +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bath +
          +
          +
          +
          +
          +
          + +
          +
          + fa-podcast +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-window-maximize +
          +
          +
          +
          +
          +
          + +
          +
          + fa-window-minimize +
          +
          +
          +
          +
          +
          + +
          +
          + fa-window-restore +
          +
          +
          +
          +
          +
          + +
          +
          + fa-times-rectangle +
          +
          +
          +
          +
          +
          + +
          +
          + fa-window-close +
          +
          +
          +
          +
          +
          + +
          +
          + fa-times-rectangle-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-window-close-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-bandcamp +
          +
          +
          +
          +
          +
          + +
          +
          + fa-grav +
          +
          +
          +
          +
          +
          + +
          +
          + fa-etsy +
          +
          +
          +
          +
          +
          + +
          +
          + fa-imdb +
          +
          +
          +
          +
          +
          + +
          +
          + fa-ravelry +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + fa-eercast +
          +
          +
          +
          +
          +
          + +
          +
          + fa-microchip +
          +
          +
          +
          +
          +
          + +
          +
          + fa-snowflake-o +
          +
          +
          +
          +
          +
          + +
          +
          + fa-superpowers +
          +
          +
          +
          +
          +
          + +
          +
          + fa-wpexplorer +
          +
          +
          +
          +
          +
          + +
          +
          + fa-meetup +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/icons/lineawesome.html b/public/components/icons/lineawesome.html new file mode 100644 index 00000000..e0bb4a97 --- /dev/null +++ b/public/components/icons/lineawesome.html @@ -0,0 +1,10791 @@ + + + + + + + + Metronic | Lineawesome Icons + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Lineawesome Icons +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + LineAwesome Icons +

          +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-500px +
          +
          +
          +
          +
          +
          + +
          +
          + la-adjust +
          +
          +
          +
          +
          +
          + +
          +
          + la-adn +
          +
          +
          +
          +
          +
          + +
          +
          + la-align-center +
          +
          +
          +
          +
          +
          + +
          +
          + la-align-justify +
          +
          +
          +
          +
          +
          + +
          +
          + la-align-left +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-align-right +
          +
          +
          +
          +
          +
          + +
          +
          + la-amazon +
          +
          +
          +
          +
          +
          + +
          +
          + la-ambulance +
          +
          +
          +
          +
          +
          + +
          +
          + la-anchor +
          +
          +
          +
          +
          +
          + +
          +
          + la-android +
          +
          +
          +
          +
          +
          + +
          +
          + la-angellist +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-angle-double-down +
          +
          +
          +
          +
          +
          + +
          +
          + la-angle-double-left +
          +
          +
          +
          +
          +
          + +
          +
          + la-angle-double-right +
          +
          +
          +
          +
          +
          + +
          +
          + la-angle-double-up +
          +
          +
          +
          +
          +
          + +
          +
          + la-angle-down +
          +
          +
          +
          +
          +
          + +
          +
          + la-angle-left +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-angle-right +
          +
          +
          +
          +
          +
          + +
          +
          + la-angle-up +
          +
          +
          +
          +
          +
          + +
          +
          + la-apple +
          +
          +
          +
          +
          +
          + +
          +
          + la-archive +
          +
          +
          +
          +
          +
          + +
          +
          + la-area-chart +
          +
          +
          +
          +
          +
          + +
          +
          + la-arrow-circle-down +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-arrow-circle-left +
          +
          +
          +
          +
          +
          + +
          +
          + la-arrow-circle-o-down +
          +
          +
          +
          +
          +
          + +
          +
          + la-arrow-circle-o-left +
          +
          +
          +
          +
          +
          + +
          +
          + la-arrow-circle-o-right +
          +
          +
          +
          +
          +
          + +
          +
          + la-arrow-circle-o-up +
          +
          +
          +
          +
          +
          + +
          +
          + la-arrow-circle-right +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-arrow-circle-up +
          +
          +
          +
          +
          +
          + +
          +
          + la-arrow-down +
          +
          +
          +
          +
          +
          + +
          +
          + la-arrow-left +
          +
          +
          +
          +
          +
          + +
          +
          + la-arrow-right +
          +
          +
          +
          +
          +
          + +
          +
          + la-arrow-up +
          +
          +
          +
          +
          +
          + +
          +
          + la-arrows +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-arrows-alt +
          +
          +
          +
          +
          +
          + +
          +
          + la-arrows-h +
          +
          +
          +
          +
          +
          + +
          +
          + la-arrows-v +
          +
          +
          +
          +
          +
          + +
          +
          + la-asterisk +
          +
          +
          +
          +
          +
          + +
          +
          + la-at +
          +
          +
          +
          +
          +
          + +
          +
          + la-automobile +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-backward +
          +
          +
          +
          +
          +
          + +
          +
          + la-balance-scale +
          +
          +
          +
          +
          +
          + +
          +
          + la-ban +
          +
          +
          +
          +
          +
          + +
          +
          + la-bank +
          +
          +
          +
          +
          +
          + +
          +
          + la-bar-chart +
          +
          +
          +
          +
          +
          + +
          +
          + la-bar-chart-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-barcode +
          +
          +
          +
          +
          +
          + +
          +
          + la-bars +
          +
          +
          +
          +
          +
          + +
          +
          + la-battery-0 +
          +
          +
          +
          +
          +
          + +
          +
          + la-battery-1 +
          +
          +
          +
          +
          +
          + +
          +
          + la-battery-2 +
          +
          +
          +
          +
          +
          + +
          +
          + la-battery-3 +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-battery-4 +
          +
          +
          +
          +
          +
          + +
          +
          + la-battery-empty +
          +
          +
          +
          +
          +
          + +
          +
          + la-battery-full +
          +
          +
          +
          +
          +
          + +
          +
          + la-battery-half +
          +
          +
          +
          +
          +
          + +
          +
          + la-battery-quarter +
          +
          +
          +
          +
          +
          + +
          +
          + la-battery-three-quarters +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-bed +
          +
          +
          +
          +
          +
          + +
          +
          + la-beer +
          +
          +
          +
          +
          +
          + +
          +
          + la-behance +
          +
          +
          +
          +
          +
          + +
          +
          + la-behance-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-bell +
          +
          +
          +
          +
          +
          + +
          +
          + la-bell-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-bell-slash +
          +
          +
          +
          +
          +
          + +
          +
          + la-bell-slash-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-bicycle +
          +
          +
          +
          +
          +
          + +
          +
          + la-binoculars +
          +
          +
          +
          +
          +
          + +
          +
          + la-birthday-cake +
          +
          +
          +
          +
          +
          + +
          +
          + la-bitbucket +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-bitbucket-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-bitcoin +
          +
          +
          +
          +
          +
          + +
          +
          + la-black-tie +
          +
          +
          +
          +
          +
          + +
          +
          + la-bold +
          +
          +
          +
          +
          +
          + +
          +
          + la-bolt +
          +
          +
          +
          +
          +
          + +
          +
          + la-bomb +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-book +
          +
          +
          +
          +
          +
          + +
          +
          + la-bookmark +
          +
          +
          +
          +
          +
          + +
          +
          + la-bookmark-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-briefcase +
          +
          +
          +
          +
          +
          + +
          +
          + la-btc +
          +
          +
          +
          +
          +
          + +
          +
          + la-bug +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-building +
          +
          +
          +
          +
          +
          + +
          +
          + la-building-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-bullhorn +
          +
          +
          +
          +
          +
          + +
          +
          + la-bullseye +
          +
          +
          +
          +
          +
          + +
          +
          + la-bus +
          +
          +
          +
          +
          +
          + +
          +
          + la-buysellads +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-cab +
          +
          +
          +
          +
          +
          + +
          +
          + la-calculator +
          +
          +
          +
          +
          +
          + +
          +
          + la-calendar +
          +
          +
          +
          +
          +
          + +
          +
          + la-calendar-check-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-calendar-minus-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-calendar-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-calendar-plus-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-calendar-times-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-camera +
          +
          +
          +
          +
          +
          + +
          +
          + la-camera-retro +
          +
          +
          +
          +
          +
          + +
          +
          + la-car +
          +
          +
          +
          +
          +
          + +
          +
          + la-caret-down +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-caret-left +
          +
          +
          +
          +
          +
          + +
          +
          + la-caret-right +
          +
          +
          +
          +
          +
          + +
          +
          + la-caret-square-o-down +
          +
          +
          +
          +
          +
          + +
          +
          + la-toggle-down +
          +
          +
          +
          +
          +
          + +
          +
          + la-caret-square-o-left +
          +
          +
          +
          +
          +
          + +
          +
          + la-toggle-left +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-caret-square-o-right +
          +
          +
          +
          +
          +
          + +
          +
          + la-toggle-right +
          +
          +
          +
          +
          +
          + +
          +
          + la-caret-square-o-up +
          +
          +
          +
          +
          +
          + +
          +
          + la-toggle-up +
          +
          +
          +
          +
          +
          + +
          +
          + la-caret-up +
          +
          +
          +
          +
          +
          + +
          +
          + la-cart-arrow-down +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-cart-plus +
          +
          +
          +
          +
          +
          + +
          +
          + la-cc +
          +
          +
          +
          +
          +
          + +
          +
          + la-cc-amex +
          +
          +
          +
          +
          +
          + +
          +
          + la-cc-diners-club +
          +
          +
          +
          +
          +
          + +
          +
          + la-cc-discover +
          +
          +
          +
          +
          +
          + +
          +
          + la-cc-jcb +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-cc-mastercard +
          +
          +
          +
          +
          +
          + +
          +
          + la-cc-paypal +
          +
          +
          +
          +
          +
          + +
          +
          + la-cc-stripe +
          +
          +
          +
          +
          +
          + +
          +
          + la-cc-visa +
          +
          +
          +
          +
          +
          + +
          +
          + la-certificate +
          +
          +
          +
          +
          +
          + +
          +
          + la-chain +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-chain-broken +
          +
          +
          +
          +
          +
          + +
          +
          + la-check +
          +
          +
          +
          +
          +
          + +
          +
          + la-check-circle +
          +
          +
          +
          +
          +
          + +
          +
          + la-check-circle-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-check-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-check-square-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-chevron-circle-down +
          +
          +
          +
          +
          +
          + +
          +
          + la-chevron-circle-left +
          +
          +
          +
          +
          +
          + +
          +
          + la-chevron-circle-right +
          +
          +
          +
          +
          +
          + +
          +
          + la-chevron-circle-up +
          +
          +
          +
          +
          +
          + +
          +
          + la-chevron-down +
          +
          +
          +
          +
          +
          + +
          +
          + la-chevron-left +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-chevron-right +
          +
          +
          +
          +
          +
          + +
          +
          + la-chevron-up +
          +
          +
          +
          +
          +
          + +
          +
          + la-child +
          +
          +
          +
          +
          +
          + +
          +
          + la-chrome +
          +
          +
          +
          +
          +
          + +
          +
          + la-circle +
          +
          +
          +
          +
          +
          + +
          +
          + la-circle-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-circle-o-notch +
          +
          +
          +
          +
          +
          + +
          +
          + la-circle-thin +
          +
          +
          +
          +
          +
          + +
          +
          + la-clipboard +
          +
          +
          +
          +
          +
          + +
          +
          + la-clock-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-clone +
          +
          +
          +
          +
          +
          + +
          +
          + la-close +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-cloud +
          +
          +
          +
          +
          +
          + +
          +
          + la-cloud-download +
          +
          +
          +
          +
          +
          + +
          +
          + la-cloud-upload +
          +
          +
          +
          +
          +
          + +
          +
          + la-cny +
          +
          +
          +
          +
          +
          + +
          +
          + la-code +
          +
          +
          +
          +
          +
          + +
          +
          + la-code-fork +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-codepen +
          +
          +
          +
          +
          +
          + +
          +
          + la-coffee +
          +
          +
          +
          +
          +
          + +
          +
          + la-cog +
          +
          +
          +
          +
          +
          + +
          +
          + la-cogs +
          +
          +
          +
          +
          +
          + +
          +
          + la-columns +
          +
          +
          +
          +
          +
          + +
          +
          + la-comment +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-comment-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-commenting +
          +
          +
          +
          +
          +
          + +
          +
          + la-commenting-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-comments +
          +
          +
          +
          +
          +
          + +
          +
          + la-comments-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-compass +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-compress +
          +
          +
          +
          +
          +
          + +
          +
          + la-connectdevelop +
          +
          +
          +
          +
          +
          + +
          +
          + la-contao +
          +
          +
          +
          +
          +
          + +
          +
          + la-copy +
          +
          +
          +
          +
          +
          + +
          +
          + la-copyright +
          +
          +
          +
          +
          +
          + +
          +
          + la-creative-commons +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-credit-card +
          +
          +
          +
          +
          +
          + +
          +
          + la-crop +
          +
          +
          +
          +
          +
          + +
          +
          + la-crosshairs +
          +
          +
          +
          +
          +
          + +
          +
          + la-css3 +
          +
          +
          +
          +
          +
          + +
          +
          + la-cube +
          +
          +
          +
          +
          +
          + +
          +
          + la-cubes +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-cut +
          +
          +
          +
          +
          +
          + +
          +
          + la-cutlery +
          +
          +
          +
          +
          +
          + +
          +
          + la-dashboard +
          +
          +
          +
          +
          +
          + +
          +
          + la-dashcube +
          +
          +
          +
          +
          +
          + +
          +
          + la-database +
          +
          +
          +
          +
          +
          + +
          +
          + la-dedent +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-delicious +
          +
          +
          +
          +
          +
          + +
          +
          + la-desktop +
          +
          +
          +
          +
          +
          + +
          +
          + la-deviantart +
          +
          +
          +
          +
          +
          + +
          +
          + la-diamond +
          +
          +
          +
          +
          +
          + +
          +
          + la-digg +
          +
          +
          +
          +
          +
          + +
          +
          + la-dollar +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-dot-circle-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-download +
          +
          +
          +
          +
          +
          + +
          +
          + la-dribbble +
          +
          +
          +
          +
          +
          + +
          +
          + la-dropbox +
          +
          +
          +
          +
          +
          + +
          +
          + la-drupal +
          +
          +
          +
          +
          +
          + +
          +
          + la-edit +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-eject +
          +
          +
          +
          +
          +
          + +
          +
          + la-ellipsis-h +
          +
          +
          +
          +
          +
          + +
          +
          + la-ellipsis-v +
          +
          +
          +
          +
          +
          + +
          +
          + la-empire +
          +
          +
          +
          +
          +
          + +
          +
          + la-ge +
          +
          +
          +
          +
          +
          + +
          +
          + la-envelope +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-envelope-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-envelope-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-eraser +
          +
          +
          +
          +
          +
          + +
          +
          + la-eur +
          +
          +
          +
          +
          +
          + +
          +
          + la-euro +
          +
          +
          +
          +
          +
          + +
          +
          + la-exchange +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-exclamation +
          +
          +
          +
          +
          +
          + +
          +
          + la-exclamation-circle +
          +
          +
          +
          +
          +
          + +
          +
          + la-exclamation-triangle +
          +
          +
          +
          +
          +
          + +
          +
          + la-expand +
          +
          +
          +
          +
          +
          + +
          +
          + la-expeditedssl +
          +
          +
          +
          +
          +
          + +
          +
          + la-external-link +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-external-link-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-eye +
          +
          +
          +
          +
          +
          + +
          +
          + la-eye-slash +
          +
          +
          +
          +
          +
          + +
          +
          + la-eyedropper +
          +
          +
          +
          +
          +
          + +
          +
          + la-facebook +
          +
          +
          +
          +
          +
          + +
          +
          + la-facebook-f +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-facebook-official +
          +
          +
          +
          +
          +
          + +
          +
          + la-facebook-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-fast-backward +
          +
          +
          +
          +
          +
          + +
          +
          + la-fast-forward +
          +
          +
          +
          +
          +
          + +
          +
          + la-fax +
          +
          +
          +
          +
          +
          + +
          +
          + la-female +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-fighter-jet +
          +
          +
          +
          +
          +
          + +
          +
          + la-file +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-archive-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-audio-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-code-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-excel-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-image-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-movie-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-pdf-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-photo-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-picture-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-powerpoint-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-sound-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-text +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-text-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-video-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-word-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-file-zip-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-files-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-film +
          +
          +
          +
          +
          +
          + +
          +
          + la-filter +
          +
          +
          +
          +
          +
          + +
          +
          + la-fire +
          +
          +
          +
          +
          +
          + +
          +
          + la-fire-extinguisher +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-firefox +
          +
          +
          +
          +
          +
          + +
          +
          + la-flag +
          +
          +
          +
          +
          +
          + +
          +
          + la-flag-checkered +
          +
          +
          +
          +
          +
          + +
          +
          + la-flag-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-flash +
          +
          +
          +
          +
          +
          + +
          +
          + la-flask +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-flickr +
          +
          +
          +
          +
          +
          + +
          +
          + la-floppy-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-folder +
          +
          +
          +
          +
          +
          + +
          +
          + la-folder-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-folder-open +
          +
          +
          +
          +
          +
          + +
          +
          + la-folder-open-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-font +
          +
          +
          +
          +
          +
          + +
          +
          + la-fonticons +
          +
          +
          +
          +
          +
          + +
          +
          + la-forumbee +
          +
          +
          +
          +
          +
          + +
          +
          + la-forward +
          +
          +
          +
          +
          +
          + +
          +
          + la-foursquare +
          +
          +
          +
          +
          +
          + +
          +
          + la-frown-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-futbol-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-soccer-ball-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-gamepad +
          +
          +
          +
          +
          +
          + +
          +
          + la-gavel +
          +
          +
          +
          +
          +
          + +
          +
          + la-gbp +
          +
          +
          +
          +
          +
          + +
          +
          + la-gear +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-gears +
          +
          +
          +
          +
          +
          + +
          +
          + la-genderless +
          +
          +
          +
          +
          +
          + +
          +
          + la-get-pocket +
          +
          +
          +
          +
          +
          + +
          +
          + la-gg +
          +
          +
          +
          +
          +
          + +
          +
          + la-gg-circle +
          +
          +
          +
          +
          +
          + +
          +
          + la-gift +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-git +
          +
          +
          +
          +
          +
          + +
          +
          + la-git-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-github +
          +
          +
          +
          +
          +
          + +
          +
          + la-github-alt +
          +
          +
          +
          +
          +
          + +
          +
          + la-github-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-glass +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-globe +
          +
          +
          +
          +
          +
          + +
          +
          + la-google +
          +
          +
          +
          +
          +
          + +
          +
          + la-google-plus +
          +
          +
          +
          +
          +
          + +
          +
          + la-google-plus-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-google-wallet +
          +
          +
          +
          +
          +
          + +
          +
          + la-graduation-cap +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-gratipay +
          +
          +
          +
          +
          +
          + +
          +
          + la-gittip +
          +
          +
          +
          +
          +
          + +
          +
          + la-group +
          +
          +
          +
          +
          +
          + +
          +
          + la-h-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-hacker-news +
          +
          +
          +
          +
          +
          + +
          +
          + la-hand-grab-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-hand-lizard-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-hand-o-down +
          +
          +
          +
          +
          +
          + +
          +
          + la-hand-o-left +
          +
          +
          +
          +
          +
          + +
          +
          + la-hand-o-right +
          +
          +
          +
          +
          +
          + +
          +
          + la-hand-o-up +
          +
          +
          +
          +
          +
          + +
          +
          + la-hand-paper-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-hand-peace-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-hand-pointer-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-hand-rock-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-hand-scissors-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-hand-spock-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-hand-stop-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-hdd-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-header +
          +
          +
          +
          +
          +
          + +
          +
          + la-headphones +
          +
          +
          +
          +
          +
          + +
          +
          + la-heart +
          +
          +
          +
          +
          +
          + +
          +
          + la-heart-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-heartbeat +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-history +
          +
          +
          +
          +
          +
          + +
          +
          + la-home +
          +
          +
          +
          +
          +
          + +
          +
          + la-hospital-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-hotel +
          +
          +
          +
          +
          +
          + +
          +
          + la-hourglass +
          +
          +
          +
          +
          +
          + +
          +
          + la-hourglass-1 +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-hourglass-2 +
          +
          +
          +
          +
          +
          + +
          +
          + la-hourglass-3 +
          +
          +
          +
          +
          +
          + +
          +
          + la-hourglass-end +
          +
          +
          +
          +
          +
          + +
          +
          + la-hourglass-half +
          +
          +
          +
          +
          +
          + +
          +
          + la-hourglass-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-hourglass-start +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-houzz +
          +
          +
          +
          +
          +
          + +
          +
          + la-html5 +
          +
          +
          +
          +
          +
          + +
          +
          + la-i-cursor +
          +
          +
          +
          +
          +
          + +
          +
          + la-ils +
          +
          +
          +
          +
          +
          + +
          +
          + la-image +
          +
          +
          +
          +
          +
          + +
          +
          + la-inbox +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-indent +
          +
          +
          +
          +
          +
          + +
          +
          + la-industry +
          +
          +
          +
          +
          +
          + +
          +
          + la-info +
          +
          +
          +
          +
          +
          + +
          +
          + la-info-circle +
          +
          +
          +
          +
          +
          + +
          +
          + la-inr +
          +
          +
          +
          +
          +
          + +
          +
          + la-instagram +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-institution +
          +
          +
          +
          +
          +
          + +
          +
          + la-internet-explorer +
          +
          +
          +
          +
          +
          + +
          +
          + la-ioxhost +
          +
          +
          +
          +
          +
          + +
          +
          + la-italic +
          +
          +
          +
          +
          +
          + +
          +
          + la-joomla +
          +
          +
          +
          +
          +
          + +
          +
          + la-jpy +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-jsfiddle +
          +
          +
          +
          +
          +
          + +
          +
          + la-key +
          +
          +
          +
          +
          +
          + +
          +
          + la-keyboard-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-krw +
          +
          +
          +
          +
          +
          + +
          +
          + la-language +
          +
          +
          +
          +
          +
          + +
          +
          + la-laptop +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-lastfm +
          +
          +
          +
          +
          +
          + +
          +
          + la-lastfm-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-leaf +
          +
          +
          +
          +
          +
          + +
          +
          + la-leanpub +
          +
          +
          +
          +
          +
          + +
          +
          + la-legal +
          +
          +
          +
          +
          +
          + +
          +
          + la-lemon-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-level-down +
          +
          +
          +
          +
          +
          + +
          +
          + la-level-up +
          +
          +
          +
          +
          +
          + +
          +
          + la-life-bouy +
          +
          +
          +
          +
          +
          + +
          +
          + la-life-buoy +
          +
          +
          +
          +
          +
          + +
          +
          + la-life-ring +
          +
          +
          +
          +
          +
          + +
          +
          + la-support +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-life-saver +
          +
          +
          +
          +
          +
          + +
          +
          + la-lightbulb-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-line-chart +
          +
          +
          +
          +
          +
          + +
          +
          + la-link +
          +
          +
          +
          +
          +
          + +
          +
          + la-linkedin +
          +
          +
          +
          +
          +
          + +
          +
          + la-linkedin-square +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-linux +
          +
          +
          +
          +
          +
          + +
          +
          + la-list +
          +
          +
          +
          +
          +
          + +
          +
          + la-list-alt +
          +
          +
          +
          +
          +
          + +
          +
          + la-list-ol +
          +
          +
          +
          +
          +
          + +
          +
          + la-list-ul +
          +
          +
          +
          +
          +
          + +
          +
          + la-location-arrow +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-lock +
          +
          +
          +
          +
          +
          + +
          +
          + la-long-arrow-down +
          +
          +
          +
          +
          +
          + +
          +
          + la-long-arrow-left +
          +
          +
          +
          +
          +
          + +
          +
          + la-long-arrow-right +
          +
          +
          +
          +
          +
          + +
          +
          + la-long-arrow-up +
          +
          +
          +
          +
          +
          + +
          +
          + la-magic +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-magnet +
          +
          +
          +
          +
          +
          + +
          +
          + la-mail-forward +
          +
          +
          +
          +
          +
          + +
          +
          + la-mail-reply +
          +
          +
          +
          +
          +
          + +
          +
          + la-mail-reply-all +
          +
          +
          +
          +
          +
          + +
          +
          + la-male +
          +
          +
          +
          +
          +
          + +
          +
          + la-map +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-map-marker +
          +
          +
          +
          +
          +
          + +
          +
          + la-map-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-map-pin +
          +
          +
          +
          +
          +
          + +
          +
          + la-map-signs +
          +
          +
          +
          +
          +
          + +
          +
          + la-mars +
          +
          +
          +
          +
          +
          + +
          +
          + la-mars-double +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-mars-stroke +
          +
          +
          +
          +
          +
          + +
          +
          + la-mars-stroke-h +
          +
          +
          +
          +
          +
          + +
          +
          + la-mars-stroke-v +
          +
          +
          +
          +
          +
          + +
          +
          + la-maxcdn +
          +
          +
          +
          +
          +
          + +
          +
          + la-meanpath +
          +
          +
          +
          +
          +
          + +
          +
          + la-medium +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-medkit +
          +
          +
          +
          +
          +
          + +
          +
          + la-meh-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-mercury +
          +
          +
          +
          +
          +
          + +
          +
          + la-microphone +
          +
          +
          +
          +
          +
          + +
          +
          + la-microphone-slash +
          +
          +
          +
          +
          +
          + +
          +
          + la-minus +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-minus-circle +
          +
          +
          +
          +
          +
          + +
          +
          + la-minus-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-minus-square-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-mobile +
          +
          +
          +
          +
          +
          + +
          +
          + la-mobile-phone +
          +
          +
          +
          +
          +
          + +
          +
          + la-money +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-moon-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-mortar-board +
          +
          +
          +
          +
          +
          + +
          +
          + la-motorcycle +
          +
          +
          +
          +
          +
          + +
          +
          + la-mouse-pointer +
          +
          +
          +
          +
          +
          + +
          +
          + la-music +
          +
          +
          +
          +
          +
          + +
          +
          + la-navicon +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-neuter +
          +
          +
          +
          +
          +
          + +
          +
          + la-newspaper-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-object-group +
          +
          +
          +
          +
          +
          + +
          +
          + la-object-ungroup +
          +
          +
          +
          +
          +
          + +
          +
          + la-odnoklassniki +
          +
          +
          +
          +
          +
          + +
          +
          + la-odnoklassniki-square +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-opencart +
          +
          +
          +
          +
          +
          + +
          +
          + la-openid +
          +
          +
          +
          +
          +
          + +
          +
          + la-opera +
          +
          +
          +
          +
          +
          + +
          +
          + la-optin-monster +
          +
          +
          +
          +
          +
          + +
          +
          + la-outdent +
          +
          +
          +
          +
          +
          + +
          +
          + la-pagelines +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-paint-brush +
          +
          +
          +
          +
          +
          + +
          +
          + la-paper-plane +
          +
          +
          +
          +
          +
          + +
          +
          + la-send +
          +
          +
          +
          +
          +
          + +
          +
          + la-paper-plane-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-send-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-paperclip +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-paragraph +
          +
          +
          +
          +
          +
          + +
          +
          + la-paste +
          +
          +
          +
          +
          +
          + +
          +
          + la-pause +
          +
          +
          +
          +
          +
          + +
          +
          + la-paw +
          +
          +
          +
          +
          +
          + +
          +
          + la-paypal +
          +
          +
          +
          +
          +
          + +
          +
          + la-pencil +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-pencil-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-pencil-square-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-phone +
          +
          +
          +
          +
          +
          + +
          +
          + la-phone-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-photo +
          +
          +
          +
          +
          +
          + +
          +
          + la-picture-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-pie-chart +
          +
          +
          +
          +
          +
          + +
          +
          + la-pied-piper +
          +
          +
          +
          +
          +
          + +
          +
          + la-pied-piper-alt +
          +
          +
          +
          +
          +
          + +
          +
          + la-pinterest +
          +
          +
          +
          +
          +
          + +
          +
          + la-pinterest-p +
          +
          +
          +
          +
          +
          + +
          +
          + la-pinterest-square +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-plane +
          +
          +
          +
          +
          +
          + +
          +
          + la-play +
          +
          +
          +
          +
          +
          + +
          +
          + la-play-circle +
          +
          +
          +
          +
          +
          + +
          +
          + la-play-circle-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-plug +
          +
          +
          +
          +
          +
          + +
          +
          + la-plus +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-plus-circle +
          +
          +
          +
          +
          +
          + +
          +
          + la-plus-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-plus-square-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-power-off +
          +
          +
          +
          +
          +
          + +
          +
          + la-print +
          +
          +
          +
          +
          +
          + +
          +
          + la-puzzle-piece +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-qq +
          +
          +
          +
          +
          +
          + +
          +
          + la-qrcode +
          +
          +
          +
          +
          +
          + +
          +
          + la-question +
          +
          +
          +
          +
          +
          + +
          +
          + la-question-circle +
          +
          +
          +
          +
          +
          + +
          +
          + la-quote-left +
          +
          +
          +
          +
          +
          + +
          +
          + la-quote-right +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-ra +
          +
          +
          +
          +
          +
          + +
          +
          + la-random +
          +
          +
          +
          +
          +
          + +
          +
          + la-rebel +
          +
          +
          +
          +
          +
          + +
          +
          + la-recycle +
          +
          +
          +
          +
          +
          + +
          +
          + la-reddit +
          +
          +
          +
          +
          +
          + +
          +
          + la-reddit-square +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-refresh +
          +
          +
          +
          +
          +
          + +
          +
          + la-registered +
          +
          +
          +
          +
          +
          + +
          +
          + la-renren +
          +
          +
          +
          +
          +
          + +
          +
          + la-reorder +
          +
          +
          +
          +
          +
          + +
          +
          + la-repeat +
          +
          +
          +
          +
          +
          + +
          +
          + la-reply +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-reply-all +
          +
          +
          +
          +
          +
          + +
          +
          + la-retweet +
          +
          +
          +
          +
          +
          + +
          +
          + la-rmb +
          +
          +
          +
          +
          +
          + +
          +
          + la-road +
          +
          +
          +
          +
          +
          + +
          +
          + la-rocket +
          +
          +
          +
          +
          +
          + +
          +
          + la-rotate-left +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-rotate-right +
          +
          +
          +
          +
          +
          + +
          +
          + la-rouble +
          +
          +
          +
          +
          +
          + +
          +
          + la-rss +
          +
          +
          +
          +
          +
          + +
          +
          + la-feed +
          +
          +
          +
          +
          +
          + +
          +
          + la-rss-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-rub +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-ruble +
          +
          +
          +
          +
          +
          + +
          +
          + la-rupee +
          +
          +
          +
          +
          +
          + +
          +
          + la-safari +
          +
          +
          +
          +
          +
          + +
          +
          + la-save +
          +
          +
          +
          +
          +
          + +
          +
          + la-scissors +
          +
          +
          +
          +
          +
          + +
          +
          + la-search +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-search-minus +
          +
          +
          +
          +
          +
          + +
          +
          + la-search-plus +
          +
          +
          +
          +
          +
          + +
          +
          + la-sellsy +
          +
          +
          +
          +
          +
          + +
          +
          + la-server +
          +
          +
          +
          +
          +
          + +
          +
          + la-share +
          +
          +
          +
          +
          +
          + +
          +
          + la-share-alt +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-share-alt-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-share-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-share-square-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-shekel +
          +
          +
          +
          +
          +
          + +
          +
          + la-sheqel +
          +
          +
          +
          +
          +
          + +
          +
          + la-shield +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-ship +
          +
          +
          +
          +
          +
          + +
          +
          + la-shirtsinbulk +
          +
          +
          +
          +
          +
          + +
          +
          + la-shopping-cart +
          +
          +
          +
          +
          +
          + +
          +
          + la-sign-in +
          +
          +
          +
          +
          +
          + +
          +
          + la-sign-out +
          +
          +
          +
          +
          +
          + +
          +
          + la-signal +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-simplybuilt +
          +
          +
          +
          +
          +
          + +
          +
          + la-sitemap +
          +
          +
          +
          +
          +
          + +
          +
          + la-skyatlas +
          +
          +
          +
          +
          +
          + +
          +
          + la-skype +
          +
          +
          +
          +
          +
          + +
          +
          + la-slack +
          +
          +
          +
          +
          +
          + +
          +
          + la-sliders +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-slideshare +
          +
          +
          +
          +
          +
          + +
          +
          + la-smile-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-sort +
          +
          +
          +
          +
          +
          + +
          +
          + la-unsorted +
          +
          +
          +
          +
          +
          + +
          +
          + la-sort-alpha-asc +
          +
          +
          +
          +
          +
          + +
          +
          + la-sort-alpha-desc +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-sort-amount-asc +
          +
          +
          +
          +
          +
          + +
          +
          + la-sort-amount-desc +
          +
          +
          +
          +
          +
          + +
          +
          + la-sort-asc +
          +
          +
          +
          +
          +
          + +
          +
          + la-sort-up +
          +
          +
          +
          +
          +
          + +
          +
          + la-sort-desc +
          +
          +
          +
          +
          +
          + +
          +
          + la-sort-down +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-sort-numeric-asc +
          +
          +
          +
          +
          +
          + +
          +
          + la-sort-numeric-desc +
          +
          +
          +
          +
          +
          + +
          +
          + la-soundcloud +
          +
          +
          +
          +
          +
          + +
          +
          + la-space-shuttle +
          +
          +
          +
          +
          +
          + +
          +
          + la-spinner +
          +
          +
          +
          +
          +
          + +
          +
          + la-spoon +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-spotify +
          +
          +
          +
          +
          +
          + +
          +
          + la-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-square-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-stack-exchange +
          +
          +
          +
          +
          +
          + +
          +
          + la-stack-overflow +
          +
          +
          +
          +
          +
          + +
          +
          + la-star +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-star-half +
          +
          +
          +
          +
          +
          + +
          +
          + la-star-half-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-star-half-full +
          +
          +
          +
          +
          +
          + +
          +
          + la-star-half-empty +
          +
          +
          +
          +
          +
          + +
          +
          + la-star-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-steam +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-steam-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-step-backward +
          +
          +
          +
          +
          +
          + +
          +
          + la-step-forward +
          +
          +
          +
          +
          +
          + +
          +
          + la-stethoscope +
          +
          +
          +
          +
          +
          + +
          +
          + la-sticky-note +
          +
          +
          +
          +
          +
          + +
          +
          + la-sticky-note-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-stop +
          +
          +
          +
          +
          +
          + +
          +
          + la-street-view +
          +
          +
          +
          +
          +
          + +
          +
          + la-strikethrough +
          +
          +
          +
          +
          +
          + +
          +
          + la-stumbleupon +
          +
          +
          +
          +
          +
          + +
          +
          + la-stumbleupon-circle +
          +
          +
          +
          +
          +
          + +
          +
          + la-subscript +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-subway +
          +
          +
          +
          +
          +
          + +
          +
          + la-suitcase +
          +
          +
          +
          +
          +
          + +
          +
          + la-sun-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-superscript +
          +
          +
          +
          +
          +
          + +
          +
          + la-table +
          +
          +
          +
          +
          +
          + +
          +
          + la-tablet +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-tachometer +
          +
          +
          +
          +
          +
          + +
          +
          + la-tag +
          +
          +
          +
          +
          +
          + +
          +
          + la-tags +
          +
          +
          +
          +
          +
          + +
          +
          + la-tasks +
          +
          +
          +
          +
          +
          + +
          +
          + la-taxi +
          +
          +
          +
          +
          +
          + +
          +
          + la-television +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-tv +
          +
          +
          +
          +
          +
          + +
          +
          + la-tencent-weibo +
          +
          +
          +
          +
          +
          + +
          +
          + la-terminal +
          +
          +
          +
          +
          +
          + +
          +
          + la-text-height +
          +
          +
          +
          +
          +
          + +
          +
          + la-text-width +
          +
          +
          +
          +
          +
          + +
          +
          + la-th +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-th-large +
          +
          +
          +
          +
          +
          + +
          +
          + la-th-list +
          +
          +
          +
          +
          +
          + +
          +
          + la-thumb-tack +
          +
          +
          +
          +
          +
          + +
          +
          + la-thumbs-down +
          +
          +
          +
          +
          +
          + +
          +
          + la-thumbs-o-down +
          +
          +
          +
          +
          +
          + +
          +
          + la-thumbs-o-up +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-thumbs-up +
          +
          +
          +
          +
          +
          + +
          +
          + la-ticket +
          +
          +
          +
          +
          +
          + +
          +
          + la-times +
          +
          +
          +
          +
          +
          + +
          +
          + la-remove +
          +
          +
          +
          +
          +
          + +
          +
          + la-times-circle +
          +
          +
          +
          +
          +
          + +
          +
          + la-times-circle-o +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-tint +
          +
          +
          +
          +
          +
          + +
          +
          + la-toggle-off +
          +
          +
          +
          +
          +
          + +
          +
          + la-toggle-on +
          +
          +
          +
          +
          +
          + +
          +
          + la-trademark +
          +
          +
          +
          +
          +
          + +
          +
          + la-train +
          +
          +
          +
          +
          +
          + +
          +
          + la-transgender +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-intersex +
          +
          +
          +
          +
          +
          + +
          +
          + la-transgender-alt +
          +
          +
          +
          +
          +
          + +
          +
          + la-trash +
          +
          +
          +
          +
          +
          + +
          +
          + la-trash-o +
          +
          +
          +
          +
          +
          + +
          +
          + la-tree +
          +
          +
          +
          +
          +
          + +
          +
          + la-trello +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-tripadvisor +
          +
          +
          +
          +
          +
          + +
          +
          + la-trophy +
          +
          +
          +
          +
          +
          + +
          +
          + la-truck +
          +
          +
          +
          +
          +
          + +
          +
          + la-try +
          +
          +
          +
          +
          +
          + +
          +
          + la-tty +
          +
          +
          +
          +
          +
          + +
          +
          + la-tumblr +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-tumblr-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-turkish-lira +
          +
          +
          +
          +
          +
          + +
          +
          + la-twitch +
          +
          +
          +
          +
          +
          + +
          +
          + la-twitter +
          +
          +
          +
          +
          +
          + +
          +
          + la-twitter-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-umbrella +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-underline +
          +
          +
          +
          +
          +
          + +
          +
          + la-undo +
          +
          +
          +
          +
          +
          + +
          +
          + la-university +
          +
          +
          +
          +
          +
          + +
          +
          + la-unlink +
          +
          +
          +
          +
          +
          + +
          +
          + la-unlock +
          +
          +
          +
          +
          +
          + +
          +
          + la-unlock-alt +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-upload +
          +
          +
          +
          +
          +
          + +
          +
          + la-usd +
          +
          +
          +
          +
          +
          + +
          +
          + la-user +
          +
          +
          +
          +
          +
          + +
          +
          + la-user-md +
          +
          +
          +
          +
          +
          + +
          +
          + la-user-plus +
          +
          +
          +
          +
          +
          + +
          +
          + la-user-secret +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-user-times +
          +
          +
          +
          +
          +
          + +
          +
          + la-users +
          +
          +
          +
          +
          +
          + +
          +
          + la-venus +
          +
          +
          +
          +
          +
          + +
          +
          + la-venus-double +
          +
          +
          +
          +
          +
          + +
          +
          + la-venus-mars +
          +
          +
          +
          +
          +
          + +
          +
          + la-viacoin +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-video-camera +
          +
          +
          +
          +
          +
          + +
          +
          + la-vimeo +
          +
          +
          +
          +
          +
          + +
          +
          + la-vimeo-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-vine +
          +
          +
          +
          +
          +
          + +
          +
          + la-vk +
          +
          +
          +
          +
          +
          + +
          +
          + la-volume-down +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-volume-off +
          +
          +
          +
          +
          +
          + +
          +
          + la-volume-up +
          +
          +
          +
          +
          +
          + +
          +
          + la-warning +
          +
          +
          +
          +
          +
          + +
          +
          + la-wechat +
          +
          +
          +
          +
          +
          + +
          +
          + la-weibo +
          +
          +
          +
          +
          +
          + +
          +
          + la-weixin +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-whatsapp +
          +
          +
          +
          +
          +
          + +
          +
          + la-wheelchair +
          +
          +
          +
          +
          +
          + +
          +
          + la-wifi +
          +
          +
          +
          +
          +
          + +
          +
          + la-wikipedia-w +
          +
          +
          +
          +
          +
          + +
          +
          + la-windows +
          +
          +
          +
          +
          +
          + +
          +
          + la-won +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-wordpress +
          +
          +
          +
          +
          +
          + +
          +
          + la-wrench +
          +
          +
          +
          +
          +
          + +
          +
          + la-xing +
          +
          +
          +
          +
          +
          + +
          +
          + la-xing-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-y-combinator +
          +
          +
          +
          +
          +
          + +
          +
          + la-y-combinator-square +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-yahoo +
          +
          +
          +
          +
          +
          + +
          +
          + la-yc +
          +
          +
          +
          +
          +
          + +
          +
          + la-yc-square +
          +
          +
          +
          +
          +
          + +
          +
          + la-yelp +
          +
          +
          +
          +
          +
          + +
          +
          + la-yen +
          +
          +
          +
          +
          +
          + +
          +
          + la-youtube +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + la-youtube-play +
          +
          +
          +
          +
          +
          + +
          +
          + la-youtube-square +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/icons/socicons.html b/public/components/icons/socicons.html new file mode 100644 index 00000000..32b53b43 --- /dev/null +++ b/public/components/icons/socicons.html @@ -0,0 +1,5561 @@ + + + + + + + + Metronic | Socicons + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Socicons +

          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
          +
          +
          + + + +

          + Socicons +

          +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-modelmayhem +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-mixcloud +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-drupal +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-swarm +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-istock +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-yammer +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-ello +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-stackoverflow +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-persona +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-triplej +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-houzz +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-rss +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-paypal +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-odnoklassniki +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-airbnb +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-periscope +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-outlook +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-coderwall +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-tripadvisor +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-appnet +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-goodreads +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-tripit +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-lanyrd +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-slideshare +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-buffer +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-disqus +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-vkontakte +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-whatsapp +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-patreon +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-storehouse +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-pocket +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-mail +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-blogger +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-technorati +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-reddit +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-dribbble +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-stumbleupon +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-digg +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-envato +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-behance +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-delicious +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-deviantart +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-forrst +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-play +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-zerply +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-wikipedia +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-apple +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-flattr +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-github +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-renren +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-friendfeed +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-newsvine +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-identica +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-bebo +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-zynga +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-steam +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-xbox +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-windows +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-qq +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-douban +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-meetup +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-playstation +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-android +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-snapchat +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-twitter +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-facebook +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-googleplus +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-pinterest +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-foursquare +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-yahoo +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-skype +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-yelp +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-feedburner +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-linkedin +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-viadeo +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-xing +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-myspace +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-soundcloud +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-spotify +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-grooveshark +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-lastfm +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-youtube +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-vimeo +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-dailymotion +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-vine +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-flickr +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-500px +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-wordpress +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-tumblr +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-twitch +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-8tracks +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-amazon +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-icq +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-smugmug +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-ravelry +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-weibo +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-baidu +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-angellist +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-ebay +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-imdb +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-stayfriends +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-residentadvisor +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-google +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-yandex +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-sharethis +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-bandcamp +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-itunes +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-deezer +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-telegram +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-openid +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-amplement +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-viber +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-zomato +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-draugiem +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-endomodo +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-filmweb +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-stackexchange +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-wykop +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-teamspeak +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-teamviewer +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-ventrilo +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-younow +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-raidcall +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-mumble +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-medium +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-bebee +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-hitbox +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-reverbnation +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-formulr +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-instagram +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-battlenet +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-chrome +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-discord +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-issuu +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-macos +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-firefox +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-opera +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-keybase +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-alliance +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-livejournal +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-googlephotos +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-horde +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-etsy +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-zapier +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-google-scholar +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-researchgate +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-wechat +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-strava +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-line +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-lyft +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-uber +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-songkick +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-viewbug +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-googlegroups +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-quora +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-diablo +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-blizzard +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-hearthstone +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-heroes +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-overwatch +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-warcraft +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-starcraft +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-beam +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-curse +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-player +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-streamjar +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-nintendo +
          +
          +
          +
          +
          +
          + +
          +
          + socicon-hellocoton +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + + + + +
          + + +
          +
          + + + + +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Hi Bob. What time will be the meeting ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Hi Megan. It's at 2.30PM +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Will the development team be joining ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes sure. I invited them as well +
          +
          +
          +
          +
          + 2:30PM +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. For the Coca-Cola Mobile App project as well ? +
          +
          +
          +
          +
          +
          +
          +
          +
          + Yes, sure. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Please also prepare the quotation for the Loop CRM project as well. +
          +
          +
          +
          +
          + 3:15PM +
          +
          +
          + + M + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Noted. I will prepare it. +
          +
          +
          +
          +
          +
          +
          +
          +
          + Thanks Megan. I will see you later. +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          +
          + Megan wrote +
          +
          + Sure. See you in the meeting soon. +
          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          +
          +
          +
          +
          + General Settings +
          +
          + + Email Notifications + + + + + + +
          +
          + + Site Tracking + + + + + + +
          +
          + + SMS Alerts + + + + + + +
          +
          + + Backup Storage + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          + System Settings +
          +
          + + System Logs + + + + + + +
          +
          + + Error Reporting + + + + + + +
          +
          + + Applications Logs + + + + + + +
          +
          + + Backup Servers + + + + + + +
          +
          + + Audit Logs + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          + System Logs +
          + +
          +
          +
          + Applications Logs +
          +
          + +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoices received + + + 20 mins + +
          + + + +
          +
          +
          +
          + Server Logs +
          +
          +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 7 hrs + +
          +
          + + + 12 new users registered + + + Just now + +
          +
          + + + System shutdown + + + 11 mins + +
          +
          + + + New invoice received + + + 20 mins + +
          + +
          + + + System error + + + 2 hrs + +
          + +
          + + + Production server up + + + 5 hrs + +
          +
          + + + New order received + + + 1117 hrs + +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          + + + + + + + + + + diff --git a/public/components/maps/google-maps.html b/public/components/maps/google-maps.html new file mode 100644 index 00000000..eb56622b --- /dev/null +++ b/public/components/maps/google-maps.html @@ -0,0 +1,4023 @@ + + + + + + + + Metronic | Google Maps + + + + + + + + + + + + + + + + + + +
          + + + + +
          + + +
          + +
          + +
          + +
          + +
          + +
          +
          +
          +

          + Google Maps +

          + +
          +
          + +
          +
          +
          + +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Basic Demo +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Map Events +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Markers +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Geolocation +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Polylines +

          +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          +
          + + + +

          + Polygons +

          +
          +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Static +

          +
          +
          +
          +
          +
          +
          + +
          +
          +
          +
          + + +
          +
          +
          +
          + + + +

          + Routes +

          +
          +
          +
          +
          +
          + +
          +
          +
            +
            +
            + + +
            +
            +
            +
            + + + +

            + Geocoding +

            +
            +
            +
            +
            +
            +
            + + + + +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + + + + + + + + diff --git a/public/components/maps/jqvmap.html b/public/components/maps/jqvmap.html new file mode 100644 index 00000000..eea058cf --- /dev/null +++ b/public/components/maps/jqvmap.html @@ -0,0 +1,3925 @@ + + + + + + + + Metronic | JQVMap + + + + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + JQVMap +

            + +
            +
            + +
            +
            +
            + +
            + +
            +
            + +
            +
            +
            +
            + + + +

            + World Map +

            +
            +
            +
            +
            +
            +
            +
            + + +
            +
            +
            +
            + + + +

            + USA Map +

            +
            +
            +
            +
            +
            +
            +
            + + +
            +
            +
            +
            + + + +

            + Europe Map +

            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + +
            +
            +
            +
            + + + +

            + Russia Map +

            +
            +
            +
            +
            +
            +
            +
            + + +
            +
            +
            +
            + + + +

            + Germany Map +

            +
            +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + + + + + + + diff --git a/public/components/portlets/advanced.html b/public/components/portlets/advanced.html new file mode 100644 index 00000000..f19bb9fa --- /dev/null +++ b/public/components/portlets/advanced.html @@ -0,0 +1,5105 @@ + + + + + + + + Metronic | Advanced Portlets + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + Advanced Portlets +

            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            +
            +
            + + + +

            + Portlet Action Icons +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Dropdown Icons +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Action Buttons +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Toolbar +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Toolbar +

            +
            +
            +
            +
            + + + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Action Buttons +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Action Buttons +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Dropdown Button +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Dropdown Icon +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + +
            +
            + +
            +
            +
            +
            + + + +

            + Portlet Action Icons +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Action Icons +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Action Buttons +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Toolbar +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Toolbar +

            +
            +
            +
            +
            + + + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Action Buttons +

            +
            +
            +
            +
            + + + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Action Buttons +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Dropdown Button +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Dropdown Icon +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + +
            +
            +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + diff --git a/public/components/portlets/base.html b/public/components/portlets/base.html new file mode 100644 index 00000000..4f960fe4 --- /dev/null +++ b/public/components/portlets/base.html @@ -0,0 +1,4216 @@ + + + + + + + + Metronic | Base Portlets + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + Base Portlets +

            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            +
            +
            +

            + Basic Portlet + + portlet sub title + +

            +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            +

            + Rounded Style + + portlet sub title + +

            +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            +

            + Non-shadow Style + + portlet sub title + +

            +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            + +
            +
            +
            +
            +

            + Bordered Style +

            +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            +

            + Semi Bordered Style +

            +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            +

            + Bordered & Rounded Styles +

            +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            +

            + Portlet Small Head +

            +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            +

            + Bordered, Rounded & Air Styles +

            +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + + + +

            + Icon Title + + portlet sub title + +

            +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            +
            +
            + Portlet footer: +
            +
            + + + or + + Cancel + + +
            +
            +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Footer +

            +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            +
            +
            + Portlet footer: +
            +
            + + + or + + Cancel + + +
            +
            +
            +
            + + +
            +
            +
            +
            + + + +

            + Scrollable Content +

            +
            +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            +
            +
            +
            + + +
            +
            +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Action Icons +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Action Icons +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Dark Skin +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Solid Background Dark Skin +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + +
            +
            +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + diff --git a/public/components/portlets/creative.html b/public/components/portlets/creative.html new file mode 100644 index 00000000..c36df18f --- /dev/null +++ b/public/components/portlets/creative.html @@ -0,0 +1,4165 @@ + + + + + + + + Metronic | Creative Portlets + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + Creative Portlets +

            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            +
            +
            + + + +

            + Portlet sub title goes here +

            +

            + + Latest Orders + +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet sub title goes here +

            +

            + + Recent Customers + +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet sub title goes here +

            +

            + + Projects + +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + +
            +
            + +
            +
            +
            +
            + + + +

            + Portlet sub title goes here +

            +

            + + Stuff + +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet sub title goes here +

            +

            + + Events + +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet sub title goes here +

            +

            + + Tasks + +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + +
            +
            +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + diff --git a/public/components/portlets/draggable.html b/public/components/portlets/draggable.html new file mode 100644 index 00000000..6e459b46 --- /dev/null +++ b/public/components/portlets/draggable.html @@ -0,0 +1,4358 @@ + + + + + + + + Metronic | Draggable Portlets + + + + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + Draggable Portlets +

            + +
            +
            + +
            +
            +
            + +
            + +
            +
            + +
            +
            +
            +
            + + + +

            + Portlet Action Buttons +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Action Buttons +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Action Icons +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Dropdown Button +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            + +
            +
            + +
            +
            +
            +
            +

            + Portlet Tabs +

            +
            +
            + +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Portlet Toolbar +

            +
            +
            +
            +
            + + + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            +

            + Portlet Tabs + + with lineawesome icons + +

            +
            +
            + +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
            +
            + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged +
            +
            +
            +
            + + +
            + +
            +
            +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + + + + + + + diff --git a/public/components/portlets/tabbed.html b/public/components/portlets/tabbed.html new file mode 100644 index 00000000..d0ee662f --- /dev/null +++ b/public/components/portlets/tabbed.html @@ -0,0 +1,4522 @@ + + + + + + + + Metronic | Tabbed Portlets + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + Tabbed Portlets +

            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            +
            +
            +

            + Portlet Tabs +

            +
            +
            + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text. +
            +
            + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            +
            +
            + + +
            +
            +
            +
            +

            + Portlet Tabs + + with metronic icons + +

            +
            +
            + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            +
            +
            + + +
            +
            +
            +
            +

            + Portlet Tabs + + with lineawesome icons + +

            +
            +
            + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            +
            +
            + + +
            +
            +
            +
            +

            + Portlet Tabs + + with fontawesome icons + +

            +
            +
            + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            +
            +
            + + +
            +
            +
            +
            +

            + Portlet Tabs + + metronic dropdown + +

            +
            +
            +
            + +
            +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            +
            +
            + + +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
            +
            + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged +
            +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Portlet Tabs +

            +
            +
            + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry.When an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            +
            +
            + + +
            +
            +
            +
            +

            + Portlet Tabs + + with metronic icons + +

            +
            +
            + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry.When an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            +
            +
            + + +
            +
            +
            +
            +

            + Portlet Tabs + + with lineawesome icons + +

            +
            +
            + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled.. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            +
            +
            + + +
            +
            +
            +
            +

            + Portlet Tabs + + with fontawesome icons + +

            +
            +
            + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            +
            +
            + + +
            +
            +
            +
            +

            + Portlet Tabs + + metronic dropdown + +

            +
            +
            + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. A galley of type and scrambled. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            +
            +
            + + +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
            +
            + It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged +
            +
            +
            +
            + +
            +
            +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + diff --git a/public/components/portlets/tools.html b/public/components/portlets/tools.html new file mode 100644 index 00000000..2f84e00c --- /dev/null +++ b/public/components/portlets/tools.html @@ -0,0 +1,4333 @@ + + + + + + + + Metronic | Portlet Tools + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + Portlet Tools +

            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            +
            +
            + + + +

            + Action Tools +

            +
            +
            +
            + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled.111 +
            +
            +
            + + +
            +
            +
            +
            + + + +

            + Action Tools +

            +
            +
            +
            + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            + + +
            +
            +
            +
            + + + +

            + Form Tools +

            +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + + + + We'll never share your email with anyone else. + +
            +
            + + +
            +
            + + +
            +
            +
            +
            + + +
            +
            +
            + +
            + +
            +
            + +
            +
            +
            +
            + + + +

            + Action Tools +

            +
            +
            +
            + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            +
            + + +
            +
            +
            +
            + + + +

            + Default Collapsed Portlet +

            +
            +
            +
            + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            +
            + + +
            +
            +
            +
            + + + +

            + Action Tools +

            +
            +
            +
            + +
            +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled. +
            +
            +
            + + +
            +
            +
            +
            + + + +

            + Lazy Initialization +

            +
            +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            + + + + We'll never share your email with anyone else. + +
            +
            + + +
            +
            + + +
            +
            +
            +
            + + +
            +
            +
            + +
            + +
            +
            +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + + + + diff --git a/public/components/timeline/timeline-1.html b/public/components/timeline/timeline-1.html new file mode 100644 index 00000000..68fce3da --- /dev/null +++ b/public/components/timeline/timeline-1.html @@ -0,0 +1,4251 @@ + + + + + + + + Metronic | Timeline + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + Timeline +

            + +
            +
            + +
            +
            +
            + +
            +
            +
            +
            +
            +

            + Timeline Examples +

            +
            +
            + +
            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            + + 11:35 + + AM + + +
            +
            + Users Joined Today +
            +
            + +
            + Lorem ipsum dolor sit amit,consectetur eiusmdd +
            + tempors labore et dolore. +
            +
            +
            +
            +
            +
            +
            +
            +
            + + 02:50 + + PM + + +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            + + 02:58 + + PM + + +
            +
            + Latest News +
            +
            + Lorem ipsum dolor sit amit,consectetur eiusmdd +
            + tempor incididunt ut labore et dolore magna enim +
            + ad minim veniam nostrud. +
            + +
            +
            +
            +
            +
            +
            +
            + + 04:10 + + PM + + +
            +
            + My ToDo +
            + +
            +
            + 13:00 +
            +
            + + Setup AOL + + + Write Code + +
            +
            + +
            +
            +
            +
            +
            +
            +
            + + 05:00  + + PM + + +
            +
            + +
            +
            + Some Post +
            +
            + Lorem ipsum dolor sit amit +
            + consectetur eiusmdd +
            + tempor incididunt ut labore +
            + et dolore magna. +
            +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            + + 11:35 + + AM + + +
            +
            + Users Joined Today +
            +
            + +
            +
            + 18:30 +
            +
            + + Web Design + + + Programming + + + Illustration + +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            + + 02:50 + + PM + + +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            + + 02:58 + + PM + + +
            +
            + Latest News +
            +
            + Lorem ipsum dolor sit amit,consectetur eiusmdd +
            + tempor incididunt ut labore et dolore magna enim +
            + ad minim veniam nostrud +
            + +
            +
            +
            +
            +
            +
            +
            + + 04:10 + + PM + + +
            +
            + My ToDo +
            + +
            +
            + 13:00 +
            +
            + + Setup AOL + + + Write Code + +
            +
            + +
            +
            +
            +
            +
            +
            +
            + + 05:00 + + PM + + +
            +
            + +
            +
            + Some Post +
            +
            + Lorem ipsum dolor sit amit +
            + consectetur eiusmdd +
            + tempor incididunt ut labore +
            + et dolore magna +
            +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + diff --git a/public/components/timeline/timeline-2.html b/public/components/timeline/timeline-2.html new file mode 100644 index 00000000..f7e0f38e --- /dev/null +++ b/public/components/timeline/timeline-2.html @@ -0,0 +1,4279 @@ + + + + + + + + Metronic | Timeline + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + Timeline +

            + +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            +
            +
            +

            + Recent Activities +

            +
            +
            +
            + +
            +
            +
            +
            + +
            +
            +
            + + 10:00 + +
            + +
            +
            + Lorem ipsum dolor sit amit,consectetur eiusmdd tempor +
            + incididunt ut labore et dolore magna +
            +
            +
            + + 12:45 + +
            + +
            +
            + AEOL Meeting With +
            + +
            +
            + + 14:00 + +
            + +
            +
            + Make Deposit + + USD 700 + + To ESL. +
            +
            +
            + + 16:00 + +
            + +
            +
            + Lorem ipsum dolor sit amit,consectetur eiusmdd tempor +
            + incididunt ut labore et dolore magna elit enim at minim +
            + veniam quis nostrud +
            +
            +
            + + 17:00 + +
            + +
            +
            + Placed a new order in + + SIGNATURE MOBILE + + marketplace. +
            +
            +
            + + 16:00 + +
            + +
            +
            + Lorem ipsum dolor sit amit,consectetur eiusmdd tempor +
            + incididunt ut labore et dolore magna elit enim at minim +
            + veniam quis nostrud +
            +
            +
            + + 17:00 + +
            + +
            +
            + Received a new feedback on + + FinancePro App + + product. +
            +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Recent Notifications +

            +
            +
            +
            + +
            +
            +
            +
            +
            + +
            +
            +
            + + 09:00 + +
            + + Lorem ipsum dolor sit amit,consectetur eiusmdd tempor + +
            + + + By Bob + + +
            +
            +
            + + 10:00 + +
            + + Lorem ipsum dolor sit amit + +
            + + + By Sean + + +
            +
            +
            + + 11:00 + +
            + + Lorem ipsum dolor sit amit eiusmdd tempor + +
            + + + By James + + +
            +
            +
            + + 12:00 + +
            + + Lorem ipsum dolor + +
            + + + By James + + +
            +
            +
            + + 14:00 + +
            + + Lorem ipsum dolor sit amit,consectetur eiusmdd + +
            + + + By Derrick + + +
            +
            +
            + + 15:00 + +
            + + Lorem ipsum dolor sit amit,consectetur + +
            + + + By Iman + + +
            +
            +
            + + 17:00 + +
            + + Lorem ipsum dolor sit consectetur eiusmdd tempor + +
            + + + By Aziko + + +
            +
            +
            +
            + +
            +
            + +
            +
            +
            + + 09:00 + +
            + + Contrary to popular belief, Lorem Ipsum is not simply random text. + +
            + + + By Bob + + +
            +
            +
            + + 10:00 + +
            + + There are many variations of passages of Lorem Ipsum available. + +
            + + + By Sean + + +
            +
            +
            + + 11:00 + +
            + + Contrary to popular belief, Lorem Ipsum is not simply random text. + +
            + + + By James + + +
            +
            +
            + + 12:00 + +
            + + The standard chunk of Lorem Ipsum used since the 1500s is reproduced. + +
            + + + By James + + +
            +
            +
            + + 14:00 + +
            + + Latin words, combined with a handful of model sentence structures. + +
            + + + By Derrick + + +
            +
            +
            + + 15:00 + +
            + + Contrary to popular belief, Lorem Ipsum is not simply random text. + +
            + + + By Iman + + +
            +
            +
            + + 17:00 + +
            + + Lorem Ipsum is therefore always free from repetition, injected humour. + +
            + + + By Aziko + + +
            +
            +
            +
            + +
            +
            +
            +
            + +
            +
            +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + diff --git a/public/components/utils/idle-timer.html b/public/components/utils/idle-timer.html new file mode 100644 index 00000000..0f0d0180 --- /dev/null +++ b/public/components/utils/idle-timer.html @@ -0,0 +1,3937 @@ + + + + + + + + Metronic | JQuery Idle + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + jQuery Idle +

            + +
            +
            + +
            +
            +
            + +
            + + +
            +
            +
            +
            + + + +

            + jQuery Idle Timer +

            +
            +
            +
            +
            + The idle timer is built on jQuery and provides two events: + + idle.idleTimer + + and + + active.idleTimer + + , + which fire when the user's idle state has changed. + When you move your mouse over the page or start typing, you're considered + + active + + . + On this page we have two idle timers. One for the entire document. Another for the text area on the right (or bottom if your on mobile). +
            +
            + +
            +
            + +
            +
            +
            +
            + + + +

            + Document + + + second timeout + +

            +
            +
            +
            + +
            + +
            +
            + +
            +
            +
            +
            + + + +

            + Element + + + second timeout + +

            +
            +
            +
            + +
            + +
            +
            + +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + + + + diff --git a/public/components/utils/session-timeout.html b/public/components/utils/session-timeout.html new file mode 100644 index 00000000..f9082176 --- /dev/null +++ b/public/components/utils/session-timeout.html @@ -0,0 +1,3839 @@ + + + + + + + + Metronic | JQVMap + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + JQVMap +

            + +
            +
            + +
            +
            +
            + +
            + + +
            +
            +
            +
            + + + +

            + Session Timeout Demo +

            +
            +
            +
            +
            + After a set amount of time(10 seconds set for demo), a dialog is shown to the user with the option to either log out now, or stay connected. + If log out now is selected, the page is redirected to a logout URL. If stay connected is selected, a keep-alive URL is requested through AJAX. + If no options is selected after another set amount of time, the page is automatically redirected to a timeout URL. +
            +
            + +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + + + + diff --git a/public/components/widgets/chart.html b/public/components/widgets/chart.html new file mode 100644 index 00000000..c9d900bc --- /dev/null +++ b/public/components/widgets/chart.html @@ -0,0 +1,5955 @@ + + + + + + + + Metronic | Chart Widgets + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + Chart Widgets +

            + +
            +
            + +
            +
            +
            + +
            + +
            +
            +
            +
            + +
            +
            +

            + Daily Sales +

            + + Check out each collumn for more details + +
            +
            + +
            +
            + +
            +
            + +
            +
            +

            + Profit Share +

            + + Profit Share between customers + +
            +
            +
            +
            +
            + 45 +
            +
            +
            +
            +
            +
            + + + 37% Sport Tickets + +
            +
            + + + 47% Business Events + +
            +
            + + + 19% Others + +
            +
            +
            +
            +
            + +
            +
            + +
            +
            +

            + Revenue Change +

            + + Revenue change breakdown by cities + +
            +
            +
            +
            +
            +
            +
            +
            + + + +10% New York + +
            +
            + + + -7% London + +
            +
            + + + +20% California + +
            +
            +
            +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            +
            +

            + Application Sales +

            +
            +
            + +
            +
            +
            +
            + +
            +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + # + + Application + + Sales + + Change + + Avg Price + + Total +
            + + + + Vertex 2.0 + + + Vertex To By Again + + + 19,200 + +
            + + +
            +
            + $63 + + $14,740 +
            + + + + Metronic + + + Powerful Admin Theme + + + 24,310 + +
            + + +
            +
            + $39 + + $16,010 +
            + + + + Apex + + + The Best Selling App + + + 9,076 + +
            + + +
            +
            + $105 + + $37,200 +
            + + + + Cascades + + + Design Tool + + + 11,094 + +
            + + +
            +
            + $16 + + $8,520 +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + # + + Application + + Sales + + Change + + Avg Price + + Total +
            + + + + Loop + + + CRM System + + + 19,200 + +
            + + +
            +
            + $63 + + $34,740 +
            + + + + Selto + + + Powerful Website Builder + + + 24,310 + +
            + + +
            +
            + $39 + + $46,010 +
            + + + + Jippo + + + The Best Selling App + + + 9,076 + +
            + + +
            +
            + $105 + + $67,800 +
            + + + + Verto + + + Web Development Tool + + + 11,094 + +
            + + +
            +
            + $16 + + $18,520 +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Latest Updates +

            +
            +
            + +
            +
            +
            +
            +
            + + + +
            +
            + + Make Metronic Great Again + +
            +
            + + +500 + +
            +
            +
            +
            + + + +
            +
            + + Green Maker Team + +
            +
            + + + -64 + + +
            +
            +
            +
            + + + +
            +
            + + Make Apex Great Again + +
            +
            + + + +1080 + + +
            +
            +
            +
            + + + +
            +
            + + A Programming Language + +
            +
            + + + +19 + + +
            +
            +
            + +
            +
            +
            +
            + +
            +
            + + +
            + +
            + +
            +
            +
            +
            +

            + Trends +

            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            + + Phyton + +
            + + A Programming Language + +
            + + + +$17 + + +
            +
            + +
            + + FlyThemes + +
            + + A Let's Fly Fast Again Language + +
            + + + +$300 + + +
            +
            + +
            + + AirApp + +
            + + Awesome App For Project Management + +
            + + + +$6700 + + +
            +
            + +
            +
            + +
            + + +
            + +
            +
            +
            +
            +

            + Sales Stats +

            +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +
            + + 63% + + + Sales Grow + +
            +
            +
            +
            +
            +
            +
            +
            + + 54% + + + Orders Grow + +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            + + 41% + + + Profit Grow + +
            +
            +
            +
            +
            +
            +
            +
            + + 79% + + + Member Grow + +
            +
            +
            +
            +
            +
            +
            +
            +
            + * lorem ipsum dolor sit amet consectetuer sediat elit +
            +
            + +
            +
            + +
            + + +
            + +
            +
            +
            +
            +

            + Top Locations +

            +
            +
            +
            + +
            +
            +
            +
            +
            + +
            +
            +
            +
            + +
            + + 63% + + + London + +
            +
            +
            +
            +
            + +
            +
            + +
            + + 54% + + + Glasgow + +
            +
            +
            +
            +
            + +
            +
            +
            +
            + +
            + + 41% + + + Dublin + +
            +
            +
            +
            +
            + +
            +
            + +
            + + 79% + + + Edinburgh + +
            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            + +
            + +
            + + +
            +
            + +
            +
            +
            +
            +

            + Support Cases +

            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            + + Type + + + Amount + +
            +
            +
            + +
            + + EPS + + + +78,05% + +
            + + +
            + + PDO + + + 21,700 + +
            + + +
            + + OPL Status + + + Negative + +
            + + +
            + + Priority + + + +500,200 + +
            + + +
            + + Net Prifit + + + $18,540,60 + +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            + + + 20% Margins + +
            +
            + + + 80% Profit + +
            +
            + + + 10% Lost + +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Support Requests +

            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            + + Type + + + Amount + +
            +
            +
            + +
            + + EPS + + + +78,05% + +
            + + +
            + + PDO + + + 21,700 + +
            + + +
            + + OPL Status + + + Negative + +
            + + +
            + + Priority + + + +500,200 + +
            + + +
            + + Net Prifit + + + $18,540,60 + +
            + +
            +
            +
            +
            +
            +
            +
            + 45 +
            +
            +
            +
            +
            + + + 20% Margins + +
            +
            + + + 80% Profit + +
            +
            + + + 10% Lost + +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            +
            +
            +

            + Activity +

            +
            +
            +
            + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + + + + + Delivered + + + 15 New Paskages + +
            +
            + + + + + Reporeted + + + 72 Support Cases + +
            +
            +
            +
            + + + + + Ordered + + + 72 New Items + +
            +
            + + + + + Arrived + + + 34 Upgraded Boxes + +
            +
            +
            +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Inbound Bandwidth +

            +
            +
            + +
            +
            + +
            +
            + 670 +
            +
            + +
            +
            + +
            +
            + +
            + +
            +
            +
            +
            +

            + Outbound Bandwidth +

            +
            +
            + +
            +
            + +
            +
            + 340 +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Top Products +

            +
            +
            + +
            +
            + +
            +
            + +
            + + Phyton + +
            + + A Programming Language + +
            + + + +$17 + + +
            +
            + +
            + + FlyThemes + +
            + + A Let's Fly Fast Again Language + +
            + + + +$300 + + +
            +
            + +
            + + Starbucks + +
            + + Good Coffee & Snacks + +
            + + + +$300 + + +
            +
            + +
            +
            + +
            +
            + +
            +
            + + +
            +
            + +
            +
            +
            +
            +

            + AdWords Stats +

            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            + + + + + +
            + + Sales + +
            + + IPO, Margins, Transactions + +
            +
            +
            +
            +
            + + + + + +
            + + Profit + +
            + + Expenses, Loses, Profits + +
            +
            +
            +
            +
            + +
            +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +
            +
            + 570 + + All Sales + +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            + 690 + + All Orders + +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            + 230 + + All Transactions + +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            + 470 + + All Comissions + +
            +
            + +
            +
            +
            +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            +
            +
            +

            + Finance Summary +

            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            + + Annual Companies Taxes EMS +
            + + $500,000 + +
            + + Next Tax Review Date +
            + + July 24,2017 + +
            +
            +
            + + Avarage Product Price +
            + + $60,70 + +
            +
            +
            + Satisfication Rate +
            +
            +
            +
            +
            +
            + + 63% + +
            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            + +
            +
            + +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + + + + + + + + diff --git a/public/components/widgets/general.html b/public/components/widgets/general.html new file mode 100644 index 00000000..44cec7bf --- /dev/null +++ b/public/components/widgets/general.html @@ -0,0 +1,7369 @@ + + + + + + + + Metronic | General Widgets + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + General Widgets +

            + +
            +
            + +
            +
            +
            + +
            + +
            +
            +
            +
            + +
            +
            +

            + Total Frofit +

            +
            + + All Customs Value + + + $18M + +
            +
            +
            +
            + + Change + + + 78% + +
            +
            + +
            +
            + +
            +
            +

            + New Feedbacks +

            +
            + + Customer Review + + + 1349 + +
            +
            +
            +
            + + Change + + + 84% + +
            +
            + +
            +
            + +
            +
            +

            + New Orders +

            +
            + + Fresh Order Amount + + + 567 + +
            +
            +
            +
            + + Change + + + 69% + +
            +
            + +
            +
            + +
            +
            +

            + New Users +

            +
            + + Joined New User + + + 276 + +
            +
            +
            +
            + + Change + + + 90% + +
            +
            + +
            +
            +
            +
            + + +
            +
            +
            +
            + +
            +
            +
            +
            +

            + Member Profit +

            + + Awerage Weekly Profit + +
            +
            + + +$17,800 + +
            +
            +
            +
            +
            +
            +

            + Orders +

            + + Weekly Customer Orders + +
            +
            + + +1,800 + +
            +
            +
            +
            +
            +
            +

            + Issue Reports +

            + + System bugs and issues + +
            +
            + + -27,49% + +
            +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + IPO Margin +

            + + Awerage IPO Margin + +
            +
            + + +24% + +
            +
            +
            +
            +
            +
            +

            + Payments +

            + + Yearly Expenses + +
            +
            + + +$560,800 + +
            +
            +
            +
            +
            +
            +

            + Logistics +

            + + Overall Regional Logistics + +
            +
            + + -10% + +
            +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Orders +

            + + Awerage Weekly Orders + +
            +
            + + +15% + +
            +
            +
            +
            +
            +
            +

            + Transactions +

            + + Daily Transaction Increase + +
            +
            + + +80% + +
            +
            +
            +
            +
            +
            +

            + Revenue +

            + + Overall Revenue Increase + +
            +
            + + +60% + +
            +
            +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            +
            +

            + Tasks +

            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + Make Metronic Great Again.Lorem Ipsum Amet + +
            + + + By Bob + + +
            +
            + +
            +
            +
            +
            + +
            +
            + + Prepare Docs For Metting On Monday + +
            + + + By Sean + + +
            +
            + +
            +
            +
            +
            + +
            +
            + + Make Widgets Great Again.Estudiat Communy Elit + +
            + + + By Aziko + + +
            +
            + +
            +
            +
            +
            + +
            +
            + + Make Metronic Great Again.Lorem Ipsum + +
            + + + By James + + +
            +
            + +
            +
            +
            +
            + +
            +
            + + Completa Financial Report For Emirates Airlines + +
            + + + By Bob + + +
            +
            + +
            +
            +
            +
            + +
            +
            + + Completa Financial Report For Emirates Airlines + +
            + + + By Sean + + +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Support Tickets +

            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + Melania Trump + +
            + + 2 day ago + +
            + + Pending + +
            +
            +

            + Lorem ipsum dolor sit amet,consectetuer edipiscing elit,sed diam nonummy nibh euismod tinciduntut laoreet doloremagna aliquam erat volutpat. +

            +
            +
            +
            +
            +
            + +
            +
            + + Lebron King James + +
            + + 1 day ago + +
            + + Open + +
            +
            +

            + Lorem ipsum dolor sit amet,consectetuer edipiscing elit,sed diam nonummy nibh euismod tinciduntut laoreet doloremagna aliquam erat volutpat.Ut wisi enim ad minim veniam,quis nostrud exerci tation ullamcorper. +

            +
            +
            +
            +
            +
            + +
            +
            + + Deb Gibson + +
            + + 3 weeks ago + +
            + + Closed + +
            +
            +

            + Lorem ipsum dolor sit amet,consectetuer edipiscing elit,sed diam nonummy nibh euismod tinciduntut laoreet doloremagna aliquam erat volutpat. +

            +
            +
            +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            +
            +
            +

            + Download Files +

            +
            +
            +
            + +
            +
            +
            + +
            +
            +
            + +
            +
            + + Metronic Documentation + +
            +
            + + + +
            +
            +
            +
            + +
            +
            + + Make JPEG Great Again + +
            +
            + + + +
            +
            +
            +
            + +
            +
            + + Full Deeveloper Manual For 4.7 + +
            +
            + + + +
            +
            +
            +
            + +
            +
            + + Make JS Great Again + +
            +
            + + + +
            +
            +
            +
            + +
            +
            + + Download Ziped version OF 5.0 + +
            +
            + + + +
            +
            +
            +
            + +
            +
            + + Finance Report 2016/2017 + +
            +
            + + + +
            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + New Users +

            +
            +
            +
            + +
            +
            +
            +
            +
            + +
            + +
            +
            + +
            +
            + + Anna Strong + +
            + + Visual Designer,Google Inc + +
            + +
            + + +
            +
            + +
            +
            + + Milano Esco + +
            + + Product Designer, Apple Inc + +
            + +
            + + +
            +
            + +
            +
            + + Nick Bold + +
            + + Web Developer, Facebook Inc + +
            + +
            + + +
            +
            + +
            +
            + + Wiltor Delton + +
            + + Project Manager, Amazon Inc + +
            + +
            + + +
            +
            + +
            +
            + + Nick Stone + +
            + + Visual Designer, Github Inc + +
            + +
            + +
            + +
            +
            + +
            + +
            +
            + +
            +
            + + Kristika Bold + +
            + + Product Designer,Apple Inc + +
            + +
            + + +
            +
            + +
            +
            + + Ron Silk + +
            + + Release Manager, Loop Inc + +
            + +
            + + +
            +
            + +
            +
            + + Nick Bold + +
            + + Web Developer, Facebook Inc + +
            + +
            + + +
            +
            + +
            +
            + + Wiltor Delton + +
            + + Project Manager, Amazon Inc + +
            + +
            + + + +
            +
            + +
            +
            + + Nick Bold + +
            + + Web Developer, Facebook Inc + +
            + +
            + +
            + +
            +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Latest Updates +

            +
            +
            + +
            +
            + +
            +
            +
            + + + +
            +
            + + Make Metronic Great Again + +
            +
            + + +500 + +
            +
            +
            +
            + + + +
            +
            + + Green Maker Team + +
            +
            + + -64 + +
            +
            +
            +
            + + + +
            +
            + + Make Apex Great Again + +
            +
            + + +1080 + +
            +
            +
            +
            + + + +
            +
            + + A Programming Language + +
            +
            + + +19 + +
            +
            +
            +
            + + + +
            +
            + + Red Painted Truck + +
            +
            + + +134 + +
            +
            +
            +
            + + + +
            +
            + + New Customer + +
            +
            + + +13% + +
            +
            +
            + +
            +
            + +
            +
            + + +
            +
            + +
            +
            +
            +
            +

            + Best Sellers +

            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +

            + Great Logo Designn +

            + + Make Metronic Great Again.Lorem Ipsum Amet + +
            + + Author: + + + author: + + + Fly themes + + + Released: + + + 23.08.17 + +
            +
            +
            + + 19,200 + +
            + + sales + +
            +
            + + 1046 + +
            + + votes + +
            +
            +
            +
            + +
            +
            +

            + Branding Mockup +

            + + Make Metronic Great Again.Lorem Ipsum Amet + +
            + + Author: + + + Fly themes + + + Released: + + + 23.08.17 + +
            +
            +
            + + 24,583 + +
            + + sales + +
            +
            + + 3809 + +
            + + votes + +
            +
            +
            +
            + +
            +
            +

            + Awesome Mobile App +

            + + Make Metronic Great Again.Lorem Ipsum Amet + +
            + + Author: + + + Fly themes + + + Released: + + + 23.08.17 + +
            +
            +
            + + 10,054 + +
            + + sales + +
            +
            + + 1103 + +
            + + votes + +
            +
            +
            + +
            + + +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Authors Profit +

            +
            +
            +
            + +
            +
            +
            +
            +
            + +
            + + Trump Themes + +
            + + Make Metronic Great Again + +
            + + + +$2500 + + +
            +
            + +
            + + StarBucks + +
            + + Good Coffee & Snacks + +
            + + + -$290 + + +
            +
            + +
            + + Phyton + +
            + + A Programming Language + +
            + + + +$17 + + +
            +
            + +
            + + GreenMakers + +
            + + Make Green Great Again + +
            + + + -$2.50 + + +
            +
            + +
            + + FlyThemes + +
            + + A Let's Fly Fast Again Language + +
            + + + +$200 + + +
            +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            +
            +
            +

            + Announcements +

            +
            +
            +
            + +
            +
            +
            + +
            +
            + Lorem ipsum dolor sit amet,consectetuer edipiscing elit,sed diam nonummy euismod tinciduntut laoreet doloremagna +
            +
            +
            + +
            +
            + + Dan Bold + +
            + + 3 days ago + +
            +
            + +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            + +
            +
            +
            +
            +
            +
            + +

            + Introducing New Feature +

            +
            +
            +
            +
            +
            + +
            +
            + + Anna Krox + +
            + + UX/UI Designer, Google + +
            +
            + + 18 + + + Comments + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry scrambled it to make text of the printing and typesetting industry scrambled a type specimen book text of the dummy text of the printing printing and typesetting industry scrambled dummy text of the printing. +
            +
            +
            + +
            +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Announcements +

            +
            +
            +
            + +
            +
            +
            + +
            +
            + Lorem ipsum dolor sit amet,consectetuer edipiscing elit,sed diam nonummy euismod tinciduntut laoreet doloremagna +
            +
            +
            + +
            +
            + + Nick Mana + +
            + + 6 hours ago + +
            +
            + +
            + +
            +
            + +
            +
            + + +
            +
            + +
            +
            +
            +
            +

            + Sales Stats +

            +
            +
            +
            + +
            +
            +
            +
            +
            +
            + + Sceduled + + + Count + + + Amount + +
            +
            +
            +
            + + 16/13/17 + + + 67 + + + $14,740 + +
            +
            + + 02/28/17 + + + 120 + + + $11,002 + +
            +
            + + 03/06/17 + + + 32 + + + $10,900 + +
            +
            + + 10/21/17 + + + 130 + + + $14,740 + +
            +
            + + 01/02/17 + + + 5 + + + $18,540 + +
            +
            + + 03/06/17 + + + 32 + + + $10,900 + +
            +
            + + 12/31/17 + + + 201 + + + $25,609 + +
            +
            +
            +
            + +
            +
            +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + User Progress +

            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + Anna Strong + +
            + + Visual Designer,Google Inc + +
            +
            +
            + + 63% + + + London + +
            +
            +
            +
            +
            + +
            +
            +
            + +
            +
            + + Milano Esco + +
            + + Product Designer, Apple Inc + +
            +
            +
            + + 33% + + + Paris + +
            +
            +
            +
            +
            + +
            +
            +
            + +
            +
            + + Nick Bold + +
            + + Web Developer, Facebook Inc + +
            +
            +
            + + 13% + + + London + +
            +
            +
            +
            +
            + +
            +
            +
            + +
            +
            + + Wiltor Delton + +
            + + Project Manager, Amazon Inc + +
            +
            +
            + + 93% + + + New York + +
            +
            +
            +
            +
            + +
            +
            +
            + +
            +
            + + Sam Stone + +
            + + Project Manager, Kilpo Inc + +
            +
            +
            + + 50% + + + New York + +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            +
            +
            +

            + Finance Summary +

            +
            +
            +
            + +
            +
            +
            +
            +
            + + Annual Companies Taxes EMS +
            + + $500,000 + +
            + + Next Tax Review Date +
            + + July 24,2017 + +
            +
            +
            + + Total Annual Profit Before Tax +
            + + $3,800,000 + +
            + + Type Of Market Share +
            + + Grossery + +
            +
            +
            + + Avarage Product Price +
            + + $60,70 + +
            +
            +
            + Satisfication Rate +
            +
            +
            +
            +
            +
            + + 63% + +
            +
            +
            +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Company Summary +

            +
            +
            +
            + +
            +
            +
            +
            +
            + + Company Name + + + Stuad Deportive + +
            +
            + + Anual Taxes: + + + $520,000 + +
            +
            + + Business Description: + + + Lorem Ipsum is simply dummy text of the printing and typesetting industry. + +
            +
            + + Employee Amount: + + + 1,300 + +
            +
            + + Emal: + + + supporet@keenthemes.com + +
            +
            + + Phone: + + + (0) 123 456 78 90 + +
            +
            + + +
            +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            +
            +
            +

            + Sales Reports +

            +
            +
            + +
            +
            + +
            + +
            + +
            +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + # + + Application + + Sales + + Avg Price + + Total +
            + + + + Vertex 2.0 + + + Vertex To By Again + + + 19,200 + + $63 + + $14,740 +
            + + + + Metronic + + + Powerful Admin Theme + + + 24,310 + + $39 + + $16,010 +
            + + + + Apex + + + The Best Selling App + + + 9,076 + + $105 + + $37,200 +
            + + + + Cascades + + + Design Tool + + + 11,094 + + $16 + + $8,520 +
            + +
            +
            + +
            +
            + +
            + + +
            + +
            +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + # + + Application + + Sales + + Change + + Avg Price + + Total +
            + + + + Loop + + + CRM System + + + 19,200 + + $63 + + $11,300 + + $34,740 +
            + + + + Selto + + + Powerful Website Builder + + + 24,310 + + $39 + + $14,700 + + $46,010 +
            + + + + Jippo + + + The Best Selling App + + + 9,076 + + $105 + + $8,400 + + $67,800 +
            + + + + Verto + + + Web Development Tool + + + 11,094 + + $16 + + $12,500 + + $18,520 +
            + +
            +
            + +
            +
            + +
            + + +
            + +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Product Sales + + Total Sales By Products + +

            +
            +
            + +
            +
            +
            + + $237,650 + + + Total Revenue This Month + +
            +
            + + 63% + +
            +
            +
            +
            + + Sales Growth + +
            +
            + + 39% + +
            +
            +
            +
            + + Product Growth + +
            +
            + + 54% + +
            +
            +
            +
            + + Community Growth + +
            +
            +
            +
            +
            + +
            +
            + +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + diff --git a/public/header/actions.html b/public/header/actions.html new file mode 100644 index 00000000..2bce1d61 --- /dev/null +++ b/public/header/actions.html @@ -0,0 +1,3855 @@ + + + + + + + + Metronic | Actions + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + Actions +

            + +
            +
            + +
            +
            +
            + +
            + +
            +
            +
            +
            +

            + Create A Post +

            +
            +
            +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            + + +
            +
            +
            +
            +
            + +
            + +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + + + + diff --git a/public/header/profile.html b/public/header/profile.html new file mode 100644 index 00000000..92267cdc --- /dev/null +++ b/public/header/profile.html @@ -0,0 +1,4177 @@ + + + + + + + + Metronic | My Profile + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + My Profile +

            +
            +
            + +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            + Your Profile +
            +
            +
            + +
            +
            +
            + + Mark Andre + + +
            +
            + +
            +
            +
            +
            +
            +

            + Member Profit +

            + + Awerage Weekly Profit + +
            +
            + + +$17,800 + +
            +
            +
            +
            +
            +
            +

            + Orders +

            + + Weekly Customer Orders + +
            +
            + + +1,800 + +
            +
            +
            +
            +
            +
            +

            + Issue Reports +

            + + System bugs and issues + +
            +
            + + -27,49% + +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            + +
            + +
            +
            +
            +
            +
            +
            +
            + +
            +
            +
            +

            + 1. Personal Details +

            +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + + + If you want your invoices addressed to a company. Leave blank to use your full name. + +
            +
            +
            + +
            + +
            +
            +
            +
            +
            +

            + 2. Address +

            +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            +
            +
            +

            + 3. Social Links +

            +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            + +
            + +
            +
            +
            +
            +
            +
            +
            +
            + +    + +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + diff --git a/public/index.php b/public/index.php new file mode 100644 index 00000000..ab41c26e --- /dev/null +++ b/public/index.php @@ -0,0 +1,39 @@ +load(__DIR__.'/../.env'); +} + +$env = $_SERVER['APP_ENV'] ?? 'dev'; +$debug = $_SERVER['APP_DEBUG'] ?? ('prod' !== $env); + +if ($debug) { + umask(0000); + + Debug::enable(); +} + +if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? false) { + Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST); +} + +if ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? false) { + Request::setTrustedHosts(explode(',', $trustedHosts)); +} + +$kernel = new Kernel($env, $debug); +$request = Request::createFromGlobals(); +$response = $kernel->handle($request); +$response->send(); +$kernel->terminate($request, $response); diff --git a/public/snippets/general/pricing-tables/pricing-table-1.html b/public/snippets/general/pricing-tables/pricing-table-1.html new file mode 100644 index 00000000..ec3a4157 --- /dev/null +++ b/public/snippets/general/pricing-tables/pricing-table-1.html @@ -0,0 +1,4065 @@ + + + + + + + + Metronic | Pricing Tables v1 + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + Pricing Tables v1 +

            + +
            +
            + +
            +
            +
            + +
            + + +
            +
            +
            +
            + + + +

            + Basic Pricing Table +

            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            + + + +
            + + Free + +

            + 1 End Product License +

            + + Lorem ipsum dolor sit amet edipiscing elit +
            + sed do eiusmod elpors labore et dolore +
            + magna siad enim aliqua +
            +
            + +
            +
            +
            +
            +
            +
            + + + +
            + + 69 + + $ + + +

            + Business License +

            + + Lorem ipsum dolor sit amet edipiscing elit +
            + sed do eiusmod elpors labore et dolore +
            + magna siad enim aliqua +
            +
            + +
            +
            +
            +
            +
            +
            + + + +
            + + 889 + + $ + + +

            + Enterprice License +

            + + Lorem ipsum dolor sit amet edipiscing elit +
            + sed do eiusmod elpors labore et dolore +
            + magna siad enim aliqua +
            +
            + +
            +
            +
            +
            +
            +
            + + + + +
            +
            +
            +
            + + + +

            + Fluid Pricing Table +

            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            + + + +
            + + Free + +

            + 1 End Product License +

            + + Lorem ipsum aret +
            + sed do eiusmod +
            + magna siad ali +
            +
            + +
            +
            +
            +
            +
            +
            + + + +
            + + 69 + + $ + + +

            + Business License +

            + + Lorem ipsum +
            + sed do eiusmod +
            + magna siad enim aliqua +
            +
            + +
            +
            +
            +
            +
            +
            + + + +
            + + 548 + + $ + + +

            + Enterprice License +

            + + Lorem ipsum dolor +
            + sed do eiusmod +
            + magna siad enim +
            +
            + +
            +
            +
            +
            +
            +
            + + + +
            + + 899 + + $ + + +

            + Custom License +

            + + Lorem ipsum +
            + sed do eiusmod tem +
            + magna siad enim +
            +
            + +
            +
            +
            +
            +
            +
            + + +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + diff --git a/public/snippets/general/pricing-tables/pricing-table-2.html b/public/snippets/general/pricing-tables/pricing-table-2.html new file mode 100644 index 00000000..c8a36832 --- /dev/null +++ b/public/snippets/general/pricing-tables/pricing-table-2.html @@ -0,0 +1,4070 @@ + + + + + + + + Metronic | Pricing Tables v2 + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + Pricing Tables v2 +

            + +
            +
            + +
            +
            +
            + +
            + +
            +
            +
            +
            +
            +

            + Transparent & Simple Pricing +

            +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            + + + +
            +

            + Basic Plan +

            +
            + + 1 Domain + + + 10 Users + + + 20 Copies + + + Free Assets + +
            + + 69 + + + $ + +
            + +
            +
            +
            +
            +
            + + + +
            +

            + For Business +

            +
            + + 10 Domains + + + Unlimited Users + + + Unlimited Copies + + + Free Assets + +
            + + 169 + + + $ + +
            + +
            +
            +
            +
            +
            + + + +
            +

            + Enterprice +

            +
            + + Unlimited Domain + + + Unlimited Users + + + Unlimited Copies + + + Free Assets + +
            + + 669 + + + $ + +
            + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            + +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + diff --git a/public/snippets/general/pricing-tables/pricing-table-3.html b/public/snippets/general/pricing-tables/pricing-table-3.html new file mode 100644 index 00000000..ea8bcd49 --- /dev/null +++ b/public/snippets/general/pricing-tables/pricing-table-3.html @@ -0,0 +1,3945 @@ + + + + + + + + Metronic | Pricing Tables v3 + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + Pricing Tables v3 +

            + +
            +
            + +
            +
            +
            + +
            + + +
            +
            +
            +
            + + + +

            + Pricing Table +

            +
            +
            +
            +
            +
            +
            +
            +
            +
            +

            + Basic +

            + + Free + +
            + + + Lorem ipsum dolor sit amet adipiscing elit + +
            + + sed do eiusmod tempors labore et dolore + +
            + + magna siad enim aliqua + +
            +
            +
            + +
            +
            +
            +
            +
            +

            + Professional +

            + + + $ + + + 29 + + + /  Per Installation + + +
            + + + Lorem ipsum dolor sit amet adipiscing elit + +
            + + sed do eiusmod tempors labore et dolore + +
            + + magna siad enim aliqua + +
            +
            +
            + +
            +
            +
            +
            +
            +

            + Extended +

            + + + $ + + + 99 + + + /  Per Installation + + +
            + + + Lorem ipsum dolor sit amet adipiscing elit + +
            + + sed do eiusmod tempors labore et dolore + +
            + + magna siad enim aliqua + +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + diff --git a/public/snippets/general/pricing-tables/pricing-table-4.html b/public/snippets/general/pricing-tables/pricing-table-4.html new file mode 100644 index 00000000..fc447096 --- /dev/null +++ b/public/snippets/general/pricing-tables/pricing-table-4.html @@ -0,0 +1,4248 @@ + + + + + + + + Metronic | Pricing Tables v4 + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + +
            + +
            + +
            + +
            +
            +
            +

            + Pricing Tables v4 +

            + +
            +
            + +
            +
            +
            + +
            + +
            +
            + +
            +
            +
            +
            +
            +

            + Transparent & Simple Pricing +

            +
            +
            +
            + +
            + +
            + + + +

            + Basic Plan +

            +
            + + Lorem ipsum dolor adipiscing + +
            + + do eiusmod tempors + +
            + + 69 + + + $ + +
            + +
            + +
            +
            + + Number Of Users + +
            + + Up to 10k + +
            +
            + + Domains + +
            + + 1 + +
            +
            + + Projects + +
            + + 5 + +
            +
            + + Storage + +
            + + 5GB + +
            +
            + + Supporet + +
            + + No + +
            +
            + + Tutorials + +
            + + No + +
            +
            + + Cancelation + +
            + + Yes + +
            +
            + +
            +
            + +
            + + +
            + + + +

            + For Business +

            +
            + + Lorem ipsum dolor adipiscing + +
            + + do eiusmod tempors + +
            + + 169 + + + $ + +
            + +
            + +
            +
            + + Number Of Users + +
            + + Up to 100k + +
            +
            + + Domains + +
            + + 20 + +
            +
            + + Projects + +
            + + 100 + +
            +
            + + Storage + +
            + + 200GB + +
            +
            + + Supporet + +
            + + Yes + +
            +
            + + Tutorials + +
            + + Yes + +
            +
            + + Cancelation + +
            + + Yes + +
            +
            + +
            +
            + +
            + + +
            + + + +

            + Enterprise +

            +
            + + Lorem ipsum dolor adipiscing + +
            + + do eiusmod tempors + +
            + + 669 + + + $ + +
            + +
            + +
            +
            + + Number Of Users + +
            + + Unlimited + +
            +
            + + Domains + +
            + + 100 + +
            +
            + + Projects + +
            + + 500 + +
            +
            + + Storage + +
            + + Unlimited + +
            +
            + + Supporet + +
            + + Yes + +
            +
            + + Tutorials + +
            + + Yes + +
            +
            + + Cancelation + +
            + + Yes + +
            +
            + +
            +
            + +
            + +
            + +
            +
            +
            +
            +
            +
            +
            + Number Of Users +
            +
            + Up to 10k +
            +
            + Up to 100k +
            +
            + Unlimited +
            +
            +
            +
            + Domains +
            +
            + 1 +
            +
            + 20 +
            +
            + 100 +
            +
            +
            +
            + Projects +
            +
            + 5 +
            +
            + 100 +
            +
            + 500 +
            +
            +
            +
            + Storage +
            +
            + 5GB +
            +
            + 200GB +
            +
            + Unlimited +
            +
            +
            +
            + Supporet +
            +
            + No +
            +
            + Yes +
            +
            + Yes +
            +
            +
            +
            + Tutorials +
            +
            + No +
            +
            + Yes +
            +
            + Yes +
            +
            +
            +
            + Cancelation +
            +
            + Yes +
            +
            + Yes +
            +
            + Yes +
            +
            +
            +
            +
            + +
            +
            + +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + diff --git a/public/snippets/pages/errors/error-1.html b/public/snippets/pages/errors/error-1.html new file mode 100644 index 00000000..807aecba --- /dev/null +++ b/public/snippets/pages/errors/error-1.html @@ -0,0 +1,67 @@ + + + + + + + + Metronic | Error Page - 1 + + + + + + + + + + + + + + + + + + +
            +
            +
            + +

            + 404 +

            +
            +

            + OOPS! Something went wrong here +

            +
            +
            +
            + + + + + + + + diff --git a/public/snippets/pages/errors/error-2.html b/public/snippets/pages/errors/error-2.html new file mode 100644 index 00000000..a744a203 --- /dev/null +++ b/public/snippets/pages/errors/error-2.html @@ -0,0 +1,67 @@ + + + + + + + + Metronic | Error Page - 2 + + + + + + + + + + + + + + + + + + +
            +
            +
            + +

            + OOPS! +

            +
            + + Something went wrong here + +
            +
            +
            + + + + + + + + diff --git a/public/snippets/pages/errors/error-3.html b/public/snippets/pages/errors/error-3.html new file mode 100644 index 00000000..f1c37d96 --- /dev/null +++ b/public/snippets/pages/errors/error-3.html @@ -0,0 +1,75 @@ + + + + + + + + Metronic | Error Page - 3 + + + + + + + + + + + + + + + + + + +
            +
            +
            + +

            + 404 +

            +
            +

            + How did you get here +

            +

            + Sorry we can't seem to find the page you're looking for. +

            +

            + There may be amisspelling in the URL entered, +
            + or the page you are looking for may no longer exist. +

            +
            +
            +
            + + + + + + + + diff --git a/public/snippets/pages/errors/error-4.html b/public/snippets/pages/errors/error-4.html new file mode 100644 index 00000000..3c88bba0 --- /dev/null +++ b/public/snippets/pages/errors/error-4.html @@ -0,0 +1,68 @@ + + + + + + + + Metronic | Error Page - 4 + + + + + + + + + + + + + + + + + + +
            +
            +
            +

            + 404 +

            +

            + ERROR +

            +

            + Nothing left to do here. +

            +
            +
            +
            + + + + + + + + diff --git a/public/snippets/pages/errors/error-5.html b/public/snippets/pages/errors/error-5.html new file mode 100644 index 00000000..7ab9187a --- /dev/null +++ b/public/snippets/pages/errors/error-5.html @@ -0,0 +1,74 @@ + + + + + + + + Metronic | Error Page - 5 + + + + + + + + + + + + + + + + + + +
            +
            +
            + +

            + Oops! +

            +
            +

            + Something went wrong here. +

            +

            + We're working on it and we'll get it fixed +
            + as soon possible. +
            + You can back or use our Help Center. +

            +
            +
            +
            + + + + + + + + diff --git a/public/snippets/pages/errors/error-6.html b/public/snippets/pages/errors/error-6.html new file mode 100644 index 00000000..615e94f7 --- /dev/null +++ b/public/snippets/pages/errors/error-6.html @@ -0,0 +1,69 @@ + + + + + + + + Metronic | Error Page - 6 + + + + + + + + + + + + + + + + + + +
            +
            +
            +
            +

            + Oops... +

            +
            +

            + Looks like something went wrong. +
            + We're working on it +

            +
            +
            +
            + + + + + + + + diff --git a/public/snippets/pages/user/login-1.html b/public/snippets/pages/user/login-1.html new file mode 100644 index 00000000..3cfd2703 --- /dev/null +++ b/public/snippets/pages/user/login-1.html @@ -0,0 +1,199 @@ + + + + + + + + Metronic | Login Page - 1 + + + + + + + + + + + + + + + + + + +
            + +
            + + + + + + + + + + + diff --git a/public/snippets/pages/user/login-2.html b/public/snippets/pages/user/login-2.html new file mode 100644 index 00000000..4bc63c9d --- /dev/null +++ b/public/snippets/pages/user/login-2.html @@ -0,0 +1,183 @@ + + + + + + + + Metronic | Login Page - 2 + + + + + + + + + + + + + + + + + + +
            + +
            + + + + + + + + + + + diff --git a/public/snippets/pages/user/login-3.html b/public/snippets/pages/user/login-3.html new file mode 100644 index 00000000..fab0275d --- /dev/null +++ b/public/snippets/pages/user/login-3.html @@ -0,0 +1,183 @@ + + + + + + + + Metronic | Login Page - 3 + + + + + + + + + + + + + + + + + + +
            + +
            + + + + + + + + + + + diff --git a/public/snippets/pages/user/login-4.html b/public/snippets/pages/user/login-4.html new file mode 100644 index 00000000..71613d5d --- /dev/null +++ b/public/snippets/pages/user/login-4.html @@ -0,0 +1,183 @@ + + + + + + + + Metronic | Login Page - 4 + + + + + + + + + + + + + + + + + + +
            + +
            + + + + + + + + + + + diff --git a/public/snippets/pages/user/login-5.html b/public/snippets/pages/user/login-5.html new file mode 100644 index 00000000..b7a0211a --- /dev/null +++ b/public/snippets/pages/user/login-5.html @@ -0,0 +1,194 @@ + + + + + + + + Metronic | Login Page - 5 + + + + + + + + + + + + + + + + + + +
            + +
            + + + + + + + + + + + diff --git a/src/Command/UserCreateCommand.php b/src/Command/UserCreateCommand.php new file mode 100644 index 00000000..f0873dc1 --- /dev/null +++ b/src/Command/UserCreateCommand.php @@ -0,0 +1,70 @@ +encoder_factory = $ef; + $this->object_manager = $om; + + parent::__construct(); + } + + protected function configure() + { + $this->setName('user:create') + ->setDescription('Create new user.') + ->setHelp('Creates user and inserts into database.') + ->addArgument('username', InputArgument::REQUIRED, 'username') + ->addArgument('password', InputArgument::REQUIRED, 'password') + ->addOption('superadmin', 'sa', InputOption::VALUE_NONE, 'Assign role of ROLE_SUPER_ADMIN.'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $username = $input->getArgument('username'); + $raw_pass = $input->getArgument('password'); + + $user = new User(); + + // encode password + $enc = $this->encoder_factory->getEncoder($user); + $password = $enc->encodePassword($raw_pass, $user->getSalt()); + + // get entity manager + // $em = $this->getContainer()->get('doctrine')->getEntityManager(); + $em = $this->object_manager; + + // build user + $user->setUsername($username) + ->setPassword($password) + ->setEnabled(); + + // superadmin + if ($input->getOption('superadmin')) + { + $role = $em->getReference('App\Entity\Role', Role::SUPER_ADMIN); + $user->addRole($role); + } + + $em->persist($user); + + $em->flush(); + } +} diff --git a/src/Controller/.gitignore b/src/Controller/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/src/Controller/HomeController.php b/src/Controller/HomeController.php new file mode 100644 index 00000000..442d0e8c --- /dev/null +++ b/src/Controller/HomeController.php @@ -0,0 +1,15 @@ +initParameters('home'); + + return $this->render('home.html.twig', $params); + } +} diff --git a/src/Controller/SecurityController.php b/src/Controller/SecurityController.php new file mode 100644 index 00000000..f9763dbe --- /dev/null +++ b/src/Controller/SecurityController.php @@ -0,0 +1,28 @@ + false, + 'last_username' => '' + ]; + + $error = $auth_utils->getLastAuthenticationError(); + $last_username = $auth_utils->getLastUsername(); + + $params = [ + 'error' => $error, + 'last_username' => $last_username, + ]; + + return $this->render('login.html.twig', $params); + } +} diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php new file mode 100644 index 00000000..61803a6a --- /dev/null +++ b/src/Controller/UserController.php @@ -0,0 +1,15 @@ +initParameters('user_list'); + + return $this->render('home.html.twig', $params); + } +} diff --git a/src/DataFixtures/.gitignore b/src/DataFixtures/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/src/DataFixtures/UserFixtures.php b/src/DataFixtures/UserFixtures.php new file mode 100644 index 00000000..7ac1c849 --- /dev/null +++ b/src/DataFixtures/UserFixtures.php @@ -0,0 +1,20 @@ +setID(Role::SUPER_ADMIN) + ->setName('Super Administrator'); + $em->persist($role); + $em->flush(); + } +} diff --git a/src/Entity/.gitignore b/src/Entity/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/src/Entity/Role.php b/src/Entity/Role.php new file mode 100644 index 00000000..107e7430 --- /dev/null +++ b/src/Entity/Role.php @@ -0,0 +1,114 @@ +users = new ArrayCollection(); + $this->acl_attributes = []; + } + + public function setID($id) + { + // example ROLE_SUPER_ADMIN, ROLE_CASHIER, etc + $this->id = $id; + return $this; + } + + public function getID() + { + return $this->id; + } + + public function setName($name) + { + $this->name = $name; + return $this; + } + + public function getName() + { + return $this->name; + } + + public function getUsers() + { + return $this->users; + } + + public function getUsersCount() + { + return $this->users->count(); + } + + public function isSuperAdmin() + { + if ($this->id == self::SUPER_ADMIN) + return true; + + return false; + } + + // TODO: shift out ACL stuff to its own class + public function clearACLAttributes() + { + $this->acl_attributes = []; + return $this; + } + + public function getACLAttributes() + { + return $this->acl_attributes; + } + + public function addACLAccess($attribute) + { + $this->acl_attributes[$attribute] = true; + return $this; + } + + public function hasACLAccess($attribute) + { + // if it's super admin, they always have access + if ($this->isSuperAdmin()) + return true; + + // check ACL attributes + if (isset($this->acl_attributes[$attribute]) && $this->acl_attributes[$attribute]) + return true; + + return false; + } +} diff --git a/src/Entity/User.php b/src/Entity/User.php new file mode 100644 index 00000000..269ca3d2 --- /dev/null +++ b/src/Entity/User.php @@ -0,0 +1,231 @@ +roles = new ArrayCollection(); + $this->enabled = true; + } + + public function getID() + { + return $this->id; + } + + public function setUsername($username) + { + $this->username = $username; + return $this; + } + + public function getUsername() + { + return $this->username; + } + + public function setPassword($password) + { + $this->password = $password; + return $this; + } + + public function getPassword() + { + return $this->password; + } + + public function setSalt($salt) + { + // do nothing + return $this; + } + + public function getSalt() + { + return null; + } + + public function addRole(Role $role) + { + $this->roles->add($role); + return $this; + } + + public function clearRoles() + { + $this->roles->clear(); + return $this; + } + + public function getRoles() + { + // has to return set of strings because symfony is trying to move away from role objects + $str_roles = []; + foreach ($this->roles as $role) + $str_roles[] = $role->getID(); + + return $str_roles; + } + + public function getRoleObjects() + { + return $this->roles; + } + + public function eraseCredentials() + { + return $this; + } + + public function isAccountNonExpired() + { + return true; + } + + public function isAccountNonLocked() + { + return true; + } + + public function isCredentialsNonExpired() + { + return true; + } + + public function setEnabled($enabled = true) + { + $this->enabled = $enabled; + return $this; + } + + public function isEnabled() + { + return $this->enabled; + } + + public function serialize() + { + return serialize([ + $this->id, + $this->username, + $this->password, + $this->enabled, + ]); + } + + public function unserialize($serial) + { + list ( + $this->id, + $this->username, + $this->password, + $this->enabled, + ) = unserialize($serial); + } + + public function setFirstName($name) + { + $this->first_name = $name; + return $this; + } + + public function getFirstName() + { + return $this->first_name; + } + + public function setLastName($name) + { + $this->last_name = $name; + return $this; + } + + public function getLastName() + { + return $this->last_name; + } + + public function setContactNumber($num) + { + $this->contact_num = $num; + return $this; + } + + public function getContactNumber() + { + return $this->contact_num; + } + + public function setEmail($email = null) + { + $this->email = $email; + return $this; + } + + public function getEmail() + { + return $this->email; + } +} diff --git a/src/Kernel.php b/src/Kernel.php new file mode 100644 index 00000000..4425aee4 --- /dev/null +++ b/src/Kernel.php @@ -0,0 +1,61 @@ +getProjectDir().'/var/cache/'.$this->environment; + } + + public function getLogDir() + { + return $this->getProjectDir().'/var/log'; + } + + public function registerBundles() + { + $contents = require $this->getProjectDir().'/config/bundles.php'; + foreach ($contents as $class => $envs) { + if (isset($envs['all']) || isset($envs[$this->environment])) { + yield new $class(); + } + } + } + + protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader) + { + $container->setParameter('container.autowiring.strict_mode', true); + $container->setParameter('container.dumper.inline_class_loader', true); + $confDir = $this->getProjectDir().'/config'; + $loader->load($confDir.'/packages/*'.self::CONFIG_EXTS, 'glob'); + if (is_dir($confDir.'/packages/'.$this->environment)) { + $loader->load($confDir.'/packages/'.$this->environment.'/**/*'.self::CONFIG_EXTS, 'glob'); + } + $loader->load($confDir.'/services'.self::CONFIG_EXTS, 'glob'); + $loader->load($confDir.'/services_'.$this->environment.self::CONFIG_EXTS, 'glob'); + } + + protected function configureRoutes(RouteCollectionBuilder $routes) + { + $confDir = $this->getProjectDir().'/config'; + if (is_dir($confDir.'/routes/')) { + $routes->import($confDir.'/routes/*'.self::CONFIG_EXTS, '/', 'glob'); + } + if (is_dir($confDir.'/routes/'.$this->environment)) { + $routes->import($confDir.'/routes/'.$this->environment.'/**/*'.self::CONFIG_EXTS, '/', 'glob'); + } + $routes->import($confDir.'/routes'.self::CONFIG_EXTS, '/', 'glob'); + } +} diff --git a/src/Menu/Collection.php b/src/Menu/Collection.php new file mode 100644 index 00000000..2867c901 --- /dev/null +++ b/src/Menu/Collection.php @@ -0,0 +1,71 @@ +position = 0; + $this->array = array(); + $this->index_array = array(); + } + + // iterator stuff + public function rewind() + { + $this->position = 0; + } + + public function current() + { + return $this->array[$this->index_array[$this->position]]; + } + + public function key() + { + return $this->position; + } + + public function next() + { + return ++$this->position; + } + + public function valid() + { + return isset($this->index_array[$this->position]); + } + // end of iterator stuff + + public function add(Item $mi) + { + $id = $mi->getID(); + $this->array[$id] = $mi; + $this->index_array[] = $id; + return $this; + } + + public function get($id) + { + if (isset($this->array[$id])) + return $this->array[$id]; + + return null; + } + + public function unselectAll() + { + foreach ($this->array as $mi) + $mi->setSelected(false, false); + + return $this; + } +} diff --git a/src/Menu/Generator.php b/src/Menu/Generator.php new file mode 100644 index 00000000..12a65302 --- /dev/null +++ b/src/Menu/Generator.php @@ -0,0 +1,158 @@ +index = new Collection(); + $this->menu = new Collection(); + $this->router = $router; + $this->cache_dir = $cache_dir; + $this->config_dir = $config_dir; + } + + public function getMenu($menu_key) + { + // initialize + $menu_data = [ + 'menu' => [], + 'index' => [] + ]; + + // cache config + $cache_file = $this->cache_dir . '/' . $menu_key . '.serial'; + $menu_cache = new ConfigCache($cache_file, true); + + // cache not fresh + if (!$menu_cache->isFresh()) + { + $files = []; + $resources = []; + + try + { + // get location of menu.yaml + $path = $this->config_dir . '/menu.yaml'; + $files[] = $path; + $resources[] = new FileResource($path); + + // process bundle menu + $this->parseMenu($path, $menu_key); + } + catch (\InvalidArgumentException $e) + { + error_log($e->getMessage()); + error_log($menu_key . ' menu not found.'); + return $menu_data; + } + + $menu_data = [ + 'menu' => $this->menu, + 'index' => $this->index, + ]; + $menu_serial = serialize($menu_data); + $menu_cache->write($menu_serial, $resources); + } + else + { + $menu_serial = file_get_contents($cache_file); + $menu_data = unserialize($menu_serial); + $this->menu = $menu_data['menu']; + $this->index = $menu_data['index']; + } + + return $menu_data; + } + + protected function parseMenu($path, $menu_key) + { + $parser = new YamlParser(); + $menu_config = $parser->parse(file_get_contents($path)); + + // check if we have menu items + if (!isset($menu_config[$menu_key])) + { + error_log('No ' . $menu_key . ' found for ' . $path); + return; + } + + // go through each one + foreach ($menu_config[$menu_key] as $mi_data) + { + // check params + if (!isset($mi_data['icon'])) + $mi_data['icon'] = null; + + // instantiate + $mi = $this->newItem($mi_data['id'], $mi_data['label'], $mi_data['icon']); + + // acl + if (isset($mi_data['acl'])) + $mi->setACLKey($mi_data['acl']); + + // check parent + if (isset($mi_data['parent']) && $mi_data['parent'] != null) + { + $parent = $this->index->get($mi_data['parent']); + if ($parent == null) + continue; + + $parent->addChild($mi); + } + else + $this->menu->add($mi); + + } + } + + protected function newItem($id, $label, $icon = null) + { + $mi = new Item(); + $mi->setID($id) + ->setLabel($label); + + try + { + $mi->setLink($this->router->generate($id)); + } + catch (RouteNotFoundException $e) + { + // no route, set to # + $mi->setLink('#'); + } + + if ($icon != null) + $mi->setIcon($icon); + + $this->index->add($mi); + + return $mi; + } + + public function generate() + { + $this->getAllBundleMenus(); + + return $this->menu; + } + + public function getIndex() + { + return $this->index; + } +} diff --git a/src/Menu/Item.php b/src/Menu/Item.php new file mode 100644 index 00000000..a57f805c --- /dev/null +++ b/src/Menu/Item.php @@ -0,0 +1,138 @@ +id = ''; + $this->icon = null; + $this->link = null; + $this->label = ''; + $this->children = []; + $this->selected = false; + $this->parent = null; + $this->acl_key = null; + } + + // setters + public function setID($id) + { + $this->id = $id; + return $this; + } + + public function setIcon($icon) + { + $this->icon = $icon; + return $this; + } + + public function setLink($link) + { + $this->link = $link; + return $this; + } + + public function setLabel($label) + { + $this->label = $label; + return $this; + } + + public function setParent(self $parent) + { + $this->parent = $parent; + return $this; + } + + public function addChild(self $child) + { + $child->setParent($this); + + // check if selected + if ($child->isSelected()) + $this->setSelected(); + + $this->children[] = $child; + return $this; + } + + public function setSelected($sel = true, $to_bubble = true) + { + if ($sel) + { + $this->selected = true; + // bubble up to parents + if ($this->parent != null && $to_bubble) + $this->parent->setSelected(true, true); + } + else + $this->selected = false; + return $this; + } + + public function setACLKey($key) + { + $this->acl_key = $key; + return $this; + } + + // getters + public function getID() + { + return $this->id; + } + + public function getIcon() + { + return $this->icon; + } + + public function getLink() + { + return $this->link; + } + + public function getLabel() + { + return $this->label; + } + + public function getChildren() + { + return $this->children; + } + + public function hasChildren() + { + if (count($this->children) > 0) + return true; + return false; + } + + public function isSelected() + { + return $this->selected; + } + + public function getParent() + { + return $this->parent; + } + + public function getACLKey() + { + return $this->acl_key; + } +} diff --git a/src/Migrations/.gitignore b/src/Migrations/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/src/Ramcar/BaseController.php b/src/Ramcar/BaseController.php new file mode 100644 index 00000000..8290fec1 --- /dev/null +++ b/src/Ramcar/BaseController.php @@ -0,0 +1,33 @@ +menu_gen = $menu_gen; + } + + protected function initParameters($route) + { + // get menu + $menu = $this->menu_gen->getMenu('main_menu'); + + // set menu selected + $sel = $menu['index']->get($route); + if ($sel != null) + $sel->setSelected(); + + error_log(print_r($menu, true)); + + return [ + 'main_menu' => $menu + ]; + } +} diff --git a/src/Repository/.gitignore b/src/Repository/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/symfony.lock b/symfony.lock new file mode 100644 index 00000000..e82e3c10 --- /dev/null +++ b/symfony.lock @@ -0,0 +1,251 @@ +{ + "doctrine/annotations": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.0", + "ref": "cb4152ebcadbe620ea2261da1a1c5a9b8cea7672" + } + }, + "doctrine/cache": { + "version": "v1.7.1" + }, + "doctrine/collections": { + "version": "v1.5.0" + }, + "doctrine/common": { + "version": "v2.8.1" + }, + "doctrine/data-fixtures": { + "version": "v1.3.0" + }, + "doctrine/dbal": { + "version": "v2.6.3" + }, + "doctrine/doctrine-bundle": { + "version": "1.6", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.6", + "ref": "44d3aa7752dd46f77ba11af2297a25e1dedfb4d0" + } + }, + "doctrine/doctrine-cache-bundle": { + "version": "1.3.2" + }, + "doctrine/doctrine-fixtures-bundle": { + "version": "3.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.0", + "ref": "2ea6070ecf365f9a801ccaed4b31d4a3b7af5693" + } + }, + "doctrine/doctrine-migrations-bundle": { + "version": "1.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.2", + "ref": "c1431086fec31f17fbcfe6d6d7e92059458facc1" + } + }, + "doctrine/inflector": { + "version": "v1.2.0" + }, + "doctrine/instantiator": { + "version": "1.1.0" + }, + "doctrine/lexer": { + "version": "v1.0.1" + }, + "doctrine/migrations": { + "version": "v1.6.2" + }, + "doctrine/orm": { + "version": "v2.6.0" + }, + "jdorn/sql-formatter": { + "version": "v1.2.17" + }, + "ocramius/package-versions": { + "version": "1.2.0" + }, + "ocramius/proxy-manager": { + "version": "2.2.0" + }, + "psr/cache": { + "version": "1.0.1" + }, + "psr/container": { + "version": "1.0.0" + }, + "psr/log": { + "version": "1.0.2" + }, + "psr/simple-cache": { + "version": "1.0.0" + }, + "sensio/framework-extra-bundle": { + "version": "4.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.0", + "ref": "aaddfdf43cdecd4cf91f992052d76c2cadc04543" + } + }, + "symfony/cache": { + "version": "v4.0.2" + }, + "symfony/config": { + "version": "v4.0.2" + }, + "symfony/console": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "9f94d3ea453cd8a3b95db7f82592d7344fe3a76a" + } + }, + "symfony/debug": { + "version": "v4.0.2" + }, + "symfony/dependency-injection": { + "version": "v4.0.2" + }, + "symfony/doctrine-bridge": { + "version": "v4.0.2" + }, + "symfony/dotenv": { + "version": "v4.0.2" + }, + "symfony/event-dispatcher": { + "version": "v4.0.2" + }, + "symfony/filesystem": { + "version": "v4.0.2" + }, + "symfony/finder": { + "version": "v4.0.2" + }, + "symfony/flex": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.0", + "ref": "cc1afd81841db36fbef982fe56b48ade6716fac4" + } + }, + "symfony/framework-bundle": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "18f6fdceb63737d991efbb37ae9619a6f6c978c8" + } + }, + "symfony/http-foundation": { + "version": "v4.0.2" + }, + "symfony/http-kernel": { + "version": "v4.0.2" + }, + "symfony/inflector": { + "version": "v4.0.2" + }, + "symfony/lts": { + "version": "4-dev" + }, + "symfony/maker-bundle": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.0", + "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" + } + }, + "symfony/orm-pack": { + "version": "v1.0.5" + }, + "symfony/polyfill-mbstring": { + "version": "v1.6.0" + }, + "symfony/polyfill-php72": { + "version": "v1.6.0" + }, + "symfony/profiler-pack": { + "version": "v1.0.3" + }, + "symfony/property-access": { + "version": "v4.0.2" + }, + "symfony/routing": { + "version": "4.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.0", + "ref": "cda8b550123383d25827705d05a42acf6819fe4e" + } + }, + "symfony/security": { + "version": "v4.0.2" + }, + "symfony/security-bundle": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "85834af1496735f28d831489d12ab1921a875e0d" + } + }, + "symfony/stopwatch": { + "version": "v4.0.2" + }, + "symfony/twig-bridge": { + "version": "v4.0.2" + }, + "symfony/twig-bundle": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "f75ac166398e107796ca94cc57fa1edaa06ec47f" + } + }, + "symfony/var-dumper": { + "version": "v4.0.2" + }, + "symfony/web-profiler-bundle": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "6bdfa1a95f6b2e677ab985cd1af2eae35d62e0f6" + } + }, + "symfony/yaml": { + "version": "v4.0.2" + }, + "twig/twig": { + "version": "v2.4.4" + }, + "zendframework/zend-code": { + "version": "3.3.0" + }, + "zendframework/zend-eventmanager": { + "version": "3.2.0" + } +} diff --git a/templates/base.html.twig b/templates/base.html.twig new file mode 100644 index 00000000..043f42d1 --- /dev/null +++ b/templates/base.html.twig @@ -0,0 +1,12 @@ + + + + + {% block title %}Welcome!{% endblock %} + {% block stylesheets %}{% endblock %} + + + {% block body %}{% endblock %} + {% block javascripts %}{% endblock %} + + diff --git a/templates/home.html.twig b/templates/home.html.twig new file mode 100644 index 00000000..f8d6e5db --- /dev/null +++ b/templates/home.html.twig @@ -0,0 +1,4852 @@ +{% import 'menu.html.twig' as menu %} + + + + + + + Metronic | Dashboard + + + + + + + + + + + + + + + + + + + + + +
            + + + + +
            + + +
            + +
            + {{ menu.main_menu(main_menu.menu) }} + {# + + #} +
            + +
            + +
            + +
            +
            +
            +

            + Dashboard +

            +
            +
            + + + + + + + + + +
            +
            +
            + +
            + +
            +
            + +
            +
            +
            +
            +

            + Trends +

            +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            + + Phyton + +
            + + A Programming Language + +
            + + + +$17 + + +
            +
            + +
            + + FlyThemes + +
            + + A Let's Fly Fast Again Language + +
            + + + +$300 + + +
            +
            + +
            + + AirApp + +
            + + Awesome App For Project Management + +
            + + + +$6700 + + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Activity +

            +
            +
            +
            + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + + + + + Delivered + + + 15 New Paskages + +
            +
            + + + + + Reporeted + + + 72 Support Cases + +
            +
            +
            +
            + + + + + Ordered + + + 72 New Items + +
            +
            + + + + + Arrived + + + 34 Upgraded Boxes + +
            +
            +
            +
            +
            +
            + +
            +
            + +
            +
            +
            +
            + +
            +
            +
            +
            +
            +
            + +

            + Introducing New Feature +

            +
            +
            +
            +
            +
            + +
            +
            + + Anna Krox + +
            + + UX/UI Designer, Google + +
            +
            + + 18 + + + Comments + +
            +
            +
            + Lorem Ipsum is simply dummy text of the printing and typesetting industry scrambled it to make text of the printing and typesetting industry scrambled a type specimen book text of the dummy text of the printing printing and typesetting industry scrambled dummy text of the printing. +
            +
            +
            + +
            +
            +
            +
            + +
            +
            + + +
            +
            +
            +
            + +
            +
            +
            +
            +

            + Member Profit +

            + + Awerage Weekly Profit + +
            +
            + + +$17,800 + +
            +
            +
            +
            +
            +
            +

            + Orders +

            + + Weekly Customer Orders + +
            +
            + + +1,800 + +
            +
            +
            +
            +
            +
            +

            + Issue Reports +

            + + System bugs and issues + +
            +
            + + -27,49% + +
            +
            +
            +
            + +
            +
            + +
            +
            +

            + Daily Sales +

            + + Check out each collumn for more details + +
            +
            + +
            +
            + +
            +
            + +
            +
            +

            + Profit Share +

            + + Profit Share between customers + +
            +
            +
            +
            +
            + 45 +
            +
            +
            +
            +
            +
            + + + 37% Sport Tickets + +
            +
            + + + 47% Business Events + +
            +
            + + + 19% Others + +
            +
            +
            +
            +
            + +
            +
            +
            +
            + + +
            +
            + +
            +
            +
            +
            + + + +

            + Calendar +

            +
            +
            + +
            +
            +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            +
            +
            +

            + Tasks +

            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + Make Metronic Great Again.Lorem Ipsum Amet + +
            + + + By Bob + + +
            +
            + +
            +
            +
            +
            + +
            +
            + + Prepare Docs For Metting On Monday + +
            + + + By Sean + + +
            +
            + +
            +
            +
            +
            + +
            +
            + + Make Widgets Great Again.Estudiat Communy Elit + +
            + + + By Aziko + + +
            +
            + +
            +
            +
            +
            + +
            +
            + + Make Metronic Great Again.Lorem Ipsum + +
            + + + By James + + +
            +
            + +
            +
            +
            +
            + +
            +
            + + Completa Financial Report For Emirates Airlines + +
            + + + By Bob + + +
            +
            + +
            +
            +
            +
            + +
            +
            + + Completa Financial Report For Emirates Airlines + +
            + + + By Sean + + +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Support Tickets +

            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + Melania Trump + +
            + + 2 day ago + +
            + + Pending + +
            +
            +

            + Lorem ipsum dolor sit amet,consectetuer edipiscing elit,sed diam nonummy nibh euismod tinciduntut laoreet doloremagna aliquam erat volutpat. +

            +
            +
            +
            +
            +
            + +
            +
            + + Lebron King James + +
            + + 1 day ago + +
            + + Open + +
            +
            +

            + Lorem ipsum dolor sit amet,consectetuer edipiscing elit,sed diam nonummy nibh euismod tinciduntut laoreet doloremagna aliquam erat volutpat.Ut wisi enim ad minim veniam,quis nostrud exerci tation ullamcorper. +

            +
            +
            +
            +
            +
            + +
            +
            + + Deb Gibson + +
            + + 3 weeks ago + +
            + + Closed + +
            +
            +

            + Lorem ipsum dolor sit amet,consectetuer edipiscing elit,sed diam nonummy nibh euismod tinciduntut laoreet doloremagna aliquam erat volutpat. +

            +
            +
            +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            +
            +
            +

            + Recent Activities +

            +
            +
            +
            + +
            +
            +
            +
            + +
            +
            +
            + + 10:00 + +
            + +
            +
            + Lorem ipsum dolor sit amit,consectetur eiusmdd tempor +
            + incididunt ut labore et dolore magna +
            +
            +
            + + 12:45 + +
            + +
            +
            + AEOL Meeting With +
            + +
            +
            + + 14:00 + +
            + +
            +
            + Make Deposit + + USD 700 + + To ESL. +
            +
            +
            + + 16:00 + +
            + +
            +
            + Lorem ipsum dolor sit amit,consectetur eiusmdd tempor +
            + incididunt ut labore et dolore magna elit enim at minim +
            + veniam quis nostrud +
            +
            +
            + + 17:00 + +
            + +
            +
            + Placed a new order in + + SIGNATURE MOBILE + + marketplace. +
            +
            +
            + + 16:00 + +
            + +
            +
            + Lorem ipsum dolor sit amit,consectetur eiusmdd tempor +
            + incididunt ut labore et dolore magna elit enim at minim +
            + veniam quis nostrud +
            +
            +
            + + 17:00 + +
            + +
            +
            + Received a new feedback on + + FinancePro App + + product. +
            +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Recent Notifications +

            +
            +
            +
            + +
            +
            +
            +
            +
            + +
            +
            +
            + + 09:00 + +
            + + Lorem ipsum dolor sit amit,consectetur eiusmdd tempor + +
            + + + By Bob + + +
            +
            +
            + + 10:00 + +
            + + Lorem ipsum dolor sit amit + +
            + + + By Sean + + +
            +
            +
            + + 11:00 + +
            + + Lorem ipsum dolor sit amit eiusmdd tempor + +
            + + + By James + + +
            +
            +
            + + 12:00 + +
            + + Lorem ipsum dolor + +
            + + + By James + + +
            +
            +
            + + 14:00 + +
            + + Lorem ipsum dolor sit amit,consectetur eiusmdd + +
            + + + By Derrick + + +
            +
            +
            + + 15:00 + +
            + + Lorem ipsum dolor sit amit,consectetur + +
            + + + By Iman + + +
            +
            +
            + + 17:00 + +
            + + Lorem ipsum dolor sit consectetur eiusmdd tempor + +
            + + + By Aziko + + +
            +
            +
            +
            + +
            +
            + +
            +
            +
            + + 09:00 + +
            + + Contrary to popular belief, Lorem Ipsum is not simply random text. + +
            + + + By Bob + + +
            +
            +
            + + 10:00 + +
            + + There are many variations of passages of Lorem Ipsum available. + +
            + + + By Sean + + +
            +
            +
            + + 11:00 + +
            + + Contrary to popular belief, Lorem Ipsum is not simply random text. + +
            + + + By James + + +
            +
            +
            + + 12:00 + +
            + + The standard chunk of Lorem Ipsum used since the 1500s is reproduced. + +
            + + + By James + + +
            +
            +
            + + 14:00 + +
            + + Latin words, combined with a handful of model sentence structures. + +
            + + + By Derrick + + +
            +
            +
            + + 15:00 + +
            + + Contrary to popular belief, Lorem Ipsum is not simply random text. + +
            + + + By Iman + + +
            +
            +
            + + 17:00 + +
            + + Lorem Ipsum is therefore always free from repetition, injected humour. + +
            + + + By Aziko + + +
            +
            +
            +
            + +
            +
            +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            +
            +

            + Exclusive Datatable Plugin +

            +
            +
            +
            + +
            +
            +
            + +
            + +
            +
            +
            +
            + +
            +
            +
            +
            +

            + Audit Log +

            +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + pending + + + + 14 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            +
            + + + DB overloaded 80% + + settled + + + + 1 hr + +
            +
            + + + System error - + + Check + + + + 2 hrs + +
            +
            + + + Production server down + + + 3 hrs + +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + urgent + + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + pending + + + + 14 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            +
            + + + DB overloaded 80% + + settled + + + + 1 hr + +
            +
            + + + New invoice received + + + 20 mins + +
            +
            + + + DB overloaded 80% + + settled + + + + 1 hr + +
            +
            + + + System error - + + Check + + + + 2 hrs + +
            +
            + + + Production server down + + + 3 hrs + +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + urgent + + + + 7 hrs + +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + +
            +
            + +
            +
            +
            +
            +

            + Sales Stats +

            +
            +
            +
            + +
            +
            +
            + +
            +
            + +
            +
            +
            +
            +
            + + 63% + + + Sales Grow + +
            +
            +
            +
            +
            +
            +
            +
            + + 54% + + + Orders Grow + +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            + + 41% + + + Profit Grow + +
            +
            +
            +
            +
            +
            +
            +
            + + 79% + + + Member Grow + +
            +
            +
            +
            +
            +
            +
            +
            +
            + * lorem ipsum dolor sit amet consectetuer sediat elit +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Inbound Bandwidth +

            +
            +
            + +
            +
            + +
            +
            + 670 +
            +
            + +
            +
            + +
            +
            + +
            + +
            +
            +
            +
            +

            + Outbound Bandwidth +

            +
            +
            + +
            +
            + +
            +
            + 340 +
            +
            + +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Top Products +

            +
            +
            + +
            +
            + +
            +
            + +
            + + Phyton + +
            + + A Programming Language + +
            + + + +$17 + + +
            +
            + +
            + + FlyThemes + +
            + + A Let's Fly Fast Again Language + +
            + + + +$300 + + +
            +
            + +
            + + Starbucks + +
            + + Good Coffee & Snacks + +
            + + + +$300 + + +
            +
            + +
            +
            + +
            +
            + +
            +
            + + +
            +
            + +
            +
            +
            +
            +

            + Best Sellers +

            +
            +
            + +
            +
            + +
            +
            + +
            +
            +
            + +
            +
            +

            + Great Logo Designn +

            + + Make Metronic Great Again.Lorem Ipsum Amet + +
            + + Author: + + + author: + + + Fly themes + + + Released: + + + 23.08.17 + +
            +
            +
            + + 19,200 + +
            + + sales + +
            +
            + + 1046 + +
            + + votes + +
            +
            +
            +
            + +
            +
            +

            + Branding Mockup +

            + + Make Metronic Great Again.Lorem Ipsum Amet + +
            + + Author: + + + Fly themes + + + Released: + + + 23.08.17 + +
            +
            +
            + + 24,583 + +
            + + sales + +
            +
            + + 3809 + +
            + + votes + +
            +
            +
            +
            + +
            +
            +

            + Awesome Mobile App +

            + + Make Metronic Great Again.Lorem Ipsum Amet + +
            + + Author: + + + Fly themes + + + Released: + + + 23.08.17 + +
            +
            +
            + + 10,054 + +
            + + sales + +
            +
            + + 1103 + +
            + + votes + +
            +
            +
            + +
            + + +
            + +
            +
            + +
            +
            + +
            +
            +
            +
            +

            + Authors Profit +

            +
            +
            +
            + +
            +
            +
            +
            +
            + +
            + + Trump Themes + +
            + + Make Metronic Great Again + +
            + + + +$2500 + + +
            +
            + +
            + + StarBucks + +
            + + Good Coffee & Snacks + +
            + + + -$290 + + +
            +
            + +
            + + Phyton + +
            + + A Programming Language + +
            + + + +$17 + + +
            +
            + +
            + + GreenMakers + +
            + + Make Green Great Again + +
            + + + -$2.50 + + +
            +
            + +
            + + FlyThemes + +
            + + A Let's Fly Fast Again Language + +
            + + + +$200 + + +
            +
            +
            +
            + +
            +
            + +
            +
            +
            + + + + +
            + + +
            +
            + + + + +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Hi Bob. What time will be the meeting ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Hi Megan. It's at 2.30PM +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Will the development team be joining ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes sure. I invited them as well +
            +
            +
            +
            +
            + 2:30PM +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. For the Coca-Cola Mobile App project as well ? +
            +
            +
            +
            +
            +
            +
            +
            +
            + Yes, sure. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Please also prepare the quotation for the Loop CRM project as well. +
            +
            +
            +
            +
            + 3:15PM +
            +
            +
            + + M + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Noted. I will prepare it. +
            +
            +
            +
            +
            +
            +
            +
            +
            + Thanks Megan. I will see you later. +
            +
            +
            +
            +
            +
            + +
            +
            +
            +
            +
            + Megan wrote +
            +
            + Sure. See you in the meeting soon. +
            +
            +
            +
            +
            +
            +
            +
            + +
            +
            + + + +
            +
            +
            +
            +
            +
            +
            +
            + General Settings +
            +
            + + Email Notifications + + + + + + +
            +
            + + Site Tracking + + + + + + +
            +
            + + SMS Alerts + + + + + + +
            +
            + + Backup Storage + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            + System Settings +
            +
            + + System Logs + + + + + + +
            +
            + + Error Reporting + + + + + + +
            +
            + + Applications Logs + + + + + + +
            +
            + + Backup Servers + + + + + + +
            +
            + + Audit Logs + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            + System Logs +
            + +
            +
            +
            + Applications Logs +
            +
            + +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoices received + + + 20 mins + +
            + + + +
            +
            +
            +
            + Server Logs +
            +
            +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 7 hrs + +
            +
            + + + 12 new users registered + + + Just now + +
            +
            + + + System shutdown + + + 11 mins + +
            +
            + + + New invoice received + + + 20 mins + +
            + +
            + + + System error + + + 2 hrs + +
            + +
            + + + Production server up + + + 5 hrs + +
            +
            + + + New order received + + + 1117 hrs + +
            +
            +
            +
            +
            +
            +
            +
            + + +
            + +
            + + + + + + + + + + + + + + + + diff --git a/templates/login.html.twig b/templates/login.html.twig new file mode 100644 index 00000000..2cc2c391 --- /dev/null +++ b/templates/login.html.twig @@ -0,0 +1,176 @@ + + + + + + + Metronic | Login Page - 3 + + + + + + + + + + + + + + + + + + +
            + +
            + + + + + + + + + + + diff --git a/templates/menu.html.twig b/templates/menu.html.twig new file mode 100644 index 00000000..97dee2aa --- /dev/null +++ b/templates/menu.html.twig @@ -0,0 +1,59 @@ +{% macro main_menu(menu_items) %} + {% import _self as menu %} + + +{% endmacro %} + +{% macro sub_menu(menu_items) %} + {% import _self as menu %} + +{% endmacro %}